diff options
author | Jonathan Marshall <jmarshall@xbmc.org> | 2013-12-03 19:46:48 +1300 |
---|---|---|
committer | Jonathan Marshall <jmarshall@xbmc.org> | 2013-12-24 13:48:58 +1300 |
commit | 5c0539b292c419cd1b6d1d1ae506a5e05e409b98 (patch) | |
tree | 3dff921addd5d5bc9cf7fda1a7b5e27f65d4bedb | |
parent | 8ca0a51347dc2dbd104e475081c6f13e8a717803 (diff) |
[musicdb] utilize AddAlbum() and UpdateDatabase*Info() in the scanner rather than adding song by song, artist by artist
-rw-r--r-- | xbmc/music/Artist.h | 2 | ||||
-rw-r--r-- | xbmc/music/infoscanner/MusicInfoScanner.cpp | 197 |
2 files changed, 40 insertions, 159 deletions
diff --git a/xbmc/music/Artist.h b/xbmc/music/Artist.h index 5be55e5793..daa28a079b 100644 --- a/xbmc/music/Artist.h +++ b/xbmc/music/Artist.h @@ -124,9 +124,11 @@ public: std::string GetArtist() const { return m_strArtist; } std::string GetMusicBrainzArtistID() const { return m_strMusicBrainzArtistID; } std::string GetJoinPhrase() const { return m_strJoinPhrase; } + int GetArtistId() const { return idArtist; } void SetArtist(const std::string &strArtist) { m_strArtist = strArtist; } void SetMusicBrainzArtistID(const std::string &strMusicBrainzArtistID) { m_strMusicBrainzArtistID = strMusicBrainzArtistID; } void SetJoinPhrase(const std::string &strJoinPhrase) { m_strJoinPhrase = strJoinPhrase; } + void SetArtistId(int idArtist) { this->idArtist = idArtist; } private: long idArtist; diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp index 29c2592434..098c77919b 100644 --- a/xbmc/music/infoscanner/MusicInfoScanner.cpp +++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp @@ -714,182 +714,61 @@ int CMusicInfoScanner::RetrieveMusicInfo(const CStdString& strDirectory, CFileIt break; album->strPath = strDirectory; - m_musicDatabase.BeginTransaction(); - - // Check if the album has already been downloaded or failed - map<CAlbum, CAlbum>::iterator cachedAlbum = m_albumCache.find(*album); - if (cachedAlbum == m_albumCache.end()) + m_musicDatabase.AddAlbum(*album); + if ((m_flags & SCAN_ONLINE)) { - // No - download the information - CMusicAlbumInfo albumInfo; - INFO_RET albumDownloadStatus = INFO_NOT_FOUND; - if ((m_flags & SCAN_ONLINE) && albumScraper) - albumDownloadStatus = DownloadAlbumInfo(*album, albumScraper, albumInfo); - - if (albumDownloadStatus == INFO_ADDED || albumDownloadStatus == INFO_HAVE_ALREADY) - { - CAlbum &downloadedAlbum = albumInfo.GetAlbum(); - album->MergeScrapedAlbum(downloadedAlbum); - downloadedAlbum.idAlbum = m_musicDatabase.AddAlbum(*album); - m_musicDatabase.SetArtForItem(downloadedAlbum.idAlbum, - "album", album->art); - GetAlbumArtwork(downloadedAlbum.idAlbum, downloadedAlbum); - m_albumCache.insert(make_pair(*album, albumInfo.GetAlbum())); - } - else if (albumDownloadStatus == INFO_CANCELLED) - break; - else - { - // No download info, fallback to already gathered (eg. local) information/art (if any) - m_musicDatabase.AddAlbum(*album); - if (!album->art.empty()) - m_musicDatabase.SetArtForItem(album->idAlbum, - "album", album->art); - m_albumCache.insert(make_pair(*album, *album)); - } - - // Update the cache pointer with our newly created info - cachedAlbum = m_albumCache.find(*album); - } + if (!albumScraper || !artistScraper) + continue; - if (m_bStop) - break; + INFO_RET albumScrapeStatus = INFO_NOT_FOUND; + if (!m_musicDatabase.HasAlbumBeenScraped(album->idAlbum)) + albumScrapeStatus = UpdateDatabaseAlbumInfo(*album, albumScraper, false); - // Add the album artists - for (VECARTISTCREDITS::iterator artistCredit = cachedAlbum->second.artistCredits.begin(); artistCredit != cachedAlbum->second.artistCredits.end(); ++artistCredit) - { - if (m_bStop) - break; - - // Check if the artist has already been downloaded or failed - map<CArtistCredit, CArtist>::iterator cachedArtist = m_artistCache.find(*artistCredit); - if (cachedArtist == m_artistCache.end()) + if (albumScrapeStatus == INFO_ADDED) { - CArtist artistTmp; - artistTmp.strArtist = artistCredit->GetArtist(); - artistTmp.strMusicBrainzArtistID = artistCredit->GetMusicBrainzArtistID(); - URIUtils::GetParentPath(album->strPath, artistTmp.strPath); - - // No - download the information - CMusicArtistInfo artistInfo; - INFO_RET artistDownloadStatus = INFO_NOT_FOUND; - if ((m_flags & SCAN_ONLINE) && artistScraper) - artistDownloadStatus = DownloadArtistInfo(artistTmp, artistScraper, artistInfo); - - if (artistDownloadStatus == INFO_ADDED || artistDownloadStatus == INFO_HAVE_ALREADY) - { - CArtist &downloadedArtist = artistInfo.GetArtist(); - artistTmp.MergeScrapedArtist(downloadedArtist); - artistTmp.idArtist = m_musicDatabase.AddArtist(artistTmp.strArtist, artistTmp.strMusicBrainzArtistID); - m_musicDatabase.UpdateArtist(artistTmp); - URIUtils::GetParentPath(album->strPath, downloadedArtist.strPath); - map<string, string> artwork = GetArtistArtwork(downloadedArtist); - // check thumb stuff - m_musicDatabase.SetArtForItem(artistTmp.idArtist, "artist", artwork); - m_artistCache.insert(make_pair(*artistCredit, artistTmp)); - } - else if (artistDownloadStatus == INFO_CANCELLED) - break; - else + for (VECARTISTCREDITS::const_iterator artistCredit = album->artistCredits.begin(); + artistCredit != album->artistCredits.end(); + ++artistCredit) { - // Cache the lookup failure so we don't retry - artistTmp.idArtist = m_musicDatabase.AddArtist(artistCredit->GetArtist(), artistCredit->GetMusicBrainzArtistID()); - m_artistCache.insert(make_pair(*artistCredit, artistTmp)); - } - - // Update the cache pointer with our newly created info - cachedArtist = m_artistCache.find(*artistCredit); - } - - m_musicDatabase.AddAlbumArtist(cachedArtist->second.idArtist, - cachedAlbum->second.idAlbum, - artistCredit->GetJoinPhrase(), - artistCredit == cachedAlbum->second.artistCredits.begin() ? false : true, - std::distance(cachedAlbum->second.artistCredits.begin(), artistCredit)); - } - - if (m_bStop) - break; - - for (VECSONGS::iterator song = album->songs.begin(); song != album->songs.end(); ++song) - { - song->idAlbum = cachedAlbum->second.idAlbum; - song->idSong = m_musicDatabase.AddSong(cachedAlbum->second.idAlbum, - song->strTitle, song->strMusicBrainzTrackID, - song->strFileName, song->strComment, - song->strThumb, - StringUtils::Join(song->artist, g_advancedSettings.m_musicItemSeparator), song->genre, - song->iTrack, song->iDuration, song->iYear, - song->iTimesPlayed, song->iStartOffset, - song->iEndOffset, - song->lastPlayed, - song->rating, - song->iKaraokeNumber); - for (VECARTISTCREDITS::iterator artistCredit = song->artistCredits.begin(); artistCredit != song->artistCredits.end(); ++artistCredit) - { - if (m_bStop) - break; + if (m_bStop) + break; - // Check if the artist has already been downloaded or failed - map<CArtistCredit, CArtist>::iterator cachedArtist = m_artistCache.find(*artistCredit); - if (cachedArtist == m_artistCache.end()) - { - CArtist artistTmp; - artistTmp.strArtist = artistCredit->GetArtist(); - artistTmp.strMusicBrainzArtistID = artistCredit->GetMusicBrainzArtistID(); - URIUtils::GetParentPath(album->strPath, artistTmp.strPath); // FIXME - - // No - download the information - CMusicArtistInfo artistInfo; - INFO_RET artistDownloadStatus = INFO_NOT_FOUND; - if ((m_flags & SCAN_ONLINE) && artistScraper) - artistDownloadStatus = DownloadArtistInfo(artistTmp, artistScraper, artistInfo); - - if (artistDownloadStatus == INFO_ADDED || artistDownloadStatus == INFO_HAVE_ALREADY) + if (!m_musicDatabase.HasArtistBeenScraped(artistCredit->GetArtistId())) { - CArtist &downloadedArtist = artistInfo.GetArtist(); - artistTmp.MergeScrapedArtist(downloadedArtist); - artistTmp.idArtist = m_musicDatabase.AddArtist(artistTmp.strArtist, - artistTmp.strMusicBrainzArtistID); - m_musicDatabase.UpdateArtist(artistTmp); - // check thumb stuff - URIUtils::GetParentPath(album->strPath, artistTmp.strPath); - map<string, string> artwork = GetArtistArtwork(artistTmp); - m_musicDatabase.SetArtForItem(artistTmp.idArtist, "artist", artwork); - m_artistCache.insert(make_pair(*artistCredit, artistTmp)); + CArtist artist; + m_musicDatabase.GetArtist(artistCredit->GetArtistId(), artist); + UpdateDatabaseArtistInfo(artist, artistScraper, false); } - else if (artistDownloadStatus == INFO_CANCELLED) + } + + for (VECSONGS::iterator song = album->songs.begin(); + song != album->songs.end(); + song++) + { + if (m_bStop) break; - else + + for (VECARTISTCREDITS::const_iterator artistCredit = song->artistCredits.begin(); + artistCredit != song->artistCredits.end(); + ++artistCredit) { - // Cache the lookup failure so we don't retry - artistTmp.idArtist = m_musicDatabase.AddArtist(artistCredit->GetArtist(), artistCredit->GetMusicBrainzArtistID()); - m_artistCache.insert(make_pair(*artistCredit, artistTmp)); - } + if (m_bStop) + break; - // Update the cache pointer with our newly created info - cachedArtist = m_artistCache.find(*artistCredit); + CMusicArtistInfo musicArtistInfo; + if (!m_musicDatabase.HasArtistBeenScraped(artistCredit->GetArtistId())) + { + CArtist artist; + m_musicDatabase.GetArtist(artistCredit->GetArtistId(), artist); + UpdateDatabaseArtistInfo(artist, artistScraper, false); + } + } } - - m_musicDatabase.AddSongArtist(cachedArtist->second.idArtist, - song->idSong, - g_advancedSettings.m_musicItemSeparator, // we don't have song artist breakdowns from scrapers, yet - artistCredit == song->artistCredits.begin() ? false : true, - std::distance(song->artistCredits.begin(), artistCredit)); } } - - if (m_bStop) - break; - - // Commit the album to the DB - m_musicDatabase.CommitTransaction(); numAdded += album->songs.size(); } - if (m_bStop) - m_musicDatabase.RollbackTransaction(); - if (m_handle) m_handle->SetTitle(g_localizeStrings.Get(505)); |