CPlayList* CSelectLocation::GetPlayList( std::string _location ) { std::string plname = _location; unsigned int i; for( i = 0; i < plname.size(); i++ ) if( plname[i] == '/' ) plname[i] = '_'; plname = PLAYLISTDIR + plname + ".playlist"; std::cout << "Get playlist " << __LINE__ << std::endl; CPlayList* pl = new CPlayList( plname, !CPlayList::IsFileExists( plname ) ); std::cout << "Get playlist " << __LINE__ << std::endl; if( 0 == pl->GetSize() ) { pl->AddDir( _location ); } std::cout << "Get playlist " << __LINE__ << std::endl; return pl; }
bool CGUIWindowMusicBase::OnPlayMedia(int iItem, const std::string &player) { CFileItemPtr pItem = m_vecItems->Get(iItem); // party mode if (g_partyModeManager.IsEnabled()) { CPlayList playlistTemp; playlistTemp.Add(pItem); g_partyModeManager.AddUserSongs(playlistTemp, true); return true; } else if (!pItem->IsPlayList() && !pItem->IsInternetStream()) { // single music file - if we get here then we have autoplaynextitem turned off or queuebydefault // turned on, but we still want to use the playlist player in order to handle more queued items // following etc. if ( (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_QUEUEBYDEFAULT) && g_windowManager.GetActiveWindow() != WINDOW_MUSIC_PLAYLIST_EDITOR) ) { //! @todo Should the playlist be cleared if nothing is already playing? OnQueueItem(iItem); return true; } g_playlistPlayer.Reset(); g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Add(PLAYLIST_MUSIC, pItem); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Play(); return true; } return CGUIMediaWindow::OnPlayMedia(iItem, player); }
bool CGUIWindowMusicBase::OnPlayMedia(int iItem) { CFileItemPtr pItem = m_vecItems->Get(iItem); // party mode if (g_partyModeManager.IsEnabled()) { CPlayList playlistTemp; playlistTemp.Add(pItem); g_partyModeManager.AddUserSongs(playlistTemp, true); return true; } else if (!pItem->IsPlayList() && !pItem->IsInternetStream()) { // single music file - if we get here then we have autoplaynextitem turned off or queuebydefault // turned on, but we still want to use the playlist player in order to handle more queued items // following etc. // Karaoke items also can be added in runtime (while the song is played), so it should be queued too. if ( (CSettings::Get().GetBool("musicplayer.queuebydefault") && g_windowManager.GetActiveWindow() != WINDOW_MUSIC_PLAYLIST_EDITOR) || pItem->IsKaraoke() ) { // TODO: Should the playlist be cleared if nothing is already playing? OnQueueItem(iItem); return true; } g_playlistPlayer.Reset(); g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Add(PLAYLIST_MUSIC, pItem); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Play(); return true; } return CGUIMediaWindow::OnPlayMedia(iItem); }
bool CGUIWindowMusicNav::GetSongsFromPlayList(const CStdString& strPlayList, CFileItemList &items) { CStdString strParentPath=m_history.GetParentPath(); if (m_guiState.get() && !m_guiState->HideParentDirItems()) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(strParentPath); items.Add(pItem); } items.SetPath(strPlayList); CLog::Log(LOGDEBUG,"CGUIWindowMusicNav, opening playlist [%s]", strPlayList.c_str()); auto_ptr<CPlayList> pPlayList (CPlayListFactory::Create(strPlayList)); if ( NULL != pPlayList.get()) { // load it if (!pPlayList->Load(strPlayList)) { CGUIDialogOK::ShowAndGetInput(6, 0, 477, 0); return false; //hmmm unable to load playlist? } CPlayList playlist = *pPlayList; // convert playlist items to songs for (int i = 0; i < (int)playlist.size(); ++i) { items.Add(playlist[i]); } } return true; }
bool CGUIWindowMusicNav::GetSongsFromPlayList(const std::string& strPlayList, CFileItemList &items) { std::string strParentPath=m_history.GetParentPath(); if (m_guiState.get() && !m_guiState->HideParentDirItems()) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(strParentPath); items.Add(pItem); } items.SetPath(strPlayList); CLog::Log(LOGDEBUG,"CGUIWindowMusicNav, opening playlist [%s]", strPlayList.c_str()); std::unique_ptr<CPlayList> pPlayList (CPlayListFactory::Create(strPlayList)); if ( NULL != pPlayList.get()) { // load it if (!pPlayList->Load(strPlayList)) { HELPERS::ShowOKDialogText(CVariant{6}, CVariant{477}); return false; //hmmm unable to load playlist? } CPlayList playlist = *pPlayList; // convert playlist items to songs for (int i = 0; i < playlist.size(); ++i) { items.Add(playlist[i]); } } return true; }
bool CGUIWindowMusicBase::OnPlayMedia(int iItem) { CFileItem* pItem = m_vecItems->Get(iItem); if (pItem->m_strPath == "add" && pItem->GetLabel() == g_localizeStrings.Get(1026)) // 'add source button' in empty root { if (CGUIDialogMediaSource::ShowAndAddMediaSource("music")) { Update(""); return true; } return false; } // party mode if (g_partyModeManager.IsEnabled() && !pItem->IsLastFM()) { CPlayList playlistTemp; CPlayListItem playlistItem; CUtil::ConvertFileItemToPlayListItem(m_vecItems->Get(iItem), playlistItem); playlistTemp.Add(playlistItem); g_partyModeManager.AddUserSongs(playlistTemp, true); return true; } else if (!pItem->IsPlayList() && !pItem->IsInternetStream()) { // single music file - if we get here then we have autoplaynextitem turned off, but we // still want to use the playlist player in order to handle more queued items following etc. g_playlistPlayer.Reset(); g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Add(PLAYLIST_MUSIC, pItem); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Play(); return true; } return CGUIMediaWindow::OnPlayMedia(iItem); }
void CPartyModeManager::AddUserSongs(CPlayList& tempList, bool bPlay /* = false */) { if (!IsEnabled()) return; // where do we add? int iAddAt = -1; if (m_iLastUserSong < 0 || bPlay) iAddAt = 1; // under the currently playing song else iAddAt = m_iLastUserSong + 1; // under the last user added song int iNewUserSongs = tempList.size(); CLog::Log(LOGINFO,"PARTY MODE MANAGER: Adding %i user selected songs at %i", iNewUserSongs, iAddAt); int iPlaylist = PLAYLIST_MUSIC; if (m_bIsVideo) iPlaylist = PLAYLIST_VIDEO; g_playlistPlayer.GetPlaylist(iPlaylist).Insert(tempList, iAddAt); // update last user added song location if (m_iLastUserSong < 0) m_iLastUserSong = 0; m_iLastUserSong += iNewUserSongs; if (bPlay) Play(1); }
bool CPlaylistFileDirectory::GetDirectory(const CStdString& strPath, CFileItemList& items) { auto_ptr<CPlayList> pPlayList (CPlayListFactory::Create(strPath)); if ( NULL != pPlayList.get()) { // load it if (!pPlayList->Load(strPath)) return false; //hmmm unable to load playlist? CPlayList playlist = *pPlayList; // convert playlist items to songs for (int i = 0; i < (int)playlist.size(); ++i) { CFileItemPtr item = playlist[i]; item->m_iprogramCount = i; // hack for playlist order items.Add(item); } } return true; }
bool CPlaylistFileDirectory::GetDirectory(const CURL& url, CFileItemList& items) { const std::string pathToUrl = url.Get(); unique_ptr<CPlayList> pPlayList (CPlayListFactory::Create(pathToUrl)); if ( NULL != pPlayList.get()) { // load it if (!pPlayList->Load(pathToUrl)) return false; //hmmm unable to load playlist? CPlayList playlist = *pPlayList; // convert playlist items to songs for (int i = 0; i < (int)playlist.size(); ++i) { CFileItemPtr item = playlist[i]; item->m_iprogramCount = i; // hack for playlist order items.Add(item); } } return true; }
bool CLastFmManager::MovePlaying() { CSingleLock lock(m_lockPlaylist); // move current song to the top if its not there int iCurrentSong = g_playlistPlayer.GetCurrentSong(); if (iCurrentSong > 0) { CLog::Log(LOGINFO,"LastFmManager: Moving currently playing song from %i to 0", iCurrentSong); CPlayList &playlist = g_playlistPlayer.GetPlaylist(PLAYLIST_MUSIC); CPlayList playlistTemp; playlistTemp.Add(playlist[iCurrentSong]); playlist.Remove(iCurrentSong); for (int i=0; i<playlist.size(); i++) playlistTemp.Add(playlist[i]); playlist.Clear(); for (int i=0; i<playlistTemp.size(); i++) playlist.Add(playlistTemp[i]); } g_playlistPlayer.SetCurrentSong(0); return true; }
void CGUIWindowPictures::LoadPlayList(const std::string& strPlayList) { CLog::Log(LOGDEBUG,"CGUIWindowPictures::LoadPlayList()... converting playlist into slideshow: %s", strPlayList.c_str()); std::unique_ptr<CPlayList> pPlayList (CPlayListFactory::Create(strPlayList)); if ( NULL != pPlayList.get()) { if (!pPlayList->Load(strPlayList)) { HELPERS::ShowOKDialogText(CVariant{6}, CVariant{477}); return ; //hmmm unable to load playlist? } } CPlayList playlist = *pPlayList; if (playlist.size() > 0) { // set up slideshow CGUIWindowSlideShow *pSlideShow = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIWindowSlideShow>(WINDOW_SLIDESHOW); if (!pSlideShow) return; if (g_application.GetAppPlayer().IsPlayingVideo()) g_application.StopPlaying(); // convert playlist items into slideshow items pSlideShow->Reset(); for (int i = 0; i < (int)playlist.size(); ++i) { CFileItemPtr pItem = playlist[i]; //CLog::Log(LOGDEBUG,"-- playlist item: %s", pItem->GetPath().c_str()); if (pItem->IsPicture() && !(pItem->IsZIP() || pItem->IsRAR() || pItem->IsCBZ() || pItem->IsCBR())) pSlideShow->Add(pItem.get()); } // start slideshow if there are items pSlideShow->StartSlideShow(); if (pSlideShow->NumSlides()) CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_SLIDESHOW); } }
void CGUIWindowPictures::LoadPlayList(const CStdString& strPlayList) { CLog::Log(LOGDEBUG,"CGUIWindowPictures::LoadPlayList()... converting playlist into slideshow: %s", strPlayList.c_str()); auto_ptr<CPlayList> pPlayList (CPlayListFactory::Create(strPlayList)); if ( NULL != pPlayList.get()) { if (!pPlayList->Load(strPlayList)) { CGUIDialogOK::ShowAndGetInput(6, 0, 477, 0); return ; //hmmm unable to load playlist? } } CPlayList playlist = *pPlayList; if (playlist.size() > 0) { // set up slideshow CGUIWindowSlideShow *pSlideShow = (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW); if (!pSlideShow) return; if (g_application.m_pPlayer->IsPlayingVideo()) g_application.StopPlaying(); // convert playlist items into slideshow items pSlideShow->Reset(); for (int i = 0; i < (int)playlist.size(); ++i) { CFileItemPtr pItem = playlist[i]; //CLog::Log(LOGDEBUG,"-- playlist item: %s", pItem->GetPath().c_str()); if (pItem->IsPicture() && !(pItem->IsZIP() || pItem->IsRAR() || pItem->IsCBZ() || pItem->IsCBR())) pSlideShow->Add(pItem.get()); } // start slideshow if there are items pSlideShow->StartSlideShow(); if (pSlideShow->NumSlides()) g_windowManager.ActivateWindow(WINDOW_SLIDESHOW); } }
bool CPartyModeManager::MovePlaying() { // move current song to the top if its not there int iCurrentSong = g_playlistPlayer.GetCurrentSong(); int iPlaylist = m_bIsVideo ? PLAYLIST_MUSIC : PLAYLIST_VIDEO; if (iCurrentSong > 0) { CLog::Log(LOGINFO,"PARTY MODE MANAGER: Moving currently playing song from %i to 0", iCurrentSong); CPlayList &playlist = g_playlistPlayer.GetPlaylist(iPlaylist); CPlayList playlistTemp; playlistTemp.Add(playlist[iCurrentSong]); playlist.Remove(iCurrentSong); for (int i=0; i<playlist.size(); i++) playlistTemp.Add(playlist[i]); playlist.Clear(); for (int i=0; i<playlistTemp.size(); i++) playlist.Add(playlistTemp[i]); } g_playlistPlayer.SetCurrentSong(0); return true; }
void CPlayList::Insert(CPlayList& playlist, int iPosition /* = -1 */) { // out of bounds so just add to the end int iSize = size(); if (iPosition < 0 || iPosition >= iSize) { Add(playlist); return; } for (int i = 0; i < (int)playlist.size(); i++) { int iPos = iPosition + i; Add(playlist[i], iPos, iPos); } }
bool CPlayListDirectory::GetDirectory(const CStdString& strPath, VECFILEITEMS &items) { if ( !CUtil::IsPlayList(strPath) ) { CHDDirectory dirLoader; dirLoader.SetMask(".m3u|.b4s|.pls|.strm"); VECFILEITEMS tmpitems; CStdString strDir = g_stSettings.m_szAlbumDirectory; strDir += "\\playlists"; dirLoader.GetDirectory(strDir, tmpitems); // for each playlist found for (int i = 0; i < (int)tmpitems.size(); ++i) { CFileItem* pItem = tmpitems[i]; CStdString strPlayListName, strPlayList; strPlayList = CUtil::GetFileName( pItem->m_strPath ); strPlayListName = CUtil::GetFileName( strPlayList ); delete pItem; CPlayListFactory factory; CPlayList* pPlayList = factory.Create(strPlayList); if (pPlayList) { if ( pPlayList->Load(strPlayList) ) { CStdString strPlayListName = pPlayList->GetName(); if (strPlayListName.size()) { strPlayListName = strPlayListName; } } delete pPlayList; } // create an entry.... pItem = new CFileItem(strPlayListName); pItem->m_strPath = strPlayList; pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.push_back(pItem); } CUtil::SetThumbs(items); CUtil::FillInDefaultIcons(items); return true; } // yes, first add parent path { CFileItem *pItem = new CFileItem(".."); pItem->m_strPath = ""; pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.push_back(pItem); } // open the playlist CPlayListFactory factory; CPlayList* pPlayList = factory.Create(strPath); if (!pPlayList) return false; if ( pPlayList->Load(strPath) ) { for (int i = 0; i < (int)pPlayList->size(); ++i) { const CPlayList::CPlayListItem& playlistItem = (*pPlayList)[i]; CStdString strLabel; strLabel = CUtil::GetFileName( playlistItem.GetFileName() ); CFileItem* pItem = new CFileItem(strLabel); pItem->m_strPath = playlistItem.GetFileName(); pItem->m_bIsFolder = false; pItem->m_bIsShareOrDrive = false; items.push_back(pItem); } } delete pPlayList; CUtil::SetThumbs(items); CUtil::FillInDefaultIcons(items); return true; }
/// \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); } } } }
void CPlayList::Add(CPlayList& playlist) { for (int i = 0; i < (int)playlist.size(); i++) Add(playlist[i], -1, -1); }
/// \brief Add unique file and folders and its subfolders to playlist /// \param pItem The file item to add void CGUIWindowMusicBase::AddItemToPlayList(const CFileItem* pItem, CFileItemList &queuedItems) { if (!pItem->CanQueue() || pItem->IsRAR() || pItem->IsZIP() || pItem->IsParentFolder()) // no zip/rar enques thank you! return; 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->m_strPath)) { // 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) CFileItem item(pItem->m_strPath + "-1/", true); item.SetCanQueue(true); // workaround for CanQueue() check above AddItemToPlayList(&item, queuedItems); return; } } if (pItem->m_bIsFolder || (m_gWindowManager.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->m_strPath, 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->m_strPath)) { 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(new CFileItem(*pItem)); } else if (!pItem->IsNFO() && pItem->IsAudio()) { CFileItem *itemCheck = queuedItems.Get(pItem->m_strPath); if (!itemCheck || itemCheck->m_lStartOffset != pItem->m_lStartOffset) { // add item CLog::Log(LOGDEBUG, "Adding item (%s) to playlist", pItem->m_strPath.c_str()); queuedItems.Add(new CFileItem(*pItem)); } } } }