Skip to content

Commit

Permalink
[musicdb] Change the way we add artists to use MusicBrainzIDs
Browse files Browse the repository at this point in the history
  • Loading branch information
night199uk committed Sep 20, 2012
1 parent e8384d3 commit f9c5d00
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 24 deletions.
48 changes: 25 additions & 23 deletions xbmc/music/MusicDatabase.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -320,17 +320,23 @@ int CMusicDatabase::AddFileItem(const CFileItem& pItem, const VECALBUMS& albumHi
DeleteValues("song_genre", PrepareSQL("idSong = %d", idSong)); DeleteValues("song_genre", PrepareSQL("idSong = %d", idSong));


// Add the artists // Add the artists
const vector<string>& albumArtist = tag.GetAlbumArtist().empty() ? albumArtistHint : tag.GetAlbumArtist(); bool musicBrainz = g_advancedSettings.m_bMusicLibraryUseMusicBrainz && !tag.GetMusicBrainzArtistID().empty();
for (unsigned int index = 0; index < albumArtist.size(); index++) const vector<string>& artists = musicBrainz ? tag.GetMusicBrainzArtistID() : tag.GetArtist();
for (vector<string>::const_iterator it = artists.begin(); it != artists.end(); ++it)
{ {
int idAlbumArtist = AddArtist(albumArtist[index]); int idArtist = AddArtist(*it, musicBrainz ? *it : "");
AddAlbumArtist(idAlbumArtist, idAlbum, index > 0 ? true : false, index); AddSongArtist(idArtist, idSong, it - artists.begin() > 0, it - artists.begin());
} }


for (unsigned int index = 0; index < tag.GetArtist().size(); index++) // Add the album artists - first priority musicBrainz, second album artist tag, finally album artist hint
musicBrainz = g_advancedSettings.m_bMusicLibraryUseMusicBrainz && !tag.GetMusicBrainzAlbumArtistID().empty();
bool hasAlbumArtist = !tag.GetAlbumArtist().empty();
const vector<string>& albumArtists = musicBrainz ? tag.GetMusicBrainzAlbumArtistID() :
(hasAlbumArtist ? tag.GetAlbumArtist() : albumArtistHint);
for (vector<string>::const_iterator it = albumArtists.begin(); it != albumArtists.end(); ++it)
{ {
int idArtist = AddArtist(tag.GetArtist()[index]); int idAlbumArtist = AddArtist(*it, musicBrainz ? *it : "");
AddSongArtist(idArtist, idSong, index > 0 ? true : false, index); AddAlbumArtist(idAlbumArtist, idAlbum, it - artists.begin() > 0, it - albumArtists.begin());
} }


unsigned int index = 0; unsigned int index = 0;
Expand Down Expand Up @@ -610,7 +616,7 @@ int CMusicDatabase::AddGenre(const CStdString& strGenre1)
return -1; return -1;
} }


