diff options
author | fuzzard <fuzzard@users.noreply.github.com> | 2024-06-25 11:16:00 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-25 11:16:00 +1000 |
commit | 03786496857ab0f3dfed457fe2c70d0ead97f63c (patch) | |
tree | e12514f5cd55547676627522decc5addab881b9c | |
parent | a91c1b72f28dd0f9122cc307b91ae04c9a43d5a8 (diff) | |
parent | 92ca2329fc1493fb87596ffd36243370be796b09 (diff) |
Merge pull request #25200 from notspiff/add_playlist_fileitem_classify
Add playlist FileItem classify
36 files changed, 306 insertions, 139 deletions
diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp index 8b7012a0e6..69a23f7ee7 100644 --- a/xbmc/FileItem.cpp +++ b/xbmc/FileItem.cpp @@ -36,6 +36,7 @@ #include "pictures/PictureInfoTag.h" #include "playlists/PlayList.h" #include "playlists/PlayListFactory.h" +#include "playlists/PlayListFileItemClassify.h" #include "pvr/PVRManager.h" #include "pvr/channels/PVRChannel.h" #include "pvr/channels/PVRChannelGroupMember.h" @@ -978,10 +979,10 @@ bool CFileItem::IsFileFolder(EFileFolderType types) const if (IsType(".strm") && (types & EFILEFOLDER_TYPE_ONBROWSE)) return false; - if(types & always_type) + if (types & always_type) { - if (IsSmartPlayList() || - (IsPlayList() && + if (PLAYLIST::IsSmartPlayList(*this) || + (PLAYLIST::IsPlayList(*this) && CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_playlistAsFolders) || IsAPK() || IsZIP() || IsRAR() || IsRSS() || MUSIC::IsAudioBook(*this) || IsType(".ogg|.oga|.xbt") @@ -999,22 +1000,15 @@ bool CFileItem::IsFileFolder(EFileFolderType types) const if(types & EFILEFOLDER_TYPE_ONBROWSE) { - if((IsPlayList() && !CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_playlistAsFolders) - || IsDiscImage()) + if ((PLAYLIST::IsPlayList(*this) && + !CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_playlistAsFolders) || + IsDiscImage()) return true; } return false; } -bool CFileItem::IsSmartPlayList() const -{ - if (HasProperty("library.smartplaylist") && GetProperty("library.smartplaylist").asBoolean()) - return true; - - return URIUtils::HasExtension(m_strPath, ".xsp"); -} - bool CFileItem::IsLibraryFolder() const { if (HasProperty("library.filter") && GetProperty("library.filter").asBoolean()) @@ -1023,11 +1017,6 @@ bool CFileItem::IsLibraryFolder() const return URIUtils::IsLibraryFolder(m_strPath); } -bool CFileItem::IsPlayList() const -{ - return CPlayListFactory::IsPlaylist(*this); -} - bool CFileItem::IsPythonScript() const { return URIUtils::HasExtension(m_strPath, ".py"); @@ -1283,7 +1272,7 @@ void CFileItem::FillInDefaultIcon() // picture SetArt("icon", "DefaultPicture.png"); } - else if ( IsPlayList() || IsSmartPlayList()) + else if (PLAYLIST::IsPlayList(*this) || PLAYLIST::IsSmartPlayList(*this)) { SetArt("icon", "DefaultPlaylist.png"); } @@ -1303,7 +1292,7 @@ void CFileItem::FillInDefaultIcon() } else { - if ( IsPlayList() || IsSmartPlayList()) + if (PLAYLIST::IsPlayList(*this) || PLAYLIST::IsSmartPlayList(*this)) { SetArt("icon", "DefaultPlaylist.png"); } @@ -2534,7 +2523,7 @@ bool CFileItem::LoadDetails() return false; } - if (!IsPlayList() && VIDEO::IsVideo(*this)) + if (!PLAYLIST::IsPlayList(*this) && VIDEO::IsVideo(*this)) { if (HasVideoInfoTag()) return true; @@ -2558,7 +2547,7 @@ bool CFileItem::LoadDetails() return false; } - if (IsPlayList() && IsType(".strm")) + if (PLAYLIST::IsPlayList(*this) && IsType(".strm")) { const std::unique_ptr<PLAYLIST::CPlayList> playlist(PLAYLIST::CPlayListFactory::Create(*this)); if (playlist) diff --git a/xbmc/FileItem.h b/xbmc/FileItem.h index 7083cf77e0..2023c2e43e 100644 --- a/xbmc/FileItem.h +++ b/xbmc/FileItem.h @@ -172,8 +172,6 @@ public: bool IsDeleted() const; bool IsGame() const; - bool IsPlayList() const; - bool IsSmartPlayList() const; bool IsLibraryFolder() const; bool IsPythonScript() const; bool IsPlugin() const; diff --git a/xbmc/FileItemList.cpp b/xbmc/FileItemList.cpp index e14b9a6c61..95b2dc58ae 100644 --- a/xbmc/FileItemList.cpp +++ b/xbmc/FileItemList.cpp @@ -18,6 +18,7 @@ #include "filesystem/VideoDatabaseDirectory.h" #include "music/MusicFileItemClassify.h" #include "network/NetworkFileItemClassify.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" @@ -654,7 +655,8 @@ void CFileItemList::FilterCueItems() { strMediaFile = URIUtils::ReplaceExtension(pItem->GetPath(), *i); CFileItem item(strMediaFile, false); - if (!MUSIC::IsCUESheet(item) && !item.IsPlayList() && Contains(strMediaFile)) + if (!MUSIC::IsCUESheet(item) && !PLAYLIST::IsPlayList(item) && + Contains(strMediaFile)) { bFoundMediaFile = true; break; @@ -847,7 +849,8 @@ void CFileItemList::StackFiles() CFileItemPtr item1 = Get(i); // skip folders, nfo files, playlists - if (item1->m_bIsFolder || item1->IsParentFolder() || item1->IsNFO() || item1->IsPlayList()) + if (item1->m_bIsFolder || item1->IsParentFolder() || item1->IsNFO() || + PLAYLIST::IsPlayList(*item1)) { // increment index i++; @@ -882,7 +885,7 @@ void CFileItemList::StackFiles() // skip folders, nfo files, playlists if (item2->m_bIsFolder || item2->IsParentFolder() || item2->IsNFO() || - item2->IsPlayList()) + PLAYLIST::IsPlayList(*item2)) { // increment index j++; @@ -1086,7 +1089,7 @@ std::string CFileItemList::GetDiscFileCache(int windowID) const if (VIDEO::IsVideoDb(*this)) return StringUtils::Format("special://temp/archive_cache/vdb-{:08x}.fi", crc); - if (IsSmartPlayList()) + if (PLAYLIST::IsSmartPlayList(*this)) return StringUtils::Format("special://temp/archive_cache/sp-{:08x}.fi", crc); if (windowID) diff --git a/xbmc/PlayListPlayer.cpp b/xbmc/PlayListPlayer.cpp index 346727ca55..8d45e7f611 100644 --- a/xbmc/PlayListPlayer.cpp +++ b/xbmc/PlayListPlayer.cpp @@ -32,6 +32,7 @@ #include "music/MusicFileItemClassify.h" #include "music/tags/MusicInfoTag.h" #include "playlists/PlayList.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/SettingsComponent.h" #include "utils/StringUtils.h" @@ -973,7 +974,7 @@ void PLAYLIST::CPlayListPlayer::OnApplicationMessage(KODI::MESSAGING::ThreadMess ClearPlaylist(playlistId); SetCurrentPlaylist(playlistId); - if (list->Size() == 1 && !(*list)[0]->IsPlayList()) + if (list->Size() == 1 && !IsPlayList(*list->Get(0))) { CFileItemPtr item = (*list)[0]; // if the item is a plugin we need to resolve the URL to ensure the infotags are filled. diff --git a/xbmc/Util.cpp b/xbmc/Util.cpp index eb10ab14fc..0b507b502b 100644 --- a/xbmc/Util.cpp +++ b/xbmc/Util.cpp @@ -8,6 +8,7 @@ #include "network/Network.h" #include "network/NetworkFileItemClassify.h" +#include "playlists/PlayListFileItemClassify.h" #include "video/VideoFileItemClassify.h" #if defined(TARGET_DARWIN) #include <sys/param.h> @@ -2057,7 +2058,7 @@ void CUtil::ScanForExternalSubtitles(const std::string& strMovie, std::vector<st CFileItem item(strMovie, false); if ((NETWORK::IsInternetStream(item) && !URIUtils::IsOnLAN(item.GetDynPath())) || - item.IsPlayList() || item.IsLiveTV() || !VIDEO::IsVideo(item)) + PLAYLIST::IsPlayList(item) || item.IsLiveTV() || !VIDEO::IsVideo(item)) return; CLog::Log(LOGDEBUG, "{}: Searching for subtitles...", __FUNCTION__); @@ -2346,8 +2347,8 @@ std::string CUtil::GetVobSubIdxFromSub(const std::string& vobSub) void CUtil::ScanForExternalAudio(const std::string& videoPath, std::vector<std::string>& vecAudio) { CFileItem item(videoPath, false); - if (NETWORK::IsInternetStream(item) || item.IsPlayList() || item.IsLiveTV() || item.IsPVR() || - !VIDEO::IsVideo(item)) + if (NETWORK::IsInternetStream(item) || PLAYLIST::IsPlayList(item) || item.IsLiveTV() || + item.IsPVR() || !VIDEO::IsVideo(item)) return; std::string strBasePath; diff --git a/xbmc/application/Application.cpp b/xbmc/application/Application.cpp index fba4b3763e..fe3967edcf 100644 --- a/xbmc/application/Application.cpp +++ b/xbmc/application/Application.cpp @@ -62,6 +62,7 @@ #include "filesystem/File.h" #include "music/MusicFileItemClassify.h" #include "network/NetworkFileItemClassify.h" +#include "playlists/PlayListFileItemClassify.h" #include "video/VideoFileItemClassify.h" #ifdef HAS_FILESYSTEM_NFS #include "filesystem/NFSFile.h" @@ -2172,7 +2173,7 @@ bool CApplication::PlayMedia(CFileItem& item, const std::string& player, PLAYLIS if (URIUtils::HasPluginPath(item) && !XFILE::CPluginDirectory::GetResolvedPluginResult(item)) return false; - if (item.IsSmartPlayList()) + if (PLAYLIST::IsSmartPlayList(item)) { CFileItemList items; CUtil::GetRecursiveListing(item.GetPath(), items, "", DIR_FLAG_NO_FILE_DIRS); @@ -2192,7 +2193,7 @@ bool CApplication::PlayMedia(CFileItem& item, const std::string& player, PLAYLIS return ProcessAndStartPlaylist(smartpl.GetName(), playlist, smartplPlaylistId); } } - else if (item.IsPlayList() || NETWORK::IsInternetStream(item)) + else if (PLAYLIST::IsPlayList(item) || NETWORK::IsInternetStream(item)) { // Not owner. Dialog auto-deletes itself. CGUIDialogCache* dlgCache = @@ -2317,7 +2318,7 @@ bool CApplication::PlayFile(CFileItem item, return CServiceBroker::GetMediaManager().playStubFile(item); } - if (item.IsPlayList()) + if (PLAYLIST::IsPlayList(item)) return false; // Translate/Resolve the url if needed @@ -2842,7 +2843,7 @@ bool CApplication::OnMessage(CGUIMessage& message) std::unique_ptr<CFileItem> trailerItem = ContentUtils::GeneratePlayableTrailerItem(*item, g_localizeStrings.Get(20410)); - if (item->IsPlayList()) + if (PLAYLIST::IsPlayList(*item)) { std::unique_ptr<CFileItemList> fileitemList = std::make_unique<CFileItemList>(); fileitemList->Add(std::move(trailerItem)); diff --git a/xbmc/cores/VideoPlayer/DVDFileInfo.cpp b/xbmc/cores/VideoPlayer/DVDFileInfo.cpp index 9989176bb4..33ab24885a 100644 --- a/xbmc/cores/VideoPlayer/DVDFileInfo.cpp +++ b/xbmc/cores/VideoPlayer/DVDFileInfo.cpp @@ -17,6 +17,7 @@ #include "guilib/Texture.h" #include "network/NetworkFileItemClassify.h" #include "pictures/Picture.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/SettingsComponent.h" #include "utils/MemUtils.h" @@ -263,7 +264,8 @@ bool CDVDFileInfo::CanExtract(const CFileItem& fileItem) URIUtils::IsPVRRecording(fileItem.GetDynPath()) || // plugin path not fully resolved URIUtils::IsPlugin(fileItem.GetDynPath()) || URIUtils::IsUPnP(fileItem.GetPath()) || - NETWORK::IsInternetStream(fileItem) || VIDEO::IsDiscStub(fileItem) || fileItem.IsPlayList()) + NETWORK::IsInternetStream(fileItem) || VIDEO::IsDiscStub(fileItem) || + PLAYLIST::IsPlayList(fileItem)) return false; // mostly can't extract from discs and files from discs. diff --git a/xbmc/filesystem/Directory.cpp b/xbmc/filesystem/Directory.cpp index a9cedab793..13759a1f98 100644 --- a/xbmc/filesystem/Directory.cpp +++ b/xbmc/filesystem/Directory.cpp @@ -21,6 +21,7 @@ #include "guilib/GUIWindowManager.h" #include "messaging/ApplicationMessenger.h" #include "music/MusicFileItemClassify.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" #include "utils/Job.h" @@ -287,7 +288,7 @@ bool CDirectory::GetDirectory(const CURL& url, // Should any of the files we read be treated as a directory? // Disable for database folders, as they already contain the extracted items if (!(hints.flags & DIR_FLAG_NO_FILE_DIRS) && !MUSIC::IsMusicDb(items) && - !VIDEO::IsVideoDb(items) && !items.IsSmartPlayList()) + !VIDEO::IsVideoDb(items) && !PLAYLIST::IsSmartPlayList(items)) FilterFileDirectories(items, hints.mask); // Correct items for path substitution diff --git a/xbmc/interfaces/builtins/PlayerBuiltins.cpp b/xbmc/interfaces/builtins/PlayerBuiltins.cpp index 2d7f92608f..28b54ecd78 100644 --- a/xbmc/interfaces/builtins/PlayerBuiltins.cpp +++ b/xbmc/interfaces/builtins/PlayerBuiltins.cpp @@ -27,6 +27,7 @@ #include "music/MusicFileItemClassify.h" #include "music/MusicUtils.h" #include "playlists/PlayList.h" +#include "playlists/PlayListFileItemClassify.h" #include "pvr/PVRManager.h" #include "pvr/channels/PVRChannel.h" #include "pvr/guilib/PVRGUIActionsChannels.h" @@ -538,7 +539,7 @@ int PlayOrQueueMedia(const std::vector<std::string>& params, bool forcePlay) } item.SetProperty("check_resume", false); - if (!forcePlay /* queue */ || item.m_bIsFolder || item.IsPlayList()) + if (!forcePlay /* queue */ || item.m_bIsFolder || PLAYLIST::IsPlayList(item)) { CFileItemList items; GetItemsForPlayList(std::make_shared<CFileItem>(item), items); @@ -560,7 +561,7 @@ int PlayOrQueueMedia(const std::vector<std::string>& params, bool forcePlay) // Mixed playlist item played by music player, mixed content folder has music removed if (containsMusic && containsVideo) { - if (item.IsPlayList()) + if (PLAYLIST::IsPlayList(item)) playlistId = PLAYLIST::Id::TYPE_MUSIC; else { @@ -625,7 +626,8 @@ int PlayOrQueueMedia(const std::vector<std::string>& params, bool forcePlay) if (forcePlay) { - if ((MUSIC::IsAudio(item) || VIDEO::IsVideo(item)) && !item.IsSmartPlayList() && !item.IsPVR()) + if ((MUSIC::IsAudio(item) || VIDEO::IsVideo(item)) && !PLAYLIST::IsSmartPlayList(item) && + !item.IsPVR()) { if (!item.HasProperty("playlist_type_hint")) item.SetProperty("playlist_type_hint", static_cast<int>(GetPlayListId(item))); diff --git a/xbmc/interfaces/json-rpc/FileOperations.cpp b/xbmc/interfaces/json-rpc/FileOperations.cpp index a495607ff9..c5eb4e5399 100644 --- a/xbmc/interfaces/json-rpc/FileOperations.cpp +++ b/xbmc/interfaces/json-rpc/FileOperations.cpp @@ -18,6 +18,7 @@ #include "VideoLibrary.h" #include "filesystem/Directory.h" #include "media/MediaLockState.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/MediaSourceSettings.h" #include "settings/SettingsComponent.h" @@ -29,8 +30,9 @@ #include <memory> -using namespace XFILE; +using namespace KODI; using namespace JSONRPC; +using namespace XFILE; JSONRPC_STATUS CFileOperations::GetRootDirectory(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -378,7 +380,8 @@ bool CFileOperations::FillFileItemList(const CVariant ¶meterObject, CFileIte { // Sort folders and files by filename to avoid reverse item order bug on some platforms, // but leave items from a playlist, smartplaylist or upnp container in order supplied - if (!items.IsPlayList() && !items.IsSmartPlayList() && !URIUtils::IsUPnP(items.GetPath())) + if (!PLAYLIST::IsPlayList(items) && !PLAYLIST::IsSmartPlayList(items) && + !URIUtils::IsUPnP(items.GetPath())) items.Sort(SortByFile, SortOrderAscending); CFileItemList filteredDirectories; diff --git a/xbmc/interfaces/legacy/PlayList.cpp b/xbmc/interfaces/legacy/PlayList.cpp index 076e1928b1..3d28645812 100644 --- a/xbmc/interfaces/legacy/PlayList.cpp +++ b/xbmc/interfaces/legacy/PlayList.cpp @@ -12,6 +12,7 @@ #include "PlayListPlayer.h" #include "ServiceBroker.h" #include "playlists/PlayListFactory.h" +#include "playlists/PlayListFileItemClassify.h" #include "utils/URIUtils.h" using namespace KODI; @@ -64,7 +65,7 @@ namespace XBMCAddon CFileItem item(cFileName); item.SetPath(cFileName); - if (item.IsPlayList()) + if (PLAYLIST::IsPlayList(item)) { // load playlist and copy al items to existing playlist diff --git a/xbmc/music/GUIViewStateMusic.cpp b/xbmc/music/GUIViewStateMusic.cpp index 5d43691b4d..89a20a8c16 100644 --- a/xbmc/music/GUIViewStateMusic.cpp +++ b/xbmc/music/GUIViewStateMusic.cpp @@ -16,6 +16,7 @@ #include "filesystem/VideoDatabaseDirectory.h" #include "guilib/LocalizeStrings.h" #include "guilib/WindowIDs.h" +#include "playlists/PlayListFileItemClassify.h" #include "playlists/PlayListTypes.h" #include "settings/AdvancedSettings.h" #include "settings/MediaSourceSettings.h" @@ -380,7 +381,7 @@ CGUIViewStateMusicSmartPlaylist::CGUIViewStateMusicSmartPlaylist(const CFileItem AddSortMethod(SortByBPM, 38080, LABEL_MASKS("%T - %A", "%f")); // Title - Artist, bpm, empty, empty - if (items.IsSmartPlayList() || items.IsLibraryFolder()) + if (PLAYLIST::IsSmartPlayList(items) || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS(strTrack, "%D")); else { @@ -424,7 +425,7 @@ CGUIViewStateMusicSmartPlaylist::CGUIViewStateMusicSmartPlaylist(const CFileItem // userrating AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%F", "", strAlbum, "%r")); // Filename, empty | Userdefined, UserRating - if (items.IsSmartPlayList() || items.IsLibraryFolder()) + if (PLAYLIST::IsSmartPlayList(items) || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%F", "", strAlbum, "%D")); else { diff --git a/xbmc/music/MusicInfoLoader.cpp b/xbmc/music/MusicInfoLoader.cpp index a6bff1a36e..6a5aecd553 100644 --- a/xbmc/music/MusicInfoLoader.cpp +++ b/xbmc/music/MusicInfoLoader.cpp @@ -22,6 +22,7 @@ #include "music/tags/MusicInfoTag.h" #include "music/tags/MusicInfoTagLoaderFactory.h" #include "network/NetworkFileItemClassify.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" #include "utils/Archive.h" @@ -75,7 +76,7 @@ void CMusicInfoLoader::OnLoaderStart() bool CMusicInfoLoader::LoadAdditionalTagInfo(CFileItem* pItem) { - if (!pItem || (pItem->m_bIsFolder && !MUSIC::IsAudio(*pItem)) || pItem->IsPlayList() || + if (!pItem || (pItem->m_bIsFolder && !MUSIC::IsAudio(*pItem)) || PLAYLIST::IsPlayList(*pItem) || pItem->IsNFO() || NETWORK::IsInternetStream(*pItem)) return false; @@ -149,8 +150,8 @@ bool CMusicInfoLoader::LoadItem(CFileItem* pItem) bool CMusicInfoLoader::LoadItemCached(CFileItem* pItem) { - if ((pItem->m_bIsFolder && !MUSIC::IsAudio(*pItem)) || pItem->IsPlayList() || - pItem->IsSmartPlayList() || + if ((pItem->m_bIsFolder && !MUSIC::IsAudio(*pItem)) || PLAYLIST::IsPlayList(*pItem) || + PLAYLIST::IsSmartPlayList(*pItem) || StringUtils::StartsWithNoCase(pItem->GetPath(), "newplaylist://") || StringUtils::StartsWithNoCase(pItem->GetPath(), "newsmartplaylist://") || pItem->IsNFO() || (NETWORK::IsInternetStream(*pItem) && !MUSIC::IsMusicDb(*pItem))) @@ -168,7 +169,7 @@ bool CMusicInfoLoader::LoadItemLookup(CFileItem* pItem) m_pProgressCallback->SetProgressAdvance(); if ((pItem->m_bIsFolder && !MUSIC::IsAudio(*pItem)) || // - pItem->IsPlayList() || pItem->IsSmartPlayList() || // + PLAYLIST::IsPlayList(*pItem) || PLAYLIST::IsSmartPlayList(*pItem) || // StringUtils::StartsWithNoCase(pItem->GetPath(), "newplaylist://") || // StringUtils::StartsWithNoCase(pItem->GetPath(), "newsmartplaylist://") || // pItem->IsNFO() || (NETWORK::IsInternetStream(*pItem) && !MUSIC::IsMusicDb(*pItem))) diff --git a/xbmc/music/MusicUtils.cpp b/xbmc/music/MusicUtils.cpp index 5434688a8c..215dbee5f5 100644 --- a/xbmc/music/MusicUtils.cpp +++ b/xbmc/music/MusicUtils.cpp @@ -34,6 +34,7 @@ #include "network/NetworkFileItemClassify.h" #include "playlists/PlayList.h" #include "playlists/PlayListFactory.h" +#include "playlists/PlayListFileItemClassify.h" #include "profiles/ProfileManager.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" @@ -581,7 +582,7 @@ void CAsyncGetItemsForPlaylist::GetItemsForPlaylist(const std::shared_ptr<CFileI } else { - if (item->IsPlayList()) + if (PLAYLIST::IsPlayList(*item)) { const std::unique_ptr<PLAYLIST::CPlayList> playList( PLAYLIST::CPlayListFactory::Create(*item)); @@ -795,7 +796,7 @@ void QueueItem(const std::shared_ptr<CFileItem>& itemIn, QueuePosition pos) playlistId = PLAYLIST::Id::TYPE_MUSIC; // Check for the partymode playlist item, do nothing when "PartyMode.xsp" not exists - if (item->IsSmartPlayList() && !CFileUtils::Exists(item->GetPath())) + if (PLAYLIST::IsSmartPlayList(*item) && !CFileUtils::Exists(item->GetPath())) { const auto profileManager = CServiceBroker::GetSettingsComponent()->GetProfileManager(); if (item->GetPath() == profileManager->GetUserDataItem("PartyMode.xsp")) @@ -863,7 +864,7 @@ namespace { bool IsNonExistingUserPartyModePlaylist(const CFileItem& item) { - if (!item.IsSmartPlayList()) + if (!PLAYLIST::IsSmartPlayList(item)) return false; const std::string& path{item.GetPath()}; @@ -892,7 +893,7 @@ bool IsItemPlayable(const CFileItem& item) return false; // Include playlists located at one of the possible music playlist locations - if (item.IsPlayList()) + if (PLAYLIST::IsPlayList(item)) { if (StringUtils::StartsWithNoCase(item.GetMimeType(), "audio/")) return true; diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp index 3f8c5791af..6f546a63f9 100644 --- a/xbmc/music/infoscanner/MusicInfoScanner.cpp +++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp @@ -44,6 +44,7 @@ #include "music/MusicUtils.h" #include "music/tags/MusicInfoTag.h" #include "music/tags/MusicInfoTagLoaderFactory.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" @@ -554,7 +555,7 @@ bool CMusicInfoScanner::DoScan(const std::string& strDirectory) if (m_bStop) break; // if we have a directory item (non-playlist) we then recurse into that folder - if (pItem->m_bIsFolder && !pItem->IsParentFolder() && !pItem->IsPlayList()) + if (pItem->m_bIsFolder && !pItem->IsParentFolder() && !PLAYLIST::IsPlayList(*pItem)) { std::string strPath=pItem->GetPath(); if (!DoScan(strPath)) @@ -581,7 +582,8 @@ CInfoScanner::INFO_RET CMusicInfoScanner::ScanTags(const CFileItemList& items, if (CUtil::ExcludeFileOrFolder(pItem->GetPath(), regexps)) continue; - if (pItem->m_bIsFolder || pItem->IsPlayList() || pItem->IsPicture() || MUSIC::IsLyrics(*pItem)) + if (pItem->m_bIsFolder || PLAYLIST::IsPlayList(*pItem) || pItem->IsPicture() || + MUSIC::IsLyrics(*pItem)) continue; m_currentItem++; @@ -1275,7 +1277,7 @@ int CMusicInfoScanner::GetPathHash(const CFileItemList &items, std::string &hash digest.Update((unsigned char *)&pItem->m_dwSize, sizeof(pItem->m_dwSize)); KODI::TIME::FileTime time = pItem->m_dateTime; digest.Update((unsigned char*)&time, sizeof(KODI::TIME::FileTime)); - if (MUSIC::IsAudio(*pItem) && !pItem->IsPlayList() && !pItem->IsNFO()) + if (MUSIC::IsAudio(*pItem) && !PLAYLIST::IsPlayList(*pItem) && !pItem->IsNFO()) count++; } hash = digest.Finalize(); @@ -2336,7 +2338,7 @@ int CMusicInfoScanner::CountFiles(const CFileItemList &items, bool recursive) if (recursive && pItem->m_bIsFolder) count+=CountFilesRecursively(pItem->GetPath()); - else if (MUSIC::IsAudio(*pItem) && !pItem->IsPlayList() && !pItem->IsNFO()) + else if (MUSIC::IsAudio(*pItem) && !PLAYLIST::IsPlayList(*pItem) && !pItem->IsNFO()) count++; } return count; diff --git a/xbmc/music/windows/GUIWindowMusicBase.cpp b/xbmc/music/windows/GUIWindowMusicBase.cpp index 7bef12c9c0..6086c8bb93 100644 --- a/xbmc/music/windows/GUIWindowMusicBase.cpp +++ b/xbmc/music/windows/GUIWindowMusicBase.cpp @@ -25,6 +25,7 @@ #include "application/ApplicationPlayer.h" #include "music/MusicFileItemClassify.h" #include "network/NetworkFileItemClassify.h" +#include "playlists/PlayListFileItemClassify.h" #include "video/VideoFileItemClassify.h" #ifdef HAS_CDDA_RIPPER #include "cdrip/CDDARipper.h" @@ -78,7 +79,6 @@ using namespace MUSIC_INFO; using namespace KODI; using namespace KODI::MESSAGING; using KODI::MESSAGING::HELPERS::DialogResponse; -using namespace KODI::VIDEO; using namespace std::chrono_literals; @@ -303,7 +303,7 @@ void CGUIWindowMusicBase::OnItemInfo(int iItem) CFileItemPtr item = m_vecItems->Get(iItem); // Match visibility test of CMusicInfo::IsVisible - if (IsVideoDb(*item) && item->HasVideoInfoTag() && + if (VIDEO::IsVideoDb(*item) && item->HasVideoInfoTag() && (item->HasProperty("artist_musicid") || item->HasProperty("album_musicid"))) { // Music video artist or album (navigation by music > music video > artist)) @@ -311,7 +311,7 @@ void CGUIWindowMusicBase::OnItemInfo(int iItem) return; } - if (IsVideo(*item) && item->HasVideoInfoTag() && + if (VIDEO::IsVideo(*item) && item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_type == MediaTypeMusicVideo) { // Music video on a mixed current playlist or navigation by music > music video > artist > video CGUIDialogVideoInfo::ShowFor(*item); @@ -354,8 +354,8 @@ void CGUIWindowMusicBase::RetrieveMusicInfo() for (int i = 0; i < m_vecItems->Size(); ++i) { CFileItemPtr pItem = (*m_vecItems)[i]; - if (pItem->m_bIsFolder || pItem->IsPlayList() || pItem->IsPicture() || - MUSIC::IsLyrics(*pItem) || IsVideo(*pItem)) + if (pItem->m_bIsFolder || PLAYLIST::IsPlayList(*pItem) || pItem->IsPicture() || + MUSIC::IsLyrics(*pItem) || VIDEO::IsVideo(*pItem)) continue; CMusicInfoTag& tag = *pItem->GetMusicInfoTag(); @@ -435,7 +435,7 @@ void CGUIWindowMusicBase::GetContextButtons(int itemNumber, CContextButtons &but // Check for the partymode playlist item. // When "PartyMode.xsp" not exist, only context menu button is edit - if (item->IsSmartPlayList() && + if (PLAYLIST::IsSmartPlayList(*item) && (item->GetPath() == profileManager->GetUserDataItem("PartyMode.xsp")) && !CFileUtils::Exists(item->GetPath())) { @@ -448,12 +448,12 @@ void CGUIWindowMusicBase::GetContextButtons(int itemNumber, CContextButtons &but //! @todo get rid of IsAddonsPath and IsScript check. CanQueue should be enough! if (item->CanQueue() && !item->IsAddonsPath() && !item->IsScript()) { - if (item->IsSmartPlayList()) + if (PLAYLIST::IsSmartPlayList(*item)) buttons.Add(CONTEXT_BUTTON_PLAY_PARTYMODE, 15216); // Play in Partymode - if (item->IsSmartPlayList() || m_vecItems->IsSmartPlayList()) + if (PLAYLIST::IsSmartPlayList(*item) || PLAYLIST::IsSmartPlayList(*m_vecItems)) buttons.Add(CONTEXT_BUTTON_EDIT_SMART_PLAYLIST, 586); - else if (item->IsPlayList() || m_vecItems->IsPlayList()) + else if (PLAYLIST::IsPlayList(*item) || PLAYLIST::IsPlayList(*m_vecItems)) buttons.Add(CONTEXT_BUTTON_EDIT, 586); } #ifdef HAS_OPTICAL_DRIVE @@ -505,7 +505,10 @@ bool CGUIWindowMusicBase::OnContextButton(int itemNumber, CONTEXT_BUTTON button) case CONTEXT_BUTTON_EDIT: { - std::string playlist = item->IsPlayList() ? item->GetPath() : m_vecItems->GetPath(); // save path as activatewindow will destroy our items + std::string playlist = + PLAYLIST::IsPlayList(*item) + ? item->GetPath() + : m_vecItems->GetPath(); // save path as activatewindow will destroy our items CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_MUSIC_PLAYLIST_EDITOR, playlist); // need to update m_vecItems->RemoveDiscCache(GetID()); @@ -514,7 +517,10 @@ bool CGUIWindowMusicBase::OnContextButton(int itemNumber, CONTEXT_BUTTON button) case CONTEXT_BUTTON_EDIT_SMART_PLAYLIST: { - std::string playlist = item->IsSmartPlayList() ? item->GetPath() : m_vecItems->GetPath(); // save path as activatewindow will destroy our items + const std::string playlist = + PLAYLIST::IsSmartPlayList(*item) + ? item->GetPath() + : m_vecItems->GetPath(); // save path as activatewindow will destroy our items if (CGUIDialogSmartPlaylistEditor::EditPlaylist(playlist, "music")) Refresh(true); // need to update return true; @@ -610,7 +616,7 @@ void CGUIWindowMusicBase::PlayItem(int iItem) #endif // Check for the partymode playlist item, do nothing when "PartyMode.xsp" not exist - if (pItem->IsSmartPlayList()) + if (PLAYLIST::IsSmartPlayList(*pItem)) { const std::shared_ptr<CProfileManager> profileManager = CServiceBroker::GetSettingsComponent()->GetProfileManager(); @@ -655,7 +661,7 @@ void CGUIWindowMusicBase::PlayItem(int iItem) // play! CServiceBroker::GetPlaylistPlayer().Play(); } - else if (pItem->IsPlayList()) + else if (PLAYLIST::IsPlayList(*pItem)) { // load the playlist the old way LoadPlayList(pItem->GetPath()); @@ -712,7 +718,7 @@ bool CGUIWindowMusicBase::OnPlayMedia(int iItem, const std::string &player) g_partyModeManager.AddUserSongs(playlistTemp, !CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_MUSICPLAYER_QUEUEBYDEFAULT)); return true; } - else if (!pItem->IsPlayList() && !NETWORK::IsInternetStream(*pItem)) + else if (!PLAYLIST::IsPlayList(*pItem) && !NETWORK::IsInternetStream(*pItem)) { // single music file - if we get here then we have autoplaynextitem turned off or queuebydefault // turned on, but we still want to use the playlist player in order to handle more queued items // following etc. @@ -734,7 +740,7 @@ bool CGUIWindowMusicBase::OnPlayMedia(int iItem, const std::string &player) void CGUIWindowMusicBase::OnRetrieveMusicInfo(CFileItemList& items) { // No need to attempt to read music file tags for music videos - if (IsVideoDb(items)) + if (VIDEO::IsVideoDb(items)) return; if (items.GetFolderCount() == items.Size() || MUSIC::IsMusicDb(items) || (!CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( @@ -1046,7 +1052,7 @@ void CGUIWindowMusicBase::OnPrepareFileItems(CFileItemList &items) { CGUIMediaWindow::OnPrepareFileItems(items); - if (!MUSIC::IsMusicDb(items) && !items.IsSmartPlayList()) + if (!MUSIC::IsMusicDb(items) && !PLAYLIST::IsSmartPlayList(items)) RetrieveMusicInfo(); } diff --git a/xbmc/music/windows/GUIWindowMusicNav.cpp b/xbmc/music/windows/GUIWindowMusicNav.cpp index b54eb59e93..840881515a 100644 --- a/xbmc/music/windows/GUIWindowMusicNav.cpp +++ b/xbmc/music/windows/GUIWindowMusicNav.cpp @@ -36,6 +36,7 @@ #include "network/NetworkFileItemClassify.h" #include "playlists/PlayList.h" #include "playlists/PlayListFactory.h" +#include "playlists/PlayListFileItemClassify.h" #include "profiles/ProfileManager.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" @@ -57,7 +58,6 @@ using namespace XFILE; using namespace MUSICDATABASEDIRECTORY; using namespace KODI; using namespace KODI::MESSAGING; -using namespace KODI::VIDEO; #define CONTROL_BTNVIEWASICONS 2 #define CONTROL_BTNSORTBY 3 @@ -355,8 +355,8 @@ bool CGUIWindowMusicNav::OnClick(int iItem, const std::string &player /* = "" */ if (MUSIC::IsMusicDb(*item) && !item->m_bIsFolder) m_musicdatabase.SetPropertiesForFileItem(*item); - if (item->IsPlayList() && - !CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_playlistAsFolders) + if (PLAYLIST::IsPlayList(*item) && + !CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_playlistAsFolders) { PlayItem(iItem); return true; @@ -386,12 +386,12 @@ bool CGUIWindowMusicNav::GetDirectory(const std::string &strDirectory, CFileItem bool bResult = CGUIWindowMusicBase::GetDirectory(strDirectory, items); if (bResult) { - if (items.IsPlayList()) + if (PLAYLIST::IsPlayList(items)) OnRetrieveMusicInfo(items); } // update our content in the info manager - if (StringUtils::StartsWithNoCase(strDirectory, "videodb://") || IsVideoDb(items)) + if (StringUtils::StartsWithNoCase(strDirectory, "videodb://") || VIDEO::IsVideoDb(items)) { CVideoDatabaseDirectory dir; VIDEODATABASEDIRECTORY::NODE_TYPE node = dir.GetDirectoryChildType(items.GetPath()); @@ -471,7 +471,7 @@ bool CGUIWindowMusicNav::GetDirectory(const std::string &strDirectory, CFileItem break; } } - else if (items.IsPlayList()) + else if (PLAYLIST::IsPlayList(items)) items.SetContent("songs"); else if (URIUtils::PathEquals(strDirectory, "special://musicplaylists/") || URIUtils::PathEquals(strDirectory, "library://music/playlists.xml/")) @@ -480,8 +480,8 @@ bool CGUIWindowMusicNav::GetDirectory(const std::string &strDirectory, CFileItem items.SetContent("plugins"); else if (items.IsAddonsPath()) items.SetContent("addons"); - else if (!items.IsSourcesPath() && !items.IsVirtualDirectoryRoot() && - !items.IsLibraryFolder() && !items.IsPlugin() && !items.IsSmartPlayList()) + else if (!items.IsSourcesPath() && !items.IsVirtualDirectoryRoot() && !items.IsLibraryFolder() && + !items.IsPlugin() && !PLAYLIST::IsSmartPlayList(items)) items.SetContent("files"); return bResult; @@ -518,7 +518,7 @@ void CGUIWindowMusicNav::UpdateButtons() if (m_vecItems->IsPath("special://musicplaylists/")) strLabel = g_localizeStrings.Get(136); // "{Playlist Name}" - else if (m_vecItems->IsPlayList()) + else if (PLAYLIST::IsPlayList(*m_vecItems)) { // get playlist name from path std::string strDummy; @@ -618,7 +618,8 @@ void CGUIWindowMusicNav::GetContextButtons(int itemNumber, CContextButtons &butt item->m_bIsFolder && // Folders only, but playlists can be folders too !URIUtils::IsLibraryContent(item->GetPath()) && // database folder or .xsp files !URIUtils::IsSpecial(item->GetPath()) && !item->IsPlugin() && !item->IsScript() && - !item->IsPlayList() && // .m3u etc. that as flagged as folders when playlistasfolders + !PLAYLIST::IsPlayList( + *item) && // .m3u etc. that as flagged as folders when playlistasfolders !StringUtils::StartsWithNoCase(item->GetPath(), "addons://") && (profileManager->GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) @@ -630,7 +631,7 @@ void CGUIWindowMusicNav::GetContextButtons(int itemNumber, CContextButtons &butt if (!item->IsParentFolder() && !dir.IsAllItem(item->GetPath())) { - if (item->m_bIsFolder && !IsVideoDb(*item) && !item->IsPlugin() && + if (item->m_bIsFolder && !VIDEO::IsVideoDb(*item) && !item->IsPlugin() && !StringUtils::StartsWithNoCase(item->GetPath(), "musicsearch://")) { if (item->IsAlbum()) @@ -686,8 +687,8 @@ void CGUIWindowMusicNav::GetContextButtons(int itemNumber, CContextButtons &butt buttons.Add(CONTEXT_BUTTON_DELETE, 646); } } - if (inPlaylists && URIUtils::GetFileName(item->GetPath()) != "PartyMode.xsp" - && (item->IsPlayList() || item->IsSmartPlayList())) + if (inPlaylists && URIUtils::GetFileName(item->GetPath()) != "PartyMode.xsp" && + (PLAYLIST::IsPlayList(*item) || PLAYLIST::IsSmartPlayList(*item))) buttons.Add(CONTEXT_BUTTON_DELETE, 117); if (!item->IsReadOnly() && CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool("filelists.allowfiledeletion")) @@ -724,7 +725,7 @@ bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { case CONTEXT_BUTTON_INFO: { - if (!IsVideoDb(*item)) + if (!VIDEO::IsVideoDb(*item)) return CGUIWindowMusicBase::OnContextButton(itemNumber,button); // music videos - artists @@ -813,7 +814,7 @@ bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) } case CONTEXT_BUTTON_RENAME: - if (!IsVideoDb(*item) && !item->IsReadOnly()) + if (!VIDEO::IsVideoDb(*item) && !item->IsReadOnly()) OnRenameItem(itemNumber); CGUIDialogVideoInfo::UpdateVideoItemTitle(item); @@ -822,14 +823,14 @@ bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) return true; case CONTEXT_BUTTON_DELETE: - if (item->IsPlayList() || item->IsSmartPlayList()) + if (PLAYLIST::IsPlayList(*item) || PLAYLIST::IsSmartPlayList(*item)) { item->m_bIsFolder = false; CGUIComponent *gui = CServiceBroker::GetGUI(); if (gui && gui->ConfirmDelete(item->GetPath())) CFileUtils::DeleteItem(item); } - else if (!IsVideoDb(*item)) + else if (!VIDEO::IsVideoDb(*item)) OnDeleteItem(itemNumber); else { diff --git a/xbmc/network/upnp/UPnPInternal.cpp b/xbmc/network/upnp/UPnPInternal.cpp index f1b7ea4bb2..f7709e0a54 100644 --- a/xbmc/network/upnp/UPnPInternal.cpp +++ b/xbmc/network/upnp/UPnPInternal.cpp @@ -20,6 +20,7 @@ #include "imagefiles/ImageFileURL.h" #include "music/MusicFileItemClassify.h" #include "music/tags/MusicInfoTag.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" @@ -715,7 +716,7 @@ PLT_MediaObject* BuildObject(CFileItem& item, break; } } - else if (item.IsPlayList() || item.IsSmartPlayList()) + else if (PLAYLIST::IsPlayList(item) || PLAYLIST::IsSmartPlayList(item)) { container->m_ObjectClass.type += ".playlistContainer"; } @@ -749,7 +750,7 @@ PLT_MediaObject* BuildObject(CFileItem& item, if (!item.GetLabel().empty()) { std::string title = item.GetLabel(); - if (item.IsPlayList() || !item.m_bIsFolder) + if (PLAYLIST::IsPlayList(item) || !item.m_bIsFolder) URIUtils::RemoveExtension(title); object->m_Title = title.c_str(); } diff --git a/xbmc/network/upnp/UPnPServer.cpp b/xbmc/network/upnp/UPnPServer.cpp index 93e5a00db9..340e308847 100644 --- a/xbmc/network/upnp/UPnPServer.cpp +++ b/xbmc/network/upnp/UPnPServer.cpp @@ -30,6 +30,7 @@ #include "music/MusicLibraryQueue.h" #include "music/MusicThumbLoader.h" #include "music/tags/MusicInfoTag.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" #include "utils/Digest.h" @@ -449,7 +450,7 @@ PLT_MediaObject* CUPnPServer::Build(const std::shared_ptr<CFileItem>& item, } } // all playlist types are folders - else if (item->IsPlayList() || item->IsSmartPlayList()) + else if (PLAYLIST::IsPlayList(*item) || PLAYLIST::IsSmartPlayList(*item)) { item->m_bIsFolder = true; } diff --git a/xbmc/pictures/PictureFolderImageFileLoader.cpp b/xbmc/pictures/PictureFolderImageFileLoader.cpp index 1bebd0c225..0370bc50d0 100644 --- a/xbmc/pictures/PictureFolderImageFileLoader.cpp +++ b/xbmc/pictures/PictureFolderImageFileLoader.cpp @@ -16,10 +16,12 @@ #include "filesystem/Directory.h" #include "guilib/Texture.h" #include "imagefiles/ImageFileURL.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" #include "utils/FileExtensionProvider.h" +using namespace KODI; using namespace XFILE; bool CPictureFolderImageFileLoader::CanLoad(const std::string& specialType) const @@ -38,7 +40,7 @@ std::unique_ptr<CTexture> CPictureFolderImageFileLoader::Load( for (int i = 0; i < imagesInFolder.Size();) { if (!imagesInFolder[i]->IsPicture() || imagesInFolder[i]->IsZIP() || - imagesInFolder[i]->IsRAR() || imagesInFolder[i]->IsPlayList()) + imagesInFolder[i]->IsRAR() || PLAYLIST::IsPlayList(*imagesInFolder[i])) { imagesInFolder.Remove(i); } diff --git a/xbmc/pictures/PictureThumbLoader.cpp b/xbmc/pictures/PictureThumbLoader.cpp index 4a8a3dce94..d26c7bab38 100644 --- a/xbmc/pictures/PictureThumbLoader.cpp +++ b/xbmc/pictures/PictureThumbLoader.cpp @@ -19,6 +19,7 @@ #include "guilib/GUIComponent.h" #include "guilib/GUIWindowManager.h" #include "imagefiles/ImageFileURL.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" @@ -28,7 +29,7 @@ #include "video/VideoFileItemClassify.h" #include "video/VideoThumbLoader.h" -using namespace KODI::VIDEO; +using namespace KODI; using namespace XFILE; CPictureThumbLoader::CPictureThumbLoader() : CThumbLoader() @@ -78,13 +79,14 @@ bool CPictureThumbLoader::LoadItemCached(CFileItem* pItem) } std::string thumb; - if (pItem->IsPicture() && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && !pItem->IsCBR() && !pItem->IsPlayList()) + if (pItem->IsPicture() && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && + !pItem->IsCBR() && !PLAYLIST::IsPlayList(*pItem)) { // load the thumb from the image file thumb = pItem->HasArt("thumb") ? pItem->GetArt("thumb") : IMAGE_FILES::URLFromFile(pItem->GetPath()); } - else if (IsVideo(*pItem) && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && - !pItem->IsCBR() && !pItem->IsPlayList()) + else if (VIDEO::IsVideo(*pItem) && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && + !pItem->IsCBR() && !PLAYLIST::IsPlayList(*pItem)) { // video CVideoThumbLoader loader; loader.LoadItem(pItem); @@ -165,7 +167,8 @@ void CPictureThumbLoader::ProcessFoldersAndArchives(CFileItem *pItem) // count the number of images for (int i=0; i < items.Size();) { - if (!items[i]->IsPicture() || items[i]->IsZIP() || items[i]->IsRAR() || items[i]->IsPlayList()) + if (!items[i]->IsPicture() || items[i]->IsZIP() || items[i]->IsRAR() || + PLAYLIST::IsPlayList(*items[i])) { items.Remove(i); } diff --git a/xbmc/playlists/CMakeLists.txt b/xbmc/playlists/CMakeLists.txt index e3fe1cf8fb..b9215a39c3 100644 --- a/xbmc/playlists/CMakeLists.txt +++ b/xbmc/playlists/CMakeLists.txt @@ -2,6 +2,7 @@ set(SOURCES PlayList.cpp PlayListASX.cpp PlayListB4S.cpp PlayListFactory.cpp + PlayListFileItemClassify.cpp PlayListM3U.cpp PlayListPLS.cpp PlayListRAM.cpp @@ -16,6 +17,7 @@ set(HEADERS PlayList.h PlayListASX.h PlayListB4S.h PlayListFactory.h + PlayListFileItemClassify.h PlayListM3U.h PlayListPLS.h PlayListRAM.h diff --git a/xbmc/playlists/PlayListFileItemClassify.cpp b/xbmc/playlists/PlayListFileItemClassify.cpp new file mode 100644 index 0000000000..32ae1f827b --- /dev/null +++ b/xbmc/playlists/PlayListFileItemClassify.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2005-2024 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "playlists/PlayListFileItemClassify.h" + +#include "FileItem.h" +#include "playlists/PlayListFactory.h" +#include "utils/URIUtils.h" +#include "utils/Variant.h" + +namespace KODI::PLAYLIST +{ + +bool IsPlayList(const CFileItem& item) +{ + return CPlayListFactory::IsPlaylist(item); +} + +bool IsSmartPlayList(const CFileItem& item) +{ + if (item.GetProperty("library.smartplaylist").asBoolean(false)) + return true; + + return URIUtils::HasExtension(item.GetPath(), ".xsp"); +} + +} // namespace KODI::PLAYLIST diff --git a/xbmc/playlists/PlayListFileItemClassify.h b/xbmc/playlists/PlayListFileItemClassify.h new file mode 100644 index 0000000000..ff3a6203be --- /dev/null +++ b/xbmc/playlists/PlayListFileItemClassify.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2005-2024 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +class CFileItem; + +namespace KODI::PLAYLIST +{ + +//! \brief Check whether an item is a playlist. +bool IsPlayList(const CFileItem& item); + +//! \brief Check whether an item is a smart playlist. +bool IsSmartPlayList(const CFileItem& item); + +} // namespace KODI::PLAYLIST diff --git a/xbmc/playlists/test/CMakeLists.txt b/xbmc/playlists/test/CMakeLists.txt index 25e076d9b0..af584c511e 100644 --- a/xbmc/playlists/test/CMakeLists.txt +++ b/xbmc/playlists/test/CMakeLists.txt @@ -1,6 +1,7 @@ set(SOURCES TestPlayListASX.cpp TestPlayListB4S.cpp TestPlayListFactory.cpp + TestPlayListFileItemClassify.cpp TestPlayListWPL.cpp TestPlayListXML.cpp TestPlayListXSPF.cpp) diff --git a/xbmc/playlists/test/TestPlayListFileItemClassify.cpp b/xbmc/playlists/test/TestPlayListFileItemClassify.cpp new file mode 100644 index 0000000000..03ba20a1a4 --- /dev/null +++ b/xbmc/playlists/test/TestPlayListFileItemClassify.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "FileItem.h" +#include "playlists/PlayListFileItemClassify.h" +#include "utils/Variant.h" + +#include <array> + +#include <gtest/gtest.h> + +using namespace KODI; + +struct PlayListClassifyTest +{ + PlayListClassifyTest(const std::string& path, bool res, const std::string& mime = "") + : item(path, false), result(res) + { + if (!mime.empty()) + item.SetMimeType(mime); + } + + CFileItem item; + bool result; +}; + +class PlayListTest : public testing::WithParamInterface<PlayListClassifyTest>, public testing::Test +{ +}; + +TEST_P(PlayListTest, IsPlayList) +{ + EXPECT_EQ(PLAYLIST::IsPlayList(GetParam().item), GetParam().result); +} + +const auto playlist_tests = std::array{ + PlayListClassifyTest{"/home/user/video.avi", false}, + PlayListClassifyTest{"/home/user/video.avi", false, "video/avi"}, + PlayListClassifyTest{"https://some.where/foo.m3u8", false}, + PlayListClassifyTest{"https://some.where/something", true, "audio/x-pn-realaudio"}, + PlayListClassifyTest{"https://some.where/something", true, "playlist"}, + PlayListClassifyTest{"https://some.where/something", true, "audio/x-mpegurl"}, + PlayListClassifyTest{"/home/user/video.m3u", true}, + PlayListClassifyTest{"/home/user/video.m3u8", true}, + PlayListClassifyTest{"/home/user/video.b4s", true}, + PlayListClassifyTest{"/home/user/video.pls", true}, + PlayListClassifyTest{"/home/user/video.strm", true}, + PlayListClassifyTest{"/home/user/video.wpl", true}, + PlayListClassifyTest{"/home/user/video.asx", true}, + PlayListClassifyTest{"/home/user/video.ram", true}, + PlayListClassifyTest{"/home/user/video.url", true}, + PlayListClassifyTest{"/home/user/video.pxml", true}, + PlayListClassifyTest{"/home/user/video.xspf", true}, +}; + +INSTANTIATE_TEST_SUITE_P(TestPlayListFileItemClassify, + PlayListTest, + testing::ValuesIn(playlist_tests)); + +TEST(TestPlayListFileItemClassify, IsSmartPlayList) +{ + CFileItem item("/some/where.avi", false); + EXPECT_FALSE(PLAYLIST::IsSmartPlayList(item)); + item.SetProperty("library.smartplaylist", true); + EXPECT_TRUE(PLAYLIST::IsSmartPlayList(item)); + + CFileItem item2("/some/where.xsp", false); + EXPECT_TRUE(PLAYLIST::IsSmartPlayList(item2)); + CFileItem item3("/some/where.xsp", true); + EXPECT_TRUE(PLAYLIST::IsSmartPlayList(item3)); +} diff --git a/xbmc/utils/ExecString.cpp b/xbmc/utils/ExecString.cpp index 95164ce7eb..10f1dca0eb 100644 --- a/xbmc/utils/ExecString.cpp +++ b/xbmc/utils/ExecString.cpp @@ -14,6 +14,7 @@ #include "Util.h" #include "music/MusicFileItemClassify.h" #include "music/tags/MusicInfoTag.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/SettingsComponent.h" #include "utils/StringUtils.h" @@ -106,7 +107,7 @@ bool CExecString::Parse(const CFileItem& item, const std::string& contextWindow) } else if (item.m_bIsFolder && (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_playlistAsFolders || - !(item.IsSmartPlayList() || item.IsPlayList()))) + !(PLAYLIST::IsSmartPlayList(item) || PLAYLIST::IsPlayList(item)))) { if (!contextWindow.empty()) Build("ActivateWindow", {contextWindow, StringUtils::Paramify(item.GetPath()), "return"}); diff --git a/xbmc/video/GUIViewStateVideo.cpp b/xbmc/video/GUIViewStateVideo.cpp index f9c4ca06e0..52cf65d719 100644 --- a/xbmc/video/GUIViewStateVideo.cpp +++ b/xbmc/video/GUIViewStateVideo.cpp @@ -15,6 +15,7 @@ #include "filesystem/Directory.h" #include "filesystem/VideoDatabaseDirectory.h" #include "guilib/WindowIDs.h" +#include "playlists/PlayListFileItemClassify.h" #include "playlists/PlayListTypes.h" #include "settings/MediaSettings.h" #include "settings/MediaSourceSettings.h" @@ -475,7 +476,7 @@ CGUIViewStateVideoMovies::CGUIViewStateVideoMovies(const CFileItemList& items) : LABEL_MASKS("%T", "%V", "%T", "%V")); // Title, Playcount | Title, Playcount const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavtitles"); - if (items.IsSmartPlayList() || items.IsLibraryFolder()) + if (PLAYLIST::IsSmartPlayList(items) || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%T", "%R", "%T", "%R")); // Title, Rating | Title, Rating else { @@ -515,7 +516,7 @@ CGUIViewStateVideoMusicVideos::CGUIViewStateVideoMusicVideos(const CFileItemList AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%N")); // Userdefined, Track Number | empty, empty const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavmusicvideos"); - if (items.IsSmartPlayList() || items.IsLibraryFolder()) + if (PLAYLIST::IsSmartPlayList(items) || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%A - %T", "%Y")); // Artist - Title, Year | empty, empty else { @@ -554,7 +555,7 @@ CGUIViewStateVideoTVShows::CGUIViewStateVideoTVShows(const CFileItemList& items) LABEL_MASKS("%T", "%r", "%T", "%r")); // Title, Userrating | Title, Userrating const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavtvshows"); - if (items.IsSmartPlayList() || items.IsLibraryFolder()) + if (PLAYLIST::IsSmartPlayList(items) || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%T", "%M", "%T", "%M")); // Title, #Episodes | Title, #Episodes else { @@ -593,7 +594,7 @@ CGUIViewStateVideoEpisodes::CGUIViewStateVideoEpisodes(const CFileItemList& item CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavepisodes"); - if (items.IsSmartPlayList() || items.IsLibraryFolder()) + if (PLAYLIST::IsSmartPlayList(items) || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%Z - %H. %T", "%R")); // TvShow - Order. Title, Rating | empty, empty else { diff --git a/xbmc/video/VideoInfoScanner.cpp b/xbmc/video/VideoInfoScanner.cpp index ae74d1f38c..9dc3588a5c 100644 --- a/xbmc/video/VideoInfoScanner.cpp +++ b/xbmc/video/VideoInfoScanner.cpp @@ -33,6 +33,7 @@ #include "interfaces/AnnouncementManager.h" #include "messaging/helpers/DialogHelper.h" #include "messaging/helpers/DialogOKHelper.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" @@ -431,7 +432,8 @@ namespace KODI::VIDEO // if we have a directory item (non-playlist) we then recurse into that folder // do not recurse for tv shows - we have already looked recursively for episodes - if (pItem->m_bIsFolder && !pItem->IsParentFolder() && !pItem->IsPlayList() && settings.recurse > 0 && content != CONTENT_TVSHOWS) + if (pItem->m_bIsFolder && !pItem->IsParentFolder() && !PLAYLIST::IsPlayList(*pItem) && + settings.recurse > 0 && content != CONTENT_TVSHOWS) { if (!DoScan(pItem->GetPath())) { @@ -726,7 +728,7 @@ namespace KODI::VIDEO CGUIDialogProgress* pDlgProgress) { if (pItem->m_bIsFolder || !IsVideo(*pItem) || pItem->IsNFO() || - (pItem->IsPlayList() && !URIUtils::HasExtension(pItem->GetPath(), ".strm"))) + (PLAYLIST::IsPlayList(*pItem) && !URIUtils::HasExtension(pItem->GetPath(), ".strm"))) return INFO_NOT_NEEDED; if (ProgressCancelled(pDlgProgress, 198, pItem->GetLabel())) @@ -831,7 +833,7 @@ namespace KODI::VIDEO CGUIDialogProgress* pDlgProgress) { if (pItem->m_bIsFolder || !IsVideo(*pItem) || pItem->IsNFO() || - (pItem->IsPlayList() && !URIUtils::HasExtension(pItem->GetPath(), ".strm"))) + (PLAYLIST::IsPlayList(*pItem) && !URIUtils::HasExtension(pItem->GetPath(), ".strm"))) return INFO_NOT_NEEDED; if (ProgressCancelled(pDlgProgress, 20394, pItem->GetLabel())) @@ -2207,7 +2209,7 @@ namespace KODI::VIDEO KODI::TIME::FileTime time = pItem->m_dateTime; digest.Update(&time, sizeof(KODI::TIME::FileTime)); } - if (IsVideo(*pItem) && !pItem->IsPlayList() && !pItem->IsNFO()) + if (IsVideo(*pItem) && !PLAYLIST::IsPlayList(*pItem) && !pItem->IsNFO()) count++; } hash = digest.Finalize(); diff --git a/xbmc/video/VideoUtils.cpp b/xbmc/video/VideoUtils.cpp index a3258bbac8..eb6ab9674d 100644 --- a/xbmc/video/VideoUtils.cpp +++ b/xbmc/video/VideoUtils.cpp @@ -14,6 +14,7 @@ #include "Util.h" #include "filesystem/Directory.h" #include "filesystem/VideoDatabaseDirectory/QueryParams.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/SettingUtils.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" @@ -30,7 +31,7 @@ #include <cstdint> #include <vector> -using namespace KODI::VIDEO; +using namespace KODI; namespace { @@ -99,7 +100,7 @@ KODI::VIDEO::UTILS::ResumeInformation GetNonFolderItemResumeInformation(const CF return {}; // do not resume playlists, except strm files - if (!item.IsType(".strm") && item.IsPlayList()) + if (!item.IsType(".strm") && PLAYLIST::IsPlayList(item)) return {}; // do not resume Live TV and 'deleted' items (e.g. trashed pvr recordings) @@ -128,13 +129,13 @@ KODI::VIDEO::UTILS::ResumeInformation GetNonFolderItemResumeInformation(const CF } std::string path = item.GetPath(); - if (IsVideoDb(item) || item.IsDVD()) + if (VIDEO::IsVideoDb(item) || item.IsDVD()) { if (item.HasVideoInfoTag()) { path = item.GetVideoInfoTag()->m_strFileNameAndPath; } - else if (IsVideoDb(item)) + else if (VIDEO::IsVideoDb(item)) { // Obtain path+filename from video db XFILE::VIDEODATABASEDIRECTORY::CQueryParams params; diff --git a/xbmc/video/guilib/VideoGUIUtils.cpp b/xbmc/video/guilib/VideoGUIUtils.cpp index 1352ba8c93..70c6003751 100644 --- a/xbmc/video/guilib/VideoGUIUtils.cpp +++ b/xbmc/video/guilib/VideoGUIUtils.cpp @@ -27,6 +27,7 @@ #include "network/NetworkFileItemClassify.h" #include "playlists/PlayList.h" #include "playlists/PlayListFactory.h" +#include "playlists/PlayListFileItemClassify.h" #include "profiles/ProfileManager.h" #include "settings/MediaSettings.h" #include "settings/SettingUtils.h" @@ -291,7 +292,7 @@ void CAsyncGetItemsForPlaylist::GetItemsForPlaylist(const std::shared_ptr<CFileI GetItemsForPlaylist(i); } } - else if (item->IsPlayList()) + else if (PLAYLIST::IsPlayList(*item)) { // just queue the playlist, it will be expanded on play m_queuedItems.Add(item); @@ -492,7 +493,7 @@ namespace { bool IsNonExistingUserPartyModePlaylist(const CFileItem& item) { - if (!item.IsSmartPlayList()) + if (!PLAYLIST::IsSmartPlayList(item)) return false; const std::string& path{item.GetPath()}; @@ -533,7 +534,7 @@ bool IsItemPlayable(const CFileItem& item) return false; // Include playlists located at one of the possible video/mixed playlist locations - if (item.IsPlayList()) + if (PLAYLIST::IsPlayList(item)) { if (StringUtils::StartsWithNoCase(item.GetMimeType(), "video/")) return true; diff --git a/xbmc/video/windows/GUIWindowVideoBase.cpp b/xbmc/video/windows/GUIWindowVideoBase.cpp index eded77d85d..95cb103f10 100644 --- a/xbmc/video/windows/GUIWindowVideoBase.cpp +++ b/xbmc/video/windows/GUIWindowVideoBase.cpp @@ -40,6 +40,7 @@ #include "network/NetworkFileItemClassify.h" #include "playlists/PlayList.h" #include "playlists/PlayListFactory.h" +#include "playlists/PlayListFileItemClassify.h" #include "profiles/ProfileManager.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" @@ -213,7 +214,7 @@ bool CGUIWindowVideoBase::OnMessage(CGUIMessage& message) bool CGUIWindowVideoBase::OnItemInfo(const CFileItem& fileItem) { if (fileItem.IsParentFolder() || fileItem.m_bIsShareOrDrive || fileItem.IsPath("add") || - (fileItem.IsPlayList() && !URIUtils::HasExtension(fileItem.GetDynPath(), ".strm"))) + (PLAYLIST::IsPlayList(fileItem) && !URIUtils::HasExtension(fileItem.GetDynPath(), ".strm"))) return false; // "Videos/Video Add-ons" lists addons in the video window @@ -303,7 +304,7 @@ bool CGUIWindowVideoBase::OnItemInfo(const CFileItem& fileItem) ->m_moviesExcludeFromScanRegExps; for (const auto& i : items) { - if (VIDEO::IsVideo(*i) && !i->IsPlayList() && + if (VIDEO::IsVideo(*i) && !PLAYLIST::IsPlayList(*i) && !CUtil::ExcludeFileOrFolder(i->GetPath(), excludeFromScan)) { item.SetPath(i->GetPath()); @@ -817,7 +818,7 @@ void CGUIWindowVideoBase::GetContextButtons(int itemNumber, CContextButtons &but } } - if (item->IsSmartPlayList()) + if (PLAYLIST::IsSmartPlayList(*item)) { buttons.Add(CONTEXT_BUTTON_PLAY_PARTYMODE, 15216); // Play in Partymode } @@ -834,7 +835,7 @@ void CGUIWindowVideoBase::GetContextButtons(int itemNumber, CContextButtons &but else buttons.Add(CONTEXT_BUTTON_PLAY_AND_QUEUE, 13412); } - if (item->IsSmartPlayList() || m_vecItems->IsSmartPlayList()) + if (PLAYLIST::IsSmartPlayList(*item) || PLAYLIST::IsSmartPlayList(*m_vecItems)) buttons.Add(CONTEXT_BUTTON_EDIT_SMART_PLAYLIST, 586); if (VIDEO::IsBlurayPlaylist(*item)) buttons.Add(CONTEXT_BUTTON_CHOOSE_PLAYLIST, 13424); @@ -937,7 +938,10 @@ bool CGUIWindowVideoBase::OnContextButton(int itemNumber, CONTEXT_BUTTON button) return true; case CONTEXT_BUTTON_EDIT_SMART_PLAYLIST: { - std::string playlist = m_vecItems->Get(itemNumber)->IsSmartPlayList() ? m_vecItems->Get(itemNumber)->GetPath() : m_vecItems->GetPath(); // save path as activatewindow will destroy our items + const std::string playlist = + PLAYLIST::IsSmartPlayList(*m_vecItems->Get(itemNumber)) + ? m_vecItems->Get(itemNumber)->GetPath() + : m_vecItems->GetPath(); // save path as activatewindow will destroy our items if (CGUIDialogSmartPlaylistEditor::EditPlaylist(playlist, "video")) Refresh(true); // need to update return true; @@ -1152,7 +1156,7 @@ bool CGUIWindowVideoBase::PlayItem(const std::shared_ptr<CFileItem>& pItem, CServiceBroker::GetPlaylistPlayer().Play(); return true; } - else if (pItem->IsPlayList() && !pItem->IsType(".strm")) + else if (PLAYLIST::IsPlayList(*pItem) && !pItem->IsType(".strm")) { // Note: strm files being somehow special playlists need to be handled in OnPlay*Media diff --git a/xbmc/video/windows/GUIWindowVideoNav.cpp b/xbmc/video/windows/GUIWindowVideoNav.cpp index a53d72443b..17c51cd46f 100644 --- a/xbmc/video/windows/GUIWindowVideoNav.cpp +++ b/xbmc/video/windows/GUIWindowVideoNav.cpp @@ -28,6 +28,7 @@ #include "messaging/ApplicationMessenger.h" #include "messaging/helpers/DialogOKHelper.h" #include "music/MusicDatabase.h" +#include "playlists/PlayListFileItemClassify.h" #include "profiles/ProfileManager.h" #include "settings/AdvancedSettings.h" #include "settings/MediaSettings.h" @@ -540,7 +541,7 @@ void CGUIWindowVideoNav::UpdateButtons() if (m_vecItems->IsPath("special://videoplaylists/")) strLabel = g_localizeStrings.Get(136); // "{Playlist Name}" - else if (m_vecItems->IsPlayList()) + else if (PLAYLIST::IsPlayList(*m_vecItems)) { // get playlist name from path std::string strDummy; @@ -829,17 +830,18 @@ void CGUIWindowVideoNav::GetContextButtons(int itemNumber, CContextButtons &butt if (!VIDEO::IsVideoDb(*m_vecItems) && !m_vecItems->IsVirtualDirectoryRoot()) { // non-video db items, file operations are allowed - if ((CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_FILELISTS_ALLOWFILEDELETION) && - CUtil::SupportsWriteFileOperations(item->GetPath())) || - (inPlaylists && URIUtils::GetFileName(item->GetPath()) != "PartyMode-Video.xsp" - && (item->IsPlayList() || item->IsSmartPlayList()))) + if ((CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_FILELISTS_ALLOWFILEDELETION) && + CUtil::SupportsWriteFileOperations(item->GetPath())) || + (inPlaylists && URIUtils::GetFileName(item->GetPath()) != "PartyMode-Video.xsp" && + (PLAYLIST::IsPlayList(*item) || PLAYLIST::IsSmartPlayList(*item)))) { buttons.Add(CONTEXT_BUTTON_DELETE, 117); buttons.Add(CONTEXT_BUTTON_RENAME, 118); } // add "Set/Change content" to folders - if (item->m_bIsFolder && !VIDEO::IsVideoDb(*item) && !item->IsPlayList() && - !item->IsSmartPlayList() && !item->IsLibraryFolder() && !item->IsLiveTV() && + if (item->m_bIsFolder && !VIDEO::IsVideoDb(*item) && !PLAYLIST::IsPlayList(*item) && + !PLAYLIST::IsSmartPlayList(*item) && !item->IsLibraryFolder() && !item->IsLiveTV() && !item->IsPlugin() && !item->IsAddonsPath() && !URIUtils::IsUPnP(item->GetPath())) { if (info && info->Content() != CONTENT_NONE) @@ -1087,7 +1089,7 @@ bool CGUIWindowVideoNav::ApplyWatchedFilter(CFileItemList &items) if (!VIDEO::IsVideoDb(items)) filterWatched = true; if (items.GetContent() == "tvshows" && - (items.IsSmartPlayList() || items.IsLibraryFolder())) + (PLAYLIST::IsSmartPlayList(items) || items.IsLibraryFolder())) node = NODE_TYPE_TITLE_TVSHOWS; // so that the check below works int watchMode = CMediaSettings::GetInstance().GetWatchedMode(m_vecItems->GetContent()); diff --git a/xbmc/view/GUIViewState.cpp b/xbmc/view/GUIViewState.cpp index cebf9319be..3bd48bd64b 100644 --- a/xbmc/view/GUIViewState.cpp +++ b/xbmc/view/GUIViewState.cpp @@ -31,6 +31,7 @@ #include "guilib/TextureManager.h" #include "music/GUIViewStateMusic.h" #include "pictures/GUIViewStatePictures.h" +#include "playlists/PlayListFileItemClassify.h" #include "profiles/ProfileManager.h" #include "programs/GUIViewStatePrograms.h" #include "pvr/windows/GUIViewStatePVR.h" @@ -75,8 +76,7 @@ CGUIViewState* CGUIViewState::GetViewState(int windowId, const CFileItemList& it if (url.IsProtocol("musicsearch")) return new CGUIViewStateMusicSearch(items); - if (items.IsSmartPlayList() || url.IsProtocol("upnp") || - items.IsLibraryFolder()) + if (PLAYLIST::IsSmartPlayList(items) || url.IsProtocol("upnp") || items.IsLibraryFolder()) { if (items.GetContent() == "songs" || items.GetContent() == "albums" || @@ -95,7 +95,7 @@ CGUIViewState* CGUIViewState::GetViewState(int windowId, const CFileItemList& it if (url.IsProtocol("library")) return new CGUIViewStateLibrary(items); - if (items.IsPlayList()) + if (PLAYLIST::IsPlayList(items)) { // Playlists (like .strm) can be music or video type if (windowId == WINDOW_VIDEO_NAV) diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp index dcb5455503..afb236c205 100644 --- a/xbmc/windows/GUIMediaWindow.cpp +++ b/xbmc/windows/GUIMediaWindow.cpp @@ -25,6 +25,7 @@ #include "application/Application.h" #include "messaging/ApplicationMessenger.h" #include "network/NetworkFileItemClassify.h" +#include "playlists/PlayListFileItemClassify.h" #if defined(TARGET_ANDROID) #include "platform/android/activity/XBMCApp.h" #endif @@ -1501,7 +1502,7 @@ bool CGUIMediaWindow::OnPlayMedia(int iItem, const std::string &player) CLog::Log(LOGDEBUG, "{} {}", __FUNCTION__, CURL::GetRedacted(pItem->GetPath())); bool bResult = false; - if (NETWORK::IsInternetStream(*pItem) || pItem->IsPlayList()) + if (NETWORK::IsInternetStream(*pItem) || PLAYLIST::IsPlayList(*pItem)) bResult = g_application.PlayMedia(*pItem, player, m_guiState->GetPlaylist()); else bResult = g_application.PlayFile(*pItem, player); @@ -1603,7 +1604,7 @@ void CGUIMediaWindow::UpdateFileList() if (pItem->m_bIsFolder) continue; - if (!pItem->IsPlayList() && !pItem->IsZIP() && !pItem->IsRAR()) + if (!PLAYLIST::IsPlayList(*pItem) && !pItem->IsZIP() && !pItem->IsRAR()) CServiceBroker::GetPlaylistPlayer().Add(playlistId, pItem); if (pItem->GetPath() == playlistItem.GetPath() && @@ -1619,7 +1620,7 @@ void CGUIMediaWindow::OnDeleteItem(int iItem) if ( iItem < 0 || iItem >= m_vecItems->Size()) return; CFileItemPtr item = m_vecItems->Get(iItem); - if (item->IsPlayList()) + if (PLAYLIST::IsPlayList(*item)) item->m_bIsFolder = false; const std::shared_ptr<CProfileManager> profileManager = CServiceBroker::GetSettingsComponent()->GetProfileManager(); diff --git a/xbmc/windows/GUIWindowFileManager.cpp b/xbmc/windows/GUIWindowFileManager.cpp index b25c1e4924..5c288c0209 100644 --- a/xbmc/windows/GUIWindowFileManager.cpp +++ b/xbmc/windows/GUIWindowFileManager.cpp @@ -45,6 +45,7 @@ #include "platform/Filesystem.h" #include "playlists/PlayList.h" #include "playlists/PlayListFactory.h" +#include "playlists/PlayListFileItemClassify.h" #include "settings/MediaSourceSettings.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" @@ -62,7 +63,6 @@ using namespace XFILE; using namespace KODI; using namespace KODI::MESSAGING; -using namespace KODI::VIDEO; #define CONTROL_BTNSELECTALL 1 #define CONTROL_BTNFAVOURITES 2 @@ -644,7 +644,7 @@ void CGUIWindowFileManager::OnClick(int iList, int iItem) void CGUIWindowFileManager::OnStart(CFileItem *pItem, const std::string &player) { // start playlists from file manager - if (pItem->IsPlayList()) + if (PLAYLIST::IsPlayList(*pItem)) { const std::string& strPlayList = pItem->GetPath(); std::unique_ptr<PLAYLIST::CPlayList> pPlayList(PLAYLIST::CPlayListFactory::Create(strPlayList)); @@ -659,7 +659,7 @@ void CGUIWindowFileManager::OnStart(CFileItem *pItem, const std::string &player) g_application.ProcessAndStartPlaylist(strPlayList, *pPlayList, PLAYLIST::Id::TYPE_MUSIC); return; } - if (MUSIC::IsAudio(*pItem) || IsVideo(*pItem)) + if (MUSIC::IsAudio(*pItem) || VIDEO::IsVideo(*pItem)) { CServiceBroker::GetPlaylistPlayer().Play(std::make_shared<CFileItem>(*pItem), player); return; |