aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Marshall <jmarshall@xbmc.org>2013-12-03 19:46:48 +1300
committerJonathan Marshall <jmarshall@xbmc.org>2013-12-24 13:48:58 +1300
commit5c0539b292c419cd1b6d1d1ae506a5e05e409b98 (patch)
tree3dff921addd5d5bc9cf7fda1a7b5e27f65d4bedb
parent8ca0a51347dc2dbd104e475081c6f13e8a717803 (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.h2
-rw-r--r--xbmc/music/infoscanner/MusicInfoScanner.cpp197
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));