void CGUIWindowMusicPlayList::SavePlayList() { CStdString strNewFileName; if (CGUIKeyboardFactory::ShowAndGetInput(strNewFileName, g_localizeStrings.Get(16012), false)) { // need 2 rename it CStdString strFolder, strPath; URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), "music", strFolder); strNewFileName= CUtil::MakeLegalFileName( strNewFileName ); strNewFileName += ".m3u"; URIUtils::AddFileToFolder(strFolder, strNewFileName, strPath); // get selected item int iItem = m_viewControl.GetSelectedItem(); CStdString strSelectedItem = ""; if (iItem >= 0 && iItem < m_vecItems->Size()) { CFileItemPtr pItem = m_vecItems->Get(iItem); if (!pItem->IsParentFolder()) { GetDirectoryHistoryString(pItem.get(), strSelectedItem); } } CStdString strOldDirectory = m_vecItems->GetPath(); m_history.SetSelectedItem(strSelectedItem, strOldDirectory); CPlayListM3U playlist; for (int i = 0; i < (int)m_vecItems->Size(); ++i) { CFileItemPtr pItem = m_vecItems->Get(i); // Musicdatabase items should contain the real path instead of a musicdb url // otherwise the user can't save and reuse the playlist when the musicdb gets deleted if (pItem->IsMusicDb()) pItem->SetPath(pItem->GetMusicInfoTag()->GetURL()); playlist.Add(pItem); } CLog::Log(LOGDEBUG, "Saving music playlist: [%s]", strPath.c_str()); playlist.Save(strPath); Refresh(); // need to update } }
bool CGUIWindowMusicNav::OnClick(CFileItemPtr& item) { if (!item) return false; if (item->GetPath().Left(14) == "musicsearch://") { if (m_searchWithEdit) OnSearchUpdate(); else { CStdString search(GetProperty("search").asString()); CGUIKeyboardFactory::ShowAndGetFilter(search, true); SetProperty("search", search); } return true; } if (item->IsMusicDb() && !item->m_bIsFolder) m_musicdatabase.SetPropertiesForFileItem(*item); return CGUIWindowMusicBase::OnClick(item); }
bool CGUIWindowMusicNav::OnClick(int iItem) { if (iItem < 0 || iItem >= m_vecItems->Size()) return false; CFileItemPtr item = m_vecItems->Get(iItem); if (item->GetPath().Left(14) == "musicsearch://") { if (m_searchWithEdit) OnSearchUpdate(); else { CStdString search(GetProperty("search")); CGUIDialogKeyboard::ShowAndGetFilter(search, true); SetProperty("search", search); } return true; } if (item->IsMusicDb() && !item->m_bIsFolder) m_musicdatabase.SetPropertiesForFileItem(*item); return CGUIWindowMusicBase::OnClick(iItem); }
bool CGUIWindowMusicNav::OnClick(int iItem) { if (iItem < 0 || iItem >= m_vecItems->Size()) return false; CFileItemPtr item = m_vecItems->Get(iItem); if (StringUtils::StartsWith(item->GetPath(), "musicsearch://")) { if (m_searchWithEdit) OnSearchUpdate(); else { std::string search(GetProperty("search").asString()); CGUIKeyboardFactory::ShowAndGetFilter(search, true); SetProperty("search", search); } return true; } if (item->IsMusicDb() && !item->m_bIsFolder) m_musicdatabase.SetPropertiesForFileItem(*item); return CGUIWindowMusicBase::OnClick(iItem); }
/// \brief Add unique file and folders and its subfolders to playlist /// \param pItem The file item to add void CGUIWindowMusicBase::AddItemToPlayList(const CFileItemPtr &pItem, CFileItemList &queuedItems) { if (!pItem->CanQueue() || pItem->IsRAR() || pItem->IsZIP() || pItem->IsParentFolder()) // no zip/rar enques thank you! return; // fast lookup is needed here queuedItems.SetFastLookup(true); if (pItem->IsMusicDb() && pItem->m_bIsFolder && !pItem->IsParentFolder()) { // we have a music database folder, just grab the "all" item underneath it CMusicDatabaseDirectory dir; if (!dir.ContainsSongs(pItem->GetPath())) { // grab the ALL item in this category // Genres will still require 2 lookups, and queuing the entire Genre folder // will require 3 lookups (genre, artist, album) CMusicDbUrl musicUrl; musicUrl.FromString(pItem->GetPath()); musicUrl.AppendPath("-1/"); CFileItemPtr item(new CFileItem(musicUrl.ToString(), true)); item->SetCanQueue(true); // workaround for CanQueue() check above AddItemToPlayList(item, queuedItems); return; } } if (pItem->m_bIsFolder || (g_windowManager.GetActiveWindow() == WINDOW_MUSIC_NAV && pItem->IsPlayList())) { // Check if we add a locked share if ( pItem->m_bIsShareOrDrive ) { CFileItem item = *pItem; if ( !g_passwordManager.IsItemUnlocked( &item, "music" ) ) return ; } // recursive CFileItemList items; GetDirectory(pItem->GetPath(), items); //OnRetrieveMusicInfo(items); FormatAndSort(items); for (int i = 0; i < items.Size(); ++i) AddItemToPlayList(items[i], queuedItems); } else { if (pItem->IsPlayList()) { auto_ptr<CPlayList> pPlayList (CPlayListFactory::Create(*pItem)); if (pPlayList.get()) { // load it if (!pPlayList->Load(pItem->GetPath())) { CGUIDialogOK::ShowAndGetInput(6, 0, 477, 0); return; //hmmm unable to load playlist? } CPlayList playlist = *pPlayList; for (int i = 0; i < (int)playlist.size(); ++i) { AddItemToPlayList(playlist[i], queuedItems); } return; } } else if(pItem->IsInternetStream()) { // just queue the internet stream, it will be expanded on play queuedItems.Add(pItem); } else if (pItem->IsPlugin() && pItem->GetProperty("isplayable") == "true") { // python files can be played queuedItems.Add(pItem); } else if (!pItem->IsNFO() && pItem->IsAudio()) { CFileItemPtr itemCheck = queuedItems.Get(pItem->GetPath()); if (!itemCheck || itemCheck->m_lStartOffset != pItem->m_lStartOffset) { // add item CFileItemPtr item(new CFileItem(*pItem)); m_musicdatabase.SetPropertiesForFileItem(*item); queuedItems.Add(item); } } } }
JSONRPC_STATUS CPlayerOperations::GetItem(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { PlayerType player = GetPlayer(parameterObject["playerid"]); CFileItemPtr fileItem; switch (player) { case Video: case Audio: { fileItem = CFileItemPtr(new CFileItem(g_application.CurrentFileItem())); if (fileItem->GetLabel().empty()) { if (IsPVRChannel()) { CPVRChannelPtr currentChannel; if (g_PVRManager.GetCurrentChannel(currentChannel) && currentChannel.get() != NULL) fileItem = CFileItemPtr(new CFileItem(*currentChannel.get())); } else if (player == Video) { if (!CVideoLibrary::FillFileItem(g_application.CurrentFile(), fileItem, parameterObject)) { const CVideoInfoTag *currentVideoTag = g_infoManager.GetCurrentMovieTag(); if (currentVideoTag != NULL) fileItem = CFileItemPtr(new CFileItem(*currentVideoTag)); fileItem->SetPath(g_application.CurrentFileItem().GetPath()); } } else { if (!CAudioLibrary::FillFileItem(g_application.CurrentFile(), fileItem, parameterObject)) { const MUSIC_INFO::CMusicInfoTag *currentMusicTag = g_infoManager.GetCurrentSongTag(); if (currentMusicTag != NULL) fileItem = CFileItemPtr(new CFileItem(*currentMusicTag)); fileItem->SetPath(g_application.CurrentFileItem().GetPath()); } } } if (IsPVRChannel()) break; if (player == Video) { bool additionalInfo = false; bool streamdetails = false; for (CVariant::const_iterator_array itr = parameterObject["properties"].begin_array(); itr != parameterObject["properties"].end_array(); itr++) { CStdString fieldValue = itr->asString(); if (fieldValue == "cast" || fieldValue == "set" || fieldValue == "setid" || fieldValue == "showlink" || fieldValue == "resume" || (fieldValue == "streamdetails" && !fileItem->GetVideoInfoTag()->m_streamDetails.HasItems())) additionalInfo = true; } CVideoDatabase videodatabase; if ((additionalInfo) && videodatabase.Open()) { if (additionalInfo) { switch (fileItem->GetVideoContentType()) { case VIDEODB_CONTENT_MOVIES: videodatabase.GetMovieInfo("", *(fileItem->GetVideoInfoTag()), fileItem->GetVideoInfoTag()->m_iDbId); break; case VIDEODB_CONTENT_MUSICVIDEOS: videodatabase.GetMusicVideoInfo("", *(fileItem->GetVideoInfoTag()), fileItem->GetVideoInfoTag()->m_iDbId); break; case VIDEODB_CONTENT_EPISODES: videodatabase.GetEpisodeInfo("", *(fileItem->GetVideoInfoTag()), fileItem->GetVideoInfoTag()->m_iDbId); break; case VIDEODB_CONTENT_TVSHOWS: case VIDEODB_CONTENT_MOVIE_SETS: default: break; } } videodatabase.Close(); } } else if (player == Audio) { if (fileItem->IsMusicDb()) { CMusicDatabase musicdb; CFileItemList items; items.Add(fileItem); CAudioLibrary::GetAdditionalSongDetails(parameterObject, items, musicdb); } } break; } case Picture: { CGUIWindowSlideShow *slideshow = (CGUIWindowSlideShow*)g_windowManager.GetWindow(WINDOW_SLIDESHOW); if (!slideshow) return FailedToExecute; CFileItemList slides; slideshow->GetSlideShowContents(slides); fileItem = slides[slideshow->CurrentSlide() - 1]; break; } case None: default: return FailedToExecute; } HandleFileItem("id", !IsPVRChannel(), "item", fileItem, parameterObject, parameterObject["properties"], result, false); return OK; }
void CGUIWindowMusicBase::GetContextButtons(int itemNumber, CContextButtons &buttons) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); if (item && !item->GetProperty("pluginreplacecontextitems").asBoolean()) { if (item && !item->IsParentFolder()) { if (!m_vecItems->IsPlugin() && (item->IsPlugin() || item->IsScript())) buttons.Add(CONTEXT_BUTTON_INFO,24003); // Add-on info if (item->CanQueue() && !item->IsAddonsPath() && !item->IsScript()) { buttons.Add(CONTEXT_BUTTON_QUEUE_ITEM, 13347); //queue // allow a folder to be ad-hoc queued and played by the default player if (item->m_bIsFolder || (item->IsPlayList() && !g_advancedSettings.m_playlistAsFolders)) { buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 208); // Play } else { // check what players we have, if we have multiple display play with option VECPLAYERCORES vecCores; CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); if (vecCores.size() >= 1) buttons.Add(CONTEXT_BUTTON_PLAY_WITH, 15213); // Play With... } if (item->IsSmartPlayList()) { buttons.Add(CONTEXT_BUTTON_PLAY_PARTYMODE, 15216); // Play in Partymode } if (item->IsSmartPlayList() || m_vecItems->IsSmartPlayList()) buttons.Add(CONTEXT_BUTTON_EDIT_SMART_PLAYLIST, 586); else if (item->IsPlayList() || m_vecItems->IsPlayList()) buttons.Add(CONTEXT_BUTTON_EDIT, 586); } // Add the scan button(s) if (g_application.IsMusicScanning()) buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353); // Stop Scanning else if (!m_vecItems->IsMusicDb() && !m_vecItems->IsInternetStream() && !item->IsPath("add") && !item->IsParentFolder() && !item->IsPlugin() && !item->IsMusicDb() && !item->IsLibraryFolder() && !StringUtils::StartsWithNoCase(item->GetPath(), "addons://") && (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) { buttons.Add(CONTEXT_BUTTON_SCAN, 13352); } #ifdef HAS_DVD_DRIVE // enable Rip CD Audio or Track button if we have an audio disc if (g_mediaManager.IsDiscInDrive() && m_vecItems->IsCDDA()) { // those cds can also include Audio Tracks: CDExtra and MixedMode! MEDIA_DETECT::CCdInfo *pCdInfo = g_mediaManager.GetCdInfo(); if (pCdInfo->IsAudio(1) || pCdInfo->IsCDExtra(1) || pCdInfo->IsMixedMode(1)) buttons.Add(CONTEXT_BUTTON_RIP_TRACK, 610); } #endif } // enable CDDB lookup if the current dir is CDDA if (g_mediaManager.IsDiscInDrive() && m_vecItems->IsCDDA() && (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) { buttons.Add(CONTEXT_BUTTON_CDDB, 16002); } } CGUIMediaWindow::GetContextButtons(itemNumber, buttons); }
void CGUIWindowMusicNav::SetThumb(int iItem, CONTEXT_BUTTON button) { CFileItemPtr pItem = m_vecItems->Get(iItem); CFileItemList items; CStdString picturePath; CStdString strPath=pItem->m_strPath; CStdString strThumb; CStdString cachedThumb; if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB) { long idArtist = -1; if (pItem->IsMusicDb()) { CUtil::RemoveSlashAtEnd(strPath); int nPos=strPath.ReverseFind("/"); if (nPos>-1) { // try to guess where the user should start // browsing for the artist thumb idArtist=atol(strPath.Mid(nPos+1)); } } else if (pItem->IsVideoDb()) idArtist = m_musicdatabase.GetArtistByName(pItem->GetLabel()); m_musicdatabase.GetArtistPath(idArtist, picturePath); cachedThumb = pItem->GetCachedArtistThumb(); CArtist artist; m_musicdatabase.GetArtistInfo(idArtist,artist); int i=1; for (std::vector<CScraperUrl::SUrlEntry>::iterator iter=artist.thumbURL.m_url.begin();iter != artist.thumbURL.m_url.end();++iter) { CStdString thumbFromWeb; CStdString strLabel; strLabel.Format("allmusicthumb%i.jpg",i); CUtil::AddFileToFolder("z:\\", strLabel, thumbFromWeb); if (CScraperUrl::DownloadThumbnail(thumbFromWeb,*iter)) { CStdString strItemPath; strItemPath.Format("thumb://Remote%i",i++); CFileItemPtr item(new CFileItem(strItemPath, false)); item->SetThumbnailImage(thumbFromWeb); CStdString strLabel; item->SetLabel(g_localizeStrings.Get(20015)); items.Add(item); } } } else { strPath = m_vecItems->Get(iItem)->m_strPath; strPath.Replace("plugin://music/","Q:\\plugins\\music\\"); strPath.Replace("/","\\"); picturePath = strPath; CFileItem item(strPath,true); cachedThumb = item.GetCachedProgramThumb(); } if (XFILE::CFile::Exists(cachedThumb)) { CFileItemPtr item(new CFileItem("thumb://Current", false)); item->SetThumbnailImage(cachedThumb); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB) { if (items.Size() == 0) { CFileItem item2(strPath,false); CUtil::AddFileToFolder(strPath,"default.py",item2.m_strPath); if (XFILE::CFile::Exists(item2.GetCachedProgramThumb())) { CFileItemPtr item(new CFileItem("thumb://Current", false)); item->SetThumbnailImage(item2.GetCachedProgramThumb()); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } } CUtil::AddFileToFolder(strPath,"default.tbn",strThumb); if (XFILE::CFile::Exists(strThumb)) { CFileItemPtr item(new CFileItem(strThumb,false)); item->SetThumbnailImage(strThumb); item->SetLabel(g_localizeStrings.Get(20017)); items.Add(item); } } 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); } CFileItemPtr nItem(new CFileItem("thumb://None",false)); nItem->SetLabel(g_localizeStrings.Get(20018)); if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB) nItem->SetThumbnailImage("DefaultArtistBig.png"); else nItem->SetThumbnailImage("DefaultFolderBig.png"); items.Add(nItem); if (CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_musicSources, g_localizeStrings.Get(20019), picturePath)) { CPicture picture; if (picturePath.Equals("thumb://Current")) return; if (picturePath.Equals("thumb://None")) { XFILE::CFile::Delete(cachedThumb); if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB) { CPicture picture; picture.CacheSkinImage("DefaultFolderBig.png",cachedThumb); CFileItem item2(strPath,false); CUtil::AddFileToFolder(strPath,"default.py",item2.m_strPath); XFILE::CFile::Delete(item2.GetCachedProgramThumb()); } } else if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB) XFILE::CFile::Cache(picturePath,cachedThumb); if (!picturePath.Equals("thumb://None") && picturePath.Left(8).Equals("thumb://") && items.Get(picturePath)) picturePath = items.Get(picturePath)->GetThumbnailImage(); if (picturePath.Equals("thumb://None") || picture.DoCreateThumbnail(picturePath, cachedThumb)) { CMusicDatabaseDirectory dir; dir.ClearDirectoryCache(m_vecItems->m_strPath); CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_graphicsContext.SendMessage(msg); Update(m_vecItems->m_strPath); } else CLog::Log(LOGERROR, " %s Could not cache artist/plugin thumb: %s", __FUNCTION__, picturePath.c_str()); } }