JSONRPC_STATUS CAudioLibrary::SetAlbumDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { int id = (int)parameterObject["albumid"].asInteger(); CMusicDatabase musicdatabase; if (!musicdatabase.Open()) return InternalError; CAlbum album; // Get current album details, but not songs as we do not want to update them here if (!musicdatabase.GetAlbum(id, album, false) || album.idAlbum <= 0) return InvalidParams; if (ParameterNotNull(parameterObject, "title")) album.strAlbum = parameterObject["title"].asString(); if (ParameterNotNull(parameterObject, "displayartist")) album.strArtistDesc = parameterObject["displayartist"].asString(); // Set album sort string before processing artist credits if (ParameterNotNull(parameterObject, "sortartist")) album.strArtistSort = parameterObject["sortartist"].asString(); // Match up artist names and mbids to make new artist credits // Mbid values only apply if there are names if (ParameterNotNull(parameterObject, "artist")) { std::vector<std::string> artists; std::vector<std::string> mbids; CopyStringArray(parameterObject["artist"], artists); // Check for Musicbrainz ids if (ParameterNotNull(parameterObject, "musicbrainzalbumartistid")) CopyStringArray(parameterObject["musicbrainzalbumartistid"], mbids); // When display artist is not provided and yet artists is changing make by concatenation if (!ParameterNotNull(parameterObject, "displayartist")) album.strArtistDesc = StringUtils::Join(artists, g_advancedSettings.m_musicItemSeparator); album.SetArtistCredits(artists, std::vector<std::string>(), mbids); // On updatealbum artists will be changed album.bArtistSongMerge = true; } if (ParameterNotNull(parameterObject, "description")) album.strReview = parameterObject["description"].asString(); if (ParameterNotNull(parameterObject, "genre")) CopyStringArray(parameterObject["genre"], album.genre); if (ParameterNotNull(parameterObject, "theme")) CopyStringArray(parameterObject["theme"], album.themes); if (ParameterNotNull(parameterObject, "mood")) CopyStringArray(parameterObject["mood"], album.moods); if (ParameterNotNull(parameterObject, "style")) CopyStringArray(parameterObject["style"], album.styles); if (ParameterNotNull(parameterObject, "type")) album.strType = parameterObject["type"].asString(); if (ParameterNotNull(parameterObject, "albumlabel")) album.strLabel = parameterObject["albumlabel"].asString(); if (ParameterNotNull(parameterObject, "rating")) album.fRating = parameterObject["rating"].asFloat(); if (ParameterNotNull(parameterObject, "userrating")) album.iUserrating = parameterObject["userrating"].asInteger(); if (ParameterNotNull(parameterObject, "votes")) album.iVotes = parameterObject["votes"].asInteger(); if (ParameterNotNull(parameterObject, "year")) album.iYear = (int)parameterObject["year"].asInteger(); if (ParameterNotNull(parameterObject, "musicbrainzalbumid")) album.strMusicBrainzAlbumID = parameterObject["musicbrainzalbumid"].asString(); if (ParameterNotNull(parameterObject, "musicbrainzreleasegroupid")) album.strReleaseGroupMBID = parameterObject["musicbrainzreleasegroupid"].asString(); // Update existing art. Any existing artwork that isn't specified in this request stays as is. // If the value is null then the existing art with that type is removed. if (ParameterNotNull(parameterObject, "art")) { // Get current artwork musicdatabase.GetArtForItem(album.idAlbum, MediaTypeAlbum, album.art); std::set<std::string> removedArtwork; CVariant art = parameterObject["art"]; for (CVariant::const_iterator_map artIt = art.begin_map(); artIt != art.end_map(); artIt++) { if (artIt->second.isString() && !artIt->second.asString().empty()) album.art[artIt->first] = CTextureUtils::UnwrapImageURL(artIt->second.asString()); else if (artIt->second.isNull()) { album.art.erase(artIt->first); removedArtwork.insert(artIt->first); } } // Remove null art now, as not done by update if (!musicdatabase.RemoveArtForItem(album.idAlbum, MediaTypeAlbum, removedArtwork)) return InternalError; } // Update artist including adding or replacing (but not removing) art if (!musicdatabase.UpdateAlbum(album)) return InternalError; CJSONRPCUtils::NotifyItemUpdated(); return ACK; }
JSONRPC_STATUS CAudioLibrary::SetSongDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { int id = (int)parameterObject["songid"].asInteger(); CMusicDatabase musicdatabase; if (!musicdatabase.Open()) return InternalError; CSong song; if (!musicdatabase.GetSong(id, song) || song.idSong != id) return InvalidParams; if (ParameterNotNull(parameterObject, "title")) song.strTitle = parameterObject["title"].asString(); if (ParameterNotNull(parameterObject, "displayartist")) song.strArtistDesc = parameterObject["displayartist"].asString(); // Set album sort string before processing artist credits if (ParameterNotNull(parameterObject, "sortartist")) song.strArtistSort = parameterObject["sortartist"].asString(); // Match up artist names and mbids to make new artist credits // Mbid values only apply if there are names bool updateartists = false; if (ParameterNotNull(parameterObject, "artist")) { std::vector<std::string> artists, mbids; updateartists = true; CopyStringArray(parameterObject["artist"], artists); // Check for Musicbrainz ids if (ParameterNotNull(parameterObject, "musicbrainzartistid")) CopyStringArray(parameterObject["musicbrainzartistid"], mbids); // When display artist is not provided and yet artists is changing make by concatenation if (!ParameterNotNull(parameterObject, "displayartist")) song.strArtistDesc = StringUtils::Join(artists, g_advancedSettings.m_musicItemSeparator); song.SetArtistCredits(artists, std::vector<std::string>(), mbids); } if (ParameterNotNull(parameterObject, "genre")) CopyStringArray(parameterObject["genre"], song.genre); if (ParameterNotNull(parameterObject, "year")) song.iYear = (int)parameterObject["year"].asInteger(); if (ParameterNotNull(parameterObject, "rating")) song.rating = parameterObject["rating"].asFloat(); if (ParameterNotNull(parameterObject, "userrating")) song.userrating = parameterObject["userrating"].asInteger(); if (ParameterNotNull(parameterObject, "track")) song.iTrack = (song.iTrack & 0xffff0000) | ((int)parameterObject["track"].asInteger() & 0xffff); if (ParameterNotNull(parameterObject, "disc")) song.iTrack = (song.iTrack & 0xffff) | ((int)parameterObject["disc"].asInteger() << 16); if (ParameterNotNull(parameterObject, "duration")) song.iDuration = (int)parameterObject["duration"].asInteger(); if (ParameterNotNull(parameterObject, "comment")) song.strComment = parameterObject["comment"].asString(); if (ParameterNotNull(parameterObject, "musicbrainztrackid")) song.strMusicBrainzTrackID = parameterObject["musicbrainztrackid"].asString(); if (ParameterNotNull(parameterObject, "playcount")) song.iTimesPlayed = static_cast<int>(parameterObject["playcount"].asInteger()); if (ParameterNotNull(parameterObject, "lastplayed")) song.lastPlayed.SetFromDBDateTime(parameterObject["lastplayed"].asString()); if (ParameterNotNull(parameterObject, "mood")) song.strAlbum = parameterObject["mood"].asString(); // Update existing art. Any existing artwork that isn't specified in this request stays as is. // If the value is null then the existing art with that type is removed. if (ParameterNotNull(parameterObject, "art")) { // Get current artwork std::map<std::string, std::string> artwork; musicdatabase.GetArtForItem(song.idSong, MediaTypeSong, artwork); std::set<std::string> removedArtwork; CVariant art = parameterObject["art"]; for (CVariant::const_iterator_map artIt = art.begin_map(); artIt != art.end_map(); artIt++) { if (artIt->second.isString() && !artIt->second.asString().empty()) artwork[artIt->first] = CTextureUtils::UnwrapImageURL(artIt->second.asString()); else if (artIt->second.isNull()) { artwork.erase(artIt->first); removedArtwork.insert(artIt->first); } } //Update artwork, not done in update song musicdatabase.SetArtForItem(song.idSong, MediaTypeSong, artwork); if (!musicdatabase.RemoveArtForItem(song.idSong, MediaTypeSong, removedArtwork)) return InternalError; } // Update song (not including artwork) if (!musicdatabase.UpdateSong(song, updateartists)) return InternalError; CJSONRPCUtils::NotifyItemUpdated(); return ACK; }
JSONRPC_STATUS CAudioLibrary::SetArtistDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { int id = (int)parameterObject["artistid"].asInteger(); CMusicDatabase musicdatabase; if (!musicdatabase.Open()) return InternalError; CArtist artist; if (!musicdatabase.GetArtist(id, artist) || artist.idArtist <= 0) return InvalidParams; if (ParameterNotNull(parameterObject, "artist")) artist.strArtist = parameterObject["artist"].asString(); if (ParameterNotNull(parameterObject, "instrument")) CopyStringArray(parameterObject["instrument"], artist.instruments); if (ParameterNotNull(parameterObject, "style")) CopyStringArray(parameterObject["style"], artist.styles); if (ParameterNotNull(parameterObject, "mood")) CopyStringArray(parameterObject["mood"], artist.moods); if (ParameterNotNull(parameterObject, "born")) artist.strBorn = parameterObject["born"].asString(); if (ParameterNotNull(parameterObject, "formed")) artist.strFormed = parameterObject["formed"].asString(); if (ParameterNotNull(parameterObject, "description")) artist.strBiography = parameterObject["description"].asString(); if (ParameterNotNull(parameterObject, "genre")) CopyStringArray(parameterObject["genre"], artist.genre); if (ParameterNotNull(parameterObject, "died")) artist.strDied = parameterObject["died"].asString(); if (ParameterNotNull(parameterObject, "disbanded")) artist.strDisbanded = parameterObject["disbanded"].asString(); if (ParameterNotNull(parameterObject, "yearsactive")) CopyStringArray(parameterObject["yearsactive"], artist.yearsActive); if (ParameterNotNull(parameterObject, "musicbrainzartistid")) artist.strMusicBrainzArtistID = parameterObject["musicbrainzartistid"].asString(); if (ParameterNotNull(parameterObject, "sortname")) artist.strSortName = parameterObject["sortname"].asString(); if (ParameterNotNull(parameterObject, "type")) artist.strType = parameterObject["type"].asString(); if (ParameterNotNull(parameterObject, "gender")) artist.strGender = parameterObject["gender"].asString(); if (ParameterNotNull(parameterObject, "disambiguation")) artist.strDisambiguation = parameterObject["disambiguation"].asString(); // Update existing art. Any existing artwork that isn't specified in this request stays as is. // If the value is null then the existing art with that type is removed. if (ParameterNotNull(parameterObject, "art")) { // Get current artwork musicdatabase.GetArtForItem(artist.idArtist, MediaTypeArtist, artist.art); std::set<std::string> removedArtwork; CVariant art = parameterObject["art"]; for (CVariant::const_iterator_map artIt = art.begin_map(); artIt != art.end_map(); artIt++) { if (artIt->second.isString() && !artIt->second.asString().empty()) artist.art[artIt->first] = CTextureUtils::UnwrapImageURL(artIt->second.asString()); else if (artIt->second.isNull()) { artist.art.erase(artIt->first); removedArtwork.insert(artIt->first); } } // Remove null art now, as not done by update if (!musicdatabase.RemoveArtForItem(artist.idArtist, MediaTypeArtist, removedArtwork)) return InternalError; } // Update artist including adding or replacing (but not removing) art if (!musicdatabase.UpdateArtist(artist)) return InternalError; CJSONRPCUtils::NotifyItemUpdated(); return ACK; }