Skip to content

Commit

Permalink
[musicdb] adds UpdateArtist() as a replacement for SetArtistInfo()
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonathan Marshall committed Dec 24, 2013
1 parent f5ffcd2 commit 7ccc6a2
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 95 deletions.
2 changes: 1 addition & 1 deletion xbmc/interfaces/json-rpc/AudioLibrary.cpp
Expand Up @@ -423,7 +423,7 @@ JSONRPC_STATUS CAudioLibrary::SetArtistDetails(const CStdString &method, ITransp
if (ParameterNotNull(parameterObject, "yearsactive"))
CopyStringArray(parameterObject["yearsactive"], artist.yearsActive);

if (musicdatabase.SetArtistInfo(id, artist) <= 0)
if (musicdatabase.UpdateArtist(artist) <= 0)
return InternalError;

CJSONRPCUtils::NotifyItemUpdated();
Expand Down
157 changes: 93 additions & 64 deletions xbmc/music/MusicDatabase.cpp
Expand Up @@ -1022,6 +1022,32 @@ int CMusicDatabase::AddGenre(const CStdString& strGenre1)
return -1;
}

bool CMusicDatabase::UpdateArtist(const CArtist& artist)
{
UpdateArtist(artist.idArtist,
artist.strArtist, artist.strMusicBrainzArtistID,
artist.strBorn, artist.strFormed,
StringUtils::Join(artist.genre, g_advancedSettings.m_musicItemSeparator),
StringUtils::Join(artist.moods, g_advancedSettings.m_musicItemSeparator),
StringUtils::Join(artist.styles, g_advancedSettings.m_musicItemSeparator),
StringUtils::Join(artist.instruments, g_advancedSettings.m_musicItemSeparator),
artist.strBiography, artist.strDied,
artist.strDisbanded,
StringUtils::Join(artist.yearsActive, g_advancedSettings.m_musicItemSeparator).c_str(),
artist.thumbURL.m_xml.c_str(),
artist.fanart.m_xml.c_str());

DeleteArtistDiscography(artist.idArtist);
for (std::vector<std::pair<CStdString,CStdString> >::const_iterator disc = artist.discography.begin();
disc != artist.discography.end();
++disc)
{
AddArtistDiscography(artist.idArtist, disc->first, disc->second);
}

return true;
}

