summaryrefslogtreecommitdiff
path: root/plex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plex.cpp')
-rw-r--r--plex.cpp398
1 files changed, 198 insertions, 200 deletions
diff --git a/plex.cpp b/plex.cpp
index 74b31f7..9d9523a 100644
--- a/plex.cpp
+++ b/plex.cpp
@@ -30,17 +30,15 @@ bool cMyPlugin::PlayingFile = false;
** @note DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
** VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
*/
-cMyPlugin::cMyPlugin(void)
-{
+cMyPlugin::cMyPlugin(void) {
}
/**
** Clean up after yourself!
*/
-cMyPlugin::~cMyPlugin(void)
-{
- plexclient::plexgdm::GetInstance().stopRegistration();
- plexclient::ControlServer::GetInstance().Stop();
+cMyPlugin::~cMyPlugin(void) {
+ plexclient::plexgdm::GetInstance().stopRegistration();
+ plexclient::ControlServer::GetInstance().Stop();
}
/**
@@ -48,9 +46,8 @@ cMyPlugin::~cMyPlugin(void)
**
** @returns version number as constant string.
*/
-const char *cMyPlugin::Version(void)
-{
- return VERSION;
+const char *cMyPlugin::Version(void) {
+ return VERSION;
}
/**
@@ -58,153 +55,158 @@ const char *cMyPlugin::Version(void)
**
** @returns short description as constant string.
*/
-const char *cMyPlugin::Description(void)
-{
- return DESCRIPTION;
+const char *cMyPlugin::Description(void) {
+ return DESCRIPTION;
}
-bool cMyPlugin::Start(void)
-{
+bool cMyPlugin::Start(void) {
#ifdef SKINDESIGNER
- m_pPlugStruct = new skindesignerapi::cPluginStructure();
- m_pPlugStruct->name = "plex";
- m_pPlugStruct->libskindesignerAPIVersion = LIBSKINDESIGNERAPIVERSION;
-
- m_pPlugStruct->RegisterRootView("root.xml");
- skindesignerapi::cTokenContainer *tkBackground = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineTokens(eViewElementsRoot::background, tkBackground);
- m_pPlugStruct->RegisterViewElement((int)eViews::rootView, (int)eViewElementsRoot::background, "background", tkBackground);
-
- skindesignerapi::cTokenContainer *tkHeader = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineTokens(eViewElementsRoot::header, tkHeader);
- m_pPlugStruct->RegisterViewElement((int)eViews::rootView, (int)eViewElementsRoot::header, "header", tkHeader);
-
- skindesignerapi::cTokenContainer *tkFooter = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineTokens(eViewElementsRoot::footer, tkFooter);
- m_pPlugStruct->RegisterViewElement((int)eViews::rootView, (int)eViewElementsRoot::footer, "footer", tkFooter);
-
- skindesignerapi::cTokenContainer *tkInfopane = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineTokens(eViewElementsRoot::infopane, tkInfopane);
- m_pPlugStruct->RegisterViewElement((int)eViews::rootView, (int)eViewElementsRoot::infopane, "infopane", tkInfopane);
-
- skindesignerapi::cTokenContainer *tkWatch = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineTokens(eViewElementsRoot::watch, tkWatch);
- m_pPlugStruct->RegisterViewElement((int)eViews::rootView, (int)eViewElementsRoot::watch, "time", tkWatch);
-
- skindesignerapi::cTokenContainer *tkMessage = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineTokens(eViewElementsRoot::message, tkMessage);
- m_pPlugStruct->RegisterViewElement((int)eViews::rootView, (int)eViewElementsRoot::message, "message", tkMessage);
-
- skindesignerapi::cTokenContainer *tkScrollbar = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineTokens(eViewElementsRoot::scrollbar, tkScrollbar);
- m_pPlugStruct->RegisterViewElement((int)eViews::rootView, (int)eViewElementsRoot::scrollbar, "scrollbar", tkScrollbar);
-
- skindesignerapi::cTokenContainer *tkGridCover = new skindesignerapi::cTokenContainer();
- skindesignerapi::cTokenContainer *tkGridDetail = new skindesignerapi::cTokenContainer();
- skindesignerapi::cTokenContainer *tkGridList = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineGridTokens(tkGridCover);
- cPlexSdOsd::DefineGridTokens(tkGridDetail);
- cPlexSdOsd::DefineGridTokens(tkGridList);
- m_pPlugStruct->RegisterViewGrid((int)eViews::rootView, (int)eViewGrids::cover, "coverbrowser", tkGridCover);
- m_pPlugStruct->RegisterViewGrid((int)eViews::rootView, (int)eViewGrids::detail, "detailbrowser", tkGridDetail);
- m_pPlugStruct->RegisterViewGrid((int)eViews::rootView, (int)eViewGrids::list, "listbrowser", tkGridList);
-
- // DetailsView
- m_pPlugStruct->RegisterSubView((int)eViews::detailView, "detail.xml");
- skindesignerapi::cTokenContainer *tkBackgroundDetail = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::background, tkBackgroundDetail);
- m_pPlugStruct->RegisterViewElement((int)eViews::detailView, (int)eViewElementsDetail::background, "background", tkBackgroundDetail);
-
- skindesignerapi::cTokenContainer *tkDetailInfo = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::info, tkDetailInfo);
- m_pPlugStruct->RegisterViewElement((int)eViews::detailView, (int)eViewElementsDetail::info, "info", tkDetailInfo);
-
- skindesignerapi::cTokenContainer *tkDetailFooter = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::footer, tkDetailFooter);
- m_pPlugStruct->RegisterViewElement((int)eViews::detailView, (int)eViewElementsDetail::footer, "footer", tkDetailFooter);
-
- skindesignerapi::cTokenContainer *tkDetailScrollbar = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::scrollbar, tkDetailScrollbar);
- m_pPlugStruct->RegisterViewElement((int)eViews::detailView, (int)eViewElementsDetail::scrollbar, "scrollbar", tkDetailScrollbar);
-
- skindesignerapi::cTokenContainer *tkDetailMessage = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::message, tkDetailMessage);
- m_pPlugStruct->RegisterViewElement((int)eViews::detailView, (int)eViewElementsDetail::message, "message", tkDetailMessage);
-
- skindesignerapi::cTokenContainer *tkDetailExtraGrid = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineGridTokens(tkDetailExtraGrid);
- m_pPlugStruct->RegisterViewGrid((int)eViews::detailView, (int)eViewDetailViewGrids::extras, "extragrid", tkDetailExtraGrid);
-
- skindesignerapi::cTokenContainer *tkDetailWatch = new skindesignerapi::cTokenContainer();
- cPlexSdOsd::DefineWatchTokens(tkDetailWatch);
- m_pPlugStruct->RegisterViewElement((int)eViews::detailView, (int)eViewElementsDetail::watch, "time", tkDetailWatch);
-
-
- if (!skindesignerapi::SkindesignerAPI::RegisterPlugin(m_pPlugStruct)) {
- esyslog("[plex]: skindesigner not available");
- bSkindesigner = false;
- } else {
- dsyslog("[plex]: successfully registered at skindesigner, id %d", m_pPlugStruct->id);
- m_pTestOsd = new cPlexSdOsd(m_pPlugStruct);
- bSkindesigner = true;
- }
+ m_pPlugStruct = new skindesignerapi::cPluginStructure();
+ m_pPlugStruct->name = "plex";
+ m_pPlugStruct->libskindesignerAPIVersion = LIBSKINDESIGNERAPIVERSION;
+
+ m_pPlugStruct->RegisterRootView("root.xml");
+ skindesignerapi::cTokenContainer *tkBackground = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineTokens(eViewElementsRoot::background, tkBackground);
+ m_pPlugStruct->RegisterViewElement((int) eViews::rootView, (int) eViewElementsRoot::background, "background",
+ tkBackground);
+
+ skindesignerapi::cTokenContainer *tkHeader = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineTokens(eViewElementsRoot::header, tkHeader);
+ m_pPlugStruct->RegisterViewElement((int) eViews::rootView, (int) eViewElementsRoot::header, "header", tkHeader);
+
+ skindesignerapi::cTokenContainer *tkFooter = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineTokens(eViewElementsRoot::footer, tkFooter);
+ m_pPlugStruct->RegisterViewElement((int) eViews::rootView, (int) eViewElementsRoot::footer, "footer", tkFooter);
+
+ skindesignerapi::cTokenContainer *tkInfopane = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineTokens(eViewElementsRoot::infopane, tkInfopane);
+ m_pPlugStruct->RegisterViewElement((int) eViews::rootView, (int) eViewElementsRoot::infopane, "infopane",
+ tkInfopane);
+
+ skindesignerapi::cTokenContainer *tkWatch = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineTokens(eViewElementsRoot::watch, tkWatch);
+ m_pPlugStruct->RegisterViewElement((int) eViews::rootView, (int) eViewElementsRoot::watch, "time", tkWatch);
+
+ skindesignerapi::cTokenContainer *tkMessage = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineTokens(eViewElementsRoot::message, tkMessage);
+ m_pPlugStruct->RegisterViewElement((int) eViews::rootView, (int) eViewElementsRoot::message, "message", tkMessage);
+
+ skindesignerapi::cTokenContainer *tkScrollbar = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineTokens(eViewElementsRoot::scrollbar, tkScrollbar);
+ m_pPlugStruct->RegisterViewElement((int) eViews::rootView, (int) eViewElementsRoot::scrollbar, "scrollbar",
+ tkScrollbar);
+
+ skindesignerapi::cTokenContainer *tkGridCover = new skindesignerapi::cTokenContainer();
+ skindesignerapi::cTokenContainer *tkGridDetail = new skindesignerapi::cTokenContainer();
+ skindesignerapi::cTokenContainer *tkGridList = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineGridTokens(tkGridCover);
+ cPlexSdOsd::DefineGridTokens(tkGridDetail);
+ cPlexSdOsd::DefineGridTokens(tkGridList);
+ m_pPlugStruct->RegisterViewGrid((int) eViews::rootView, (int) eViewGrids::cover, "coverbrowser", tkGridCover);
+ m_pPlugStruct->RegisterViewGrid((int) eViews::rootView, (int) eViewGrids::detail, "detailbrowser", tkGridDetail);
+ m_pPlugStruct->RegisterViewGrid((int) eViews::rootView, (int) eViewGrids::list, "listbrowser", tkGridList);
+
+ // DetailsView
+ m_pPlugStruct->RegisterSubView((int) eViews::detailView, "detail.xml");
+ skindesignerapi::cTokenContainer *tkBackgroundDetail = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::background, tkBackgroundDetail);
+ m_pPlugStruct->RegisterViewElement((int) eViews::detailView, (int) eViewElementsDetail::background, "background",
+ tkBackgroundDetail);
+
+ skindesignerapi::cTokenContainer *tkDetailInfo = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::info, tkDetailInfo);
+ m_pPlugStruct->RegisterViewElement((int) eViews::detailView, (int) eViewElementsDetail::info, "info", tkDetailInfo);
+
+ skindesignerapi::cTokenContainer *tkDetailFooter = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::footer, tkDetailFooter);
+ m_pPlugStruct->RegisterViewElement((int) eViews::detailView, (int) eViewElementsDetail::footer, "footer",
+ tkDetailFooter);
+
+ skindesignerapi::cTokenContainer *tkDetailScrollbar = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::scrollbar, tkDetailScrollbar);
+ m_pPlugStruct->RegisterViewElement((int) eViews::detailView, (int) eViewElementsDetail::scrollbar, "scrollbar",
+ tkDetailScrollbar);
+
+ skindesignerapi::cTokenContainer *tkDetailMessage = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineDetailsTokens(eViewElementsDetail::message, tkDetailMessage);
+ m_pPlugStruct->RegisterViewElement((int) eViews::detailView, (int) eViewElementsDetail::message, "message",
+ tkDetailMessage);
+
+ skindesignerapi::cTokenContainer *tkDetailExtraGrid = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineGridTokens(tkDetailExtraGrid);
+ m_pPlugStruct->RegisterViewGrid((int) eViews::detailView, (int) eViewDetailViewGrids::extras, "extragrid",
+ tkDetailExtraGrid);
+
+ skindesignerapi::cTokenContainer *tkDetailWatch = new skindesignerapi::cTokenContainer();
+ cPlexSdOsd::DefineWatchTokens(tkDetailWatch);
+ m_pPlugStruct->RegisterViewElement((int) eViews::detailView, (int) eViewElementsDetail::watch, "time",
+ tkDetailWatch);
+
+
+ if (!skindesignerapi::SkindesignerAPI::RegisterPlugin(m_pPlugStruct)) {
+ esyslog("[plex]: skindesigner not available");
+ bSkindesigner = false;
+ } else {
+ dsyslog("[plex]: successfully registered at skindesigner, id %d", m_pPlugStruct->id);
+ m_pTestOsd = new cPlexSdOsd(m_pPlugStruct);
+ bSkindesigner = true;
+ }
#endif
- return true;
+ return true;
}
/**
** Start any background activities the plugin shall perform.
*/
-bool cMyPlugin::Initialize(void)
-{
- // Initialize SSL
- {
- using namespace Poco;
- using namespace Poco::Net;
- using Poco::Net::SSLManager;
- using Poco::Net::Context;
- using Poco::Net::AcceptCertificateHandler;
- using Poco::Net::PrivateKeyPassphraseHandler;
- using Poco::Net::InvalidCertificateHandler;
- using Poco::Net::ConsoleCertificateHandler;
-
- //SharedPtr<PrivateKeyPassphraseHandler> pConsoleHandler = new PrivateKeyPassphraseHandler;
- SharedPtr<InvalidCertificateHandler> pInvalidCertHandler = new AcceptCertificateHandler(false);
- Context::Ptr pContext = new Poco::Net::Context(
- Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, // VERIFY_NONE...?!
- 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
- SSLManager::instance().initializeClient(NULL, pInvalidCertHandler, pContext);
- }
- // First Startup? Save UUID
- SetupStore("UUID", Config::GetInstance().GetUUID().c_str());
-
- plexclient::plexgdm::GetInstance().clientDetails(Config::GetInstance().GetUUID(), Config::GetInstance().GetHostname(), "3200", DESCRIPTION, VERSION);
- plexclient::plexgdm::GetInstance().Start();
- plexclient::ControlServer::GetInstance().Start();
-
- return true;
+bool cMyPlugin::Initialize(void) {
+ // Initialize SSL
+ {
+ using namespace Poco;
+ using namespace Poco::Net;
+ using Poco::Net::SSLManager;
+ using Poco::Net::Context;
+ using Poco::Net::AcceptCertificateHandler;
+ using Poco::Net::PrivateKeyPassphraseHandler;
+ using Poco::Net::InvalidCertificateHandler;
+ using Poco::Net::ConsoleCertificateHandler;
+
+ //SharedPtr<PrivateKeyPassphraseHandler> pConsoleHandler = new PrivateKeyPassphraseHandler;
+ SharedPtr<InvalidCertificateHandler> pInvalidCertHandler = new AcceptCertificateHandler(false);
+ Context::Ptr pContext = new Poco::Net::Context(
+ Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, // VERIFY_NONE...?!
+ 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
+ SSLManager::instance().initializeClient(NULL, pInvalidCertHandler, pContext);
+ }
+ // First Startup? Save UUID
+ SetupStore("UUID", Config::GetInstance().GetUUID().c_str());
+
+ plexclient::plexgdm::GetInstance().clientDetails(Config::GetInstance().GetUUID(),
+ Config::GetInstance().GetHostname(), "3200", DESCRIPTION, VERSION);
+ plexclient::plexgdm::GetInstance().Start();
+ plexclient::ControlServer::GetInstance().Start();
+
+ return true;
}
/**
** Create main menu entry.
*/
-const char *cMyPlugin::MainMenuEntry(void)
-{
- return Config::GetInstance().HideMainMenuEntry ? NULL : MAINMENUENTRY;
+const char *cMyPlugin::MainMenuEntry(void) {
+ return Config::GetInstance().HideMainMenuEntry ? NULL : MAINMENUENTRY;
}
/**
** Perform the action when selected from the main VDR menu.
*/
-cOsdObject *cMyPlugin::MainMenuAction(void)
-{
- //dsyslog("[plex]%s:\n", __FUNCTION__);
+cOsdObject *cMyPlugin::MainMenuAction(void) {
+ //dsyslog("[plex]%s:\n", __FUNCTION__);
#ifdef SKINDESIGNER
- if(bSkindesigner && m_pTestOsd->SdSupport()) return new cPlexSdOsd(m_pPlugStruct);
- else return cPlexMenu::ProcessMenu();
+ if (bSkindesigner && m_pTestOsd->SdSupport()) return new cPlexSdOsd(m_pPlugStruct);
+ else return cPlexMenu::ProcessMenu();
#else
- return cPlexMenu::ProcessMenu();
+ return cPlexMenu::ProcessMenu();
#endif
}
@@ -212,23 +214,21 @@ cOsdObject *cMyPlugin::MainMenuAction(void)
** Called for every plugin once during every cycle of VDR's main program
** loop.
*/
-void cMyPlugin::MainThreadHook(void)
-{
- // dsyslog("[plex]%s:\n", __FUNCTION__);
- // Start Tasks, e.g. Play Video
- if(plexclient::ActionManager::GetInstance().IsAction()) {
- PlayFile(plexclient::ActionManager::GetInstance().GetAction());
- }
+void cMyPlugin::MainThreadHook(void) {
+ // dsyslog("[plex]%s:\n", __FUNCTION__);
+ // Start Tasks, e.g. Play Video
+ if (plexclient::ActionManager::GetInstance().IsAction()) {
+ PlayFile(plexclient::ActionManager::GetInstance().GetAction());
+ }
}
/**
** Return our setup menu.
*/
-cMenuSetupPage *cMyPlugin::SetupMenu(void)
-{
- //dsyslog("[plex]%s:\n", __FUNCTION__);
+cMenuSetupPage *cMyPlugin::SetupMenu(void) {
+ //dsyslog("[plex]%s:\n", __FUNCTION__);
- return new cMyMenuSetupPage;
+ return new cMyMenuSetupPage;
}
/**
@@ -239,11 +239,10 @@ cMenuSetupPage *cMyPlugin::SetupMenu(void)
**
** @returns true if the parameter is supported.
*/
-bool cMyPlugin::SetupParse(const char *name, const char *value)
-{
- //dsyslog("[plex]%s: '%s' = '%s'\n", __FUNCTION__, name, value);
+bool cMyPlugin::SetupParse(const char *name, const char *value) {
+ //dsyslog("[plex]%s: '%s' = '%s'\n", __FUNCTION__, name, value);
- return Config::GetInstance().Parse(name, value);
+ return Config::GetInstance().Parse(name, value);
}
/**
@@ -251,56 +250,55 @@ bool cMyPlugin::SetupParse(const char *name, const char *value)
**
** @param filename path and file name
*/
-void cMyPlugin::PlayFile(plexclient::cVideo Vid)
-{
- if(Vid.m_iMyPlayOffset == 0 && Vid.m_lViewoffset > 0 ) {
- cString message = cString::sprintf(tr("To start from %ld minutes, press Ok."), Vid.m_lViewoffset / 60000);
- eKeys response = Skins.Message(eMessageType::mtInfo, message, 5);
- if(response == kOk) {
- Vid.m_iMyPlayOffset = Vid.m_lViewoffset/1000;
- }
- }
-
- cPlugin* mpvPlugin = cPluginManager::GetPlugin("mpv");
-
- if(Config::GetInstance().UseMpv && mpvPlugin) {
- CurrentVideo = Vid;
- cMyPlugin::PlayingFile = true;
-
- Mpv_PlayFile req;
- Mpv_SetTitle reqTitle;
- std::string file;
- if(Config::GetInstance().UsePlexAccount && Vid.m_pServer->IsLocal() == false) {
- file = plexclient::Plexservice::GetUniversalTranscodeUrl(&Vid, Vid.m_iMyPlayOffset, NULL, true);
- }
- else {
- file = (Vid.m_pServer->GetUri() + Vid.m_Media.m_sPartKey);
- }
-
- req.Filename = (char*)file.c_str();
- mpvPlugin->Service(MPV_PLAY_FILE, &req);
-
- reqTitle.Title = (char*)Vid.GetTitle().c_str();
- mpvPlugin->Service(MPV_SET_TITLE, &reqTitle);
-
- // Set "StartAt" for mpv player
- Mpv_Seek seekData;
- seekData.SeekAbsolute = Vid.m_iMyPlayOffset;
- seekData.SeekRelative = 0;
- mpvPlugin->Service(MPV_SEEK, &seekData);
-
- return;
-
- } else if (Config::GetInstance().UseMpv) {
- isyslog("Can't find mpv %s, playing directly.", mpvPlugin ? "service" : "plugin");
- }
-
-
- isyslog("[plex]: play file '%s'\n", Vid.m_sKey.c_str());
- cControl* control = cHlsPlayerControl::Create(Vid);
- if(control) {
- cControl::Launch(control);
- }
+void cMyPlugin::PlayFile(plexclient::cVideo Vid) {
+ if (Vid.m_iMyPlayOffset == 0 && Vid.m_lViewoffset > 0) {
+ cString message = cString::sprintf(tr("To start from %ld minutes, press Ok."), Vid.m_lViewoffset / 60000);
+ eKeys response = Skins.Message(eMessageType::mtInfo, message, 5);
+ if (response == kOk) {
+ Vid.m_iMyPlayOffset = Vid.m_lViewoffset / 1000;
+ }
+ }
+
+ cPlugin *mpvPlugin = cPluginManager::GetPlugin("mpv");
+
+ if (Config::GetInstance().UseMpv && mpvPlugin) {
+ CurrentVideo = Vid;
+ cMyPlugin::PlayingFile = true;
+
+ Mpv_PlayFile req;
+ Mpv_SetTitle reqTitle;
+ std::string file;
+ if (Config::GetInstance().UsePlexAccount && Vid.m_pServer->IsLocal() == false) {
+ file = plexclient::Plexservice::GetUniversalTranscodeUrl(&Vid, Vid.m_iMyPlayOffset, NULL, true);
+ }
+ else {
+ file = (Vid.m_pServer->GetUri() + Vid.m_Media.m_sPartKey);
+ }
+
+ req.Filename = (char *) file.c_str();
+ mpvPlugin->Service(MPV_PLAY_FILE, &req);
+
+ reqTitle.Title = (char *) Vid.GetTitle().c_str();
+ mpvPlugin->Service(MPV_SET_TITLE, &reqTitle);
+
+ // Set "StartAt" for mpv player
+ Mpv_Seek seekData;
+ seekData.SeekAbsolute = Vid.m_iMyPlayOffset;
+ seekData.SeekRelative = 0;
+ mpvPlugin->Service(MPV_SEEK, &seekData);
+
+ return;
+
+ } else if (Config::GetInstance().UseMpv) {
+ isyslog("Can't find mpv %s, playing directly.", mpvPlugin ? "service" : "plugin");
+ }
+
+
+ isyslog("[plex]: play file '%s'\n", Vid.m_sKey.c_str());
+ cControl *control = cHlsPlayerControl::Create(Vid);
+ if (control) {
+ cControl::Launch(control);
+ }
}
-VDRPLUGINCREATOR(cMyPlugin); // Don't touch this!
+VDRPLUGINCREATOR(cMyPlugin); // Don't touch this!