std::string CMusicDatabaseFile::TranslateUrl(const CURL& url) { CMusicDatabase musicDatabase; if (!musicDatabase.Open()) return ""; std::string strFileName=URIUtils::GetFileName(url.Get()); std::string strExtension = URIUtils::GetExtension(strFileName); URIUtils::RemoveExtension(strFileName); if (!StringUtils::IsNaturalNumber(strFileName)) return ""; long idSong=atol(strFileName.c_str()); CSong song; if (!musicDatabase.GetSong(idSong, song)) return ""; StringUtils::ToLower(strExtension); if (!URIUtils::HasExtension(song.strFileName, strExtension)) return ""; return song.strFileName; }
bool CAudioLibrary::FillFileItemList(const CVariant ¶meterObject, CFileItemList &list) { CMusicDatabase musicdatabase; if (!musicdatabase.Open()) return false; CStdString file = parameterObject["file"].asString(); int artistID = (int)parameterObject["artistid"].asInteger(-1); int albumID = (int)parameterObject["albumid"].asInteger(-1); int genreID = (int)parameterObject["genreid"].asInteger(-1); bool success = false; CFileItemPtr fileItem(new CFileItem()); if (FillFileItem(file, fileItem, parameterObject)) { success = true; list.Add(fileItem); } if (artistID != -1 || albumID != -1 || genreID != -1) success |= musicdatabase.GetSongsNav("musicdb://songs/", list, genreID, artistID, albumID); int songID = (int)parameterObject["songid"].asInteger(-1); if (songID != -1) { CSong song; if (musicdatabase.GetSong(songID, song)) { list.Add(CFileItemPtr(new CFileItem(song))); success = true; } } if (success) { // If we retrieved the list of songs by "artistid" // we sort by album (and implicitly by track number) if (artistID != -1) list.Sort(SORT_METHOD_ALBUM_IGNORE_THE, SortOrderAscending); // If we retrieve the list of songs by "genreid" // we sort by artist (and implicitly by album and track number) else if (genreID != -1) list.Sort(SORT_METHOD_ARTIST_IGNORE_THE, SortOrderAscending); // otherwise we sort by track number else list.Sort(SORT_METHOD_TRACKNUM, SortOrderAscending); } return success; }
bool CAudioLibrary::FillFileItemList(const CVariant ¶meterObject, CFileItemList &list) { CMusicDatabase musicdatabase; if (!musicdatabase.Open()) return false; std::string file = parameterObject["file"].asString(); int artistID = (int)parameterObject["artistid"].asInteger(-1); int albumID = (int)parameterObject["albumid"].asInteger(-1); int genreID = (int)parameterObject["genreid"].asInteger(-1); bool success = false; CFileItemPtr fileItem(new CFileItem()); if (FillFileItem(file, fileItem, parameterObject)) { success = true; list.Add(fileItem); } if (artistID != -1 || albumID != -1 || genreID != -1) success |= musicdatabase.GetSongsNav("musicdb://songs/", list, genreID, artistID, albumID); int songID = (int)parameterObject["songid"].asInteger(-1); if (songID != -1) { CSong song; if (musicdatabase.GetSong(songID, song)) { list.Add(CFileItemPtr(new CFileItem(song))); success = true; } } if (success) { // If we retrieved the list of songs by "artistid" // we sort by album (and implicitly by track number) if (artistID != -1) list.Sort(SortByAlbum, SortOrderAscending, CServiceBroker::GetSettings().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); // If we retrieve the list of songs by "genreid" // we sort by artist (and implicitly by album and track number) else if (genreID != -1) list.Sort(SortByArtist, SortOrderAscending, CServiceBroker::GetSettings().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); // otherwise we sort by track number else list.Sort(SortByTrackNumber, SortOrderAscending); } return success; }
bool CMusicInfoTagLoaderDatabase::Load(const CStdString& strFileName, CMusicInfoTag& tag, EmbeddedArt *art) { tag.SetLoaded(false); CMusicDatabase database; database.Open(); XFILE::MUSICDATABASEDIRECTORY::CQueryParams param; XFILE::MUSICDATABASEDIRECTORY::CDirectoryNode::GetDatabaseInfo(strFileName,param); CSong song; if (database.GetSong(param.GetSongId(),song)) tag.SetSong(song); database.Close(); return tag.Loaded(); }
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, "artist")) CopyStringArray(parameterObject["artist"], song.artist); if (ParameterNotNull(parameterObject, "albumartist")) CopyStringArray(parameterObject["albumartist"], song.albumArtist); 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 = '0' + (char)parameterObject["rating"].asInteger(); if (ParameterNotNull(parameterObject, "album")) song.strAlbum = parameterObject["album"].asString(); 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 (musicdatabase.UpdateSong(id, song) <= 0) return InternalError; CJSONRPCUtils::NotifyItemUpdated(); return ACK; }
JSONRPC_STATUS CAudioLibrary::GetSongDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { int idSong = (int)parameterObject["songid"].asInteger(); CMusicDatabase musicdatabase; if (!musicdatabase.Open()) return InternalError; CSong song; if (!musicdatabase.GetSong(idSong, song)) return InvalidParams; CFileItemList items; items.Add(CFileItemPtr(new CFileItem(song))); JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase); if (ret != OK) return ret; HandleFileItem("songid", true, "songdetails", items[0], parameterObject, parameterObject["properties"], result, false); return OK; }
bool CGUIWindowVideoNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); if (CGUIDialogContextMenu::OnContextButton("video", item, button)) { //! @todo should we search DB for entries from plugins? if (button == CONTEXT_BUTTON_REMOVE_SOURCE && !item->IsPlugin() && !item->IsLiveTV() &&!item->IsRSS() && !URIUtils::IsUPnP(item->GetPath())) { // if the source has been properly removed, remove the cached source list because the list has changed if (OnUnAssignContent(item->GetPath(), 20375, 20340)) m_vecItems->RemoveDiscCache(GetID()); } Refresh(); return true; } switch (button) { case CONTEXT_BUTTON_EDIT: { CONTEXT_BUTTON ret = (CONTEXT_BUTTON)CGUIDialogVideoInfo::ManageVideoItem(item); if (ret >= 0) { Refresh(true); if (ret == CONTEXT_BUTTON_DELETE) { int select = itemNumber >= m_vecItems->Size()-1 ? itemNumber-1:itemNumber; m_viewControl.SetSelectedItem(select); } } return true; } case CONTEXT_BUTTON_SET_ACTOR_THUMB: case CONTEXT_BUTTON_SET_ARTIST_THUMB: { std::string type = MediaTypeSeason; if (button == CONTEXT_BUTTON_SET_ACTOR_THUMB) type = "actor"; else if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB) type = MediaTypeArtist; bool result = CGUIDialogVideoInfo::ManageVideoItemArtwork(m_vecItems->Get(itemNumber), type); Refresh(); return result; } case CONTEXT_BUTTON_GO_TO_ARTIST: { std::string strPath; CMusicDatabase database; database.Open(); strPath = StringUtils::Format("musicdb://artists/%i/", database.GetArtistByName(StringUtils::Join(m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator))); g_windowManager.ActivateWindow(WINDOW_MUSIC_NAV,strPath); return true; } case CONTEXT_BUTTON_GO_TO_ALBUM: { std::string strPath; CMusicDatabase database; database.Open(); strPath = StringUtils::Format("musicdb://albums/%i/", database.GetAlbumByName(m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strAlbum)); g_windowManager.ActivateWindow(WINDOW_MUSIC_NAV,strPath); return true; } case CONTEXT_BUTTON_PLAY_OTHER: { CMusicDatabase database; database.Open(); CSong song; if (database.GetSong(database.GetSongByArtistAndAlbumAndTitle(StringUtils::Join(m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator),m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strAlbum, m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strTitle), song)) { CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast<void*>(new CFileItem(song))); } return true; } case CONTEXT_BUTTON_SCAN_TO_LIBRARY: CGUIDialogVideoInfo::ShowFor(*item); return true; default: break; } return CGUIWindowVideoBase::OnContextButton(itemNumber, button); }
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::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(); // Artist names, along with MusicbrainzArtistID needs to update artist credits // As temp fix just set the artist description string if (ParameterNotNull(parameterObject, "artist")) { std::vector<std::string> artist; CopyStringArray(parameterObject["artist"], artist); song.strArtistDesc = StringUtils::Join(artist, g_advancedSettings.m_musicItemSeparator); } //Albumartist not part of song, belongs to album so not changed as a song detail?? //if (ParameterNotNull(parameterObject, "albumartist")) // CopyStringArray(parameterObject["albumartist"], song.albumArtist); // song_genre table needs updating too when genre string changes. This needs fixing too. 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(); //Album title is not part of song, it belongs to album so not changed as a song detail?? if (ParameterNotNull(parameterObject, "album")) song.strAlbum = parameterObject["album"].asString(); 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()); // This overlay of UpdateSong needs to be deprecated. // Also need to update artist credits and propagate changes // to song_artist and song_genre tables. if (musicdatabase.UpdateSong(id, song) <= 0) return InternalError; CJSONRPCUtils::NotifyItemUpdated(); return ACK; }
bool CGUIWindowVideoNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); if (CGUIDialogContextMenu::OnContextButton("video", item, button)) { //TODO should we search DB for entries from plugins? if (button == CONTEXT_BUTTON_REMOVE_SOURCE && !item->IsPlugin() && !item->IsLiveTV() &&!item->IsRSS() && !URIUtils::IsUPnP(item->GetPath())) { OnUnAssignContent(item->GetPath(),20375,20340,20341); } Refresh(); return true; } switch (button) { case CONTEXT_BUTTON_EDIT: { CONTEXT_BUTTON ret = (CONTEXT_BUTTON)CGUIDialogVideoInfo::ManageVideoItem(item); if (ret >= 0) { if (ret == CONTEXT_BUTTON_MARK_WATCHED) m_viewControl.SetSelectedItem(itemNumber + 1); Refresh(true); } return true; } case CONTEXT_BUTTON_SET_SEASON_ART: case CONTEXT_BUTTON_SET_ACTOR_THUMB: case CONTEXT_BUTTON_SET_ARTIST_THUMB: { std::string type = "season"; if (button == CONTEXT_BUTTON_SET_ACTOR_THUMB) type = "actor"; else if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB) type = "artist"; bool result = CGUIDialogVideoInfo::ManageVideoItemArtwork(m_vecItems->Get(itemNumber), type); Refresh(); return result; } case CONTEXT_BUTTON_GO_TO_ARTIST: { CStdString strPath; CMusicDatabase database; database.Open(); strPath = StringUtils::Format("musicdb://artists/%ld/", database.GetArtistByName(StringUtils::Join(m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator))); g_windowManager.ActivateWindow(WINDOW_MUSIC_NAV,strPath); return true; } case CONTEXT_BUTTON_GO_TO_ALBUM: { CStdString strPath; CMusicDatabase database; database.Open(); strPath = StringUtils::Format("musicdb://albums/%ld/", database.GetAlbumByName(m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strAlbum)); g_windowManager.ActivateWindow(WINDOW_MUSIC_NAV,strPath); return true; } case CONTEXT_BUTTON_PLAY_OTHER: { CMusicDatabase database; database.Open(); CSong song; if (database.GetSong(database.GetSongByArtistAndAlbumAndTitle(StringUtils::Join(m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator),m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strAlbum, m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strTitle), song)) { CApplicationMessenger::Get().PlayFile(song); } return true; } default: break; } return CGUIWindowVideoBase::OnContextButton(itemNumber, button); }