JSONRPC_STATUS CAudioLibrary::GetAdditionalSongDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase) { if (!musicdatabase.Open()) return InternalError; std::set<std::string> checkProperties; checkProperties.insert("genreid"); checkProperties.insert("artistid"); checkProperties.insert("albumartistid"); std::set<std::string> additionalProperties; if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties)) return OK; for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; if (additionalProperties.find("genreid") != additionalProperties.end()) { std::vector<int> genreids; if (musicdatabase.GetGenresBySong(item->GetMusicInfoTag()->GetDatabaseId(), genreids)) { CVariant genreidObj(CVariant::VariantTypeArray); for (std::vector<int>::const_iterator genreid = genreids.begin(); genreid != genreids.end(); genreid++) genreidObj.push_back(*genreid); item->SetProperty("genreid", genreidObj); } } if (additionalProperties.find("artistid") != additionalProperties.end()) { std::vector<int> artistids; if (musicdatabase.GetArtistsBySong(item->GetMusicInfoTag()->GetDatabaseId(), true, artistids)) { CVariant artistidObj(CVariant::VariantTypeArray); for (std::vector<int>::const_iterator artistid = artistids.begin(); artistid != artistids.end(); artistid++) artistidObj.push_back(*artistid); item->SetProperty("artistid", artistidObj); } } if (additionalProperties.find("albumartistid") != additionalProperties.end() && item->GetMusicInfoTag()->GetAlbumId() > 0) { std::vector<int> albumartistids; if (musicdatabase.GetArtistsByAlbum(item->GetMusicInfoTag()->GetAlbumId(), true, albumartistids)) { CVariant albumartistidObj(CVariant::VariantTypeArray); for (std::vector<int>::const_iterator albumartistid = albumartistids.begin(); albumartistid != albumartistids.end(); albumartistid++) albumartistidObj.push_back(*albumartistid); item->SetProperty("albumartistid", albumartistidObj); } } } return OK; }
JSONRPC_STATUS CAudioLibrary::GetAdditionalSongDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase) { if (!musicdatabase.Open()) return InternalError; std::set<std::string> checkProperties; checkProperties.insert("genreid"); checkProperties.insert("sourceid"); // Query (songview join songartistview) returns song.strAlbumArtists = CMusicInfoTag.m_strAlbumArtistDesc only // Actual album artist data, if required, comes from album_artist and artist tables. // It may differ from just splitting album artist description string checkProperties.insert("albumartist"); checkProperties.insert("albumartistid"); checkProperties.insert("musicbrainzalbumartistid"); std::set<std::string> additionalProperties; if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties)) return OK; for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; if (additionalProperties.find("genreid") != additionalProperties.end()) { std::vector<int> genreids; if (musicdatabase.GetGenresBySong(item->GetMusicInfoTag()->GetDatabaseId(), genreids)) { CVariant genreidObj(CVariant::VariantTypeArray); for (std::vector<int>::const_iterator genreid = genreids.begin(); genreid != genreids.end(); ++genreid) genreidObj.push_back(*genreid); item->SetProperty("genreid", genreidObj); } } if (additionalProperties.find("sourceid") != additionalProperties.end()) { musicdatabase.GetSourcesBySong(item->GetMusicInfoTag()->GetDatabaseId(), item->GetPath(), item.get()); } if (item->GetMusicInfoTag()->GetAlbumId() > 0) { if (additionalProperties.find("albumartist") != additionalProperties.end() || additionalProperties.find("albumartistid") != additionalProperties.end() || additionalProperties.find("musicbrainzalbumartistid") != additionalProperties.end()) { musicdatabase.GetArtistsByAlbum(item->GetMusicInfoTag()->GetAlbumId(), item.get()); } } } return OK; }