bool CGUIWindowMusicBase::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { items.SetThumbnailImage(""); bool bResult = CGUIMediaWindow::GetDirectory(strDirectory,items); if (bResult) CMusicThumbLoader::FillThumb(items); // add in the "New Playlist" item if we're in the playlists folder if ((items.GetPath() == "special://musicplaylists/") && !items.Contains("newplaylist://")) { CFileItemPtr newPlaylist(new CFileItem(g_settings.GetUserDataItem("PartyMode.xsp"),false)); newPlaylist->SetLabel(g_localizeStrings.Get(16035)); newPlaylist->SetLabelPreformated(true); newPlaylist->m_bIsFolder = true; items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newplaylist://", false)); newPlaylist->SetLabel(g_localizeStrings.Get(525)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newsmartplaylist://music", false)); newPlaylist->SetLabel(g_localizeStrings.Get(21437)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); } return bResult; }
bool CGUIWindowMusicBase::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { CStdString directory = strDirectory; // check if the path contains a filter and if so load it and // remove it from the path to get proper GUI view states etc CSmartPlaylist filterXsp; CMusicDbUrl musicUrl; if (musicUrl.FromString(strDirectory)) { CVariant filter; if (musicUrl.GetOption("filter", filter)) { // load the filter and if it's type does not match the // path's item type reset it if (filterXsp.LoadFromJson(filter.asString()) && !filterXsp.GetType().Equals(musicUrl.GetType().c_str())) filterXsp.Reset(); // remove the "filter" option from the path musicUrl.AddOption("filter", ""); } directory = musicUrl.ToString(); } items.SetArt("thumb", ""); bool bResult = CGUIMediaWindow::GetDirectory(directory, items); if (bResult) CMusicThumbLoader::FillThumb(items); // (re-)apply the previously retrieved filter // because it was reset in CGUIMediaWindow::GetDirectory() if (!filterXsp.IsEmpty()) m_filter = filterXsp; // add in the "New Playlist" item if we're in the playlists folder if ((items.GetPath() == "special://musicplaylists/") && !items.Contains("newplaylist://")) { CFileItemPtr newPlaylist(new CFileItem(g_settings.GetUserDataItem("PartyMode.xsp"),false)); newPlaylist->SetLabel(g_localizeStrings.Get(16035)); newPlaylist->SetLabelPreformated(true); newPlaylist->m_bIsFolder = true; items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newplaylist://", false)); newPlaylist->SetLabel(g_localizeStrings.Get(525)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newsmartplaylist://music", false)); newPlaylist->SetLabel(g_localizeStrings.Get(21437)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); } return bResult; }
bool CFavouritesDirectory::IsFavourite(CFileItem *item, int contextWindow) { CFileItemList items; if (!Load(items)) return false; return items.Contains(GetExecutePath(*item, contextWindow)); }
/** * \brief Gets a list of folders for recorded TV shows */ bool CMythDirectory::GetTvShowFolders(const CStdString& base, CFileItemList &items) { cmyth_proglist_t list = m_session->GetAllRecordedPrograms(); if (!list) { CLog::Log(LOGERROR, "%s - unable to get list of recordings", __FUNCTION__); return false; } int count = m_dll->proglist_get_count(list); for (int i = 0; i < count; i++) { cmyth_proginfo_t program = m_dll->proglist_get_item(list, i); if (program) { if (!IsVisible(program)) { m_dll->ref_release(program); continue; } if (!IsTvShow(program)) { m_dll->ref_release(program); continue; } CStdString title = GetValue(m_dll->proginfo_title(program)); CStdString path = base + "/" + title + "/"; /* * Only add each TV show once. If the TV show is already in the list, update the date for the * folder to be the date of the last recorded TV show as the programs are returned in the * order they were recorded. */ if (items.Contains(path)) { CFileItemPtr item = items.Get(path); item->m_dateTime = GetValue(m_dll->proginfo_rec_start(program)); } else { CFileItemPtr item(new CFileItem(path, true)); item->m_dateTime = GetValue(m_dll->proginfo_rec_start(program)); item->SetLabel(title); items.Add(item); } m_dll->ref_release(program); } } if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) items.AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551 /* Name */, LABEL_MASKS("", "", "%L", "%J")); else items.AddSortMethod(SORT_METHOD_LABEL, 551 /* Name */, LABEL_MASKS("", "", "%L", "%J")); items.AddSortMethod(SORT_METHOD_DATE, 552 /* Date */, LABEL_MASKS("", "", "%L", "%J")); return true; }
// Android apk directory i/o. Depends on libzip // Basically the same format as zip. // We might want to refactor CZipDirectory someday... ////////////////////////////////////////////////////////////////////// bool CAPKDirectory::GetDirectory(const CURL& url, CFileItemList &items) { // uses a <fully qualified path>/filename.apk/... std::string path = url.GetFileName(); std::string host = url.GetHostName(); URIUtils::AddSlashAtEnd(path); int zip_flags = 0, zip_error = 0; struct zip *zip_archive; zip_archive = zip_open(host.c_str(), zip_flags, &zip_error); if (!zip_archive || zip_error) { CLog::Log(LOGERROR, "CAPKDirectory::GetDirectory: Unable to open archive : '%s'", host.c_str()); return false; } std::string test_name; int numFiles = zip_get_num_files(zip_archive); for (int zip_index = 0; zip_index < numFiles; zip_index++) { test_name = zip_get_name(zip_archive, zip_index, zip_flags); // check for non matching path. if (!StringUtils::StartsWith(test_name, path)) continue; // libzip does not index folders, only filenames. We search for a /, // add it if it's not in our list already, and hope that no one has // any "file/name.exe" files in a zip. size_t dir_marker = test_name.find('/', path.size() + 1); if (dir_marker != std::string::npos) { // return items relative to path test_name=test_name.substr(0, dir_marker); if (items.Contains(host + "/" + test_name)) continue; } struct zip_stat sb; zip_stat_init(&sb); if (zip_stat_index(zip_archive, zip_index, zip_flags, &sb) != -1) { g_charsetConverter.unknownToUTF8(test_name); CFileItemPtr pItem(new CFileItem(test_name)); pItem->m_dwSize = sb.size; pItem->m_dateTime = sb.mtime; pItem->m_bIsFolder = dir_marker > 0 ; pItem->SetPath(host + "/" + test_name); pItem->SetLabel(test_name.substr(path.size())); items.Add(pItem); } } zip_close(zip_archive); return true; }
/** * \brief Gets a list of folders for recorded TV shows */ bool CCMythDirectory::GetTvShowFolders(const CStdString& base, CFileItemList &items) { cmyth_conn_t control = m_session->GetControl(); if(!control) return false; cmyth_proglist_t list = m_dll->proglist_get_all_recorded(control); if(!list) { CLog::Log(LOGERROR, "%s - unable to get list of recordings", __FUNCTION__); return false; } int count = m_dll->proglist_get_count(list); for(int i=0; i<count; i++) { cmyth_proginfo_t program = m_dll->proglist_get_item(list, i); if(program) { if(GetValue(m_dll->proginfo_recgroup(program)).Equals("LiveTV")) { m_dll->ref_release(program); continue; } if (!IsTvShow(program)) { m_dll->ref_release(program); continue; } CStdString title = GetValue(m_dll->proginfo_title(program)); // Only add each TV show once if (items.Contains(base + "/" + title + "/")) { m_dll->ref_release(program); continue; } CFileItemPtr item(new CFileItem(base + "/" + title + "/", true)); item->SetLabel(title); item->SetLabelPreformated(true); items.Add(item); m_dll->ref_release(program); } } // Sort by name only. Labels are preformated. if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) items.AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551 /* Name */, LABEL_MASKS("%L", "", "%L", "")); else items.AddSortMethod(SORT_METHOD_LABEL, 551 /* Name */, LABEL_MASKS("%L", "", "%L", "")); m_dll->ref_release(list); return true; }
bool CGUIWindowMusicBase::GetDirectory(const std::string &strDirectory, CFileItemList &items) { items.ClearArt(); bool bResult = CGUIMediaWindow::GetDirectory(strDirectory, items); if (bResult) { CMusicThumbLoader loader; loader.FillThumb(items); } CQueryParams params; CDirectoryNode::GetDatabaseInfo(items.GetPath(), params); if (params.GetAlbumId()) { map<string, string> artistArt; if (m_musicdatabase.GetArtistArtForItem(params.GetAlbumId(), MediaTypeAlbum, artistArt)) items.AppendArt(artistArt, MediaTypeArtist); map<string, string> albumArt; if (m_musicdatabase.GetArtForItem(params.GetAlbumId(), MediaTypeAlbum, albumArt)) items.AppendArt(albumArt, MediaTypeAlbum); } // add in the "New Playlist" item if we're in the playlists folder if ((items.GetPath() == "special://musicplaylists/") && !items.Contains("newplaylist://")) { CFileItemPtr newPlaylist(new CFileItem(CProfilesManager::GetInstance().GetUserDataItem("PartyMode.xsp"),false)); newPlaylist->SetLabel(g_localizeStrings.Get(16035)); newPlaylist->SetLabelPreformated(true); newPlaylist->m_bIsFolder = true; items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newplaylist://", false)); newPlaylist->SetLabel(g_localizeStrings.Get(525)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newsmartplaylist://music", false)); newPlaylist->SetLabel(g_localizeStrings.Get(21437)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); } return bResult; }
JSONRPC_STATUS CFileOperations::GetFileDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { CStdString file = parameterObject["file"].asString(); if (!CFile::Exists(file)) return InvalidParams; if (!CFileUtils::RemoteAccessAllowed(file)) return InvalidParams; CStdString path; URIUtils::GetDirectory(file, path); CFileItemList items; if (path.empty() || !CDirectory::GetDirectory(path, items) || !items.Contains(file)) return InvalidParams; CFileItemPtr item = items.Get(file); if (!URIUtils::IsUPnP(file)) FillFileItem(item, item, parameterObject["media"].asString(), parameterObject); // Check if the "properties" list exists // and make sure it contains the "file" // field CVariant param = parameterObject; if (!param.isMember("properties")) param["properties"] = CVariant(CVariant::VariantTypeArray); bool hasFileField = false; for (CVariant::const_iterator_array itr = param["properties"].begin_array(); itr != param["properties"].end_array(); itr++) { if (itr->asString().compare("file") == 0) { hasFileField = true; break; } } if (!hasFileField) param["properties"].append("file"); param["properties"].append("filetype"); HandleFileItem("id", true, "filedetails", item, parameterObject, param["properties"], result, false); return OK; }
static bool LoadFromFile(const std::string& strPath, CFileItemList& items) { CXBMCTinyXML doc; if (!doc.LoadFile(strPath)) { CLog::Log(LOGERROR, "Unable to load %s (row %i column %i)", strPath.c_str(), doc.Row(), doc.Column()); return false; } TiXmlElement *root = doc.RootElement(); if (!root || strcmp(root->Value(), "favourites")) { CLog::Log(LOGERROR, "Favourites.xml doesn't contain the <favourites> root element"); return false; } TiXmlElement *favourite = root->FirstChildElement("favourite"); while (favourite) { // format: // <favourite name="Cool Video" thumb="foo.jpg">PlayMedia(c:\videos\cool_video.avi)</favourite> // <favourite name="My Album" thumb="bar.tbn">ActivateWindow(MyMusic,c:\music\my album)</favourite> // <favourite name="Apple Movie Trailers" thumb="path_to_thumb.png">RunScript(special://xbmc/scripts/apple movie trailers/default.py)</favourite> const char *name = favourite->Attribute("name"); const char *thumb = favourite->Attribute("thumb"); if (name && favourite->FirstChild()) { CURL url; url.SetProtocol("favourites"); url.SetHostName(CURL::Encode(favourite->FirstChild()->Value())); const std::string favURL(url.Get()); if (!items.Contains(favURL)) { const CFileItemPtr item(std::make_shared<CFileItem>(name)); item->SetPath(favURL); if (thumb) item->SetArt("thumb", thumb); items.Add(item); } } favourite = favourite->NextSiblingElement("favourite"); } return true; }
bool CFavourites::LoadFavourites(CStdString& strPath, CFileItemList& items) { TiXmlDocument doc; if (!doc.LoadFile(strPath)) { CLog::Log(LOGERROR, "Unable to load %s (row %i column %i)", strPath.c_str(), doc.Row(), doc.Column()); return false; } TiXmlElement *root = doc.RootElement(); if (!root || strcmp(root->Value(), "favourites")) { CLog::Log(LOGERROR, "Favourites.xml doesn't contain the <favourites> root element"); return false; } TiXmlElement *favourite = root->FirstChildElement("favourite"); while (favourite) { // format: // <favourite name="Cool Video" thumb="foo.jpg">PlayMedia(c:\videos\cool_video.avi)</favourite> // <favourite name="My Album" thumb="bar.tbn">ActivateWindow(MyMusic,c:\music\my album)</favourite> // <favourite name="Apple Movie Trailers" thumb="path_to_thumb.png">RunScript(special://xbmc/scripts/apple movie trailers/default.py)</favourite> const char *name = favourite->Attribute("name"); const char *thumb = favourite->Attribute("thumb"); if (name && favourite->FirstChild()) { if(!items.Contains(favourite->FirstChild()->Value())) { CFileItemPtr item(new CFileItem(name)); item->m_strPath = favourite->FirstChild()->Value(); if (thumb) item->SetThumbnailImage(thumb); items.Add(item); } } favourite = favourite->NextSiblingElement("favourite"); } return true; }
bool CGUIWindowMusicBase::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { items.SetArt("thumb", ""); bool bResult = CGUIMediaWindow::GetDirectory(strDirectory, items); if (bResult) CMusicThumbLoader::FillThumb(items); // add in the "New Playlist" item if we're in the playlists folder if ((items.GetPath() == "special://musicplaylists/") && !items.Contains("newplaylist://")) { //spotify, this is probably not the right place to do this but cant find a better one. //load up the spotify playlists //TODO scan all plugins for playlists g_spotify->GetPlaylists(items); CFileItemPtr newPlaylist(new CFileItem(g_settings.GetUserDataItem("PartyMode.xsp"),false)); newPlaylist->SetLabel(g_localizeStrings.Get(16035)); newPlaylist->SetLabelPreformated(true); newPlaylist->m_bIsFolder = true; items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newplaylist://", false)); newPlaylist->SetLabel(g_localizeStrings.Get(525)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newsmartplaylist://music", false)); newPlaylist->SetLabel(g_localizeStrings.Get(21437)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); } return bResult; }
int CGUIWindowAddonBrowser::SelectAddonID(const std::vector<ADDON::TYPE> &types, std::vector<std::string> &addonIDs, bool showNone /* = false */, bool showDetails /* = true */, bool multipleSelection /* = true */, bool showInstalled /* = true */, bool showInstallable /* = false */, bool showMore /* = true */) { // if we shouldn't show neither installed nor installable addons the list will be empty if (!showInstalled && !showInstallable) return -1; // can't show the "Get More" button if we already show installable addons if (showInstallable) showMore = false; CGUIDialogSelect *dialog = g_windowManager.GetWindow<CGUIDialogSelect>(); if (!dialog) return -1; // get rid of any invalid addon types std::vector<ADDON::TYPE> validTypes(types.size()); std::copy_if(types.begin(), types.end(), validTypes.begin(), [](ADDON::TYPE type) { return type != ADDON_UNKNOWN; }); if (validTypes.empty()) return -1; // get all addons to show VECADDONS addons; if (showInstalled) { for (std::vector<ADDON::TYPE>::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) { VECADDONS typeAddons; if (*type == ADDON_AUDIO) CAddonsDirectory::GetScriptsAndPlugins("audio", typeAddons); else if (*type == ADDON_EXECUTABLE) CAddonsDirectory::GetScriptsAndPlugins("executable", typeAddons); else if (*type == ADDON_IMAGE) CAddonsDirectory::GetScriptsAndPlugins("image", typeAddons); else if (*type == ADDON_VIDEO) CAddonsDirectory::GetScriptsAndPlugins("video", typeAddons); else if (*type == ADDON_GAME) CAddonsDirectory::GetScriptsAndPlugins("game", typeAddons); else CAddonMgr::GetInstance().GetAddons(typeAddons, *type); addons.insert(addons.end(), typeAddons.begin(), typeAddons.end()); } } if (showInstallable || showMore) { VECADDONS installableAddons; if (CAddonMgr::GetInstance().GetInstallableAddons(installableAddons)) { for (ADDON::IVECADDONS addon = installableAddons.begin(); addon != installableAddons.end();) { AddonPtr pAddon = *addon; // check if the addon matches one of the provided addon types bool matchesType = false; for (std::vector<ADDON::TYPE>::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) { if (pAddon->IsType(*type)) { matchesType = true; break; } } if (matchesType) { ++addon; continue; } addon = installableAddons.erase(addon); } if (showInstallable) addons.insert(addons.end(), installableAddons.begin(), installableAddons.end()); else if (showMore) showMore = !installableAddons.empty(); } } if (addons.empty() && !showNone) return -1; // turn the addons into items std::map<std::string, AddonPtr> addonMap; CFileItemList items; for (ADDON::IVECADDONS addon = addons.begin(); addon != addons.end(); ++addon) { CFileItemPtr item(CAddonsDirectory::FileItemFromAddon(*addon, (*addon)->ID())); item->SetLabel2((*addon)->Summary()); if (!items.Contains(item->GetPath())) { items.Add(item); addonMap.insert(std::make_pair(item->GetPath(), *addon)); } } if (items.IsEmpty() && !showNone) return -1; std::string heading; for (std::vector<ADDON::TYPE>::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) { if (!heading.empty()) heading += ", "; heading += TranslateType(*type, true); } dialog->SetHeading(CVariant{std::move(heading)}); dialog->Reset(); dialog->SetUseDetails(showDetails); if (multipleSelection) { showNone = false; showMore = false; dialog->EnableButton(true, 186); } else if (showMore) dialog->EnableButton(true, 21452); if (showNone) { CFileItemPtr item(new CFileItem("", false)); item->SetLabel(g_localizeStrings.Get(231)); item->SetLabel2(g_localizeStrings.Get(24040)); item->SetIconImage("DefaultAddonNone.png"); item->SetSpecialSort(SortSpecialOnTop); items.Add(item); } items.Sort(SortByLabel, SortOrderAscending); if (!addonIDs.empty()) { for (std::vector<std::string>::const_iterator it = addonIDs.begin(); it != addonIDs.end() ; ++it) { CFileItemPtr item = items.Get(*it); if (item) item->Select(true); } } dialog->SetItems(items); dialog->SetMultiSelection(multipleSelection); dialog->Open(); // if the "Get More" button has been pressed and we haven't shown the // installable addons so far show a list of installable addons if (showMore&& dialog->IsButtonPressed()) return SelectAddonID(types, addonIDs, showNone, showDetails, multipleSelection, false, true, false); if (!dialog->IsConfirmed()) return 0; addonIDs.clear(); for (int i : dialog->GetSelectedItems()) { const CFileItemPtr& item = items.Get(i); // check if one of the selected addons needs to be installed if (showInstallable) { std::map<std::string, AddonPtr>::const_iterator itAddon = addonMap.find(item->GetPath()); if (itAddon != addonMap.end()) { const AddonPtr& addon = itAddon->second; // if the addon isn't installed we need to install it if (!CAddonMgr::GetInstance().IsAddonInstalled(addon->ID())) { AddonPtr installedAddon; if (!CAddonInstaller::GetInstance().InstallModal(addon->ID(), installedAddon, false)) continue; } // if the addon is disabled we need to enable it if (CAddonMgr::GetInstance().IsAddonDisabled(addon->ID())) CAddonMgr::GetInstance().EnableAddon(addon->ID()); } } addonIDs.push_back(item->GetPath()); } return 1; }
bool CGUIWindowVideoNav::GetDirectory(const std::string &strDirectory, CFileItemList &items) { if (m_thumbLoader.IsLoading()) m_thumbLoader.StopThread(); items.ClearArt(); items.ClearProperties(); bool bResult = CGUIWindowVideoBase::GetDirectory(strDirectory, items); if (bResult) { if (items.IsVideoDb()) { XFILE::CVideoDatabaseDirectory dir; CQueryParams params; dir.GetQueryParams(items.GetPath(),params); VIDEODATABASEDIRECTORY::NODE_TYPE node = dir.GetDirectoryChildType(items.GetPath()); int iFlatten = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_VIDEOLIBRARY_FLATTENTVSHOWS); int itemsSize = items.GetObjectCount(); int firstIndex = items.Size() - itemsSize; // perform the flattening logic for tvshows with a single (unwatched) season (+ optional special season) if (node == NODE_TYPE_SEASONS && !items.IsEmpty()) { // check if the last item is the "All seasons" item which should be ignored for flattening if (!items[items.Size() - 1]->HasVideoInfoTag() || items[items.Size() - 1]->GetVideoInfoTag()->m_iSeason < 0) itemsSize -= 1; bool bFlatten = (itemsSize == 1 && iFlatten == 1) || iFlatten == 2 || // flatten if one one season or if always flatten is enabled (itemsSize == 2 && iFlatten == 1 && // flatten if one season + specials (items[firstIndex]->GetVideoInfoTag()->m_iSeason == 0 || items[firstIndex + 1]->GetVideoInfoTag()->m_iSeason == 0)); if (iFlatten > 0 && !bFlatten && (WatchedMode)CMediaSettings::GetInstance().GetWatchedMode("tvshows") == WatchedModeUnwatched) { int count = 0; for(int i = 0; i < items.Size(); i++) { const CFileItemPtr item = items.Get(i); if (item->GetProperty("unwatchedepisodes").asInteger() != 0 && item->GetVideoInfoTag()->m_iSeason > 0) count++; } bFlatten = (count < 2); // flatten if there is only 1 unwatched season (not counting specials) } if (bFlatten) { // flatten if one season or flatten always items.Clear(); CVideoDbUrl videoUrl; if (!videoUrl.FromString(items.GetPath())) return false; videoUrl.AppendPath("-2/"); return GetDirectory(videoUrl.ToString(), items); } } if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES || node == NODE_TYPE_SEASONS || node == NODE_TYPE_RECENTLY_ADDED_EPISODES) { CLog::Log(LOGDEBUG, "WindowVideoNav::GetDirectory"); // grab the show thumb CVideoInfoTag details; m_database.GetTvShowInfo("", details, params.GetTvShowId()); std::map<std::string, std::string> art; if (m_database.GetArtForItem(details.m_iDbId, details.m_type, art)) { items.AppendArt(art, details.m_type); items.SetArtFallback("fanart", "tvshow.fanart"); if (node == NODE_TYPE_SEASONS) { // set an art fallback for "thumb" if (items.HasArt("tvshow.poster")) items.SetArtFallback("thumb", "tvshow.poster"); else if (items.HasArt("tvshow.banner")) items.SetArtFallback("thumb", "tvshow.banner"); } } // Grab fanart data items.SetProperty("fanart_color1", details.m_fanart.GetColor(0)); items.SetProperty("fanart_color2", details.m_fanart.GetColor(1)); items.SetProperty("fanart_color3", details.m_fanart.GetColor(2)); // save the show description (showplot) items.SetProperty("showplot", details.m_strPlot); items.SetProperty("showtitle", details.m_strShowTitle); // the container folder thumb is the parent (i.e. season or show) if (itemsSize && (node == NODE_TYPE_EPISODES || node == NODE_TYPE_RECENTLY_ADDED_EPISODES)) { items.SetContent("episodes"); int seasonID = -1; int seasonParam = params.GetSeason(); // grab all season art when flatten always if (seasonParam == -2 && iFlatten == 2) seasonParam = -1; if (seasonParam >= -1) seasonID = m_database.GetSeasonId(details.m_iDbId, seasonParam); else seasonID = items[firstIndex]->GetVideoInfoTag()->m_iIdSeason; CGUIListItem::ArtMap seasonArt; if (seasonID > -1 && m_database.GetArtForItem(seasonID, MediaTypeSeason, seasonArt)) { items.AppendArt(seasonArt, MediaTypeSeason); // set an art fallback for "thumb" if (items.HasArt("season.poster")) items.SetArtFallback("thumb", "season.poster"); else if (items.HasArt("season.banner")) items.SetArtFallback("thumb", "season.banner"); } } else items.SetContent("seasons"); } else if (node == NODE_TYPE_TITLE_MOVIES || node == NODE_TYPE_RECENTLY_ADDED_MOVIES) { if (params.GetSetId() > 0) { CGUIListItem::ArtMap setArt; if (m_database.GetArtForItem(params.GetSetId(), MediaTypeVideoCollection, setArt)) { items.AppendArt(setArt, MediaTypeVideoCollection); items.SetArtFallback("fanart", "set.fanart"); if (items.HasArt("set.poster")) items.SetArtFallback("thumb", "set.poster"); } } items.SetContent("movies"); } else if (node == NODE_TYPE_TITLE_TVSHOWS || node == NODE_TYPE_INPROGRESS_TVSHOWS) items.SetContent("tvshows"); else if (node == NODE_TYPE_TITLE_MUSICVIDEOS || node == NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS) items.SetContent("musicvideos"); else if (node == NODE_TYPE_GENRE) items.SetContent("genres"); else if (node == NODE_TYPE_COUNTRY) items.SetContent("countries"); else if (node == NODE_TYPE_ACTOR) { if (params.GetContentType() == VIDEODB_CONTENT_MUSICVIDEOS) items.SetContent("artists"); else items.SetContent("actors"); } else if (node == NODE_TYPE_DIRECTOR) items.SetContent("directors"); else if (node == NODE_TYPE_STUDIO) items.SetContent("studios"); else if (node == NODE_TYPE_YEAR) items.SetContent("years"); else if (node == NODE_TYPE_MUSICVIDEOS_ALBUM) items.SetContent("albums"); else if (node == NODE_TYPE_SETS) items.SetContent("sets"); else if (node == NODE_TYPE_TAGS) items.SetContent("tags"); else items.SetContent(""); } else if (URIUtils::PathEquals(items.GetPath(), "special://videoplaylists/")) items.SetContent("playlists"); else if (!items.IsVirtualDirectoryRoot()) { // load info from the database std::string label; if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::GetInstance().GetSources("video"), &label)) items.SetLabel(label); if (!items.IsSourcesPath() && !items.IsLibraryFolder()) LoadVideoInfo(items); } CVideoDbUrl videoUrl; if (videoUrl.FromString(items.GetPath()) && items.GetContent() == "tags" && !items.Contains("newtag://" + videoUrl.GetType())) { CFileItemPtr newTag(new CFileItem("newtag://" + videoUrl.GetType(), false)); newTag->SetLabel(g_localizeStrings.Get(20462)); newTag->SetLabelPreformated(true); newTag->SetSpecialSort(SortSpecialOnTop); items.Add(newTag); } } return bResult; }
bool CZipDirectory::GetDirectory(const CStdString& strPathOrig, CFileItemList& items) { CStdString strPath; /* if this isn't a proper archive path, assume it's the path to a archive file */ if( !strPathOrig.Left(6).Equals("zip://") ) URIUtils::CreateArchivePath(strPath, "zip", strPathOrig, ""); else strPath = strPathOrig; CURL url(strPath); CStdString strArchive = url.GetHostName(); CStdString strOptions = url.GetOptions(); CStdString strPathInZip = url.GetFileName(); url.SetOptions(""); // delete options to have a clean path to add stuff too url.SetFileName(""); // delete filename too as our names later will contain it CStdString strSlashPath = url.Get(); CStdString strBuffer; // the RAR code depends on things having a "/" at the end of the path URIUtils::AddSlashAtEnd(strSlashPath); vector<SZipEntry> entries; // turn on fast lookups bool bWasFast(items.GetFastLookup()); items.SetFastLookup(true); if (!g_ZipManager.GetZipList(strPath,entries)) return false; vector<CStdString> baseTokens; if (!strPathInZip.IsEmpty()) CUtil::Tokenize(strPathInZip,baseTokens,"/"); for (vector<SZipEntry>::iterator ze=entries.begin(); ze!=entries.end(); ++ze) { CStdString strEntryName(ze->name); strEntryName.Replace('\\','/'); if (strEntryName == strPathInZip) // skip the listed dir continue; vector<CStdString> pathTokens; CUtil::Tokenize(strEntryName,pathTokens,"/"); if (pathTokens.size() < baseTokens.size()+1) continue; bool bAdd=true; strEntryName = ""; for ( unsigned int i=0; i<baseTokens.size(); ++i ) { if (pathTokens[i] != baseTokens[i]) { bAdd = false; break; } strEntryName += pathTokens[i] + "/"; } if (!bAdd) continue; strEntryName += pathTokens[baseTokens.size()]; char c=ze->name[strEntryName.size()]; if (c == '/' || c == '\\') strEntryName += '/'; bool bIsFolder = false; if (strEntryName[strEntryName.size()-1] != '/') // this is a file { strBuffer = strSlashPath + strEntryName + strOptions; } else { // this is new folder. add if not already added bIsFolder = true; strBuffer = strSlashPath + strEntryName + strOptions; if (items.Contains(strBuffer)) // already added continue; } CFileItemPtr pFileItem(new CFileItem); if (g_charsetConverter.isValidUtf8(pathTokens[baseTokens.size()])) g_charsetConverter.utf8ToStringCharset(pathTokens[baseTokens.size()]); pFileItem->SetLabel(pathTokens[baseTokens.size()]); if (bIsFolder) { pFileItem->m_dwSize = 0; URIUtils::AddSlashAtEnd(strBuffer); } else pFileItem->m_dwSize = ze->usize; pFileItem->SetPath(strBuffer); pFileItem->m_bIsFolder = bIsFolder; pFileItem->m_idepth = ze->method; items.Add(pFileItem); } items.SetFastLookup(bWasFast); return true; }
bool CGUIWindowMusicBase::GetDirectory(const std::string &strDirectory, CFileItemList &items) { items.ClearArt(); bool bResult = CGUIMediaWindow::GetDirectory(strDirectory, items); if (bResult) { // We always want to expand disc images in music windows. CDirectory::FilterFileDirectories(items, ".iso", true); CMusicThumbLoader loader; loader.FillThumb(items); CQueryParams params; CDirectoryNode::GetDatabaseInfo(items.GetPath(), params); if (params.GetAlbumId() > 0) { std::map<std::string, std::string> artistArt; if (m_musicdatabase.GetArtistArtForItem(params.GetAlbumId(), MediaTypeAlbum, artistArt)) items.AppendArt(artistArt, MediaTypeArtist); std::map<std::string, std::string> albumArt; if (m_musicdatabase.GetArtForItem(params.GetAlbumId(), MediaTypeAlbum, albumArt)) items.AppendArt(albumArt, MediaTypeAlbum); } if (params.GetArtistId() > 0) { std::map<std::string, std::string> artistArt; if (m_musicdatabase.GetArtForItem(params.GetArtistId(), "artist", artistArt)) items.AppendArt(artistArt, MediaTypeArtist); } // add in the "New Playlist" item if we're in the playlists folder if ((items.GetPath() == "special://musicplaylists/") && !items.Contains("newplaylist://")) { CFileItemPtr newPlaylist(new CFileItem(CProfilesManager::GetInstance().GetUserDataItem("PartyMode.xsp"),false)); newPlaylist->SetLabel(g_localizeStrings.Get(16035)); newPlaylist->SetLabelPreformatted(true); newPlaylist->SetIconImage("DefaultPartyMode.png"); newPlaylist->m_bIsFolder = true; items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newplaylist://", false)); newPlaylist->SetLabel(g_localizeStrings.Get(525)); newPlaylist->SetIconImage("DefaultAddSource.png"); newPlaylist->SetLabelPreformatted(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); newPlaylist.reset(new CFileItem("newsmartplaylist://music", false)); newPlaylist->SetLabel(g_localizeStrings.Get(21437)); newPlaylist->SetIconImage("DefaultAddSource.png"); newPlaylist->SetLabelPreformatted(true); newPlaylist->SetSpecialSort(SortSpecialOnBottom); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); } // check for .CUE files here. items.FilterCueItems(); std::string label; if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::GetInstance().GetSources("music"), &label)) items.SetLabel(label); } return bResult; }
int CGUIWindowAddonBrowser::SelectAddonID(const vector<ADDON::TYPE> &types, CStdStringArray &addonIDs, bool showNone /*= false*/, bool multipleSelection /*= true*/) { CGUIDialogSelect *dialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (!dialog) return 0; CFileItemList items; CStdString heading; int iTypes = 0; for (vector<ADDON::TYPE>::const_iterator it = types.begin(); it != types.end(); ++it) { if (*it == ADDON_UNKNOWN) continue; ADDON::VECADDONS addons; iTypes++; if (*it == ADDON_AUDIO) CAddonsDirectory::GetScriptsAndPlugins("audio",addons); else if (*it == ADDON_EXECUTABLE) CAddonsDirectory::GetScriptsAndPlugins("executable",addons); else if (*it == ADDON_IMAGE) CAddonsDirectory::GetScriptsAndPlugins("image",addons); else if (*it == ADDON_VIDEO) CAddonsDirectory::GetScriptsAndPlugins("video",addons); else CAddonMgr::Get().GetAddons(*it, addons); for (ADDON::IVECADDONS it2 = addons.begin() ; it2 != addons.end() ; ++it2) { CFileItemPtr item(CAddonsDirectory::FileItemFromAddon(*it2, "")); if (!items.Contains(item->GetPath())) items.Add(item); } if (!heading.IsEmpty()) heading += ", "; heading += TranslateType(*it, true); } if (iTypes == 0) return 0; dialog->SetHeading(heading); dialog->Reset(); dialog->SetUseDetails(true); if (multipleSelection) showNone = false; if (multipleSelection || iTypes > 1) dialog->EnableButton(true, 186); else dialog->EnableButton(true, 21452); if (showNone) { CFileItemPtr item(new CFileItem("", false)); item->SetLabel(g_localizeStrings.Get(231)); item->SetLabel2(g_localizeStrings.Get(24040)); item->SetIconImage("DefaultAddonNone.png"); item->SetSpecialSort(SortSpecialOnTop); items.Add(item); } items.Sort(SORT_METHOD_LABEL, SortOrderAscending); if (addonIDs.size() > 0) { for (CStdStringArray::const_iterator it = addonIDs.begin(); it != addonIDs.end() ; it++) { CFileItemPtr item = items.Get(*it); if (item) item->Select(true); } } dialog->SetItems(&items); dialog->SetMultiSelection(multipleSelection); dialog->DoModal(); if (!multipleSelection && iTypes == 1 && dialog->IsButtonPressed()) { // switch to the addons browser. vector<CStdString> params; params.push_back("addons://all/"+TranslateType(types[0],false)+"/"); params.push_back("return"); g_windowManager.ActivateWindow(WINDOW_ADDON_BROWSER, params); return 2; } if (!dialog->IsConfirmed()) return 0; addonIDs.clear(); const CFileItemList& list = dialog->GetSelectedItems(); for (int i = 0 ; i < list.Size() ; i++) addonIDs.push_back(list.Get(i)->GetPath()); return 1; }