aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfuzzard <fuzzard@users.noreply.github.com>2024-06-25 11:16:00 +1000
committerGitHub <noreply@github.com>2024-06-25 11:16:00 +1000
commit03786496857ab0f3dfed457fe2c70d0ead97f63c (patch)
treee12514f5cd55547676627522decc5addab881b9c
parenta91c1b72f28dd0f9122cc307b91ae04c9a43d5a8 (diff)
parent92ca2329fc1493fb87596ffd36243370be796b09 (diff)
Merge pull request #25200 from notspiff/add_playlist_fileitem_classify
Add playlist FileItem classify
-rw-r--r--xbmc/FileItem.cpp33
-rw-r--r--xbmc/FileItem.h2
-rw-r--r--xbmc/FileItemList.cpp11
-rw-r--r--xbmc/PlayListPlayer.cpp3
-rw-r--r--xbmc/Util.cpp7
-rw-r--r--xbmc/application/Application.cpp9
-rw-r--r--xbmc/cores/VideoPlayer/DVDFileInfo.cpp4
-rw-r--r--xbmc/filesystem/Directory.cpp3
-rw-r--r--xbmc/interfaces/builtins/PlayerBuiltins.cpp8
-rw-r--r--xbmc/interfaces/json-rpc/FileOperations.cpp7
-rw-r--r--xbmc/interfaces/legacy/PlayList.cpp3
-rw-r--r--xbmc/music/GUIViewStateMusic.cpp5
-rw-r--r--xbmc/music/MusicInfoLoader.cpp9
-rw-r--r--xbmc/music/MusicUtils.cpp9
-rw-r--r--xbmc/music/infoscanner/MusicInfoScanner.cpp10
-rw-r--r--xbmc/music/windows/GUIWindowMusicBase.cpp38
-rw-r--r--xbmc/music/windows/GUIWindowMusicNav.cpp35
-rw-r--r--xbmc/network/upnp/UPnPInternal.cpp5
-rw-r--r--xbmc/network/upnp/UPnPServer.cpp3
-rw-r--r--xbmc/pictures/PictureFolderImageFileLoader.cpp4
-rw-r--r--xbmc/pictures/PictureThumbLoader.cpp13
-rw-r--r--xbmc/playlists/CMakeLists.txt2
-rw-r--r--xbmc/playlists/PlayListFileItemClassify.cpp32
-rw-r--r--xbmc/playlists/PlayListFileItemClassify.h22
-rw-r--r--xbmc/playlists/test/CMakeLists.txt1
-rw-r--r--xbmc/playlists/test/TestPlayListFileItemClassify.cpp76
-rw-r--r--xbmc/utils/ExecString.cpp3
-rw-r--r--xbmc/video/GUIViewStateVideo.cpp9
-rw-r--r--xbmc/video/VideoInfoScanner.cpp10
-rw-r--r--xbmc/video/VideoUtils.cpp9
-rw-r--r--xbmc/video/guilib/VideoGUIUtils.cpp7
-rw-r--r--xbmc/video/windows/GUIWindowVideoBase.cpp16
-rw-r--r--xbmc/video/windows/GUIWindowVideoNav.cpp18
-rw-r--r--xbmc/view/GUIViewState.cpp6
-rw-r--r--xbmc/windows/GUIMediaWindow.cpp7
-rw-r--r--xbmc/windows/GUIWindowFileManager.cpp6
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 &parameterObject, CVariant &result)
{
@@ -378,7 +380,8 @@ bool CFileOperations::FillFileItemList(const CVariant &parameterObject, 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;