int EpgSearchFilter::FilterRecordings(CFileItemList &results) { int iRemoved(0); if (!g_PVRManager.IsStarted()) return iRemoved; CFileItemList recordings; g_PVRRecordings->GetAll(recordings); // TODO inefficient! CPVRRecordingPtr recording; for (int iRecordingPtr = 0; iRecordingPtr < recordings.Size(); iRecordingPtr++) { recording = recordings.Get(iRecordingPtr)->GetPVRRecordingInfoTag(); if (!recording) continue; for (int iResultPtr = 0; iResultPtr < results.Size(); iResultPtr++) { const CEpgInfoTagPtr epgentry(results.Get(iResultPtr)->GetEPGInfoTag()); /* no match */ if (!epgentry || epgentry->Title() != recording->m_strTitle || epgentry->Plot() != recording->m_strPlot) continue; results.Remove(iResultPtr); iResultPtr--; ++iRemoved; } } return iRemoved; }
bool CFavouritesDirectory::AddOrRemove(CFileItem *item, int contextWindow) { if (!item) return false; // load our list CFileItemList items; Load(items); std::string executePath(GetExecutePath(*item, contextWindow)); CFileItemPtr match = items.Get(executePath); if (match) { // remove the item items.Remove(match.get()); } else { // create our new favourite item CFileItemPtr favourite(new CFileItem(item->GetLabel())); if (item->GetLabel().empty()) favourite->SetLabel(CUtil::GetTitleFromPath(item->GetPath(), item->m_bIsFolder)); favourite->SetArt("thumb", item->GetArt("thumb")); favourite->SetPath(executePath); items.Add(favourite); } // and save our list again return Save(items); }
void CLocalFilesSource::BindItems(CFileItemList& items) { // Perform post processing here // Need to default video content to help with the UPnP case where we don't really know the content type bool bDefaultVideo = false; if( items.m_strPath.Equals("boxeedb://unresolvedVideoFiles") ) bDefaultVideo = true; for (int i = 0 ; i < items.Size() ; i++) { CFileItemPtr pItem = items[i]; if (pItem->IsVideo() || bDefaultVideo) { pItem->SetProperty("IsVideo", true); } else if (pItem->IsAudio()) { pItem->SetProperty("IsMusic", true); } else if (pItem->IsPicture()) { pItem->SetProperty("IsPhotos", true); } else if (!pItem->m_bIsFolder) { items.Remove(i); i--; } } CBrowseWindowSource::BindItems(items); }
bool CPVRChannelGroupsContainer::FilterDirectory(const CURL &url, CFileItemList &results) const { if (!results.IsEmpty()) { if (url.HasOption("view")) { const std::string view(url.GetOption("view")); if (view == "lastplayed") { // remove channels never played so far for (int i = 0; i < results.Size(); ++i) { const CPVRChannelPtr channel(results.Get(i)->GetPVRChannelInfoTag()); time_t lastWatched = channel->LastWatched(); if (!lastWatched) { results.Remove(i); --i; } } } else { CLog::Log(LOGERROR, "CPVRChannelGroupsContainer - %s - unsupported value '%s' for url parameter 'view'", __FUNCTION__, view.c_str()); return false; } } } return true; }
int CPVREpgSearchFilter::RemoveDuplicates(CFileItemList &results) { unsigned int iSize = results.Size(); for (unsigned int iResultPtr = 0; iResultPtr < iSize; iResultPtr++) { const CPVREpgInfoTagPtr epgentry_1(results.Get(iResultPtr)->GetEPGInfoTag()); if (!epgentry_1) continue; for (unsigned int iTagPtr = 0; iTagPtr < iSize; iTagPtr++) { if (iResultPtr == iTagPtr) continue; const CPVREpgInfoTagPtr epgentry_2(results.Get(iTagPtr)->GetEPGInfoTag()); if (!epgentry_2) continue; if (epgentry_1->Title() != epgentry_2->Title() || epgentry_1->Plot() != epgentry_2->Plot() || epgentry_1->PlotOutline() != epgentry_2->PlotOutline()) continue; results.Remove(iTagPtr); iResultPtr--; iTagPtr--; iSize--; } } return iSize; }
int EpgSearchFilter::FilterTimers(CFileItemList &results) { int iRemoved(0); if (!g_PVRManager.IsStarted()) return iRemoved; std::vector<CFileItemPtr> timers = g_PVRTimers->GetActiveTimers(); // TODO inefficient! for (unsigned int iTimerPtr = 0; iTimerPtr < timers.size(); iTimerPtr++) { CFileItemPtr fileItem = timers.at(iTimerPtr); if (!fileItem || !fileItem->HasPVRTimerInfoTag()) continue; CPVRTimerInfoTagPtr timer = fileItem->GetPVRTimerInfoTag(); if (!timer) continue; for (int iResultPtr = 0; iResultPtr < results.Size(); iResultPtr++) { const CEpgInfoTagPtr epgentry(results.Get(iResultPtr)->GetEPGInfoTag()); if (!epgentry || *epgentry->ChannelTag() != *timer->ChannelTag() || epgentry->StartAsUTC() < timer->StartAsUTC() || epgentry->EndAsUTC() > timer->EndAsUTC()) continue; results.Remove(iResultPtr); iResultPtr--; ++iRemoved; } } return iRemoved; }
void CAddonUnInstallJob::OnPostUnInstall() { if (m_addon->Type() == ADDON_REPOSITORY) { CAddonDatabase database; database.Open(); database.DeleteRepository(m_addon->ID()); } bool bSave(false); CFileItemList items; XFILE::CFavouritesDirectory::Load(items); for (int i=0; i < items.Size(); ++i) { if (items[i]->GetPath().find(m_addon->ID()) != std::string::npos) { items.Remove(items[i].get()); bSave = true; } } if (bSave) CFavouritesDirectory::Save(items); if (m_addon->Type() == ADDON_PVRDLL) { if (CSettings::Get().GetBool("pvrmanager.enabled")) PVR::CPVRManager::Get().Start(true); } }
bool CFavourites::AddOrRemove(CFileItem *item, int contextWindow) { if (!item) return false; // load our list CFileItemList items; Load(items); CStdString executePath(GetExecutePath(item, contextWindow)); CFileItemPtr match = items.Get(executePath); if (match) { // remove the item items.Remove(match.get()); } else { // create our new favourite item CFileItemPtr favourite(new CFileItem(item->GetLabel())); if (item->GetLabel().IsEmpty()) favourite->SetLabel(CUtil::GetTitleFromPath(item->m_strPath, item->m_bIsFolder)); favourite->SetThumbnailImage(item->GetThumbnailImage()); favourite->m_strPath = executePath; items.Add(favourite); } // and save our list again return Save(items); }
void CGUIWindowVideoNav::OnPrepareFileItems(CFileItemList &items) { CGUIWindowVideoBase::OnPrepareFileItems(items); // set fanart CQueryParams params; CVideoDatabaseDirectory dir; dir.GetQueryParams(items.m_strPath,params); if (params.GetContentType() == VIDEODB_CONTENT_MUSICVIDEOS) CGUIWindowMusicNav::SetupFanart(items); NODE_TYPE node = dir.GetDirectoryChildType(items.m_strPath); // now filter as necessary bool filterWatched=false; if (node == NODE_TYPE_EPISODES || node == NODE_TYPE_SEASONS || node == NODE_TYPE_TITLE_MOVIES || node == NODE_TYPE_TITLE_TVSHOWS || node == NODE_TYPE_TITLE_MUSICVIDEOS || node == NODE_TYPE_RECENTLY_ADDED_EPISODES || node == NODE_TYPE_RECENTLY_ADDED_MOVIES || node == NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS) filterWatched = true; if (items.IsPlugin()) filterWatched = true; if (items.IsSmartPlayList()) { if (items.GetContent() == "tvshows") node = NODE_TYPE_TITLE_TVSHOWS; // so that the check below works filterWatched = true; } int watchMode = g_settings.GetWatchMode(m_vecItems->GetContent()); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items.Get(i); if(item->HasVideoInfoTag() && (node == NODE_TYPE_TITLE_TVSHOWS || node == NODE_TYPE_SEASONS)) { if (watchMode == VIDEO_SHOW_UNWATCHED) item->GetVideoInfoTag()->m_iEpisode = item->GetPropertyInt("unwatchedepisodes"); if (watchMode == VIDEO_SHOW_WATCHED) item->GetVideoInfoTag()->m_iEpisode = item->GetPropertyInt("watchedepisodes"); item->SetProperty("numepisodes", item->GetVideoInfoTag()->m_iEpisode); } if(filterWatched) { if((watchMode==VIDEO_SHOW_WATCHED && item->GetVideoInfoTag()->m_playCount== 0) || (watchMode==VIDEO_SHOW_UNWATCHED && item->GetVideoInfoTag()->m_playCount > 0)) { items.Remove(i); i--; } } } }
void CGUIWindowVideoNav::OnLinkMovieToTvShow(int itemnumber, bool bRemove) { CFileItemList list; if (bRemove) { vector<int> ids; if (!m_database.GetLinksToTvShow(m_vecItems->Get(itemnumber)->GetVideoInfoTag()->m_iDbId,ids)) return; for (unsigned int i=0;i<ids.size();++i) { CVideoInfoTag tag; m_database.GetTvShowInfo("",tag,ids[i]); CFileItemPtr show(new CFileItem(tag)); list.Add(show); } } else { m_database.GetTvShowsNav("videodb://2/2",list); // remove already linked shows vector<int> ids; if (!m_database.GetLinksToTvShow(m_vecItems->Get(itemnumber)->GetVideoInfoTag()->m_iDbId,ids)) return; for (int i=0;i<list.Size();) { unsigned int j; for (j=0;j<ids.size();++j) { if (list[i]->GetVideoInfoTag()->m_iDbId == ids[j]) break; } if (j == ids.size()) i++; else list.Remove(i); } } int iSelectedLabel = 0; if (list.Size() > 1) { list.Sort(g_guiSettings.GetBool("filelists.ignorethewhensorting") ? SORT_METHOD_LABEL_IGNORE_THE : SORT_METHOD_LABEL, SORT_ORDER_ASC); CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); pDialog->SetItems(&list); pDialog->SetHeading(20356); pDialog->DoModal(); iSelectedLabel = pDialog->GetSelectedLabel(); } if (iSelectedLabel > -1) { m_database.LinkMovieToTvshow(m_vecItems->Get(itemnumber)->GetVideoInfoTag()->m_iDbId, list[iSelectedLabel]->GetVideoInfoTag()->m_iDbId, bRemove); CUtil::DeleteVideoDatabaseDirectoryCache(); } }
bool CGUIWindowScripts::GetDirectory(const CStdString& strDirectory, CFileItemList& items) { if (!CGUIMediaWindow::GetDirectory(strDirectory,items)) return false; // flatten any folders for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; if (item->m_bIsFolder && !item->IsParentFolder() && !item->m_bIsShareOrDrive && !item->GetLabel().Left(1).Equals(".")) { // folder item - let's check for a default.py file, and flatten if we have one CStdString defaultPY; // If using a multipath directory, get the first path CStdString firstPath; if (CUtil::IsMultiPath(item->m_strPath)) firstPath = CMultiPathDirectory::GetFirstPath(item->m_strPath); else firstPath = item->m_strPath; CUtil::AddFileToFolder(firstPath, "default.py", defaultPY); if (!CFile::Exists(defaultPY)) { CUtil::AddFileToFolder(firstPath, "Default.py", defaultPY); if (!CFile::Exists(defaultPY)) { CUtil::AddFileToFolder(firstPath, "DEFAULT.PY", defaultPY); } } if (CFile::Exists(defaultPY)) { // yes, format the item up item->m_strPath = defaultPY; item->m_bIsFolder = false; item->FillInDefaultIcon(); item->SetLabelPreformated(true); } } if (item->GetLabel().Equals("autoexec.py") || (item->GetLabel().Left(1).Equals(".") && !item->IsParentFolder())) { items.Remove(i); i--; } // Remove extension & set thumbnail AppleScripts CStdString itemLabel = item->GetLabel(); if (CUtil::GetExtension(itemLabel) == ".applescript") { CUtil::RemoveExtension(itemLabel); item->SetLabel(itemLabel); item->SetThumbnailImage(Cocoa_GetIconFromBundle("/Applications/AppleScript/Script Editor.app", "SECompiledScript")); } } items.SetProgramThumbs(); return true; }
void CGUIWindowPictures::OnPrepareFileItems(CFileItemList& items) { CGUIMediaWindow::OnPrepareFileItems(items); for (int i=0;i<items.Size();++i ) if (items[i]->GetLabel().Equals("folder.jpg")) items.Remove(i); if (items.GetFolderCount()==items.Size() || !CSettings::Get().GetBool("pictures.usetags")) return; // Start the music info loader thread CPictureInfoLoader loader; loader.SetProgressCallback(m_dlgProgress); loader.Load(items); bool bShowProgress=!g_windowManager.HasModalDialog(); bool bProgressVisible=false; unsigned int tick=XbmcThreads::SystemClockMillis(); while (loader.IsLoading() && m_dlgProgress && !m_dlgProgress->IsCanceled()) { if (bShowProgress) { // Do we have to init a progress dialog? unsigned int elapsed=XbmcThreads::SystemClockMillis()-tick; if (!bProgressVisible && elapsed>1500 && m_dlgProgress) { // tag loading takes more then 1.5 secs, show a progress dialog CURL url(items.GetPath()); m_dlgProgress->SetHeading(189); m_dlgProgress->SetLine(0, 505); m_dlgProgress->SetLine(1, ""); m_dlgProgress->SetLine(2, url.GetWithoutUserDetails()); m_dlgProgress->StartModal(); m_dlgProgress->ShowProgressBar(true); bProgressVisible = true; } if (bProgressVisible && m_dlgProgress) { // keep GUI alive m_dlgProgress->Progress(); } } // if (bShowProgress) Sleep(1); } // while (loader.IsLoading()) if (bProgressVisible && m_dlgProgress) m_dlgProgress->Close(); }
void CGUIWindowPictures::OnPrepareFileItems(CFileItemList& items) { CGUIMediaWindow::OnPrepareFileItems(items); for (int i=0;i<items.Size();++i ) if (StringUtils::EqualsNoCase(items[i]->GetLabel(), "folder.jpg")) items.Remove(i); if (items.GetFolderCount() == items.Size() || !CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PICTURES_USETAGS)) return; // Start the music info loader thread CPictureInfoLoader loader; loader.SetProgressCallback(m_dlgProgress); loader.Load(items); bool bShowProgress = !CServiceBroker::GetGUI()->GetWindowManager().HasModalDialog(true); bool bProgressVisible = false; unsigned int tick=XbmcThreads::SystemClockMillis(); while (loader.IsLoading() && m_dlgProgress && !m_dlgProgress->IsCanceled()) { if (bShowProgress) { // Do we have to init a progress dialog? unsigned int elapsed=XbmcThreads::SystemClockMillis()-tick; if (!bProgressVisible && elapsed>1500 && m_dlgProgress) { // tag loading takes more then 1.5 secs, show a progress dialog CURL url(items.GetPath()); m_dlgProgress->SetHeading(CVariant{189}); m_dlgProgress->SetLine(0, CVariant{505}); m_dlgProgress->SetLine(1, CVariant{""}); m_dlgProgress->SetLine(2, CVariant{url.GetWithoutUserDetails()}); m_dlgProgress->Open(); m_dlgProgress->ShowProgressBar(true); bProgressVisible = true; } if (bProgressVisible && m_dlgProgress) { // keep GUI alive m_dlgProgress->Progress(); } } // if (bShowProgress) Sleep(1); } // while (loader.IsLoading()) if (bProgressVisible && m_dlgProgress) m_dlgProgress->Close(); }
bool CGUIWindowAddonBrowser::GetDirectory(const std::string& strDirectory, CFileItemList& items) { bool result = CGUIMediaWindow::GetDirectory(strDirectory, items); if (result && CAddonsDirectory::IsRepoDirectory(CURL(strDirectory))) { if (CServiceBroker::GetSettings().GetBool(CSettings::SETTING_GENERAL_ADDONFOREIGNFILTER)) { int i = 0; while (i < items.Size()) { auto prop = items[i]->GetProperty("Addon.Language"); if (!prop.isNull() && IsForeign(prop.asString())) items.Remove(i); else ++i; } } if (CServiceBroker::GetSettings().GetBool(CSettings::SETTING_GENERAL_ADDONBROKENFILTER)) { for (int i = items.Size() - 1; i >= 0; i--) { if (items[i]->GetAddonInfo() && !items[i]->GetAddonInfo()->Broken().empty()) { //check if it's installed AddonPtr addon; if (!CAddonMgr::GetInstance().GetAddon(items[i]->GetProperty("Addon.ID").asString(), addon)) items.Remove(i); } } } } for (int i = 0; i < items.Size(); ++i) UpdateStatus(items[i]); return result; }
void CMyAppsSource::BindItems(CFileItemList& items) { // Perform post processing here CBrowseWindowPropertyValueFilter* filter = NULL; if (m_mapFilters.find("apptype") != m_mapFilters.end()) { CStdString filtername = m_mapFilters["apptype"]; if (filtername != "") { if (filtername == "video") { filter = new CBrowseWindowPropertyValueFilter(FILTER_APPS_VIDEO_ID, FILTER_APPS_VIDEO_NAME, "app-media", "video"); } else if (filtername == "music") { filter = new CBrowseWindowPropertyValueFilter(FILTER_APPS_MUSIC_ID, FILTER_APPS_MUSIC_NAME, "app-media", "music"); } else if (filtername == "pictures") { filter = new CBrowseWindowPropertyValueFilter(FILTER_APPS_PICTURES_ID, FILTER_APPS_PICTURES_NAME, "app-media", "pictures"); } if (filter != NULL) { int i = 0; while (i < items.Size()) { if (filter->Apply(&*items[i]) != true) {//need to remove this item items.Remove(i); } else { i++; } } delete filter; } } } CBrowseWindowSource::BindItems(items); }
void CAddonUnInstallJob::ClearFavourites() { bool bSave = false; CFileItemList items; XFILE::CFavouritesDirectory::Load(items); for (int i = 0; i < items.Size(); i++) { if (items[i]->GetPath().find(m_addon->ID()) != std::string::npos) { items.Remove(items[i].get()); bSave = true; } } if (bSave) CFavouritesDirectory::Save(items); }
void CAddonUnInstallJob::ClearFavourites() { bool bSave = false; CFileItemList items; CServiceBroker::GetFavouritesService().GetAll(items); for (int i = 0; i < items.Size(); i++) { if (items[i]->GetPath().find(m_addon->ID()) != std::string::npos) { items.Remove(items[i].get()); bSave = true; } } if (bSave) CServiceBroker::GetFavouritesService().Save(items); }
void CDirectory::FilterFileDirectories(CFileItemList &items, const CStdString &mask) { for (int i=0; i< items.Size(); ++i) { CFileItemPtr pItem=items[i]; if (!pItem->m_bIsFolder && pItem->IsFileFolder(EFILEFOLDER_TYPE_ALWAYS)) { auto_ptr<IFileDirectory> pDirectory(CFileDirectoryFactory::Create(pItem->GetPath(),pItem.get(),mask)); if (pDirectory.get()) pItem->m_bIsFolder = true; else if (pItem->m_bIsFolder) { items.Remove(i); i--; // don't confuse loop } } } }
bool CGUIWindowScripts::GetDirectory(const CStdString& strDirectory, CFileItemList& items) { if (!CGUIMediaWindow::GetDirectory(strDirectory,items)) return false; // flatten any folders for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; if (item->m_bIsFolder && !item->IsParentFolder() && !item->m_bIsShareOrDrive && !item->GetLabel().Left(1).Equals(".")) { // folder item - let's check for a default.py file, and flatten if we have one CStdString defaultPY; CUtil::AddFileToFolder(item->m_strPath, "default.py", defaultPY); if (!CFile::Exists(defaultPY)) { CUtil::AddFileToFolder(item->m_strPath, "Default.py", defaultPY); if (!CFile::Exists(defaultPY)) { CUtil::AddFileToFolder(item->m_strPath, "DEFAULT.PY", defaultPY); } } if (CFile::Exists(defaultPY)) { // yes, format the item up item->m_strPath = defaultPY; item->m_bIsFolder = false; item->FillInDefaultIcon(); item->SetLabelPreformated(true); } } if (item->GetLabel().Equals("autoexec.py") || (item->GetLabel().Left(1).Equals(".") && !item->IsParentFolder())) { items.Remove(i); i--; } } items.SetProgramThumbs(); return true; }
void CAddonUnInstallJob::OnPostUnInstall() { if (m_addon->Type() == ADDON_REPOSITORY) { CAddonDatabase database; database.Open(); database.DeleteRepository(m_addon->ID()); } bool bSave(false); CFileItemList items; CFavourites::Load(items); for (int i=0; i < items.Size(); ++i) { if (items[i]->GetPath().Find(m_addon->ID()) > -1) { items.Remove(items[i].get()); bSave = true; } } if (bSave) CFavourites::Save(items); }
/*! \brief Overwrite to fill fileitems from a source \param strDirectory Path to read \param items Fill with items specified in \e strDirectory */ bool CGUIMediaWindow::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { // cleanup items if (items.Size()) items.Clear(); CStdString strParentPath=m_history.GetParentPath(); CLog::Log(LOGDEBUG,"CGUIMediaWindow::GetDirectory (%s)", strDirectory.c_str()); CLog::Log(LOGDEBUG," ParentPath = [%s]", strParentPath.c_str()); // see if we can load a previously cached folder CFileItemList cachedItems(strDirectory); if (!strDirectory.IsEmpty() && cachedItems.Load(GetID())) { items.Assign(cachedItems); } else { unsigned int time = XbmcThreads::SystemClockMillis(); if (strDirectory.IsEmpty()) SetupShares(); if (!m_rootDir.GetDirectory(strDirectory, items)) return false; // took over a second, and not normally cached, so cache it if ((XbmcThreads::SystemClockMillis() - time) > 1000 && items.CacheToDiscIfSlow()) items.Save(GetID()); // if these items should replace the current listing, then pop it off the top if (items.GetReplaceListing()) m_history.RemoveParentPath(); } if (m_guiState.get() && !m_guiState->HideParentDirItems() && items.GetPath() != m_startDirectory) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(strParentPath); pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.AddFront(pItem, 0); } CStdStringArray regexps; int iWindow = GetID(); // TODO: Do we want to limit the directories we apply the video ones to? if (iWindow == WINDOW_VIDEO_NAV) regexps = g_advancedSettings.m_videoExcludeFromListingRegExps; if (iWindow == WINDOW_MUSIC_FILES) regexps = g_advancedSettings.m_audioExcludeFromListingRegExps; if (iWindow == WINDOW_PICTURES) regexps = g_advancedSettings.m_pictureExcludeFromListingRegExps; if (regexps.size()) { for (int i=0; i < items.Size();) { if (CUtil::ExcludeFileOrFolder(items[i]->GetPath(), regexps)) items.Remove(i); else i++; } } // clear the filter SetProperty("filter", ""); return true; }
bool CGUIWindowAddonBrowser::GetDirectory(const std::string& strDirectory, CFileItemList& items) { bool result; if (URIUtils::PathEquals(strDirectory, "addons://downloading/")) { VECADDONS addons; CAddonInstaller::Get().GetInstallList(addons); CURL url(strDirectory); CAddonsDirectory::GenerateAddonListing(url, addons, items, g_localizeStrings.Get(24067)); result = true; items.SetPath(strDirectory); if (m_guiState.get() && !m_guiState->HideParentDirItems()) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(m_history.GetParentPath()); pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.AddFront(pItem, 0); } } else { result = CGUIMediaWindow::GetDirectory(strDirectory, items); if (CAddonsDirectory::IsRepoDirectory(CURL(strDirectory))) { if (CSettings::Get().GetBool("general.addonforeignfilter")) { int i=0; while (i < items.Size()) { if (!FilterVar(true, items[i]->GetProperty("Addon.Language"), "en") || !FilterVar(true, items[i]->GetProperty("Addon.Language"), g_langInfo.GetLocale().GetLanguageCode()) || !FilterVar(true, items[i]->GetProperty("Addon.Language"), g_langInfo.GetLocale().ToShortString())) { i++; } else items.Remove(i); } } if (CSettings::Get().GetBool("general.addonbrokenfilter")) { for (int i = items.Size() - 1; i >= 0; i--) { if (!items[i]->GetProperty("Addon.Broken").empty()) { //check if it's installed AddonPtr addon; if (!CAddonMgr::Get().GetAddon(items[i]->GetProperty("Addon.ID").asString(), addon)) items.Remove(i); } } } } } if (strDirectory.empty() && CAddonInstaller::Get().IsDownloading()) { CFileItemPtr item(new CFileItem("addons://downloading/",true)); item->SetLabel(g_localizeStrings.Get(24067)); item->SetLabelPreformated(true); item->SetIconImage("DefaultNetwork.png"); items.Add(item); } items.SetContent("addons"); for (int i=0;i<items.Size();++i) SetItemLabel2(items[i]); return result; }
void CMultiPathDirectory::MergeItems(CFileItemList &items) { CLog::Log(LOGDEBUG, "CMultiPathDirectory::MergeItems, items = %i", (int)items.Size()); unsigned int time = CTimeUtils::GetTimeMS(); if (items.Size() == 0) return; // sort items by label // folders are before files in this sort method items.Sort(SORT_METHOD_LABEL, SORT_ORDER_ASC); int i = 0; // if first item in the sorted list is a file, just abort if (!items.Get(i)->m_bIsFolder) return; while (i + 1 < items.Size()) { // there are no more folders left, so exit the loop CFileItemPtr pItem1 = items.Get(i); if (!pItem1->m_bIsFolder) break; vector<int> stack; stack.push_back(i); CLog::Log(LOGDEBUG,"Testing path: [%03i] %s", i, pItem1->m_strPath.c_str()); int j = i + 1; do { CFileItemPtr pItem2 = items.Get(j); if (!pItem2->GetLabel().Equals(pItem1->GetLabel())) break; // ignore any filefolders which may coincidently have // the same label as a true folder if (!pItem2->IsFileFolder()) { stack.push_back(j); CLog::Log(LOGDEBUG," Adding path: [%03i] %s", j, pItem2->m_strPath.c_str()); } j++; } while (j < items.Size()); // do we have anything to combine? if (stack.size() > 1) { // we have a multipath so remove the items and add the new item CStdString newPath = ConstructMultiPath(items, stack); for (unsigned int k = stack.size() - 1; k > 0; --k) items.Remove(stack[k]); pItem1->m_strPath = newPath; CLog::Log(LOGDEBUG," New path: %s", pItem1->m_strPath.c_str()); } i++; } CLog::Log(LOGDEBUG, "CMultiPathDirectory::MergeItems, items = %i, took %d ms", items.Size(), CTimeUtils::GetTimeMS() - time); }
bool CDirectory::GetDirectory(const CURL& url, CFileItemList &items, const CHints &hints, bool allowThreads) { try { CURL realURL = URIUtils::SubstitutePath(url); std::shared_ptr<IDirectory> pDirectory(CDirectoryFactory::Create(realURL)); if (!pDirectory.get()) return false; // check our cache for this path if (g_directoryCache.GetDirectory(realURL.Get(), items, (hints.flags & DIR_FLAG_READ_CACHE) == DIR_FLAG_READ_CACHE)) items.SetURL(url); else { // need to clear the cache (in case the directory fetch fails) // and (re)fetch the folder if (!(hints.flags & DIR_FLAG_BYPASS_CACHE)) g_directoryCache.ClearDirectory(realURL.Get()); pDirectory->SetFlags(hints.flags); bool result = false, cancel = false; while (!result && !cancel) { const std::string pathToUrl(url.Get()); if (g_application.IsCurrentThread() && allowThreads && !URIUtils::IsSpecial(pathToUrl)) { CSingleExit ex(g_graphicsContext); CGetDirectory get(pDirectory, realURL, url); if(!get.Wait(TIME_TO_BUSY_DIALOG)) { CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); if (dialog) { dialog->Open(); while(!get.Wait(10)) { CSingleLock lock(g_graphicsContext); // update progress float progress = pDirectory->GetProgress(); if (progress > 0) dialog->SetProgress(progress); if (dialog->IsCanceled()) { cancel = true; pDirectory->CancelDirectory(); break; } lock.Leave(); // prevent an occasional deadlock on exit g_windowManager.ProcessRenderLoop(false); } dialog->Close(); } } result = get.GetDirectory(items); } else { items.SetURL(url); result = pDirectory->GetDirectory(realURL, items); } if (!result) { if (!cancel && g_application.IsCurrentThread() && pDirectory->ProcessRequirements()) continue; CLog::Log(LOGERROR, "%s - Error getting %s", __FUNCTION__, url.GetRedacted().c_str()); return false; } } // cache the directory, if necessary if (!(hints.flags & DIR_FLAG_BYPASS_CACHE)) g_directoryCache.SetDirectory(realURL.Get(), items, pDirectory->GetCacheType(url)); } // now filter for allowed files if (!pDirectory->AllowAll()) { pDirectory->SetMask(hints.mask); for (int i = 0; i < items.Size(); ++i) { CFileItemPtr item = items[i]; if (!item->m_bIsFolder && !pDirectory->IsAllowed(item->GetURL())) { items.Remove(i); i--; // don't confuse loop } } } // filter hidden files // TODO: we shouldn't be checking the gui setting here, callers should use getHidden instead if (!CSettings::Get().GetBool("filelists.showhidden") && !(hints.flags & DIR_FLAG_GET_HIDDEN)) { for (int i = 0; i < items.Size(); ++i) { if (items[i]->GetProperty("file:hidden").asBoolean()) { items.Remove(i); i--; // don't confuse loop } } } // Should any of the files we read be treated as a directory? // Disable for database folders, as they already contain the extracted items if (!(hints.flags & DIR_FLAG_NO_FILE_DIRS) && !items.IsMusicDb() && !items.IsVideoDb() && !items.IsSmartPlayList()) FilterFileDirectories(items, hints.mask); // Correct items for path substitution const std::string pathToUrl(url.Get()); const std::string pathToUrl2(realURL.Get()); if (pathToUrl != pathToUrl2) { for (int i = 0; i < items.Size(); ++i) { CFileItemPtr item = items[i]; item->SetPath(URIUtils::SubstitutePath(item->GetPath(), true)); } } return true; } XBMCCOMMONS_HANDLE_UNCHECKED catch (...) { CLog::Log(LOGERROR, "%s - Unhandled exception", __FUNCTION__); } CLog::Log(LOGERROR, "%s - Error getting %s", __FUNCTION__, url.GetRedacted().c_str()); return false; }
bool CGUIWindowVideoNav::ApplyWatchedFilter(CFileItemList &items) { bool listchanged = false; CVideoDatabaseDirectory dir; NODE_TYPE node = dir.GetDirectoryChildType(items.GetPath()); // now filter watched items as necessary bool filterWatched=false; if (node == NODE_TYPE_EPISODES || node == NODE_TYPE_SEASONS || node == NODE_TYPE_SETS || node == NODE_TYPE_TAGS || node == NODE_TYPE_TITLE_MOVIES || node == NODE_TYPE_TITLE_TVSHOWS || node == NODE_TYPE_TITLE_MUSICVIDEOS || node == NODE_TYPE_RECENTLY_ADDED_EPISODES || node == NODE_TYPE_RECENTLY_ADDED_MOVIES || node == NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS) filterWatched = true; if (!items.IsVideoDb()) filterWatched = true; if (items.GetContent() == "tvshows" && (items.IsSmartPlayList() || items.IsLibraryFolder())) node = NODE_TYPE_TITLE_TVSHOWS; // so that the check below works int watchMode = CMediaSettings::GetInstance().GetWatchedMode(m_vecItems->GetContent()); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items.Get(i); if(item->HasVideoInfoTag() && (node == NODE_TYPE_TITLE_TVSHOWS || node == NODE_TYPE_SEASONS)) { if (watchMode == WatchedModeUnwatched) item->GetVideoInfoTag()->m_iEpisode = (int)item->GetProperty("unwatchedepisodes").asInteger(); if (watchMode == WatchedModeWatched) item->GetVideoInfoTag()->m_iEpisode = (int)item->GetProperty("watchedepisodes").asInteger(); if (watchMode == WatchedModeAll) item->GetVideoInfoTag()->m_iEpisode = (int)item->GetProperty("totalepisodes").asInteger(); item->SetProperty("numepisodes", item->GetVideoInfoTag()->m_iEpisode); listchanged = true; } if (filterWatched) { if(!item->IsParentFolder() && // Don't delete the go to parent folder ((watchMode == WatchedModeWatched && item->GetVideoInfoTag()->GetPlayCount() == 0) || (watchMode == WatchedModeUnwatched && item->GetVideoInfoTag()->GetPlayCount() > 0))) { items.Remove(i); i--; listchanged = true; } } } // Remove the parent folder icon, if it's the only thing in the folder. This is needed for hiding seasons. if (items.GetObjectCount() == 0 && items.GetFileCount() > 0 && items.Get(0)->IsParentFolder()) items.Remove(0); if(node == NODE_TYPE_TITLE_TVSHOWS || node == NODE_TYPE_SEASONS) { // the watched filter may change the "numepisodes" property which is reflected in the TV_SHOWS and SEASONS nodes // therefore, the items labels have to be refreshed, and possibly the list needs resorting as well. items.ClearSortState(); // this is needed to force resorting even if sort method did not change FormatAndSort(items); } return listchanged; }
void CPictureThumbLoader::ProcessFoldersAndArchives(CFileItem *pItem) { if (pItem->HasThumbnail()) return; CTextureDatabase db; db.Open(); if (pItem->IsCBR() || pItem->IsCBZ()) { CStdString strTBN(URIUtils::ReplaceExtension(pItem->GetPath(),".tbn")); if (CFile::Exists(strTBN)) { db.SetTextureForPath(pItem->GetPath(), "thumb", strTBN); CTextureCache::Get().BackgroundCacheImage(strTBN); pItem->SetThumbnailImage(strTBN); return; } } if ((pItem->m_bIsFolder || pItem->IsCBR() || pItem->IsCBZ()) && !pItem->m_bIsShareOrDrive && !pItem->IsParentFolder()) { // first check for a folder.jpg CStdString thumb = "folder.jpg"; CStdString strPath = pItem->GetPath(); if (pItem->IsCBR()) { URIUtils::CreateArchivePath(strPath,"rar",pItem->GetPath(),""); thumb = "cover.jpg"; } if (pItem->IsCBZ()) { URIUtils::CreateArchivePath(strPath,"zip",pItem->GetPath(),""); thumb = "cover.jpg"; } if (pItem->IsMultiPath()) strPath = CMultiPathDirectory::GetFirstPath(pItem->GetPath()); thumb = URIUtils::AddFileToFolder(strPath, thumb); if (CFile::Exists(thumb)) { db.SetTextureForPath(pItem->GetPath(), "thumb", thumb); CTextureCache::Get().BackgroundCacheImage(thumb); pItem->SetThumbnailImage(thumb); return; } if (!pItem->IsPlugin()) { // we load the directory, grab 4 random thumb files (if available) and then generate // the thumb. CFileItemList items; CDirectory::GetDirectory(strPath, items, g_settings.m_pictureExtensions, DIR_FLAG_NO_FILE_DIRS); // create the folder thumb by choosing 4 random thumbs within the folder and putting // them into one thumb. // count the number of images for (int i=0; i < items.Size();) { if (!items[i]->IsPicture() || items[i]->IsZIP() || items[i]->IsRAR() || items[i]->IsPlayList()) { items.Remove(i); } else i++; } if (items.IsEmpty()) { if (pItem->IsCBZ() || pItem->IsCBR()) { CDirectory::GetDirectory(strPath, items, g_settings.m_pictureExtensions, DIR_FLAG_NO_FILE_DIRS); for (int i=0;i<items.Size();++i) { CFileItemPtr item = items[i]; if (item->m_bIsFolder) { ProcessFoldersAndArchives(item.get()); pItem->SetThumbnailImage(items[i]->GetThumbnailImage()); pItem->SetIconImage(items[i]->GetIconImage()); return; } } } return; // no images in this folder } // randomize them items.Randomize(); if (items.Size() < 4 || pItem->IsCBR() || pItem->IsCBZ()) { // less than 4 items, so just grab the first thumb items.Sort(SORT_METHOD_LABEL, SORT_ORDER_ASC); CStdString thumb = CTextureCache::GetWrappedThumbURL(items[0]->GetPath()); db.SetTextureForPath(pItem->GetPath(), "thumb", thumb); CTextureCache::Get().BackgroundCacheImage(thumb); pItem->SetThumbnailImage(thumb); } else { // ok, now we've got the files to get the thumbs from, lets create it... // we basically load the 4 images and combine them vector<string> files; for (int thumb = 0; thumb < 4; thumb++) files.push_back(items[thumb]->GetPath()); CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "picturefolder"); CStdString relativeCacheFile = CTextureCache::GetCacheFile(thumb) + ".png"; if (CPicture::CreateTiledThumb(files, CTextureCache::GetCachedPath(relativeCacheFile))) { CTextureDetails details; details.file = relativeCacheFile; details.width = g_advancedSettings.m_thumbSize; details.height = g_advancedSettings.m_thumbSize; CTextureCache::Get().AddCachedTexture(thumb, details); db.SetTextureForPath(pItem->GetPath(), "thumb", thumb); pItem->SetThumbnailImage(CTextureCache::GetCachedPath(relativeCacheFile)); } } } // refill in the icon to get it to update pItem->FillInDefaultIcon(); } }
/*! \brief Overwrite to fill fileitems from a source \param strDirectory Path to read \param items Fill with items specified in \e strDirectory */ bool CGUIMediaWindow::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { // cleanup items if (items.Size()) items.Clear(); CStdString strParentPath=m_history.GetParentPath(); CLog::Log(LOGDEBUG,"CGUIMediaWindow::GetDirectory (%s)", strDirectory.c_str()); CLog::Log(LOGDEBUG," ParentPath = [%s]", strParentPath.c_str()); // see if we can load a previously cached folder CFileItemList cachedItems(strDirectory); if (!strDirectory.IsEmpty() && cachedItems.Load()) { items.Assign(cachedItems); } else { DWORD time = timeGetTime(); if (!m_rootDir.GetDirectory(strDirectory, items)) return false; // took over a second, and not normally cached, so cache it if (time + 1000 < timeGetTime() && items.CacheToDiscIfSlow()) items.Save(); // if these items should replace the current listing, then pop it off the top if (items.GetReplaceListing()) m_history.RemoveParentPath(); } if (m_guiState.get() && !m_guiState->HideParentDirItems() && !items.m_strPath.IsEmpty()) { CFileItemPtr pItem(new CFileItem("..")); pItem->m_strPath = strParentPath; pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.AddFront(pItem, 0); } int iWindow = GetID(); CStdStringArray regexps; if (iWindow == WINDOW_VIDEO_FILES) regexps = g_advancedSettings.m_videoExcludeFromListingRegExps; if (iWindow == WINDOW_MUSIC_FILES) regexps = g_advancedSettings.m_audioExcludeFromListingRegExps; if (iWindow == WINDOW_PICTURES) regexps = g_advancedSettings.m_pictureExcludeFromListingRegExps; if (regexps.size()) { for (int i=0; i < items.Size();) { if (CUtil::ExcludeFileOrFolder(items[i]->m_strPath, regexps)) items.Remove(i); else i++; } } // clear window properties at root or plugin root if (items.IsVirtualDirectoryRoot() || items.IsPluginRoot()) ClearProperties(); return true; }
/*! \brief Start playback of media. * \param params The parameters. * \details params[0] = URL to media to play (optional). * params[1,...] = "isdir" if media is a directory (optional). * params[1,...] = "1" to start playback in fullscreen (optional). * params[1,...] = "resume" to force resuming (optional). * params[1,...] = "noresume" to force not resuming (optional). * params[1,...] = "playoffset=<offset>" to start playback from a given position in a playlist (optional). */ static int PlayMedia(const std::vector<std::string>& params) { CFileItem item(params[0], false); if (URIUtils::HasSlashAtEnd(params[0])) item.m_bIsFolder = true; // restore to previous window if needed if( CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == WINDOW_SLIDESHOW || CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO || CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == WINDOW_FULLSCREEN_GAME || CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == WINDOW_VISUALISATION ) CServiceBroker::GetGUI()->GetWindowManager().PreviousWindow(); // reset screensaver g_application.ResetScreenSaver(); g_application.WakeUpScreenSaverAndDPMS(); // ask if we need to check guisettings to resume bool askToResume = true; int playOffset = 0; for (unsigned int i = 1 ; i < params.size() ; i++) { if (StringUtils::EqualsNoCase(params[i], "isdir")) item.m_bIsFolder = true; else if (params[i] == "1") // set fullscreen or windowed CMediaSettings::GetInstance().SetVideoStartWindowed(true); else if (StringUtils::EqualsNoCase(params[i], "resume")) { // force the item to resume (if applicable) (see CApplication::PlayMedia) item.m_lStartOffset = STARTOFFSET_RESUME; askToResume = false; } else if (StringUtils::EqualsNoCase(params[i], "noresume")) { // force the item to start at the beginning (m_lStartOffset is initialized to 0) askToResume = false; } else if (StringUtils::StartsWithNoCase(params[i], "playoffset=")) { playOffset = atoi(params[i].substr(11).c_str()) - 1; item.SetProperty("playlist_starting_track", playOffset); } } if (!item.m_bIsFolder && item.IsPlugin()) item.SetProperty("IsPlayable", true); if ( askToResume == true ) { if ( CGUIWindowVideoBase::ShowResumeMenu(item) == false ) return false; } if (item.m_bIsFolder) { CFileItemList items; std::string extensions = CServiceBroker::GetFileExtensionProvider().GetVideoExtensions() + "|" + CServiceBroker::GetFileExtensionProvider().GetMusicExtensions(); XFILE::CDirectory::GetDirectory(item.GetPath(), items, extensions, XFILE::DIR_FLAG_DEFAULTS); bool containsMusic = false, containsVideo = false; for (int i = 0; i < items.Size(); i++) { bool isVideo = items[i]->IsVideo(); containsMusic |= !isVideo; containsVideo |= isVideo; if (containsMusic && containsVideo) break; } std::unique_ptr<CGUIViewState> state(CGUIViewState::GetViewState(containsVideo ? WINDOW_VIDEO_NAV : WINDOW_MUSIC_NAV, items)); if (state.get()) items.Sort(state->GetSortMethod()); else items.Sort(SortByLabel, SortOrderAscending); int playlist = containsVideo? PLAYLIST_VIDEO : PLAYLIST_MUSIC;; if (containsMusic && containsVideo) //mixed content found in the folder { for (int i = items.Size() - 1; i >= 0; i--) //remove music entries { if (!items[i]->IsVideo()) items.Remove(i); } } CServiceBroker::GetPlaylistPlayer().ClearPlaylist(playlist); CServiceBroker::GetPlaylistPlayer().Add(playlist, items); CServiceBroker::GetPlaylistPlayer().SetCurrentPlaylist(playlist); CServiceBroker::GetPlaylistPlayer().Play(playOffset, ""); } else if (item.IsAudio() || item.IsVideo()) CServiceBroker::GetPlaylistPlayer().Play(std::make_shared<CFileItem>(item), ""); else g_application.PlayMedia(item, "", PLAYLIST_NONE); return 0; }
void CGUIDialogSmartPlaylistRule::OnBrowse() { CFileItemList items; CMusicDatabase database; database.Open(); CVideoDatabase videodatabase; videodatabase.Open(); std::string basePath; if (CSmartPlaylist::IsMusicType(m_type)) basePath = "musicdb://"; else basePath = "videodb://"; VIDEODB_CONTENT_TYPE type = VIDEODB_CONTENT_MOVIES; if (m_type == "movies") basePath += "movies/"; else if (m_type == "tvshows") { type = VIDEODB_CONTENT_TVSHOWS; basePath += "tvshows/"; } else if (m_type == "musicvideos") { type = VIDEODB_CONTENT_MUSICVIDEOS; basePath += "musicvideos/"; } else if (m_type == "episodes") { if (m_rule.m_field == FieldGenre || m_rule.m_field == FieldYear || m_rule.m_field == FieldStudio) type = VIDEODB_CONTENT_TVSHOWS; else type = VIDEODB_CONTENT_EPISODES; basePath += "tvshows/"; } int iLabel = 0; if (m_rule.m_field == FieldGenre) { if (m_type == "tvshows" || m_type == "episodes" || m_type == "movies") videodatabase.GetGenresNav(basePath + "genres/", items, type); else if (m_type == "songs" || m_type == "albums" || m_type == "artists" || m_type == "mixed") database.GetGenresNav("musicdb://genres/",items); if (m_type == "musicvideos" || m_type == "mixed") { CFileItemList items2; videodatabase.GetGenresNav("videodb://musicvideos/genres/",items2,VIDEODB_CONTENT_MUSICVIDEOS); items.Append(items2); } iLabel = 515; } else if (m_rule.m_field == FieldCountry) { videodatabase.GetCountriesNav(basePath, items, type); iLabel = 574; } else if (m_rule.m_field == FieldArtist || m_rule.m_field == FieldAlbumArtist) { if (CSmartPlaylist::IsMusicType(m_type)) database.GetArtistsNav("musicdb://artists/", items, m_rule.m_field == FieldAlbumArtist, -1); if (m_type == "musicvideos" || m_type == "mixed") { CFileItemList items2; videodatabase.GetMusicVideoArtistsByName("", items2); items.Append(items2); } iLabel = 557; } else if (m_rule.m_field == FieldAlbum) { if (CSmartPlaylist::IsMusicType(m_type)) database.GetAlbumsNav("musicdb://albums/", items); if (m_type == "musicvideos" || m_type == "mixed") { CFileItemList items2; videodatabase.GetMusicVideoAlbumsByName("", items2); items.Append(items2); } iLabel = 558; } else if (m_rule.m_field == FieldActor) { videodatabase.GetActorsNav(basePath + "actors/",items,type); iLabel = 20337; } else if (m_rule.m_field == FieldYear) { if (CSmartPlaylist::IsMusicType(m_type)) database.GetYearsNav("musicdb://years/", items); if (CSmartPlaylist::IsVideoType(m_type)) { CFileItemList items2; videodatabase.GetYearsNav(basePath + "years/", items2, type); items.Append(items2); } iLabel = 562; } else if (m_rule.m_field == FieldDirector) { videodatabase.GetDirectorsNav(basePath + "directors/", items, type); iLabel = 20339; } else if (m_rule.m_field == FieldStudio) { videodatabase.GetStudiosNav(basePath + "studios/", items, type); iLabel = 572; } else if (m_rule.m_field == FieldWriter) { videodatabase.GetWritersNav(basePath, items, type); iLabel = 20417; } else if (m_rule.m_field == FieldTvShowTitle || (m_type == "tvshows" && m_rule.m_field == FieldTitle)) { videodatabase.GetTvShowsNav(basePath + "titles/", items); iLabel = 20343; } else if (m_rule.m_field == FieldTitle) { if (m_type == "songs" || m_type == "mixed") { database.GetSongsNav("musicdb://songs/", items, -1, -1, -1); iLabel = 134; } if (m_type == "movies") { videodatabase.GetMoviesNav(basePath + "titles/", items); iLabel = 20342; } if (m_type == "episodes") { videodatabase.GetEpisodesNav(basePath + "titles/-1/-1/", items); // we need to replace the db label (<season>x<episode> <title>) with the title only CLabelFormatter format("%T", ""); for (int i = 0; i < items.Size(); i++) format.FormatLabel(items[i].get()); iLabel = 20360; } if (m_type == "musicvideos" || m_type == "mixed") { videodatabase.GetMusicVideosNav(basePath + "titles/", items); iLabel = 20389; } } else if (m_rule.m_field == FieldPlaylist || m_rule.m_field == FieldVirtualFolder) { // use filebrowser to grab another smart playlist // Note: This can cause infinite loops (playlist that refers to the same playlist) but I don't // think there's any decent way to deal with this, as the infinite loop may be an arbitrary // number of playlists deep, eg playlist1 -> playlist2 -> playlist3 ... -> playlistn -> playlist1 if (CSmartPlaylist::IsVideoType(m_type)) XFILE::CDirectory::GetDirectory("special://videoplaylists/", items, ".xsp", XFILE::DIR_FLAG_NO_FILE_DIRS); if (CSmartPlaylist::IsMusicType(m_type)) { CFileItemList items2; XFILE::CDirectory::GetDirectory("special://musicplaylists/", items2, ".xsp", XFILE::DIR_FLAG_NO_FILE_DIRS); items.Append(items2); } for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; CSmartPlaylist playlist; // don't list unloadable smartplaylists or any referencable smartplaylists // which do not match the type of the current smartplaylist if (!playlist.Load(item->GetPath()) || (m_rule.m_field == FieldPlaylist && (!CSmartPlaylist::CheckTypeCompatibility(m_type, playlist.GetType()) || (!playlist.GetGroup().empty() || playlist.IsGroupMixed())))) { items.Remove(i); i -= 1; continue; } if (!playlist.GetName().empty()) item->SetLabel(playlist.GetName()); } iLabel = 559; } else if (m_rule.m_field == FieldPath) { VECSOURCES sources; if (m_type == "songs" || m_type == "mixed") sources = *CMediaSourceSettings::GetInstance().GetSources("music"); if (CSmartPlaylist::IsVideoType(m_type)) { VECSOURCES sources2 = *CMediaSourceSettings::GetInstance().GetSources("video"); sources.insert(sources.end(),sources2.begin(),sources2.end()); } g_mediaManager.GetLocalDrives(sources); std::string path = m_rule.GetParameter(); CGUIDialogFileBrowser::ShowAndGetDirectory(sources, g_localizeStrings.Get(657), path, false); if (m_rule.m_parameter.size() > 0) m_rule.m_parameter.clear(); if (!path.empty()) m_rule.m_parameter.push_back(path); UpdateButtons(); return; } else if (m_rule.m_field == FieldSet) { videodatabase.GetSetsNav("videodb://movies/sets/", items, VIDEODB_CONTENT_MOVIES); iLabel = 20434; } else if (m_rule.m_field == FieldTag) { VIDEODB_CONTENT_TYPE type = VIDEODB_CONTENT_MOVIES; if (m_type == "tvshows" || m_type == "episodes") type = VIDEODB_CONTENT_TVSHOWS; else if (m_type == "musicvideos") type = VIDEODB_CONTENT_MUSICVIDEOS; else if (m_type != "movies") return; videodatabase.GetTagsNav(basePath + "tags/", items, type); iLabel = 20459; } else { // TODO: Add browseability in here. assert(false); } // sort the items items.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); pDialog->SetItems(&items); std::string strHeading = StringUtils::Format(g_localizeStrings.Get(13401).c_str(), g_localizeStrings.Get(iLabel).c_str()); pDialog->SetHeading(CVariant{std::move(strHeading)}); pDialog->SetMultiSelection(m_rule.m_field != FieldPlaylist && m_rule.m_field != FieldVirtualFolder); if (!m_rule.m_parameter.empty()) pDialog->SetSelected(m_rule.m_parameter); pDialog->Open(); if (pDialog->IsConfirmed()) { m_rule.m_parameter.clear(); for (int i : pDialog->GetSelectedItems()) m_rule.m_parameter.push_back(items.Get(i)->GetLabel()); UpdateButtons(); } pDialog->Reset(); }
bool CGUIWindowAddonBrowser::GetDirectory(const CStdString& strDirectory, CFileItemList& items) { bool result; if (strDirectory.Equals("addons://downloading/")) { VECADDONS addons; CAddonInstaller::Get().GetInstallList(addons); CURL url(strDirectory); CAddonsDirectory::GenerateListing(url,addons,items); result = true; items.SetProperty("reponame",g_localizeStrings.Get(24067)); items.SetPath(strDirectory); if (m_guiState.get() && !m_guiState->HideParentDirItems()) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(m_history.GetParentPath()); pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.AddFront(pItem, 0); } } else { result = CGUIMediaWindow::GetDirectory(strDirectory,items); if (CSettings::Get().GetBool("general.addonforeignfilter")) { int i=0; while (i < items.Size()) { if (!FilterVar(CSettings::Get().GetBool("general.addonforeignfilter"), items[i]->GetProperty("Addon.Language"), "en") || !FilterVar(CSettings::Get().GetBool("general.addonforeignfilter"), items[i]->GetProperty("Addon.Language"), g_langInfo.GetLanguageLocale())) { i++; } else items.Remove(i); } } } if (strDirectory.IsEmpty() && CAddonInstaller::Get().IsDownloading()) { CFileItemPtr item(new CFileItem("addons://downloading/",true)); item->SetLabel(g_localizeStrings.Get(24067)); item->SetLabelPreformated(true); item->SetIconImage("DefaultNetwork.png"); items.Add(item); } items.SetContent("addons"); for (int i=0;i<items.Size();++i) SetItemLabel2(items[i]); return result; }