bool CGUIWindowMusicNav::GetDirectory(const std::string &strDirectory, CFileItemList &items) { if (strDirectory.empty()) AddSearchFolder(); bool bResult = CGUIWindowMusicBase::GetDirectory(strDirectory, items); if (bResult) { if (items.IsPlayList()) OnRetrieveMusicInfo(items); } // update our content in the info manager if (StringUtils::StartsWithNoCase(strDirectory, "videodb://") || items.IsVideoDb()) { CVideoDatabaseDirectory dir; VIDEODATABASEDIRECTORY::NODE_TYPE node = dir.GetDirectoryChildType(items.GetPath()); if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS || node == VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS) items.SetContent("musicvideos"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_GENRE) items.SetContent("genres"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_COUNTRY) items.SetContent("countries"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_ACTOR) items.SetContent("artists"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_DIRECTOR) items.SetContent("directors"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_STUDIO) items.SetContent("studios"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_YEAR) items.SetContent("years"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM) items.SetContent("albums"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS) items.SetContent("tags"); else items.SetContent(""); } else if (StringUtils::StartsWithNoCase(strDirectory, "musicdb://") || items.IsMusicDb()) { CMusicDatabaseDirectory dir; NODE_TYPE node = dir.GetDirectoryChildType(items.GetPath()); if (node == NODE_TYPE_ALBUM || node == NODE_TYPE_ALBUM_RECENTLY_ADDED || node == NODE_TYPE_ALBUM_RECENTLY_PLAYED || node == NODE_TYPE_ALBUM_TOP100 || node == NODE_TYPE_ALBUM_COMPILATIONS || node == NODE_TYPE_YEAR_ALBUM) items.SetContent("albums"); else if (node == NODE_TYPE_ARTIST) items.SetContent("artists"); else if (node == NODE_TYPE_SONG || node == NODE_TYPE_SONG_TOP100 || node == NODE_TYPE_SINGLES || node == NODE_TYPE_ALBUM_RECENTLY_ADDED_SONGS || node == NODE_TYPE_ALBUM_RECENTLY_PLAYED_SONGS || node == NODE_TYPE_ALBUM_COMPILATIONS_SONGS || node == NODE_TYPE_ALBUM_TOP100_SONGS || node == NODE_TYPE_YEAR_SONG) items.SetContent("songs"); else if (node == NODE_TYPE_GENRE) items.SetContent("genres"); else if (node == NODE_TYPE_YEAR) items.SetContent("years"); else items.SetContent(""); } else if (items.IsPlayList()) items.SetContent("songs"); else if (URIUtils::PathEquals(strDirectory, "special://musicplaylists/") || URIUtils::PathEquals(strDirectory, "library://music/playlists.xml/")) items.SetContent("playlists"); else if (URIUtils::PathEquals(strDirectory, "plugin://music/")) items.SetContent("plugins"); else if (items.IsAddonsPath()) items.SetContent("addons"); else if (!items.IsSourcesPath() && !items.IsVirtualDirectoryRoot() && !items.IsLibraryFolder() && !items.IsPlugin() && !items.IsSmartPlayList()) items.SetContent("files"); return bResult; }
bool CGUIWindowFileManager::Update(int iList, const CStdString &strDirectory) { // get selected item int iItem = GetSelectedItem(iList); CStdString strSelectedItem = ""; if (iItem >= 0 && iItem < (int)m_vecItems[iList]->Size()) { CFileItemPtr pItem = m_vecItems[iList]->Get(iItem); if (!pItem->IsParentFolder()) { GetDirectoryHistoryString(pItem.get(), strSelectedItem); m_history[iList].SetSelectedItem(strSelectedItem, m_Directory[iList]->GetPath()); } } CStdString strOldDirectory=m_Directory[iList]->GetPath(); m_Directory[iList]->SetPath(strDirectory); CFileItemList items; if (!GetDirectory(iList, m_Directory[iList]->GetPath(), items)) { if (strDirectory != strOldDirectory && GetDirectory(iList, strOldDirectory, items)) m_Directory[iList]->SetPath(strOldDirectory); // Fallback to old (previous) path) else Update(iList, ""); // Fallback to root return false; } m_history[iList].SetSelectedItem(strSelectedItem, strOldDirectory); ClearFileItems(iList); m_vecItems[iList]->Append(items); m_vecItems[iList]->SetPath(items.GetPath()); CStdString strParentPath; URIUtils::GetParentPath(strDirectory, strParentPath); if (strDirectory.IsEmpty() && (m_vecItems[iList]->Size() == 0 || CSettings::Get().GetBool("filelists.showaddsourcebuttons"))) { // add 'add source button' CStdString strLabel = g_localizeStrings.Get(1026); CFileItemPtr pItem(new CFileItem(strLabel)); pItem->SetPath("add"); pItem->SetIconImage("DefaultAddSource.png"); pItem->SetLabel(strLabel); pItem->SetLabelPreformated(true); pItem->m_bIsFolder = true; pItem->SetSpecialSort(SortSpecialOnBottom); m_vecItems[iList]->Add(pItem); } else if (items.IsEmpty() || CSettings::Get().GetBool("filelists.showparentdiritems")) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(m_rootDir.IsSource(strDirectory) ? "" : strParentPath); pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; m_vecItems[iList]->AddFront(pItem, 0); } m_strParentPath[iList] = (m_rootDir.IsSource(strDirectory) ? "" : strParentPath); if (strDirectory.IsEmpty()) { CFileItemPtr pItem(new CFileItem("special://profile/", true)); pItem->SetLabel(g_localizeStrings.Get(20070)); pItem->SetArt("thumb", "DefaultFolder.png"); pItem->SetLabelPreformated(true); m_vecItems[iList]->Add(pItem); } // if we have a .tbn file, use itself as the thumb for (int i = 0; i < (int)m_vecItems[iList]->Size(); i++) { CFileItemPtr pItem = m_vecItems[iList]->Get(i); if (pItem->IsHD() && URIUtils::HasExtension(pItem->GetPath(), ".tbn")) { pItem->SetArt("thumb", pItem->GetPath()); } } m_vecItems[iList]->FillInDefaultIcons(); OnSort(iList); UpdateButtons(); int item = 0; strSelectedItem = m_history[iList].GetSelectedItem(m_Directory[iList]->GetPath()); for (int i = 0; i < m_vecItems[iList]->Size(); ++i) { CFileItemPtr pItem = m_vecItems[iList]->Get(i); CStdString strHistory; GetDirectoryHistoryString(pItem.get(), strHistory); if (strHistory == strSelectedItem) { item = i; break; } } UpdateControl(iList, item); return true; }
JSONRPC_STATUS CFileOperations::GetDirectory(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { CStdString media = parameterObject["media"].asString(); media = media.ToLower(); CFileItemList items; CStdString strPath = parameterObject["directory"].asString(); // Check if this directory is part of a source and whether it's locked VECSOURCES *sources; bool isSource; for (unsigned int index = 0; index < SourcesSize; index++) { sources = CMediaSourceSettings::Get().GetSources(SourceNames[index]); int sourceIndex = CUtil::GetMatchingSource(strPath, *sources, isSource); if (sourceIndex >= 0 && sourceIndex < (int)sources->size() && sources->at(sourceIndex).m_iHasLock == 2) return InvalidParams; } CStdStringArray regexps; CStdString extensions = ""; if (media.Equals("video")) { regexps = g_advancedSettings.m_videoExcludeFromListingRegExps; extensions = g_advancedSettings.m_videoExtensions; } else if (media.Equals("music")) { regexps = g_advancedSettings.m_audioExcludeFromListingRegExps; extensions = g_advancedSettings.m_musicExtensions; } else if (media.Equals("pictures")) { regexps = g_advancedSettings.m_pictureExcludeFromListingRegExps; extensions = g_advancedSettings.m_pictureExtensions; } if (CDirectory::GetDirectory(strPath, items, extensions)) { CFileItemList filteredFiles; for (unsigned int i = 0; i < (unsigned int)items.Size(); i++) { if (CUtil::ExcludeFileOrFolder(items[i]->GetPath(), regexps)) continue; if (items[i]->IsSmb()) { CURL url(items[i]->GetPath()); items[i]->SetPath(url.GetWithoutUserDetails()); } if ((media == "video" && items[i]->HasVideoInfoTag()) || (media == "music" && items[i]->HasMusicInfoTag()) || (media == "picture" && items[i]->HasPictureInfoTag()) || media == "files" || URIUtils::IsUPnP(items.GetPath())) { filteredFiles.Add(items[i]); } else { CFileItemPtr fileItem(new CFileItem()); if (FillFileItem(items[i], fileItem, media, parameterObject)) { filteredFiles.Add(fileItem); } else { filteredFiles.Add(items[i]); } } } // 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"); HandleFileItemList("id", true, "files", filteredFiles, param, result); return OK; } return InvalidParams; }
CGUIViewStateWindowVideoNav::CGUIViewStateWindowVideoNav(const CFileItemList& items) : CGUIViewStateWindowVideo(items) { if (items.IsVirtualDirectoryRoot()) { AddSortMethod(SORT_METHOD_NONE, 551, LABEL_MASKS("%F", "%I", "%L", "")); // Filename, Size | Foldername, empty SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SORT_ORDER_NONE); } else if (items.IsVideoDb()) { NODE_TYPE NodeType=CVideoDatabaseDirectory::GetDirectoryChildType(items.GetPath()); CQueryParams params; CVideoDatabaseDirectory::GetQueryParams(items.GetPath(),params); switch (NodeType) { case NODE_TYPE_MOVIES_OVERVIEW: case NODE_TYPE_TVSHOWS_OVERVIEW: case NODE_TYPE_MUSICVIDEOS_OVERVIEW: case NODE_TYPE_OVERVIEW: { AddSortMethod(SORT_METHOD_NONE, 551, LABEL_MASKS("%F", "%I", "%L", "")); // Filename, Size | Foldername, empty SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SORT_ORDER_NONE); } break; case NODE_TYPE_DIRECTOR: case NODE_TYPE_ACTOR: { AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%T", "%R", "%L", "")); // Filename, Duration | Foldername, empty SetSortMethod(SORT_METHOD_LABEL); SetViewAsControl(g_settings.m_viewStateVideoNavActors.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavActors.m_sortOrder); } break; case NODE_TYPE_YEAR: { AddSortMethod(SORT_METHOD_LABEL, 562, LABEL_MASKS("%T", "%R", "%L", "")); // Filename, Duration | Foldername, empty SetSortMethod(SORT_METHOD_LABEL); SetViewAsControl(g_settings.m_viewStateVideoNavYears.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavYears.m_sortOrder); } break; case NODE_TYPE_SEASONS: { AddSortMethod(SORT_METHOD_VIDEO_TITLE, 551, LABEL_MASKS("%L", "","%L","")); // Filename, Duration | Foldername, empty SetSortMethod(SORT_METHOD_VIDEO_TITLE); SetViewAsControl(g_settings.m_viewStateVideoNavSeasons.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavSeasons.m_sortOrder); } break; case NODE_TYPE_TITLE_TVSHOWS: { if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_VIDEO_SORT_TITLE_IGNORE_THE, 551, LABEL_MASKS("%T", "%M", "%T", "%M")); // Filename, Duration | Foldername, empty else AddSortMethod(SORT_METHOD_VIDEO_SORT_TITLE, 551, LABEL_MASKS("%T", "%M", "%T", "%M")); AddSortMethod(SORT_METHOD_EPISODE, 20360, LABEL_MASKS("%L", "%M", "%L", "%M")); // Filename, Duration | Foldername, empty AddSortMethod(SORT_METHOD_YEAR,562,LABEL_MASKS("%L","%Y","%L","%Y")); SetSortMethod(SORT_METHOD_LABEL); SetViewAsControl(g_settings.m_viewStateVideoNavTvShows.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavTvShows.m_sortOrder); } break; case NODE_TYPE_MUSICVIDEOS_ALBUM: case NODE_TYPE_GENRE: case NODE_TYPE_COUNTRY: case NODE_TYPE_STUDIO: { AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%T", "%R", "%L", "")); // Filename, Duration | Foldername, empty SetSortMethod(SORT_METHOD_LABEL); SetViewAsControl(g_settings.m_viewStateVideoNavGenres.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavGenres.m_sortOrder); } break; case NODE_TYPE_SETS: { if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551, LABEL_MASKS("%T","%R")); // Filename, Duration | Foldername, empty else AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%T", "%R")); // Filename, Duration | Foldername, empty SetSortMethod(SORT_METHOD_LABEL_IGNORE_THE); SetViewAsControl(g_settings.m_viewStateVideoNavGenres.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavGenres.m_sortOrder); } break; case NODE_TYPE_EPISODES: { if (params.GetSeason() > -1) { AddSortMethod(SORT_METHOD_EPISODE,20359,LABEL_MASKS("%E. %T","%R")); AddSortMethod(SORT_METHOD_VIDEO_RATING, 563, LABEL_MASKS("%E. %T", "%R")); // Filename, Duration | Foldername, empty AddSortMethod(SORT_METHOD_MPAA_RATING, 20074, LABEL_MASKS("%E. %T", "%O")); AddSortMethod(SORT_METHOD_PRODUCTIONCODE,20368,LABEL_MASKS("%E. %T","%P", "%E. %T","%P")); AddSortMethod(SORT_METHOD_DATE,552,LABEL_MASKS("%E. %T","%J","%E. %T","%J")); if (g_settings.GetWatchMode(items.GetContent()) == VIDEO_SHOW_ALL) AddSortMethod(SORT_METHOD_PLAYCOUNT, 576, LABEL_MASKS("%E. %T", "%V")); } else { AddSortMethod(SORT_METHOD_EPISODE,20359,LABEL_MASKS("%H. %T","%R")); AddSortMethod(SORT_METHOD_VIDEO_RATING, 563, LABEL_MASKS("%H. %T", "%R")); // Filename, Duration | Foldername, empty AddSortMethod(SORT_METHOD_MPAA_RATING, 20074, LABEL_MASKS("%H. %T", "%O")); AddSortMethod(SORT_METHOD_PRODUCTIONCODE,20368,LABEL_MASKS("%H. %T","%P", "%H. %T","%P")); AddSortMethod(SORT_METHOD_DATE,552,LABEL_MASKS("%H. %T","%J","%H. %T","%J")); if (g_settings.GetWatchMode(items.GetContent()) == VIDEO_SHOW_ALL) AddSortMethod(SORT_METHOD_PLAYCOUNT, 576, LABEL_MASKS("%H. %T", "%V")); } if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551, LABEL_MASKS("%T","%R")); // Filename, Duration | Foldername, empty else AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%T", "%R")); // Filename, Duration | Foldername, empty SetSortMethod(g_settings.m_viewStateVideoNavEpisodes.m_sortMethod); SetViewAsControl(g_settings.m_viewStateVideoNavEpisodes.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavEpisodes.m_sortOrder); break; } case NODE_TYPE_RECENTLY_ADDED_EPISODES: { AddSortMethod(SORT_METHOD_NONE, 552, LABEL_MASKS("%Z - %H. %T", "%R")); // Filename, Duration | Foldername, empty SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(g_settings.m_viewStateVideoNavEpisodes.m_viewMode); SetSortOrder(SORT_ORDER_NONE); break; } case NODE_TYPE_TITLE_MOVIES: { if (params.GetSetId() > -1) // Is this a listing within a set? { AddSortMethod(SORT_METHOD_YEAR,562, LABEL_MASKS("%T", "%Y")); if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_VIDEO_SORT_TITLE_IGNORE_THE, 551, LABEL_MASKS("%T", "%R")); // Filename, Duration | Foldername, empty else AddSortMethod(SORT_METHOD_VIDEO_SORT_TITLE, 551, LABEL_MASKS("%T", "%R")); } else { if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_VIDEO_SORT_TITLE_IGNORE_THE, 551, LABEL_MASKS("%T", "%R")); // Filename, Duration | Foldername, empty else AddSortMethod(SORT_METHOD_VIDEO_SORT_TITLE, 551, LABEL_MASKS("%T", "%R")); AddSortMethod(SORT_METHOD_YEAR,562, LABEL_MASKS("%T", "%Y")); } AddSortMethod(SORT_METHOD_VIDEO_RATING, 563, LABEL_MASKS("%T", "%R")); // Filename, Duration | Foldername, empty AddSortMethod(SORT_METHOD_MPAA_RATING, 20074, LABEL_MASKS("%T", "%O")); AddSortMethod(SORT_METHOD_VIDEO_RUNTIME,2050, LABEL_MASKS("%T", "%D")); AddSortMethod(SORT_METHOD_DATEADDED, 570, LABEL_MASKS("%T", "%R")); if (g_settings.GetWatchMode(items.GetContent()) == VIDEO_SHOW_ALL) AddSortMethod(SORT_METHOD_PLAYCOUNT, 576, LABEL_MASKS("%T", "%V")); if (params.GetSetId() > -1) SetSortMethod(SORT_METHOD_YEAR); else SetSortMethod(g_settings.m_viewStateVideoNavTitles.m_sortMethod); SetViewAsControl(g_settings.m_viewStateVideoNavTitles.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavTitles.m_sortOrder); } break; case NODE_TYPE_TITLE_MUSICVIDEOS: { if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 556, LABEL_MASKS("%T", "%Y")); // Filename, Duration | Foldername, empty else AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%T", "%Y")); // Filename, Duration | Foldername, empty AddSortMethod(SORT_METHOD_MPAA_RATING, 20074, LABEL_MASKS("%T", "%O")); AddSortMethod(SORT_METHOD_YEAR,562, LABEL_MASKS("%T", "%Y")); if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) { AddSortMethod(SORT_METHOD_ARTIST_IGNORE_THE,557, LABEL_MASKS("%A - %T", "%Y")); AddSortMethod(SORT_METHOD_ALBUM_IGNORE_THE,558, LABEL_MASKS("%B - %T", "%Y")); } else { AddSortMethod(SORT_METHOD_ARTIST,557, LABEL_MASKS("%A - %T", "%Y")); AddSortMethod(SORT_METHOD_ALBUM,558, LABEL_MASKS("%B - %T", "%Y")); } if (g_settings.GetWatchMode(items.GetContent()) == VIDEO_SHOW_ALL) AddSortMethod(SORT_METHOD_PLAYCOUNT, 576, LABEL_MASKS("%T", "%V")); CStdString strTrackLeft=g_guiSettings.GetString("musicfiles.trackformat"); CStdString strTrackRight=g_guiSettings.GetString("musicfiles.trackformatright"); AddSortMethod(SORT_METHOD_TRACKNUM, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty SetSortMethod(g_settings.m_viewStateVideoNavMusicVideos.m_sortMethod); SetViewAsControl(g_settings.m_viewStateVideoNavMusicVideos.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoNavMusicVideos.m_sortOrder); } break; case NODE_TYPE_RECENTLY_ADDED_MOVIES: { AddSortMethod(SORT_METHOD_NONE, 552, LABEL_MASKS("%T", "%R")); SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(g_settings.m_viewStateVideoNavTitles.m_viewMode); SetSortOrder(SORT_ORDER_NONE); } break; case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: { AddSortMethod(SORT_METHOD_NONE, 552, LABEL_MASKS("%A - %T", "%Y")); SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(g_settings.m_viewStateVideoNavMusicVideos.m_viewMode); SetSortOrder(SORT_ORDER_NONE); } break; default: break; } } else { if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551, LABEL_MASKS("%L", "%I", "%L", "")); // FileName, Size | Foldername, empty else AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%L", "%I", "%L", "")); // FileName, Size | Foldername, empty AddSortMethod(SORT_METHOD_SIZE, 553, LABEL_MASKS("%L", "%I", "%L", "%I")); // FileName, Size | Foldername, Size AddSortMethod(SORT_METHOD_DATE, 552, LABEL_MASKS("%L", "%J", "%L", "%J")); // FileName, Date | Foldername, Date AddSortMethod(SORT_METHOD_FILE, 561, LABEL_MASKS("%L", "%I", "%L", "")); // Filename, Size | FolderName, empty SetSortMethod(g_settings.m_viewStateVideoFiles.m_sortMethod); SetViewAsControl(g_settings.m_viewStateVideoFiles.m_viewMode); SetSortOrder(g_settings.m_viewStateVideoFiles.m_sortOrder); } LoadViewState(items.GetPath(), WINDOW_VIDEO_NAV); }
CGUIViewStateMusicDatabase::CGUIViewStateMusicDatabase(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { CMusicDatabaseDirectory dir; NODE_TYPE NodeType=dir.GetDirectoryChildType(items.GetPath()); std::string strTrackLeft=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_LIBRARYTRACKFORMAT); if (strTrackLeft.empty()) strTrackLeft = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); std::string strTrackRight=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_LIBRARYTRACKFORMATRIGHT); if (strTrackRight.empty()) strTrackRight = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMATRIGHT); std::string strAlbumLeft = g_advancedSettings.m_strMusicLibraryAlbumFormat; if (strAlbumLeft.empty()) strAlbumLeft = "%B"; // album std::string strAlbumRight = g_advancedSettings.m_strMusicLibraryAlbumFormatRight; if (strAlbumRight.empty()) strAlbumRight = "%A"; // artist CLog::Log(LOGDEBUG,"Album format left = [%s]", strAlbumLeft.c_str()); CLog::Log(LOGDEBUG,"Album format right = [%s]", strAlbumRight.c_str()); SortAttribute sortAttribute = SortAttributeNone; if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) sortAttribute = SortAttributeIgnoreArticle; switch (NodeType) { case NODE_TYPE_OVERVIEW: { AddSortMethod(SortByNone, 551, LABEL_MASKS("%F", "", "%L", "")); // Filename, empty | Foldername, empty SetSortMethod(SortByNone); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_TOP100: { AddSortMethod(SortByNone, 551, LABEL_MASKS("%F", "", "%L", "")); // Filename, empty | Foldername, empty SetSortMethod(SortByNone); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_GENRE: { AddSortMethod(SortByGenre, 515, LABEL_MASKS("%F", "", "%G", "")); // Filename, empty | Genre, empty SetSortMethod(SortByGenre); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderAscending); } break; case NODE_TYPE_YEAR: { AddSortMethod(SortByLabel, 562, LABEL_MASKS("%F", "", "%Y", "")); // Filename, empty | Year, empty SetSortMethod(SortByLabel); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderAscending); } break; case NODE_TYPE_ARTIST: { AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%F", "", "%A", "")); // Filename, empty | Artist, empty AddSortMethod(SortByDateAdded, sortAttribute, 570, LABEL_MASKS("%F", "", "%A", "%a")); // Filename, empty | Artist, dateAdded SetSortMethod(SortByArtist); const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavartists"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_ALBUM_COMPILATIONS: case NODE_TYPE_ALBUM: case NODE_TYPE_YEAR_ALBUM: { // album AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // artist AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // artist / year AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // year AddSortMethod(SortByYear, 562, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // album date added AddSortMethod(SortByDateAdded, sortAttribute, 570, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // play count AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavalbums"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_ALBUM_RECENTLY_ADDED: { AddSortMethod(SortByNone, 552, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined SetSortMethod(SortByNone); SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavalbums")->m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_ADDED_SONGS: { AddSortMethod(SortByNone, 552, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined | empty, empty SetSortMethod(SortByNone); SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavsongs")->m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_PLAYED: { AddSortMethod(SortByNone, 568, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined SetSortMethod(SortByNone); SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavalbums")->m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_PLAYED_SONGS: { AddSortMethod(SortByNone, 568, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined | empty, empty SetSortMethod(SortByNone); SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavalbums")->m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_TOP100: { AddSortMethod(SortByNone, 551, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined SetSortMethod(SortByNone); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_SINGLES: { AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%T - %A", "%R")); // Title - Artist, Rating AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T - %A", "%a")); // Title - Artist, DateAdded | empty, empty const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_ALBUM_COMPILATIONS_SONGS: case NODE_TYPE_ALBUM_TOP100_SONGS: case NODE_TYPE_YEAR_SONG: case NODE_TYPE_SONG: { AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Title, Artist, Duration| empty, empty AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%T - %A", "%R")); // Title - Artist, Rating AddSortMethod(SortByYear, 562, LABEL_MASKS("%T - %A", "%Y")); // Title, Artist, Year AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T - %A", "%a")); // Title - Artist, DateAdded | empty, empty AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T - %A", "%V")); // Titel - Artist, PlayCount const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); // the "All Albums" entries always default to SortByAlbum as this is most logical - user can always // change it and the change will be saved for this particular path if (dir.IsAllItem(items.GetPath())) SetSortMethod(SortByAlbum); else SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_SONG_TOP100: { AddSortMethod(SortByNone, 576, LABEL_MASKS("%T - %A", "%V")); SetSortMethod(SortByPlaycount); SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavsongs")->m_viewMode); SetSortOrder(SortOrderNone); } break; default: break; } LoadViewState(items.GetPath(), WINDOW_MUSIC_NAV); }
bool CGUIWindowVideoNav::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { if (m_thumbLoader.IsLoading()) m_thumbLoader.StopThread(); 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()); // perform the flattening logic for tvshows with a single (unwatched) season (+ optional special season) if (node == NODE_TYPE_SEASONS) { int itemsSize = items.GetObjectCount(); int firstIndex = items.Size() - itemsSize; // check if the last item is the "All seasons" item which should be ignored for flattening if (items[items.Size() - 1]->GetVideoInfoTag()->m_iSeason < 0) itemsSize -= 1; int iFlatten = CSettings::Get().GetInt("videolibrary.flattentvshows"); 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::Get().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); } } items.SetArt("thumb", ""); 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()); map<string, string> art; if (m_database.GetArtForItem(details.m_iDbId, details.m_type, art)) { items.AppendArt(art, "tvshow"); 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); // the container folder thumb is the parent (i.e. season or show) if (node == NODE_TYPE_EPISODES || node == NODE_TYPE_RECENTLY_ADDED_EPISODES) { items.SetContent("episodes"); // grab the season thumb as the folder thumb int seasonID = m_database.GetSeasonId(details.m_iDbId, params.GetSeason()); CGUIListItem::ArtMap seasonArt; if (m_database.GetArtForItem(seasonID, "season", seasonArt)) { items.AppendArt(art, "season"); // 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) items.SetContent("movies"); else if (node == NODE_TYPE_TITLE_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 (!items.IsVirtualDirectoryRoot()) { // load info from the database CStdString label; if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::Get().GetSources("video"), &label)) items.SetLabel(label); if (!items.IsSourcesPath()) 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; }
CGUIViewStateWindowMusicNav::CGUIViewStateWindowMusicNav(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { SortAttribute sortAttribute = SortAttributeNone; if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) sortAttribute = SortAttributeIgnoreArticle; if (items.IsVirtualDirectoryRoot()) { AddSortMethod(SortByNone, 551, LABEL_MASKS("%F", "%I", "%L", "")); // Filename, Size | Foldername, empty SetSortMethod(SortByNone); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } else { if (items.IsVideoDb() && items.Size() > (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS)?1:0)) { XFILE::VIDEODATABASEDIRECTORY::CQueryParams params; XFILE::CVideoDatabaseDirectory::GetQueryParams(items[CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS)?1:0]->GetPath(),params); if (params.GetMVideoId() != -1) { AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS("%T", "%Y")); // Filename, Duration | Foldername, empty AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y")); AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%Y")); AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%Y")); AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T", "%Y")); std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%N")); // Userdefined, Track Number| empty, empty } else { AddSortMethod(SortByLabel, 551, LABEL_MASKS("%F", "%D", "%L", "")); // Filename, Duration | Foldername, empty SetSortMethod(SortByLabel); } } else { //In navigation of music files tag data is scanned whenever present and can be used as sort criteria //hence sort methods available are similar to song node (not the same as only tag data) //Unfortunately anything here appears at all levels of file navigation even if no song files there. std::string strTrackLeft = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_LIBRARYTRACKFORMAT); if (strTrackLeft.empty()) strTrackLeft = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); AddSortMethod(SortByLabel, 551, LABEL_MASKS(strTrackLeft, "%D", "%L", ""), // Userdefined, Duration | FolderName, empty CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); AddSortMethod(SortBySize, 553, LABEL_MASKS("%F", "%I", "%L", "%I")); // Filename, Size | Foldername, Size AddSortMethod(SortByDate, 552, LABEL_MASKS("%F", "%J", "%L", "%J")); // Filename, Date | Foldername, Date AddSortMethod(SortByFile, 561, LABEL_MASKS("%F", "%I", "%L", "")); // Filename, Size | Label, empty AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, "%D")); // Userdefined, Duration| empty, empty AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Title, Artist, Duration| empty, empty AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A(%Y) - %T", "%D")); // Artist(year), Title, Duration| empty, empty AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SortByYear, 562, LABEL_MASKS("%T - %A", "%Y")); // Title, Artist, Year SetSortMethod(SortByLabel); } const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); SetSortOrder(SortOrderAscending); } LoadViewState(items.GetPath(), WINDOW_MUSIC_NAV); }
int CMusicInfoScanner::RetrieveMusicInfo(CFileItemList& items, const CStdString& strDirectory) { CSongMap songsMap; // get all information for all files in current directory from database, and remove them if (m_musicDatabase.RemoveSongsFromPath(strDirectory, songsMap)) m_needsCleanup = true; VECSONGS songsToAdd; CStdStringArray regexps = g_advancedSettings.m_audioExcludeFromScanRegExps; // for every file found, but skip folder for (int i = 0; i < items.Size(); ++i) { CFileItemPtr pItem = items[i]; CStdString strExtension; URIUtils::GetExtension(pItem->GetPath(), strExtension); if (m_bStop) return 0; // Discard all excluded files defined by m_musicExcludeRegExps if (CUtil::ExcludeFileOrFolder(pItem->GetPath(), regexps)) continue; // dont try reading id3tags for folders, playlists or shoutcast streams if (!pItem->m_bIsFolder && !pItem->IsPlayList() && !pItem->IsPicture() && !pItem->IsLyrics() ) { m_currentItem++; // CLog::Log(LOGDEBUG, "%s - Reading tag for: %s", __FUNCTION__, pItem->GetPath().c_str()); // grab info from the song CSong *dbSong = songsMap.Find(pItem->GetPath()); CMusicInfoTag& tag = *pItem->GetMusicInfoTag(); if (!tag.Loaded() ) { // read the tag from a file auto_ptr<IMusicInfoTagLoader> pLoader (CMusicInfoTagLoaderFactory::CreateLoader(pItem->GetPath())); if (NULL != pLoader.get()) pLoader->Load(pItem->GetPath(), tag); } // if we have the itemcount, update our // dialog with the progress we made if (m_handle && m_itemCount>0) m_handle->SetPercentage(m_currentItem/(float)m_itemCount*100); if (tag.Loaded()) { CSong song(tag); // ensure our song has a valid filename or else it will assert in AddSong() if (song.strFileName.IsEmpty()) { // copy filename from path in case UPnP or other tag loaders didn't specify one (FIXME?) song.strFileName = pItem->GetPath(); // if we still don't have a valid filename, skip the song if (song.strFileName.IsEmpty()) { // this shouldn't ideally happen! CLog::Log(LOGERROR, "Skipping song since it doesn't seem to have a filename"); continue; } } song.iStartOffset = pItem->m_lStartOffset; song.iEndOffset = pItem->m_lEndOffset; song.strThumb = pItem->GetUserMusicThumb(true); if (dbSong) { // keep the db-only fields intact on rescan... song.iTimesPlayed = dbSong->iTimesPlayed; song.lastPlayed = dbSong->lastPlayed; song.iKaraokeNumber = dbSong->iKaraokeNumber; if (song.rating == '0') song.rating = dbSong->rating; if (song.strThumb.empty()) song.strThumb = dbSong->strThumb; } songsToAdd.push_back(song); // CLog::Log(LOGDEBUG, "%s - Tag loaded for: %s", __FUNCTION__, pItem->GetPath().c_str()); } else CLog::Log(LOGDEBUG, "%s - No tag found for: %s", __FUNCTION__, pItem->GetPath().c_str()); } } VECALBUMS albums; CategoriseAlbums(songsToAdd, albums); FindArtForAlbums(albums, items.GetPath()); // finally, add these to the database m_musicDatabase.BeginTransaction(); int numAdded = 0; set<long> albumsToScan; set<long> artistsToScan; for (VECALBUMS::iterator i = albums.begin(); i != albums.end(); ++i) { vector<int> songIDs; int idAlbum = m_musicDatabase.AddAlbum(*i, songIDs); numAdded += i->songs.size(); if (m_bStop) { m_musicDatabase.RollbackTransaction(); return numAdded; } // Build the artist & album sets albumsToScan.insert(idAlbum); for (vector<int>::iterator j = songIDs.begin(); j != songIDs.end(); ++j) { vector<long> songArtists; m_musicDatabase.GetArtistsBySong(*j, false, songArtists); artistsToScan.insert(songArtists.begin(), songArtists.end()); } std::vector<long> albumArtists; m_musicDatabase.GetArtistsByAlbum(idAlbum, false, albumArtists); artistsToScan.insert(albumArtists.begin(), albumArtists.end()); } m_musicDatabase.CommitTransaction(); // Download info & artwork bool bCanceled; for (set<long>::iterator it = artistsToScan.begin(); it != artistsToScan.end(); ++it) { bCanceled = false; if (find(m_artistsScanned.begin(),m_artistsScanned.end(), *it) == m_artistsScanned.end()) { CStdString strArtist = m_musicDatabase.GetArtistById(*it); m_artistsScanned.push_back(*it); if (!m_bStop && (m_flags & SCAN_ONLINE)) { CStdString strPath; strPath.Format("musicdb://2/%u/", *it); if (!DownloadArtistInfo(strPath, strArtist, bCanceled)) // assume we want to retry m_artistsScanned.pop_back(); } else { map<string, string> artwork = GetArtistArtwork(*it); m_musicDatabase.SetArtForItem(*it, "artist", artwork); } } } if (m_flags & SCAN_ONLINE) { for (set<long>::iterator it = albumsToScan.begin(); it != albumsToScan.end(); ++it) { if (m_bStop) return songsToAdd.size(); CStdString strPath; strPath.Format("musicdb://3/%u/",*it); CAlbum album; m_musicDatabase.GetAlbumInfo(*it, album, NULL); bCanceled = false; if (find(m_albumsScanned.begin(), m_albumsScanned.end(), *it) == m_albumsScanned.end()) { CMusicAlbumInfo albumInfo; if (DownloadAlbumInfo(strPath, StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator), album.strAlbum, bCanceled, albumInfo)) m_albumsScanned.push_back(*it); } } } if (m_handle) m_handle->SetTitle(g_localizeStrings.Get(505)); return songsToAdd.size(); }
CGUIViewStateMusicDatabase::CGUIViewStateMusicDatabase(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { CMusicDatabaseDirectory dir; NODE_TYPE NodeType=dir.GetDirectoryChildType(items.GetPath()); CStdString strTrackLeft=g_guiSettings.GetString("musicfiles.librarytrackformat"); if (strTrackLeft.IsEmpty()) strTrackLeft = g_guiSettings.GetString("musicfiles.trackformat"); CStdString strTrackRight=g_guiSettings.GetString("musicfiles.librarytrackformatright"); if (strTrackRight.IsEmpty()) strTrackRight = g_guiSettings.GetString("musicfiles.trackformatright"); CStdString strAlbumLeft = g_advancedSettings.m_strMusicLibraryAlbumFormat; if (strAlbumLeft.IsEmpty()) strAlbumLeft = "%B"; // album CStdString strAlbumRight = g_advancedSettings.m_strMusicLibraryAlbumFormatRight; if (strAlbumRight.IsEmpty()) strAlbumRight = "%A"; // artist CLog::Log(LOGDEBUG,"Album format left = [%s]", strAlbumLeft.c_str()); CLog::Log(LOGDEBUG,"Album format right = [%s]", strAlbumRight.c_str()); switch (NodeType) { case NODE_TYPE_OVERVIEW: { AddSortMethod(SORT_METHOD_NONE, 551, LABEL_MASKS("%F", "", "%L", "")); // Filename, empty | Foldername, empty SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_TOP100: { AddSortMethod(SORT_METHOD_NONE, 551, LABEL_MASKS("%F", "", "%L", "")); // Filename, empty | Foldername, empty SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_GENRE: { AddSortMethod(SORT_METHOD_GENRE, 551, LABEL_MASKS("%F", "", "%G", "")); // Filename, empty | Genre, empty SetSortMethod(SORT_METHOD_GENRE); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderAscending); } break; case NODE_TYPE_YEAR: { AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%F", "", "%Y", "")); // Filename, empty | Year, empty SetSortMethod(SORT_METHOD_LABEL); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderAscending); } break; case NODE_TYPE_ARTIST: { if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) { AddSortMethod(SORT_METHOD_ARTIST_IGNORE_THE, 551, LABEL_MASKS("%F", "", "%A", "")); // Filename, empty | Artist, empty SetSortMethod(SORT_METHOD_ARTIST_IGNORE_THE); } else { AddSortMethod(SORT_METHOD_ARTIST, 551, LABEL_MASKS("%F", "", "%A", "")); // Filename, empty | Artist, empty SetSortMethod(SORT_METHOD_ARTIST); } SetViewAsControl(g_settings.m_viewStateMusicNavArtists.m_viewMode); SetSortOrder(g_settings.m_viewStateMusicNavArtists.m_sortOrder); } break; case NODE_TYPE_ALBUM_COMPILATIONS: case NODE_TYPE_ALBUM: case NODE_TYPE_YEAR_ALBUM: { // album if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_ALBUM_IGNORE_THE, 558, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined else AddSortMethod(SORT_METHOD_ALBUM, 558, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // artist if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_ARTIST_IGNORE_THE, 557, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined else AddSortMethod(SORT_METHOD_ARTIST, 557, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // year AddSortMethod(SORT_METHOD_YEAR, 562, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); SetSortMethod(g_settings.m_viewStateMusicNavAlbums.m_sortMethod); SetViewAsControl(g_settings.m_viewStateMusicNavAlbums.m_viewMode); SetSortOrder(g_settings.m_viewStateMusicNavAlbums.m_sortOrder); } break; case NODE_TYPE_ALBUM_RECENTLY_ADDED: { AddSortMethod(SORT_METHOD_NONE, 552, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(g_settings.m_viewStateMusicNavAlbums.m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_ADDED_SONGS: { AddSortMethod(SORT_METHOD_NONE, 552, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined | empty, empty SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(g_settings.m_viewStateMusicNavSongs.m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_PLAYED: { AddSortMethod(SORT_METHOD_NONE, 551, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(g_settings.m_viewStateMusicNavAlbums.m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_PLAYED_SONGS: { AddSortMethod(SORT_METHOD_NONE, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined | empty, empty SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(g_settings.m_viewStateMusicNavAlbums.m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_TOP100: { AddSortMethod(SORT_METHOD_NONE, 551, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined SetSortMethod(SORT_METHOD_NONE); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_SINGLES: { if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) { AddSortMethod(SORT_METHOD_ARTIST_IGNORE_THE, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SORT_METHOD_TITLE_IGNORE_THE, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); } else { AddSortMethod(SORT_METHOD_ARTIST, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SORT_METHOD_TITLE, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); } AddSortMethod(SORT_METHOD_DURATION, 555, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_SONG_RATING, 563, LABEL_MASKS("%T - %A", "%R")); // Title - Artist, Rating SetSortMethod(g_settings.m_viewStateMusicNavSongs.m_sortMethod); SetViewAsControl(g_settings.m_viewStateMusicNavSongs.m_viewMode); SetSortOrder(g_settings.m_viewStateMusicNavSongs.m_sortOrder); } break; case NODE_TYPE_ALBUM_COMPILATIONS_SONGS: case NODE_TYPE_ALBUM_TOP100_SONGS: case NODE_TYPE_YEAR_SONG: case NODE_TYPE_SONG: { AddSortMethod(SORT_METHOD_TRACKNUM, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) { AddSortMethod(SORT_METHOD_TITLE_IGNORE_THE, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_ALBUM_IGNORE_THE, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Title, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_ARTIST_IGNORE_THE, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); } else { AddSortMethod(SORT_METHOD_TITLE, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_ALBUM, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Title, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_ARTIST, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); } AddSortMethod(SORT_METHOD_DURATION, 555, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_SONG_RATING, 563, LABEL_MASKS("%T - %A", "%R")); // Title - Artist, Rating AddSortMethod(SORT_METHOD_YEAR, 562, LABEL_MASKS("%T - %A", "%Y")); // Title, Artist, Year // the "All Albums" entries always default to SORT_METHOD_ALBUM as this is most logical - user can always // change it and the change will be saved for this particular path if (dir.IsAllItem(items.GetPath())) SetSortMethod(g_guiSettings.GetBool("filelists.ignorethewhensorting") ? SORT_METHOD_ALBUM_IGNORE_THE : SORT_METHOD_ALBUM); else SetSortMethod(g_settings.m_viewStateMusicNavSongs.m_sortMethod); AddSortMethod(SORT_METHOD_PLAYCOUNT, 576, LABEL_MASKS("%T - %A", "%V")); // Titel - Artist, PlayCount SetViewAsControl(g_settings.m_viewStateMusicNavSongs.m_viewMode); SetSortOrder(g_settings.m_viewStateMusicNavSongs.m_sortOrder); } break; case NODE_TYPE_SONG_TOP100: { AddSortMethod(SORT_METHOD_NONE, 576, LABEL_MASKS("%T - %A", "%V")); SetSortMethod(SORT_METHOD_PLAYCOUNT); SetViewAsControl(g_settings.m_viewStateMusicNavSongs.m_viewMode); SetSortOrder(SortOrderNone); } break; default: break; } LoadViewState(items.GetPath(), WINDOW_MUSIC_NAV); }
CGUIViewStateMusicSmartPlaylist::CGUIViewStateMusicSmartPlaylist(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { if (items.GetContent() == "songs" || items.GetContent() == "mixed") { CStdString strTrackLeft=g_guiSettings.GetString("musicfiles.trackformat"); CStdString strTrackRight=g_guiSettings.GetString("musicfiles.trackformatright"); AddSortMethod(SORT_METHOD_PLAYLIST_ORDER, 559, LABEL_MASKS(strTrackLeft, strTrackRight)); AddSortMethod(SORT_METHOD_TRACKNUM, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) { AddSortMethod(SORT_METHOD_TITLE_IGNORE_THE, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_ALBUM_IGNORE_THE, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Titel, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_ARTIST_IGNORE_THE, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Titel, Duration| empty, empty AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); } else { AddSortMethod(SORT_METHOD_TITLE, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_ALBUM, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Titel, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_ARTIST, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Titel, Duration| empty, empty AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); } AddSortMethod(SORT_METHOD_DURATION, 555, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SORT_METHOD_SONG_RATING, 563, LABEL_MASKS("%T - %A", "%R")); // Titel, Artist, Rating| empty, empty SetSortMethod(SORT_METHOD_PLAYLIST_ORDER); SetViewAsControl(g_settings.m_viewStateMusicNavSongs.m_viewMode); SetSortOrder(g_settings.m_viewStateMusicNavSongs.m_sortOrder); } else if (items.GetContent() == "albums") { CStdString strAlbumLeft = g_advancedSettings.m_strMusicLibraryAlbumFormat; if (strAlbumLeft.IsEmpty()) strAlbumLeft = "%B"; // album CStdString strAlbumRight = g_advancedSettings.m_strMusicLibraryAlbumFormatRight; if (strAlbumRight.IsEmpty()) strAlbumRight = "%A"; // artist AddSortMethod(SORT_METHOD_PLAYLIST_ORDER, 559, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // album if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_ALBUM_IGNORE_THE, 558, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined else AddSortMethod(SORT_METHOD_ALBUM, 558, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // artist if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) AddSortMethod(SORT_METHOD_ARTIST_IGNORE_THE, 557, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined else AddSortMethod(SORT_METHOD_ARTIST, 557, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // year AddSortMethod(SORT_METHOD_YEAR, 562, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); SetSortMethod(SORT_METHOD_PLAYLIST_ORDER); SetViewAsControl(g_settings.m_viewStateMusicNavAlbums.m_viewMode); SetSortOrder(g_settings.m_viewStateMusicNavAlbums.m_sortOrder); } else { CLog::Log(LOGERROR,"Music Smart Playlist must be one of songs, mixed or albums"); } LoadViewState(items.GetPath(), WINDOW_MUSIC_NAV); }
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; }
// Add an "* All ..." folder to the CFileItemList // depending on the child node void CDirectoryNode::AddQueuingFolder(CFileItemList& items) const { CFileItemPtr pItem; // always hide "all" items if (g_advancedSettings.m_bVideoLibraryHideAllItems) return; // no need for "all" item when only one item if (items.GetObjectCount() <= 1) return; // hack - as the season node might return episodes auto_ptr<CDirectoryNode> pNode(ParseURL(items.GetPath())); switch (pNode->GetChildType()) { case NODE_TYPE_SEASONS: { CStdString strLabel = g_localizeStrings.Get(20366); pItem.reset(new CFileItem(strLabel)); // "All Seasons" pItem->SetPath(BuildPath() + "-1/"); // set the number of watched and unwatched items accordingly int watched = 0; int unwatched = 0; for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; watched += (int)item->GetProperty("watchedepisodes").asInteger(); unwatched += (int)item->GetProperty("unwatchedepisodes").asInteger(); } pItem->SetProperty("totalepisodes", watched + unwatched); pItem->SetProperty("numepisodes", watched + unwatched); // will be changed later to reflect watchmode setting pItem->SetProperty("watchedepisodes", watched); pItem->SetProperty("unwatchedepisodes", unwatched); if (items.Size() && items[0]->GetVideoInfoTag()) { *pItem->GetVideoInfoTag() = *items[0]->GetVideoInfoTag(); pItem->GetVideoInfoTag()->m_iSeason = -1; } pItem->GetVideoInfoTag()->m_strTitle = strLabel; pItem->GetVideoInfoTag()->m_iEpisode = watched + unwatched; pItem->GetVideoInfoTag()->m_playCount = (unwatched == 0) ? 1 : 0; CVideoDatabase db; if (db.Open()) { pItem->GetVideoInfoTag()->m_iDbId = db.GetSeasonId(pItem->GetVideoInfoTag()->m_iIdShow, -1); db.Close(); } pItem->GetVideoInfoTag()->m_type = "season"; } break; default: break; } if (pItem) { pItem->m_bIsFolder = true; pItem->SetSpecialSort(g_advancedSettings.m_bVideoLibraryAllItemsOnBottom ? SortSpecialOnBottom : SortSpecialOnTop); pItem->SetCanQueue(false); items.Add(pItem); } }
void CGUIWindowVideoNav::LoadVideoInfo(CFileItemList &items, CVideoDatabase &database, bool allowReplaceLabels) { // TODO: this could possibly be threaded as per the music info loading, // we could also cache the info if (!items.GetContent().empty() && !items.IsPlugin()) return; // don't load for listings that have content set and weren't created from plugins CStdString content = items.GetContent(); // determine content only if it isn't set if (content.empty()) { content = database.GetContentForPath(items.GetPath()); items.SetContent(content.empty() ? "files" : content); } /* If we have a matching item in the library, so we can assign the metadata to it. In addition, we can choose * whether the item is stacked down (eg in the case of folders representing a single item) * whether or not we assign the library's labels to the item, or leave the item as is. As certain users (read: certain developers) don't want either of these to occur, we compromise by stacking items down only if stacking is available and enabled. Similarly, we assign the "clean" library labels to the item only if the "Replace filenames with library titles" setting is enabled. */ const bool stackItems = items.GetProperty("isstacked").asBoolean() || (StackingAvailable(items) && CSettings::Get().GetBool("myvideos.stackvideos")); const bool replaceLabels = allowReplaceLabels && CSettings::Get().GetBool("myvideos.replacelabels"); CFileItemList dbItems; /* NOTE: In the future when GetItemsForPath returns all items regardless of whether they're "in the library" we won't need the fetchedPlayCounts code, and can "simply" do this directly on absense of content. */ bool fetchedPlayCounts = false; if (!content.empty()) { database.GetItemsForPath(content, items.GetPath(), dbItems); dbItems.SetFastLookup(true); } for (int i = 0; i < items.Size(); i++) { CFileItemPtr pItem = items[i]; CFileItemPtr match; if (!content.empty()) /* optical media will be stacked down, so it's path won't match the base path */ match = dbItems.Get(pItem->IsOpticalMediaFile() ? pItem->GetLocalMetadataPath() : pItem->GetPath()); if (match) { pItem->UpdateInfo(*match, replaceLabels); if (stackItems) { if (match->m_bIsFolder) pItem->SetPath(match->GetVideoInfoTag()->m_strPath); else pItem->SetPath(match->GetVideoInfoTag()->m_strFileNameAndPath); // if we switch from a file to a folder item it means we really shouldn't be sorting files and // folders separately if (pItem->m_bIsFolder != match->m_bIsFolder) { items.SetSortIgnoreFolders(true); pItem->m_bIsFolder = match->m_bIsFolder; } } } else { /* NOTE: Currently we GetPlayCounts on our items regardless of whether content is set as if content is set, GetItemsForPaths doesn't return anything not in the content tables. This code can be removed once the content tables are always filled */ if (!pItem->m_bIsFolder && !fetchedPlayCounts) { database.GetPlayCounts(items.GetPath(), items); fetchedPlayCounts = true; } // preferably use some information from PVR info tag if available if (pItem->HasPVRRecordingInfoTag()) pItem->GetPVRRecordingInfoTag()->CopyClientInfo(pItem->GetVideoInfoTag()); // set the watched overlay if (pItem->IsVideo()) pItem->SetOverlayImage(CGUIListItem::ICON_OVERLAY_UNWATCHED, pItem->HasVideoInfoTag() && pItem->GetVideoInfoTag()->m_playCount > 0); } } }
/*! \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().IsEmpty()) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(strParentPath); pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.AddFront(pItem, 0); } int iWindow = GetID(); CStdStringArray regexps; // 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; }
int CMusicInfoScanner::RetrieveMusicInfo(const std::string& strDirectory, CFileItemList& items) { MAPSONGS songsMap; // get all information for all files in current directory from database, and remove them if (m_musicDatabase.RemoveSongsFromPath(strDirectory, songsMap)) m_needsCleanup = true; CFileItemList scannedItems; if (ScanTags(items, scannedItems) == INFO_CANCELLED || scannedItems.Size() == 0) return 0; VECALBUMS albums; FileItemsToAlbums(scannedItems, albums, &songsMap); FindArtForAlbums(albums, items.GetPath()); int numAdded = 0; ADDON::AddonPtr addon; ADDON::ScraperPtr albumScraper; ADDON::ScraperPtr artistScraper; if(ADDON::CAddonMgr::GetInstance().GetDefault(ADDON::ADDON_SCRAPER_ALBUMS, addon)) albumScraper = std::dynamic_pointer_cast<ADDON::CScraper>(addon); if(ADDON::CAddonMgr::GetInstance().GetDefault(ADDON::ADDON_SCRAPER_ARTISTS, addon)) artistScraper = std::dynamic_pointer_cast<ADDON::CScraper>(addon); // Add each album for (VECALBUMS::iterator album = albums.begin(); album != albums.end(); ++album) { if (m_bStop) break; // mark albums without a title as singles if (album->strAlbum.empty()) album->releaseType = CAlbum::Single; album->strPath = strDirectory; m_musicDatabase.AddAlbum(*album); // Yuk - this is a kludgy way to do what we want to do, but it will work to sort // out artist fanart until we can restructure the artist fanart to work more // like the album fanart. This has to be done after we've added the album so // we have the artist IDs to update, but before we call UpdateDatabaseArtistInfo. if (albums.size() == 1 && !album->artistCredits.empty() && !StringUtils::EqualsNoCase(album->artistCredits[0].GetArtist(), "various artists") && !StringUtils::EqualsNoCase(album->artistCredits[0].GetArtist(), "various")) { CArtist artist; if (m_musicDatabase.GetArtist(album->artistCredits[0].GetArtistId(), artist)) { artist.strPath = URIUtils::GetParentPath(strDirectory); m_musicDatabase.SetArtForItem(artist.idArtist, MediaTypeArtist, GetArtistArtwork(artist)); } } if ((m_flags & SCAN_ONLINE)) { if (!albumScraper || !artistScraper) continue; INFO_RET albumScrapeStatus = INFO_NOT_FOUND; if (!m_musicDatabase.HasAlbumBeenScraped(album->idAlbum)) albumScrapeStatus = UpdateDatabaseAlbumInfo(*album, albumScraper, false); if (albumScrapeStatus == INFO_ADDED) { for (VECARTISTCREDITS::const_iterator artistCredit = album->artistCredits.begin(); artistCredit != album->artistCredits.end(); ++artistCredit) { if (m_bStop) break; if (!m_musicDatabase.HasArtistBeenScraped(artistCredit->GetArtistId())) { CArtist artist; m_musicDatabase.GetArtist(artistCredit->GetArtistId(), artist); UpdateDatabaseArtistInfo(artist, artistScraper, false); } } for (VECSONGS::iterator song = album->songs.begin(); song != album->songs.end(); ++song) { if (m_bStop) break; for (VECARTISTCREDITS::const_iterator artistCredit = song->artistCredits.begin(); artistCredit != song->artistCredits.end(); ++artistCredit) { if (m_bStop) break; CMusicArtistInfo musicArtistInfo; if (!m_musicDatabase.HasArtistBeenScraped(artistCredit->GetArtistId())) { CArtist artist; m_musicDatabase.GetArtist(artistCredit->GetArtistId(), artist); UpdateDatabaseArtistInfo(artist, artistScraper, false); } } } } } numAdded += album->songs.size(); } if (m_handle) m_handle->SetTitle(g_localizeStrings.Get(505)); return numAdded; }
// \brief Set window to a specific directory // \param strDirectory The directory to be displayed in list/thumb control // This function calls OnPrepareFileItems() and OnFinalizeFileItems() bool CGUIMediaWindow::Update(const CStdString &strDirectory) { // TODO: OnInitWindow calls Update() before window path has been set properly. if (strDirectory == "?") return false; // get selected item int iItem = m_viewControl.GetSelectedItem(); CStdString strSelectedItem = ""; if (iItem >= 0 && iItem < m_vecItems->Size()) { CFileItemPtr pItem = m_vecItems->Get(iItem); if (!pItem->IsParentFolder()) { GetDirectoryHistoryString(pItem.get(), strSelectedItem); } } CStdString strOldDirectory = m_vecItems->GetPath(); m_history.SetSelectedItem(strSelectedItem, strOldDirectory); CFileItemList items; if (!GetDirectory(strDirectory, items)) { CLog::Log(LOGERROR,"CGUIMediaWindow::GetDirectory(%s) failed", strDirectory.c_str()); // if the directory is the same as the old directory, then we'll return // false. Else, we assume we can get the previous directory if (strDirectory.Equals(strOldDirectory)) return false; // We assume, we can get the parent // directory again, but we have to // return false to be able to eg. show // an error message. CStdString strParentPath = m_history.GetParentPath(); m_history.RemoveParentPath(); Update(strParentPath); return false; } if (items.GetLabel().IsEmpty()) items.SetLabel(CUtil::GetTitleFromPath(items.GetPath(), true)); ClearFileItems(); m_vecItems->Copy(items); // if we're getting the root source listing // make sure the path history is clean if (strDirectory.IsEmpty()) m_history.ClearPathHistory(); int iWindow = GetID(); int showLabel = 0; if (strDirectory.IsEmpty() && (iWindow == WINDOW_MUSIC_FILES || iWindow == WINDOW_FILES || iWindow == WINDOW_PICTURES || iWindow == WINDOW_PROGRAMS)) showLabel = 1026; if (strDirectory.Equals("sources://video/")) showLabel = 999; if (showLabel && (m_vecItems->Size() == 0 || !m_guiState->DisableAddSourceButtons())) // add 'add source button' { CStdString strLabel = g_localizeStrings.Get(showLabel); CFileItemPtr pItem(new CFileItem(strLabel)); pItem->SetPath("add"); pItem->SetIconImage("DefaultAddSource.png"); pItem->SetLabel(strLabel); pItem->SetLabelPreformated(true); pItem->m_bIsFolder = true; pItem->SetSpecialSort(SORT_ON_BOTTOM); m_vecItems->Add(pItem); } m_iLastControl = GetFocusedControlID(); // Ask the derived class if it wants to load additional info // for the fileitems like media info or additional // filtering on the items, setting thumbs. OnPrepareFileItems(*m_vecItems); // The idea here is to ensure we have something to focus if our file list // is empty. As such, this check MUST be last and ignore the hide parent // fileitems settings. if (m_vecItems->IsEmpty()) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(m_history.GetParentPath()); pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; m_vecItems->AddFront(pItem, 0); } m_vecItems->FillInDefaultIcons(); m_guiState.reset(CGUIViewState::GetViewState(GetID(), *m_vecItems)); FormatAndSort(*m_vecItems); // Ask the devived class if it wants to do custom list operations, // eg. changing the label OnFinalizeFileItems(*m_vecItems); UpdateButtons(); m_viewControl.SetItems(*m_vecItems); strSelectedItem = m_history.GetSelectedItem(m_vecItems->GetPath()); bool bSelectedFound = false; //int iSongInDirectory = -1; for (int i = 0; i < m_vecItems->Size(); ++i) { CFileItemPtr pItem = m_vecItems->Get(i); // Update selected item if (!bSelectedFound) { CStdString strHistory; GetDirectoryHistoryString(pItem.get(), strHistory); if (strHistory == strSelectedItem) { m_viewControl.SetSelectedItem(i); bSelectedFound = true; } } } // if we haven't found the selected item, select the first item if (!bSelectedFound) m_viewControl.SetSelectedItem(0); m_history.AddPath(m_vecItems->GetPath()); //m_history.DumpPathHistory(); return true; }
// Add an "* All ..." folder to the CFileItemList // depending on the child node void CDirectoryNode::AddQueuingFolder(CFileItemList& items) const { CFileItemPtr pItem; // always show "all" items by default if (!CSettings::Get().GetBool(CSettings::SETTING_VIDEOLIBRARY_SHOWALLITEMS)) return; // no need for "all" item when only one item if (items.GetObjectCount() <= 1) return; CVideoDbUrl videoUrl; if (!videoUrl.FromString(BuildPath())) return; // hack - as the season node might return episodes unique_ptr<CDirectoryNode> pNode(ParseURL(items.GetPath())); switch (pNode->GetChildType()) { case NODE_TYPE_SEASONS: { std::string strLabel = g_localizeStrings.Get(20366); pItem.reset(new CFileItem(strLabel)); // "All Seasons" videoUrl.AppendPath("-1/"); pItem->SetPath(videoUrl.ToString()); // set the number of watched and unwatched items accordingly int watched = 0; int unwatched = 0; for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; watched += (int)item->GetProperty("watchedepisodes").asInteger(); unwatched += (int)item->GetProperty("unwatchedepisodes").asInteger(); } pItem->SetProperty("totalepisodes", watched + unwatched); pItem->SetProperty("numepisodes", watched + unwatched); // will be changed later to reflect watchmode setting pItem->SetProperty("watchedepisodes", watched); pItem->SetProperty("unwatchedepisodes", unwatched); if (items.Size() && items[0]->GetVideoInfoTag()) { *pItem->GetVideoInfoTag() = *items[0]->GetVideoInfoTag(); pItem->GetVideoInfoTag()->m_iSeason = -1; } pItem->GetVideoInfoTag()->m_strTitle = strLabel; pItem->GetVideoInfoTag()->m_iEpisode = watched + unwatched; pItem->GetVideoInfoTag()->m_playCount = (unwatched == 0) ? 1 : 0; CVideoDatabase db; if (db.Open()) { pItem->GetVideoInfoTag()->m_iDbId = db.GetSeasonId(pItem->GetVideoInfoTag()->m_iIdShow, -1); db.Close(); } pItem->GetVideoInfoTag()->m_type = MediaTypeSeason; } break; case NODE_TYPE_MUSICVIDEOS_ALBUM: pItem.reset(new CFileItem(g_localizeStrings.Get(15102))); // "All Albums" videoUrl.AppendPath("-1/"); pItem->SetPath(videoUrl.ToString()); break; default: break; } if (pItem) { pItem->m_bIsFolder = true; pItem->SetSpecialSort(g_advancedSettings.m_bVideoLibraryAllItemsOnBottom ? SortSpecialOnBottom : SortSpecialOnTop); pItem->SetCanQueue(false); items.Add(pItem); } }
void CGUIWindowMusicBase::OnPrepareFileItems(CFileItemList &items) { if (!items.GetPath().Equals("plugin://music/")) items.SetCachedMusicThumbs(); }
CGUIViewStateWindowVideoNav::CGUIViewStateWindowVideoNav(const CFileItemList& items) : CGUIViewStateWindowVideo(items) { SortAttribute sortAttributes = SortAttributeNone; if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) sortAttributes = SortAttributeIgnoreArticle; if (items.IsVirtualDirectoryRoot()) { AddSortMethod(SortByNone, 551, LABEL_MASKS("%F", "%I", "%L", "")); // Filename, Size | Label, empty SetSortMethod(SortByNone); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } else if (items.IsVideoDb()) { NODE_TYPE NodeType=CVideoDatabaseDirectory::GetDirectoryChildType(items.GetPath()); CQueryParams params; CVideoDatabaseDirectory::GetQueryParams(items.GetPath(),params); switch (NodeType) { case NODE_TYPE_MOVIES_OVERVIEW: case NODE_TYPE_TVSHOWS_OVERVIEW: case NODE_TYPE_MUSICVIDEOS_OVERVIEW: case NODE_TYPE_OVERVIEW: { AddSortMethod(SortByNone, 551, LABEL_MASKS("%F", "%I", "%L", "")); // Filename, Size | Label, empty SetSortMethod(SortByNone); SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_DIRECTOR: case NODE_TYPE_ACTOR: { AddSortMethod(SortByLabel, 551, LABEL_MASKS("%T", "%R", "%L", "")); // Title, Rating | Label, empty AddSortMethod(SortByRelevance, 38026, LABEL_MASKS("%T", "%c", "%L", "%c")); // Title, Actor's appearences (Relevance) | Label, Actor's appearences (Relevance) SetSortMethod(SortByLabel); const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavactors"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_YEAR: { AddSortMethod(SortByLabel, 562, LABEL_MASKS("%T", "%R", "%L", "")); // Title, Rating | Label, empty SetSortMethod(SortByLabel); const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavyears"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_SEASONS: { AddSortMethod(SortBySortTitle, 556, LABEL_MASKS("%L", "","%L","")); // Label, empty | Label, empty SetSortMethod(SortBySortTitle); const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavseasons"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_TITLE_TVSHOWS: { AddSortMethod(SortBySortTitle, sortAttributes, 556, LABEL_MASKS("%T", "%M", "%T", "%M")); // Title, #Episodes | Title, #Episodes AddSortMethod(SortByNumberOfEpisodes, 20360, LABEL_MASKS("%L", "%M", "%L", "%M")); // Label, #Episodes | Label, #Episodes AddSortMethod(SortByLastPlayed, 568, LABEL_MASKS("%T", "%p", "%T", "%p")); // Title, #Last played | Title, #Last played AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T", "%a", "%T", "%a")); // Title, DateAdded | Title, DateAdded AddSortMethod(SortByYear, 562, LABEL_MASKS("%L","%Y","%L","%Y")); // Label, Year | Label, Year AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%T", "%r", "%T", "%r")); // Title, Userrating | Title, Userrating SetSortMethod(SortByLabel); const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavtvshows"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_MUSICVIDEOS_ALBUM: case NODE_TYPE_GENRE: case NODE_TYPE_COUNTRY: case NODE_TYPE_STUDIO: { AddSortMethod(SortByLabel, 551, LABEL_MASKS("%T", "%R", "%L", "")); // Title, Rating | Label, empty SetSortMethod(SortByLabel); const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavgenres"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_SETS: { AddSortMethod(SortByLabel, sortAttributes, 551, LABEL_MASKS("%T","%R", "%T","%R")); // Title, Rating | Title, Rating AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y", "%T", "%Y")); // Title, Year | Title, Year AddSortMethod(SortByRating, 563, LABEL_MASKS("%T", "%R", "%T", "%R")); // Title, Rating | Title, Rating AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T", "%a", "%T", "%a")); // Title, DateAdded | Title, DateAdded if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T", "%V", "%T", "%V")); // Title, Playcount | Title, Playcount SetSortMethod(SortByLabel); const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavgenres"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_TAGS: { AddSortMethod(SortByLabel, sortAttributes, 551, LABEL_MASKS("%T","", "%T","")); // Title, empty | Title, empty SetSortMethod(SortByLabel); const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavgenres"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_EPISODES: { if (params.GetSeason() > -1) { AddSortMethod(SortByEpisodeNumber, 20359, LABEL_MASKS("%E. %T","%R")); // Episode. Title, Rating | empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%E. %T", "%R")); // Episode. Title, Rating | empty, empty AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%E. %T", "%r")); // Episode. Title, Userrating | empty, empty AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%E. %T", "%O")); // Episode. Title, MPAA | empty, empty AddSortMethod(SortByProductionCode, 20368, LABEL_MASKS("%E. %T","%P", "%E. %T","%P")); // Episode. Title, ProductionCode | Episode. Title, ProductionCode AddSortMethod(SortByDate, 552, LABEL_MASKS("%E. %T","%J","%E. %T","%J")); // Episode. Title, Date | Episode. Title, Date if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%E. %T", "%V")); // Episode. Title, Playcount | empty, empty } else { AddSortMethod(SortByEpisodeNumber, 20359, LABEL_MASKS("%H. %T","%R")); // Order. Title, Rating | emtpy, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%H. %T", "%R")); // Order. Title, Rating | emtpy, empty AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%H. %T", "%r")); // Order. Title, Userrating | emtpy, empty AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%H. %T", "%O")); // Order. Title, MPAA | emtpy, empty AddSortMethod(SortByProductionCode, 20368, LABEL_MASKS("%H. %T","%P", "%H. %T","%P")); // Order. Title, ProductionCode | Episode. Title, ProductionCode AddSortMethod(SortByDate, 552, LABEL_MASKS("%H. %T","%J","%H. %T","%J")); // Order. Title, Date | Episode. Title, Date if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%H. %T", "%V")); // Order. Title, Playcount | empty, empty } AddSortMethod(SortByLabel, sortAttributes, 551, LABEL_MASKS("%T","%R")); // Title, Rating | empty, empty const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavepisodes"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); break; } case NODE_TYPE_RECENTLY_ADDED_EPISODES: { AddSortMethod(SortByNone, 552, LABEL_MASKS("%Z - %H. %T", "%R")); // TvShow - Order. Title, Rating | empty, empty SetSortMethod(SortByNone); SetViewAsControl(CViewStateSettings::GetInstance().Get("videonavepisodes")->m_viewMode); SetSortOrder(SortOrderNone); break; } case NODE_TYPE_TITLE_MOVIES: { if (params.GetSetId() > -1) // Is this a listing within a set? { AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y")); // Title, Year | empty, empty AddSortMethod(SortBySortTitle, sortAttributes, 556, LABEL_MASKS("%T", "%R")); // Title, Rating | empty, empty } else { AddSortMethod(SortBySortTitle, sortAttributes, 556, LABEL_MASKS("%T", "%R", "%T", "%R")); // Title, Rating | Title, Rating AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y", "%T", "%Y")); // Title, Year | Title, Year } AddSortMethod(SortByRating, 563, LABEL_MASKS("%T", "%R", "%T", "%R")); // Title, Rating | Title, Rating AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%T", "%r", "%T", "%r")); // Title, Userrating | Title, Userrating AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%T", "%O")); // Title, MPAA | empty, empty AddSortMethod(SortByTime, 180, LABEL_MASKS("%T", "%D")); // Title, Duration | empty, empty AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T", "%a", "%T", "%a")); // Title, DateAdded | Title, DateAdded if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T", "%V", "%T", "%V")); // Title, Playcount | Title, Playcount const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavtitles"); if (params.GetSetId() > -1) { SetSortMethod(SortByYear); SetSortOrder(SortOrderAscending); } else { SetSortMethod(viewState->m_sortDescription); SetSortOrder(viewState->m_sortDescription.sortOrder); } SetViewAsControl(viewState->m_viewMode); } break; case NODE_TYPE_TITLE_MUSICVIDEOS: { AddSortMethod(SortByLabel, sortAttributes, 551, LABEL_MASKS("%T", "%Y")); // Title, Year | empty, empty AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%T", "%O")); AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y")); // Title, Year | empty, empty AddSortMethod(SortByArtist, sortAttributes, 557, LABEL_MASKS("%A - %T", "%Y")); // Artist - Title, Year | empty, empty AddSortMethod(SortByAlbum, sortAttributes, 558, LABEL_MASKS("%B - %T", "%Y")); // Album - Title, Year | empty, empty if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T", "%V")); // Title, Playcount | empty, empty std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%N")); // Userdefined, Track Number | empty, empty const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavmusicvideos"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } break; case NODE_TYPE_RECENTLY_ADDED_MOVIES: { AddSortMethod(SortByNone, 552, LABEL_MASKS("%T", "%R")); // Title, Rating | empty, empty SetSortMethod(SortByNone); SetViewAsControl(CViewStateSettings::GetInstance().Get("videonavtitles")->m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: { AddSortMethod(SortByNone, 552, LABEL_MASKS("%A - %T", "%Y")); // Artist - Title, Year | empty, empty SetSortMethod(SortByNone); SetViewAsControl(CViewStateSettings::GetInstance().Get("videonavmusicvideos")->m_viewMode); SetSortOrder(SortOrderNone); } break; default: break; } } else { AddSortMethod(SortByLabel, sortAttributes, 551, LABEL_MASKS("%L", "%I", "%L", "")); // Label, Size | Label, empty AddSortMethod(SortBySize, 553, LABEL_MASKS("%L", "%I", "%L", "%I")); // Label, Size | Label, Size AddSortMethod(SortByDate, 552, LABEL_MASKS("%L", "%J", "%L", "%J")); // Label, Date | Label, Date AddSortMethod(SortByFile, 561, LABEL_MASKS("%L", "%I", "%L", "")); // Label, Size | Label, empty const CViewState *viewState = CViewStateSettings::GetInstance().Get("videofiles"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } LoadViewState(items.GetPath(), WINDOW_VIDEO_NAV); }
CGUIViewStateMusicSmartPlaylist::CGUIViewStateMusicSmartPlaylist(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { SortAttribute sortAttribute = SortAttributeNone; if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) sortAttribute = SortAttributeIgnoreArticle; const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); if (items.GetContent() == "songs" || items.GetContent() == "mixed") { std::string strTrackLeft=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); std::string strTrackRight=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMATRIGHT); AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Titel, Artist, Duration| empty, empty AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Titel, Duration| empty, empty AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%D")); // Artist, Titel, Duration| empty, empty AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%T - %A", "%R")); // Titel, Artist, Rating| empty, empty if (items.IsSmartPlayList() || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS(strTrackLeft, strTrackRight)); else { SetSortMethod(viewState->m_sortDescription); SetSortOrder(viewState->m_sortDescription.sortOrder); } SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavsongs")->m_viewMode); } else if (items.GetContent() == "albums") { std::string strAlbumLeft = g_advancedSettings.m_strMusicLibraryAlbumFormat; if (strAlbumLeft.empty()) strAlbumLeft = "%B"; // album std::string strAlbumRight = g_advancedSettings.m_strMusicLibraryAlbumFormatRight; if (strAlbumRight.empty()) strAlbumRight = "%A"; // artist // album AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // artist AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // artist / year AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // year AddSortMethod(SortByYear, 562, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); if (items.IsSmartPlayList() || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); else { SetSortMethod(viewState->m_sortDescription); SetSortOrder(viewState->m_sortDescription.sortOrder); } SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavalbums")->m_viewMode); } else { CLog::Log(LOGERROR,"Music Smart Playlist must be one of songs, mixed or albums"); } LoadViewState(items.GetPath(), WINDOW_MUSIC_NAV); }
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::Get().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((watchMode==WatchedModeWatched && item->GetVideoInfoTag()->m_playCount== 0) || (watchMode==WatchedModeUnwatched && item->GetVideoInfoTag()->m_playCount > 0)) { items.Remove(i); i--; listchanged = true; } } } 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; }