Skip to content

Commit

Permalink
[listproviders] CDirectoryProvider: Add support for default play acti…
Browse files Browse the repository at this point in the history
…on setting.
  • Loading branch information
ksooo committed Oct 4, 2023
1 parent 6e437c7 commit 3aa541d
Showing 1 changed file with 73 additions and 48 deletions.
121 changes: 73 additions & 48 deletions xbmc/listproviders/DirectoryProvider.cpp
Expand Up @@ -40,6 +40,7 @@
#include "video/VideoThumbLoader.h"
#include "video/VideoUtils.h"
#include "video/dialogs/GUIDialogVideoInfo.h"
#include "video/guilib/VideoPlayActionProcessor.h"
#include "video/guilib/VideoSelectActionProcessor.h"

#include <memory>
Expand Down Expand Up @@ -468,6 +469,11 @@ bool ExecuteAction(const std::string& execute)
return false;
}

bool ExecuteAction(const CExecString& execute)
{
return ExecuteAction(execute.GetExecString());
}

class CVideoSelectActionProcessor : public VIDEO::GUILIB::CVideoSelectActionProcessorBase
{
public:
Expand All @@ -480,25 +486,25 @@ class CVideoSelectActionProcessor : public VIDEO::GUILIB::CVideoSelectActionProc
bool OnPlayPartSelected(unsigned int part) override
{
// part numbers are 1-based
BuildAndExecAction("PlayMedia", StringUtils::Format("playoffset={}", part - 1));
ExecuteAction({"PlayMedia", m_item, StringUtils::Format("playoffset={}", part - 1)});
return true;
}

bool OnResumeSelected() override
{
BuildAndExecAction("PlayMedia", "resume");
ExecuteAction({"PlayMedia", m_item, "resume"});
return true;
}

bool OnPlaySelected() override
{
BuildAndExecAction("PlayMedia", "noresume");
ExecuteAction({"PlayMedia", m_item, "noresume"});
return true;
}

bool OnQueueSelected() override
{
BuildAndExecAction("QueueMedia", "");
ExecuteAction({"QueueMedia", m_item, ""});
return true;
}

Expand All @@ -515,92 +521,111 @@ class CVideoSelectActionProcessor : public VIDEO::GUILIB::CVideoSelectActionProc
}

private:
void BuildAndExecAction(const std::string& method, const std::string& param)
{
std::vector<std::string> params{StringUtils::Paramify(m_item.GetPath())};
if (m_item.m_bIsFolder)
params.emplace_back("isdir");
CDirectoryProvider& m_provider;
};

if (!param.empty())
params.emplace_back(param);
class CVideoPlayActionProcessor : public VIDEO::GUILIB::CVideoPlayActionProcessorBase
{
public:
explicit CVideoPlayActionProcessor(CFileItem& item) : CVideoPlayActionProcessorBase(item) {}

const CExecString es{method, params};
ExecuteAction(es.GetExecString());
protected:
bool OnResumeSelected() override
{
ExecuteAction({"PlayMedia", m_item, "resume"});
return true;
}

CDirectoryProvider& m_provider;
bool OnPlaySelected() override
{
ExecuteAction({"PlayMedia", m_item, "noresume"});
return true;
}
};
} // namespace

bool CDirectoryProvider::OnClick(const CGUIListItemPtr& item)
{
CFileItem fileItem(*std::static_pointer_cast<CFileItem>(item));
CFileItem targetItem{*std::static_pointer_cast<CFileItem>(item)};

if (fileItem.IsFavourite())
bool isNoFolderOrIsPlayMedia{false};

if (targetItem.IsFavourite())
{
// Resolve the favourite
const CFavouritesURL url{fileItem.GetPath()};
const CFavouritesURL url{targetItem.GetPath()};
if (!url.IsValid())
return false;

if (url.GetAction() == CFavouritesURL::Action::PLAY_MEDIA)
targetItem = {url.GetTarget(), url.IsDir()};
targetItem.LoadDetails();

isNoFolderOrIsPlayMedia =
(!targetItem.m_bIsFolder || (url.GetAction() == CFavouritesURL::Action::PLAY_MEDIA));
}
else
{
isNoFolderOrIsPlayMedia = !targetItem.m_bIsFolder;
if (!isNoFolderOrIsPlayMedia)
{
CFileItem targetItem{url.GetTarget(), url.IsDir()};
targetItem.LoadDetails();
if (targetItem.IsVideo() ||
(targetItem.m_bIsFolder && VIDEO_UTILS::IsItemPlayable(targetItem)))
{
CVideoSelectActionProcessor proc{*this, targetItem};
if (proc.Process())
return true;
}
const CExecString exec{targetItem, GetTarget(targetItem)};
isNoFolderOrIsPlayMedia = (exec.GetFunction() == "playmedia");
}
}
else if (fileItem.HasVideoInfoTag())

// video select action setting is for files only, except exec func is playmedia...
if (isNoFolderOrIsPlayMedia && targetItem.HasVideoInfoTag())
{
CVideoSelectActionProcessor proc{*this, fileItem};
CVideoSelectActionProcessor proc{*this, targetItem};
if (proc.Process())
return true;
}

// exec the execute string for the original (!) item
CFileItem fileItem{*std::static_pointer_cast<CFileItem>(item)};

if (fileItem.HasProperty("node.target_url"))
fileItem.SetPath(fileItem.GetProperty("node.target_url").asString());

// grab and execute the execute string
return ExecuteAction(CExecString(fileItem, GetTarget(fileItem)).GetExecString());
return ExecuteAction({fileItem, GetTarget(fileItem)});
}

bool CDirectoryProvider::OnPlay(const CGUIListItemPtr& item)
{
CFileItem fileItem(*std::static_pointer_cast<CFileItem>(item));
CFileItem targetItem{*std::static_pointer_cast<CFileItem>(item)};

if (fileItem.IsFavourite())
if (targetItem.IsFavourite())
{
// Resolve the favourite
const CFavouritesURL url(fileItem.GetPath());
if (url.IsValid())
{
// If action is playmedia, just play it
if (url.GetAction() == CFavouritesURL::Action::PLAY_MEDIA)
return ExecuteAction(url.GetExecString());
const CFavouritesURL url(targetItem.GetPath());
if (!url.IsValid())
return false;

CFileItem targetItem(url.GetTarget(), url.IsDir());
fileItem = targetItem;
}
targetItem = {url.GetTarget(), url.IsDir()};
targetItem.LoadDetails();
}

// video play action setting is for files and folders...
if (targetItem.HasVideoInfoTag() ||
(targetItem.m_bIsFolder && VIDEO_UTILS::IsItemPlayable(targetItem)))
{
CVideoPlayActionProcessor proc{targetItem};
if (proc.Process())
return true;
}

if (CPlayerUtils::IsItemPlayable(fileItem))
if (CPlayerUtils::IsItemPlayable(targetItem))
{
CExecString exec(fileItem, {});
const CExecString exec{targetItem, GetTarget(targetItem)};
if (exec.GetFunction() == "playmedia")
{
return ExecuteAction(exec.GetExecString());
// exec as is
return ExecuteAction(exec);
}
else
{
// build and execute a playmedia execute string
exec = CExecString("PlayMedia", {StringUtils::Paramify(fileItem.GetPath())});
return ExecuteAction(exec.GetExecString());
// build a playmedia execute string for given target and exec this
return ExecuteAction({"PlayMedia", targetItem, ""});
}
}
return true;
Expand Down

0 comments on commit 3aa541d

Please sign in to comment.