diff options
author | ksooo <3226626+ksooo@users.noreply.github.com> | 2023-10-14 15:21:01 +0200 |
---|---|---|
committer | ksooo <3226626+ksooo@users.noreply.github.com> | 2023-10-14 19:51:13 +0200 |
commit | b220e19c5b8d69e21886cd9c3d1ce4ddccef2740 (patch) | |
tree | 3defb55032da56fb6d3cbfd825b874078a0ec4bc | |
parent | 645313bd2944b27f1c377c515a93476fd964ddb2 (diff) | |
download | xbmc-b220e19c5b8d69e21886cd9c3d1ce4ddccef2740.tar.xz |
[fileitem][PVR] CFileItem::LoadDetails: Factor out loading of PVR items.
-rw-r--r-- | xbmc/FileItem.cpp | 27 | ||||
-rw-r--r-- | xbmc/pvr/guilib/PVRGUIActionsUtils.cpp | 40 | ||||
-rw-r--r-- | xbmc/pvr/guilib/PVRGUIActionsUtils.h | 9 |
3 files changed, 57 insertions, 19 deletions
diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp index 476018cf6b..52d297735c 100644 --- a/xbmc/FileItem.cpp +++ b/xbmc/FileItem.cpp @@ -38,6 +38,7 @@ #include "pvr/epg/EpgInfoTag.h" #include "pvr/epg/EpgSearchFilter.h" #include "pvr/guilib/PVRGUIActionsChannels.h" +#include "pvr/guilib/PVRGUIActionsUtils.h" #include "pvr/recordings/PVRRecording.h" #include "pvr/timers/PVRTimerInfoTag.h" #include "settings/AdvancedSettings.h" @@ -3747,28 +3748,16 @@ bool CFileItem::LoadDetails() return ret; } - if (URIUtils::IsPVRRecordingFileOrFolder(GetPath())) + if (IsPVR()) { - if (HasProperty("watchedepisodes") || HasProperty("watched")) - return true; - - const std::string parentPath = URIUtils::GetParentPath(GetPath()); - - //! @todo optimize, find a way to set the details of the item without loading parent directory. - CFileItemList items; - if (CDirectory::GetDirectory(parentPath, items, "", XFILE::DIR_FLAG_DEFAULTS)) + const std::shared_ptr<CFileItem> loadedItem{ + CServiceBroker::GetPVRManager().Get<PVR::GUI::Utils>().LoadItem(*this)}; + if (loadedItem) { - const std::string path = GetPath(); - const auto it = std::find_if(items.cbegin(), items.cend(), - [path](const auto& entry) { return entry->GetPath() == path; }); - if (it != items.cend()) - { - *this = *(*it); - return true; - } + UpdateInfo(*loadedItem); + return true; } - - CLog::LogF(LOGERROR, "Error filling item details (path={})", GetPath()); + CLog::LogF(LOGERROR, "Error filling PVR item details (path={})", GetPath()); return false; } diff --git a/xbmc/pvr/guilib/PVRGUIActionsUtils.cpp b/xbmc/pvr/guilib/PVRGUIActionsUtils.cpp index 5831b59ec6..44c48d8cb6 100644 --- a/xbmc/pvr/guilib/PVRGUIActionsUtils.cpp +++ b/xbmc/pvr/guilib/PVRGUIActionsUtils.cpp @@ -10,9 +10,12 @@ #include "FileItem.h" #include "ServiceBroker.h" +#include "filesystem/Directory.h" #include "pvr/PVRManager.h" #include "pvr/guilib/PVRGUIActionsEPG.h" #include "pvr/guilib/PVRGUIActionsRecordings.h" +#include "utils/URIUtils.h" +#include "utils/log.h" namespace PVR { @@ -39,4 +42,41 @@ bool CPVRGUIActionsUtils::OnInfo(const CFileItem& item) return false; } +namespace +{ +std::shared_ptr<CFileItem> LoadRecordingFileOrFolderItem(const CFileItem& item) +{ + if (URIUtils::IsPVRRecordingFileOrFolder(item.GetPath())) + { + //! @todo prop misused to detect loaded state for recording folder item + if (item.HasPVRRecordingInfoTag() || item.HasProperty("watchedepisodes")) + return std::make_shared<CFileItem>(item); // already loaded + + const std::string parentPath{URIUtils::GetParentPath(item.GetPath())}; + + //! @todo optimize, find a way to set the details of the item without loading parent directory. + CFileItemList items; + if (XFILE::CDirectory::GetDirectory(parentPath, items, "", XFILE::DIR_FLAG_DEFAULTS)) + { + const std::string path{item.GetPath()}; + const auto it = std::find_if(items.cbegin(), items.cend(), + [&path](const auto& entry) { return entry->GetPath() == path; }); + if (it != items.cend()) + return *it; + } + } + return {}; +} +} // unnamed namespace + +std::shared_ptr<CFileItem> CPVRGUIActionsUtils::LoadItem(const CFileItem& item) +{ + std::shared_ptr<CFileItem> loadedItem{LoadRecordingFileOrFolderItem(item)}; + if (loadedItem) + return loadedItem; + + CLog::LogFC(LOGWARNING, LOGPVR, "Error loading item details (path={})", item.GetPath()); + return {}; +} + } // namespace PVR diff --git a/xbmc/pvr/guilib/PVRGUIActionsUtils.h b/xbmc/pvr/guilib/PVRGUIActionsUtils.h index 7758c5b228..199e53607a 100644 --- a/xbmc/pvr/guilib/PVRGUIActionsUtils.h +++ b/xbmc/pvr/guilib/PVRGUIActionsUtils.h @@ -10,6 +10,8 @@ #include "pvr/IPVRComponent.h" +#include <memory> + class CFileItem; namespace PVR @@ -34,6 +36,13 @@ public: */ bool OnInfo(const CFileItem& item); + /*! + * @brief Load item details (create recording info tag etc.). + * @param item The item. + * @return Loaded item on success, nullptr otherwise. + */ + std::shared_ptr<CFileItem> LoadItem(const CFileItem& item); + private: CPVRGUIActionsUtils(const CPVRGUIActionsUtils&) = delete; CPVRGUIActionsUtils const& operator=(CPVRGUIActionsUtils const&) = delete; |