bool CAudioLibrary::FillFileItemList(const Value ¶meterObject, CFileItemList &list) { CMusicDatabase musicdatabase; bool success = false; if (musicdatabase.Open()) { if (parameterObject["artistid"].isInt() || parameterObject["albumid"].isInt() || parameterObject["genreid"].isInt()) { int artistID = parameterObject.get("artistid", -1).asInt(); int albumID = parameterObject.get("albumid", -1).asInt(); int genreID = parameterObject.get("genreid", -1).asInt(); success = musicdatabase.GetSongsNav("", list, genreID, artistID, albumID); } if (parameterObject["songid"].isInt()) { int songID = parameterObject.get("songid", -1).asInt(); if (songID != -1) { CSong song; if (musicdatabase.GetSongById(songID, song)) { list.Add(CFileItemPtr(new CFileItem(song))); success = true; } } } musicdatabase.Close(); } return success; }
CStdString CMusicDatabaseFile::TranslateUrl(const CURL& url) { CMusicDatabase musicDatabase; if (!musicDatabase.Open()) return ""; CStdString strFileName=URIUtils::GetFileName(url.Get()); CStdString strExtension; URIUtils::GetExtension(strFileName, strExtension); URIUtils::RemoveExtension(strFileName); if (!StringUtils::IsNaturalNumber(strFileName)) return ""; long idSong=atol(strFileName.c_str()); CSong song; if (!musicDatabase.GetSongById(idSong, song)) return ""; CStdString strExtensionFromDb; URIUtils::GetExtension(song.strFileName, strExtensionFromDb); if (!strExtensionFromDb.Equals(strExtension)) return ""; return song.strFileName; }
bool CLastFmManager::Unlove(const CMusicInfoTag& musicinfotag, bool askConfirmation /*= true*/) { if (!IsLastFmEnabled()) { CLog::Log(LOGERROR, "LastFmManager Unlove, lasfm is not enabled"); return false; } CStdString strTitle = musicinfotag.GetTitle(); CStdString strArtist = StringUtils::Join(musicinfotag.GetArtist(), g_advancedSettings.m_musicItemSeparator); if (strArtist.IsEmpty()) { CLog::Log(LOGERROR, "Last.fm Unlove no artistname provided."); return false; } if (strTitle.IsEmpty()) { CLog::Log(LOGERROR, "Last.fm Unlove no tracktitle provided."); return false; } CStdString strInfo; strInfo.Format("%s - %s", strArtist, strTitle); if (!askConfirmation || CGUIDialogYesNo::ShowAndGetInput(g_localizeStrings.Get(15200), g_localizeStrings.Get(15297), strInfo, "")) { if (CallXmlRpc("unLoveTrack", strArtist, strTitle)) { //update our local rating, now this is tricky because we only have an artist and title //and don't know if it was a local or radio song. //So we're going to try to get it from the database and check if the rating is 5, //if it is we can assume this was the song we loved before. CMusicDatabase musicdatabase; if (musicdatabase.Open()) { long songid = musicdatabase.GetSongByArtistAndAlbumAndTitle(strArtist, "%", strTitle); if (songid > 0) { CSong song; musicdatabase.GetSongById(songid, song); if (song.rating == '5') { //reset the rating musicdatabase.SetSongRating(song.strFileName, '0'); } } musicdatabase.Close(); } return true; } } return false; }
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://4/", list, genreID, artistID, albumID); int songID = (int)parameterObject["songid"].asInteger(-1); if (songID != -1) { CSong song; if (musicdatabase.GetSongById(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; }
JSONRPC_STATUS CAudioLibrary::SetSongDetails(const CStdString &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.GetSongById(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, "musicbrainzartistid")) song.strMusicBrainzArtistID = parameterObject["musicbrainzartistid"].asString(); if (ParameterNotNull(parameterObject, "musicbrainzalbumid")) song.strMusicBrainzAlbumID = parameterObject["musicbrainzalbumid"].asString(); if (ParameterNotNull(parameterObject, "musicbrainzalbumartistid")) song.strMusicBrainzAlbumArtistID = parameterObject["musicbrainzalbumartistid"].asString(); if (musicdatabase.UpdateSong(song, id) <= 0) return InternalError; CJSONRPCUtils::NotifyItemUpdated(); return ACK; }
JSONRPC_STATUS CAudioLibrary::GetSongDetails(const CStdString &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.GetSongById(idSong, song)) return InvalidParams; HandleFileItem("songid", false, "songdetails", CFileItemPtr( new CFileItem(song) ), parameterObject, parameterObject["properties"], result, false); return OK; }
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.GetSongById(param.GetSongId(),song)) tag.SetSong(song); database.Close(); return tag.Loaded(); }
bool CAudioLibrary::FillFileItemList(const CVariant ¶meterObject, CFileItemList &list) { CMusicDatabase musicdatabase; bool success = false; if (musicdatabase.Open()) { 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); CStdString spotifyID = ""; spotifyID = (CStdString) parameterObject["spotify_albumid"].asString(); CStdString artistName = ""; CFileItem fileItem; if (FillFileItem(file, fileItem)) { success = true; list.Add(CFileItemPtr(new CFileItem(fileItem))); } if(spotifyID != "") { success |= g_spotify->GetTracks(list,spotifyID,artistName,0); } else { if (artistID != -1 || albumID != -1 || genreID != -1) success |= musicdatabase.GetSongsNav("", list, genreID, artistID, albumID); } int songID = (int)parameterObject["songid"].asInteger(-1); if (songID != -1) { CSong song; if (musicdatabase.GetSongById(songID, song)) { list.Add(CFileItemPtr(new CFileItem(song))); success = true; } } musicdatabase.Close(); } return success; }
JSON_STATUS CAudioLibrary::GetSongDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const Value ¶meterObject, Value &result) { int idSong = parameterObject["songid"].asInt(); CMusicDatabase musicdatabase; if (!musicdatabase.Open()) return InternalError; CSong song; if (!musicdatabase.GetSongById(idSong, song)) { musicdatabase.Close(); return InvalidParams; } Json::Value validFields; MakeFieldsList(parameterObject, validFields); HandleFileItem("songid", false, "songdetails", CFileItemPtr( new CFileItem(song) ), parameterObject, validFields, result); musicdatabase.Close(); return OK; }
bool CGUIWindowVideoNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); switch (button) { case CONTEXT_BUTTON_SET_DEFAULT: g_settings.m_defaultVideoLibSource = GetQuickpathName(item->m_strPath); g_settings.Save(); return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: g_settings.m_defaultVideoLibSource.Empty(); g_settings.Save(); return true; case CONTEXT_BUTTON_EDIT: UpdateVideoTitle(item.get()); CUtil::DeleteVideoDatabaseDirectoryCache(); Update(m_vecItems->m_strPath); return true; case CONTEXT_BUTTON_SET_SEASON_THUMB: case CONTEXT_BUTTON_SET_ACTOR_THUMB: case CONTEXT_BUTTON_SET_ARTIST_THUMB: case CONTEXT_BUTTON_SET_MOVIESET_THUMB: { // Grab the thumbnails from the web CStdString strPath; CFileItemList items; CUtil::AddFileToFolder(g_advancedSettings.m_cachePath,"imdbthumbs",strPath); CUtil::WipeDir(strPath); XFILE::CDirectory::Create(strPath); CFileItemPtr noneitem(new CFileItem("thumb://None", false)); CStdString cachedThumb = m_vecItems->Get(itemNumber)->GetCachedSeasonThumb(); if (button == CONTEXT_BUTTON_SET_ACTOR_THUMB) cachedThumb = m_vecItems->Get(itemNumber)->GetCachedActorThumb(); if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB) cachedThumb = m_vecItems->Get(itemNumber)->GetCachedArtistThumb(); if (button == CONTEXT_BUTTON_SET_MOVIESET_THUMB) cachedThumb = m_vecItems->Get(itemNumber)->GetCachedVideoThumb(); if (CFile::Exists(cachedThumb)) { CFileItemPtr item(new CFileItem("thumb://Current", false)); item->SetThumbnailImage(cachedThumb); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } noneitem->SetIconImage("DefaultFolder.png"); noneitem->SetLabel(g_localizeStrings.Get(20018)); vector<CStdString> thumbs; if (button != CONTEXT_BUTTON_SET_ARTIST_THUMB) { CVideoInfoTag tag; if (button == CONTEXT_BUTTON_SET_SEASON_THUMB) m_database.GetTvShowInfo("",tag,m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_iDbId); else tag = *m_vecItems->Get(itemNumber)->GetVideoInfoTag(); if (button == CONTEXT_BUTTON_SET_SEASON_THUMB) tag.m_strPictureURL.GetThumbURLs(thumbs, m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_iSeason); else tag.m_strPictureURL.GetThumbURLs(thumbs); for (unsigned int i = 0; i < thumbs.size(); i++) { CStdString strItemPath; strItemPath.Format("thumb://Remote%i",i); CFileItemPtr item(new CFileItem(strItemPath, false)); item->SetThumbnailImage(thumbs[i]); item->SetIconImage("DefaultPicture.png"); item->SetLabel(g_localizeStrings.Get(20015)); items.Add(item); // TODO: Do we need to clear the cached image? // CTextureCache::Get().ClearCachedImage(thumbs[i]); } } bool local=false; if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB) { CStdString picturePath; CStdString strPath = m_vecItems->Get(itemNumber)->m_strPath; CUtil::RemoveSlashAtEnd(strPath); int nPos=strPath.ReverseFind("/"); if (nPos>-1) { // try to guess where the user should start // browsing for the artist thumb CMusicDatabase database; database.Open(); long idArtist=database.GetArtistByName(m_vecItems->Get(itemNumber)->GetLabel()); database.GetArtistPath(idArtist, picturePath); } CStdString strThumb; CUtil::AddFileToFolder(picturePath,"folder.jpg",strThumb); if (XFILE::CFile::Exists(strThumb)) { CFileItemPtr pItem(new CFileItem(strThumb,false)); pItem->SetLabel(g_localizeStrings.Get(20017)); pItem->SetThumbnailImage(strThumb); items.Add(pItem); local = true; } else noneitem->SetIconImage("DefaultArtist.png"); } if (button == CONTEXT_BUTTON_SET_ACTOR_THUMB) { CStdString picturePath; CStdString strThumb; CUtil::AddFileToFolder(picturePath,"folder.jpg",strThumb); if (XFILE::CFile::Exists(strThumb)) { CFileItemPtr pItem(new CFileItem(strThumb,false)); pItem->SetLabel(g_localizeStrings.Get(20017)); pItem->SetThumbnailImage(strThumb); items.Add(pItem); local = true; } else noneitem->SetIconImage("DefaultActor.png"); } if (button == CONTEXT_BUTTON_SET_MOVIESET_THUMB) noneitem->SetIconImage("DefaultVideo.png"); if (!local) items.Add(noneitem); VECSOURCES sources=g_settings.m_videoSources; g_mediaManager.GetLocalDrives(sources); CStdString result; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(20019), result)) { return false; // user cancelled } if (result == "thumb://Current") return false; // user chose the one they have // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail CTextureCache::Get().ClearCachedImage(cachedThumb, true); if (result.Left(14) == "thumb://Remote") { int number = atoi(result.Mid(14)); CFile::Cache(thumbs[number], cachedThumb); } if (result == "thumb://None") CTextureCache::Get().ClearCachedImage(cachedThumb, true); else CFile::Cache(result,cachedThumb); CUtil::DeleteVideoDatabaseDirectoryCache(); CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_windowManager.SendMessage(msg); Update(m_vecItems->m_strPath); return true; } case CONTEXT_BUTTON_UPDATE_LIBRARY: { OnScan(""); return true; } case CONTEXT_BUTTON_UNLINK_MOVIE: { OnLinkMovieToTvShow(itemNumber, true); Update(m_vecItems->m_strPath); return true; } case CONTEXT_BUTTON_LINK_MOVIE: { OnLinkMovieToTvShow(itemNumber, false); return true; } case CONTEXT_BUTTON_GO_TO_ARTIST: { CStdString strPath; CMusicDatabase database; database.Open(); strPath.Format("musicdb://2/%ld/",database.GetArtistByName(m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strArtist)); g_windowManager.ActivateWindow(WINDOW_MUSIC_NAV,strPath); return true; } case CONTEXT_BUTTON_GO_TO_ALBUM: { CStdString strPath; CMusicDatabase database; database.Open(); strPath.Format("musicdb://3/%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.GetSongById(database.GetSongByArtistAndAlbumAndTitle(m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strArtist,m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strAlbum, m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strTitle), song)) { g_application.getApplicationMessenger().PlayFile(song); } return true; } case CONTEXT_BUTTON_UNLINK_BOOKMARK: { m_database.Open(); m_database.DeleteBookMarkForEpisode(*m_vecItems->Get(itemNumber)->GetVideoInfoTag()); m_database.Close(); CUtil::DeleteVideoDatabaseDirectoryCache(); Update(m_vecItems->m_strPath); return true; } default: break; } return CGUIWindowVideoBase::OnContextButton(itemNumber, button); }