int CMusicDatabase::AddArtist(const CStdString& strArtist, const CStdString& strMusicBrainzArtistID)
{
CStdString strSQL;
Expand Down Expand Up @@ -1103,6 +1129,48 @@ int CMusicDatabase::AddArtist(const CStdString& strArtist, const CStdString& str
return -1;
}

int CMusicDatabase::UpdateArtist(int idArtist,
const CStdString& strArtist, const CStdString& strMusicBrainzArtistID,
const CStdString& strBorn, const CStdString& strFormed,
const CStdString& strGenres, const CStdString& strMoods,
const CStdString& strStyles, const CStdString& strInstruments,
const CStdString& strBiography, const CStdString& strDied,
const CStdString& strDisbanded, const CStdString& strYearsActive,
const CStdString& strImage, const CStdString& strFanart)
{
CScraperUrl thumbURL;
CFanart fanart;
std::vector<std::pair<CStdString,CStdString> > discography;
if (idArtist < 0)
return -1;

CStdString strSQL;
strSQL = PrepareSQL("UPDATE artist SET "
" strArtist = '%s', "
" strBorn = '%s', strFormed = '%s', strGenres = '%s', "
" strMoods = '%s', strStyles = '%s', strInstruments = '%s', "
" strBiography = '%s', strDied = '%s', strDisbanded = '%s', "
" strYearsActive = '%s', strImage = '%s', strFanart = '%s', "
" lastScraped = '%s'",
strArtist.c_str(), /* strMusicBrainzArtistID.c_str(), */
strBorn.c_str(), strFormed.c_str(), strGenres.c_str(),
strMoods.c_str(), strStyles.c_str(), strInstruments.c_str(),
strBiography.c_str(), strDied.c_str(), strDisbanded.c_str(),
strYearsActive.c_str(), strImage.c_str(), strFanart.c_str(),
CDateTime::GetCurrentDateTime().GetAsDBDateTime().c_str());
if (strMusicBrainzArtistID.empty())
strSQL += PrepareSQL(", strMusicBrainzArtistID = NULL");
else
strSQL += PrepareSQL(", strMusicBrainzArtistID = '%s'", strMusicBrainzArtistID.c_str());

strSQL += PrepareSQL(" WHERE idArtist = %i", idArtist);

bool status = ExecuteQuery(strSQL);
if (status)
AnnounceUpdate("artist", idArtist);
return idArtist;
}

bool CMusicDatabase::GetArtist(int idArtist, CArtist &artist, bool fetchAll /* = false */)
{
try
Expand Down Expand Up @@ -1163,6 +1231,21 @@ bool CMusicDatabase::ClearArtistLastScrapedTime(int idArtist)
return ExecuteQuery(strSQL);
}

int CMusicDatabase::AddArtistDiscography(int idArtist, const CStdString& strAlbum, const CStdString& strYear)
{
CStdString strSQL=PrepareSQL("INSERT INTO discography (idArtist, strAlbum, strYear) values(%i, '%s', '%s')",
idArtist,
strAlbum.c_str(),
strYear.c_str());
return ExecuteQuery(strSQL);
}

bool CMusicDatabase::DeleteArtistDiscography(int idArtist)
{
CStdString strSQL = PrepareSQL("DELETE FROM discography WHERE idArtist = %i", idArtist);
return ExecuteQuery(strSQL);
}

bool CMusicDatabase::AddSongArtist(int idArtist, int idSong, std::string joinPhrase, bool featured, int iOrder)
{
CStdString strSQL;
Expand Down Expand Up @@ -2213,65 +2296,6 @@ bool CMusicDatabase::SearchAlbums(const CStdString& search, CFileItemList &album
return false;
}

int CMusicDatabase::SetArtistInfo(int idArtist, const CArtist& artist)
{
CStdString strSQL;
try
{
if (NULL == m_pDB.get()) return -1;
if (NULL == m_pDS.get()) return -1;

// delete the discography info
strSQL=PrepareSQL("delete from discography where idArtist=%i", idArtist);
m_pDS->exec(strSQL.c_str());

// update our data
strSQL=PrepareSQL("UPDATE artist SET"
" strBorn = '%s',"
" strFormed = '%s',"
" strGenres = '%s',"
" strMoods = '%s',"
" strStyles = '%s',"
" strInstruments = '%s',"
" strBiography = '%s',"
" strDied = '%s',"
" strDisbanded = '%s',"
" strYearsActive = '%s',"
" strImage = '%s',"
" strFanart = '%s',"
" lastScraped = '%s' WHERE idArtist=%d",
artist.strBorn.c_str(),
artist.strFormed.c_str(),
StringUtils::Join(artist.genre, g_advancedSettings.m_musicItemSeparator).c_str(),
StringUtils::Join(artist.moods, g_advancedSettings.m_musicItemSeparator).c_str(),
StringUtils::Join(artist.styles, g_advancedSettings.m_musicItemSeparator).c_str(),
StringUtils::Join(artist.instruments, g_advancedSettings.m_musicItemSeparator).c_str(),
artist.strBiography.c_str(),
artist.strDied.c_str(),
artist.strDisbanded.c_str(),
StringUtils::Join(artist.yearsActive, g_advancedSettings.m_musicItemSeparator).c_str(),
artist.thumbURL.m_xml.c_str(),
artist.fanart.m_xml.c_str(),
CDateTime::GetCurrentDateTime().GetAsDBDateTime().c_str(),
idArtist);
m_pDS->exec(strSQL.c_str());
for (unsigned int i=0;i<artist.discography.size();++i)
{
strSQL=PrepareSQL("insert into discography (idArtist,strAlbum,strYear) values (%i,'%s','%s')",idArtist,artist.discography[i].first.c_str(),artist.discography[i].second.c_str());
m_pDS->exec(strSQL.c_str());
}

return idArtist;
}
catch (...)
{
CLog::Log(LOGERROR, "%s - failed with query (%s)", __FUNCTION__, strSQL.c_str());
}


return -1;
}

bool CMusicDatabase::CleanupSongsByIds(const CStdString &strSongIds)
{
try
Expand Down Expand Up @@ -5063,12 +5087,17 @@ void CMusicDatabase::ImportFromXML(const CStdString &xmlFile)
CStdString strTitle;
if (strnicmp(entry->Value(), "artist", 6) == 0)
{
CArtist artist;
artist.Load(entry);
strTitle = artist.strArtist;
int idArtist = GetArtistByName(artist.strArtist);
CArtist importedArtist;
importedArtist.Load(entry);
strTitle = importedArtist.strArtist;
int idArtist = GetArtistByName(importedArtist.strArtist);
if (idArtist > -1)
SetArtistInfo(idArtist,artist);
{
CArtist artist;
GetArtist(idArtist, artist);
artist.MergeScrapedArtist(importedArtist, true);
UpdateArtist(artist);
}

current++;
}
Expand Down
22 changes: 12 additions & 10 deletions xbmc/music/MusicDatabase.h
Expand Up @@ -243,12 +243,23 @@ class CMusicDatabase : public CDatabase
/////////////////////////////////////////////////
// Artist CRUD
/////////////////////////////////////////////////
bool UpdateArtist(const CArtist& artist);

int AddArtist(const CStdString& strArtist, const CStdString& strMusicBrainzArtistID);
bool GetArtist(int idArtist, CArtist& artist, bool fetchAll = true);
int UpdateArtist(int idArtist, const CArtist& artist);
int UpdateArtist(int idArtist,
const CStdString& strArtist, const CStdString& strMusicBrainzArtistID,
const CStdString& strBorn, const CStdString& strFormed,
const CStdString& strGenres, const CStdString& strMoods,
const CStdString& strStyles, const CStdString& strInstruments,
const CStdString& strBiography, const CStdString& strDied,
const CStdString& strDisbanded, const CStdString& strYearsActive,
const CStdString& strImage, const CStdString& strFanart);
bool DeleteArtist(int idArtist);
bool HasArtistBeenScraped(int idArtist);
bool ClearArtistLastScrapedTime(int idArtist);
int AddArtistDiscography(int idArtist, const CStdString& strAlbum, const CStdString& strYear);
bool DeleteArtistDiscography(int idArtist);

CStdString GetArtistById(int id);
int GetArtistByName(const CStdString& strArtist);
Expand All @@ -271,15 +282,6 @@ class CMusicDatabase : public CDatabase
CStdString GetGenreById(int id);
int GetGenreByName(const CStdString& strGenre);

/////////////////////////////////////////////////
// ArtistInfo
/////////////////////////////////////////////////
/*! \brief Check if an artist entity has additional metadata (scraped)
\param idArtist the id of the Artist to check
\return true or false - whether the artist has metadata
*/
int SetArtistInfo(int idArtist, const CArtist& artist);

/////////////////////////////////////////////////
// Link tables
/////////////////////////////////////////////////
Expand Down
38 changes: 18 additions & 20 deletions xbmc/music/infoscanner/MusicInfoScanner.cpp
Expand Up @@ -771,16 +771,14 @@ int CMusicInfoScanner::RetrieveMusicInfo(const CStdString& strDirectory, CFileIt
if (artistDownloadStatus == INFO_ADDED || artistDownloadStatus == INFO_HAVE_ALREADY)
{
CArtist &downloadedArtist = artistInfo.GetArtist();
downloadedArtist.idArtist = m_musicDatabase.AddArtist(downloadedArtist.strArtist,
downloadedArtist.strMusicBrainzArtistID);
m_musicDatabase.SetArtistInfo(downloadedArtist.idArtist,
downloadedArtist);

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(downloadedArtist.idArtist, "artist", artwork);
m_artistCache.insert(make_pair(*artistCredit, downloadedArtist));
m_musicDatabase.SetArtForItem(artistTmp.idArtist, "artist", artwork);
m_artistCache.insert(make_pair(*artistCredit, artistTmp));
}
else if (artistDownloadStatus == INFO_CANCELLED)
break;
Expand Down Expand Up @@ -842,15 +840,15 @@ int CMusicInfoScanner::RetrieveMusicInfo(const CStdString& strDirectory, CFileIt
if (artistDownloadStatus == INFO_ADDED || artistDownloadStatus == INFO_HAVE_ALREADY)
{
CArtist &downloadedArtist = artistInfo.GetArtist();
downloadedArtist.idArtist = m_musicDatabase.AddArtist(downloadedArtist.strArtist,
downloadedArtist.strMusicBrainzArtistID);
m_musicDatabase.SetArtistInfo(downloadedArtist.idArtist,
downloadedArtist);
artistTmp.MergeScrapedArtist(downloadedArtist);
artistTmp.idArtist = m_musicDatabase.AddArtist(artistTmp.strArtist,
artistTmp.strMusicBrainzArtistID);
m_musicDatabase.UpdateArtist(artistTmp);
// check thumb stuff
URIUtils::GetParentPath(album->strPath, downloadedArtist.strPath);
map<string, string> artwork = GetArtistArtwork(downloadedArtist);
m_musicDatabase.SetArtForItem(downloadedArtist.idArtist, "artist", artwork);
m_artistCache.insert(make_pair(*artistCredit, downloadedArtist));
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));
}
else if (artistDownloadStatus == INFO_CANCELLED)
break;
Expand Down Expand Up @@ -1075,13 +1073,13 @@ INFO_RET CMusicInfoScanner::UpdateDatabaseArtistInfo(const CStdString& strPath,
}
else if (artistDownloadStatus == INFO_ADDED)
{
artist.MergeScrapedArtist(artistInfo.GetArtist());
m_musicDatabase.Open();
m_musicDatabase.SetArtistInfo(params.GetArtistId(), artistInfo.GetArtist());
m_musicDatabase.GetArtistPath(params.GetArtistId(), artist.strPath);
map<string, string> artwork = GetArtistArtwork(artist);
m_musicDatabase.SetArtForItem(params.GetArtistId(), "artist", artwork);
artistInfo.SetLoaded();
m_musicDatabase.UpdateArtist(artist);
m_musicDatabase.GetArtistPath(artist.idArtist, artist.strPath);
m_musicDatabase.SetArtForItem(artist.idArtist, "artist", GetArtistArtwork(artist));
m_musicDatabase.Close();
artistInfo.SetLoaded();
}
return artistDownloadStatus;
}
Expand Down

0 comments on commit 7ccc6a2

Please sign in to comment.