int CMusicDatabase::AddArtist(const CStdString& strArtist1) int CMusicDatabase::AddArtist(const CStdString& strArtist1, const CStdString& strMusicBrainzArtistID)
{ {
CStdString strSQL; CStdString strSQL;
try try
Expand All @@ -625,29 +631,27 @@ int CMusicDatabase::AddArtist(const CStdString& strArtist1)
if (NULL == m_pDB.get()) return -1; if (NULL == m_pDB.get()) return -1;
if (NULL == m_pDS.get()) return -1; if (NULL == m_pDS.get()) return -1;


map <CStdString, int>::const_iterator it; strSQL = PrepareSQL("SELECT * FROM artist WHERE ");

if (strMusicBrainzArtistID.empty())
it = m_artistCache.find(strArtist); strSQL += PrepareSQL("strArtist = '%s'", strArtist.c_str());
if (it != m_artistCache.end()) else
return it->second;//.idArtist; strSQL += PrepareSQL("strMusicBrainzArtistID = '%s'", strMusicBrainzArtistID.c_str());


strSQL=PrepareSQL("select * from artist where strArtist like '%s'", strArtist.c_str());
m_pDS->query(strSQL.c_str()); m_pDS->query(strSQL.c_str());

if (m_pDS->num_rows() == 0) if (m_pDS->num_rows() == 0)
{ {
m_pDS->close(); m_pDS->close();
// doesnt exists, add it if (strMusicBrainzArtistID.empty())
strSQL=PrepareSQL("insert into artist (idArtist, strArtist) values( NULL, '%s' )", strArtist.c_str()); strSQL = PrepareSQL("INSERT INTO artist (idArtist, strArtist, strMusicBrainzArtistID) VALUES ( NULL, '%s', NULL )", strArtist.c_str());
else
strSQL = PrepareSQL("INSERT INTO artist (idArtist, strArtist, strMusicBrainzArtistID) VALUES ( NULL, '%s', '%s' )", strArtist.c_str(), strMusicBrainzArtistID.c_str());
m_pDS->exec(strSQL.c_str()); m_pDS->exec(strSQL.c_str());
int idArtist = (int)m_pDS->lastinsertid(); int idArtist = (int)m_pDS->lastinsertid();
m_artistCache.insert(pair<CStdString, int>(strArtist1, idArtist));
return idArtist; return idArtist;
} }
else else
{ {
int idArtist = (int)m_pDS->fv("idArtist").get_asInt(); int idArtist = (int)m_pDS->fv("idArtist").get_asInt();
m_artistCache.insert(pair<CStdString, int>(strArtist1, idArtist));
m_pDS->close(); m_pDS->close();
return idArtist; return idArtist;
} }
Expand Down Expand Up @@ -1177,7 +1181,7 @@ bool CMusicDatabase::SearchArtists(const CStdString& search, CFileItemList &arti
if (NULL == m_pDS.get()) return false; if (NULL == m_pDS.get()) return false;


// Exclude "Various Artists" // Exclude "Various Artists"
int idVariousArtist = AddArtist(g_localizeStrings.Get(340)); int idVariousArtist = AddArtist(g_localizeStrings.Get(340), "");


CStdString strSQL; CStdString strSQL;
if (search.GetLength() >= MIN_FULL_SEARCH_LENGTH) if (search.GetLength() >= MIN_FULL_SEARCH_LENGTH)
Expand Down Expand Up @@ -1800,7 +1804,6 @@ bool CMusicDatabase::GetSongsByPath(const CStdString& strPath1, MAPSONGS& songs,


void CMusicDatabase::EmptyCache() void CMusicDatabase::EmptyCache()
{ {
m_artistCache.erase(m_artistCache.begin(), m_artistCache.end());
m_genreCache.erase(m_genreCache.begin(), m_genreCache.end()); m_genreCache.erase(m_genreCache.begin(), m_genreCache.end());
m_pathCache.erase(m_pathCache.begin(), m_pathCache.end()); m_pathCache.erase(m_pathCache.begin(), m_pathCache.end());
m_albumCache.erase(m_albumCache.begin(), m_albumCache.end()); m_albumCache.erase(m_albumCache.begin(), m_albumCache.end());
Expand Down Expand Up @@ -2239,7 +2242,7 @@ bool CMusicDatabase::CleanupArtists()
// must be executed AFTER the song, album and their artist link tables are cleaned. // must be executed AFTER the song, album and their artist link tables are cleaned.
// don't delete the "Various Artists" string // don't delete the "Various Artists" string
CStdString strVariousArtists = g_localizeStrings.Get(340); CStdString strVariousArtists = g_localizeStrings.Get(340);
int idVariousArtists = AddArtist(strVariousArtists); int idVariousArtists = AddArtist(strVariousArtists, "");
CStdString strSQL = "delete from artist where idArtist not in (select idArtist from song_artist)"; CStdString strSQL = "delete from artist where idArtist not in (select idArtist from song_artist)";
strSQL += " and idArtist not in (select idArtist from album_artist)"; strSQL += " and idArtist not in (select idArtist from album_artist)";
CStdString strSQL2; CStdString strSQL2;
Expand Down Expand Up @@ -2820,7 +2823,6 @@ bool CMusicDatabase::GetArtistsNav(const CStdString& strBaseDir, CFileItemList&
musicUrl.AddOption("songid", idSong); musicUrl.AddOption("songid", idSong);


musicUrl.AddOption("albumartistsonly", albumArtistsOnly); musicUrl.AddOption("albumartistsonly", albumArtistsOnly);

Filter filter; Filter filter;
bool result = GetArtistsByWhere(musicUrl.ToString(), filter, items, sortDescription); bool result = GetArtistsByWhere(musicUrl.ToString(), filter, items, sortDescription);
CLog::Log(LOGDEBUG,"Time to retrieve artists from dataset = %i", XbmcThreads::SystemClockMillis() - time); CLog::Log(LOGDEBUG,"Time to retrieve artists from dataset = %i", XbmcThreads::SystemClockMillis() - time);
Expand Down
2 changes: 1 addition & 1 deletion xbmc/music/MusicDatabase.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ class CMusicDatabase : public CDatabase
int AddSong(const CStdString& strTitle, const CStdString& strArtists, int idAlbum, const CStdString& strPathAndFileName, const CStdString& strGenres, int iTrack, int iDuration, int iYear, const CStdString& strMusicBrainzTrackID, const CStdString& strComment, int iStartOffset, int iEndOffset); int AddSong(const CStdString& strTitle, const CStdString& strArtists, int idAlbum, const CStdString& strPathAndFileName, const CStdString& strGenres, int iTrack, int iDuration, int iYear, const CStdString& strMusicBrainzTrackID, const CStdString& strComment, int iStartOffset, int iEndOffset);
int AddAlbum(const CStdString& strAlbum1, const CStdString &strArtist1, const CStdString& strMusicBrainzAlbumID, const CStdString& strGenre, int year, bool bCompilation); int AddAlbum(const CStdString& strAlbum1, const CStdString &strArtist1, const CStdString& strMusicBrainzAlbumID, const CStdString& strGenre, int year, bool bCompilation);
int AddGenre(const CStdString& strGenre); int AddGenre(const CStdString& strGenre);
int AddArtist(const CStdString& strArtist); int AddArtist(const CStdString& strArtist1, const CStdString& strMusicBrainzArtistID);
int AddPath(const CStdString& strPath); int AddPath(const CStdString& strPath);


bool AddAlbumArtist(int idArtist, int idAlbum, bool featured, int iOrder); bool AddAlbumArtist(int idArtist, int idAlbum, bool featured, int iOrder);
Expand Down

0 comments on commit f9c5d00

Please sign in to comment.