aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorksooo <3226626+ksooo@users.noreply.github.com>2023-10-14 15:21:01 +0200
committerksooo <3226626+ksooo@users.noreply.github.com>2023-10-14 19:51:13 +0200
commitb220e19c5b8d69e21886cd9c3d1ce4ddccef2740 (patch)
tree3defb55032da56fb6d3cbfd825b874078a0ec4bc
parent645313bd2944b27f1c377c515a93476fd964ddb2 (diff)
downloadxbmc-b220e19c5b8d69e21886cd9c3d1ce4ddccef2740.tar.xz
[fileitem][PVR] CFileItem::LoadDetails: Factor out loading of PVR items.
-rw-r--r--xbmc/FileItem.cpp27
-rw-r--r--xbmc/pvr/guilib/PVRGUIActionsUtils.cpp40
-rw-r--r--xbmc/pvr/guilib/PVRGUIActionsUtils.h9
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;