summaryrefslogtreecommitdiff
path: root/plexOsd.cpp
diff options
context:
space:
mode:
authorchriszero <zerov83@gmail.com>2015-03-15 12:46:04 +0100
committerchriszero <zerov83@gmail.com>2015-03-15 12:46:04 +0100
commit5ffd91556f73336f91e1fc96da2af36e6e7e5660 (patch)
treee397497642a9a154a1ef4fde82c8265c3cd4331d /plexOsd.cpp
parent2788b2cbe68b4b481f3a080658cc433d2927b4fb (diff)
downloadvdr-plugin-plex-5ffd91556f73336f91e1fc96da2af36e6e7e5660.tar.gz
vdr-plugin-plex-5ffd91556f73336f91e1fc96da2af36e6e7e5660.tar.bz2
Refactoring0.1.4
Own files for OsdMenus Bump version to 0.1.4
Diffstat (limited to 'plexOsd.cpp')
-rw-r--r--plexOsd.cpp288
1 files changed, 288 insertions, 0 deletions
diff --git a/plexOsd.cpp b/plexOsd.cpp
new file mode 100644
index 0000000..55f26b3
--- /dev/null
+++ b/plexOsd.cpp
@@ -0,0 +1,288 @@
+#include "plexOsd.h"
+#include "plex.h"
+
+//////////////////////////////////////////////////////////////////////////////
+// cOsdMenu
+//////////////////////////////////////////////////////////////////////////////
+static std::shared_ptr<plexclient::Plexservice> pPlexService;
+
+std::shared_ptr<plexclient::Plexservice> cPlexBrowser::pLastService;
+int cPlexBrowser::lastCurrentItem;
+
+cPlexBrowser::cPlexBrowser(const char *title, std::shared_ptr<plexclient::Plexservice> Service) :cOsdMenu(title)
+{
+ dsyslog("[plex]%s:\n", __FUNCTION__);
+ pService = Service;
+ pService->Authenticate();
+ if(pService == pLastService) {
+ pCont = pService->GetLastSection(true);
+ } else {
+ pCont = pService->GetSection(pService->StartUri);
+ }
+ SetMenuCategory(mcRecording);
+ CreateMenu();
+}
+
+cPlexBrowser* cPlexBrowser::RecoverLastState()
+{
+ if (cPlexBrowser::pLastService != NULL) {
+ cPlexBrowser* pBrowser = new cPlexBrowser("", cPlexBrowser::pLastService);
+ return pBrowser;
+ }
+ return NULL;
+}
+
+void cPlexBrowser::CreateMenu()
+{
+ // Clear Menu
+ Clear();
+ // Directory or Video?
+ if(pCont && pCont->m_vDirectories.size() > 0) {
+
+ for(std::vector<plexclient::Directory>::iterator it = pCont->m_vDirectories.begin(); it != pCont->m_vDirectories.end(); ++it) {
+ plexclient::Directory *pDir = &(*it);
+ Add(new cPlexOsdItem( tr(pDir->GetTitle().c_str()), pDir) );
+ }
+ }
+
+ if(pCont && pCont->m_vVideos.size() > 0) {
+ for(std::vector<plexclient::Video>::iterator it = pCont->m_vVideos.begin(); it != pCont->m_vVideos.end(); ++it) {
+ plexclient::Video *vid = &(*it); // cast raw pointer
+ Add(new cPlexOsdItem( vid->GetTitle().c_str(), vid) );
+ }
+ }
+
+ if(Count() < 1) {
+ Add(new cPlexOsdItem("Empty"));
+ } else if (pService == pLastService) {
+ // recover last selected item
+ cOsdItem* item = Get(lastCurrentItem);
+ SetCurrent(item);
+ pLastService = NULL;
+ }
+
+ Display();
+}
+
+eOSState cPlexBrowser::ProcessKey(eKeys key)
+{
+ eOSState state;
+
+ // call standard function
+ state = cOsdMenu::ProcessKey(key);
+
+ int current = Current(); // get current menu item index
+ cPlexOsdItem *item = static_cast<cPlexOsdItem*>(Get(current));
+
+ if(item->IsVideo()) {
+ if(item->GetAttachedVideo()->m_iViewCount > 0) SetHelp(tr("Info"), tr("Unscrobble"));
+ else SetHelp(tr("Info"), tr("Scrobble"));
+ } else {
+ SetHelp(NULL);
+ }
+
+ switch (state) {
+ case osUnknown:
+ switch (key) {
+ case kOk:
+ return ProcessSelected();
+ case kBack:
+ return LevelUp();
+ case kRed:
+ std::cout << "RED";
+ if(item->IsVideo()) {
+ std::cout << " Video Info";
+ }
+ std::cout << std::endl;
+ break;
+ case kGreen:
+ if(item->IsVideo()) {
+ if(item->GetAttachedVideo()->m_iViewCount > 0) {
+ if(item->GetAttachedVideo()->SetUnwatched()) {
+ item->GetAttachedVideo()->UpdateFromServer();
+ }
+ } else {
+ if(item->GetAttachedVideo()->SetWatched()) {
+ item->GetAttachedVideo()->UpdateFromServer();
+ }
+ }
+ }
+ if(item->GetAttachedVideo()->m_iViewCount > 0) SetHelp(tr("Info"), tr("Unscrobble"));
+ else SetHelp(tr("Info"), tr("Scrobble"));
+ break;
+ default:
+ break;
+ }
+ break;
+ case osBack:
+ state = LevelUp();
+ if (state == osEnd) { // top level reached
+ return osPlugin;
+ }
+ default:
+ break;
+ }
+ return state;
+}
+
+eOSState cPlexBrowser::LevelUp()
+{
+ pCont = pService->GetLastSection();
+ if(!pCont) {
+ cPlexMenu::eShow = menuShow::MAIN;
+ return osEnd;
+ }
+ cString title = cString::sprintf(tr("Browse Plex - %s"), tr(pCont->m_sTitle1.c_str()));
+ SetTitle(title);
+ CreateMenu();
+ return osContinue;
+}
+
+eOSState cPlexBrowser::ProcessSelected()
+{
+ int current = Current(); // get current menu item index
+ cPlexOsdItem *item = static_cast<cPlexOsdItem*>(Get(current));
+
+
+ if(item->IsVideo()) {
+ pLastService = pService;
+ lastCurrentItem = current;
+ cMyPlugin::PlayFile(*item->GetAttachedVideo());
+ return osEnd;
+ }
+
+ if(item->IsDir()) {
+ plexclient::Directory* pDir = item->GetAttachedDirectory();
+ pCont = pService->GetSection(pDir->m_sKey);
+ cString title = cString::sprintf(tr("Browse Plex - %s"), tr(pDir->m_sTitle.c_str()));
+ SetTitle(title);
+ CreateMenu();
+ return osContinue;
+ }
+
+ //return osEnd;
+ return osContinue;
+}
+
+
+cPlexInfo::cPlexInfo(plexclient::Video* video) : cOsdMenu(video->GetTitle().c_str())
+{
+ cOsdMenu::Display();
+
+ Add(new cOsdItem(video->m_sSummary.c_str()));
+}
+
+eOSState cPlexInfo::ProcessKey(eKeys Key)
+{
+ switch (int(Key)) {
+ case kUp|k_Repeat:
+ case kUp:
+ case kDown|k_Repeat:
+ case kDown:
+ case kLeft|k_Repeat:
+ case kLeft:
+ case kRight|k_Repeat:
+ case kRight:
+ DisplayMenu()->Scroll(NORMALKEY(Key) == kUp || NORMALKEY(Key) == kLeft, NORMALKEY(Key) == kLeft || NORMALKEY(Key) == kRight);
+ cStatus::MsgOsdTextItem(NULL, NORMALKEY(Key) == kUp || NORMALKEY(Key) == kLeft);
+ return osContinue;
+ case kInfo:
+ return osBack;
+ default:
+ break;
+ }
+
+ eOSState state = cOsdMenu::ProcessKey(Key);
+
+ if (state == osUnknown) {
+ switch (Key) {
+ case kGreen:
+ cRemote::Put(Key, true);
+ case kOk:
+ return osBack;
+ default:
+ break;
+ }
+ }
+ return state;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// cOsdMenu
+//////////////////////////////////////////////////////////////////////////////
+
+menuShow cPlexMenu::eShow = MAIN;
+
+/**
+** Play menu constructor.
+*/
+cPlexMenu::cPlexMenu(const char *title, int c0, int c1, int c2, int c3, int c4)
+ :cOsdMenu(title, c0, c1, c2, c3, c4)
+{
+ SetHasHotkeys();
+
+ for(std::vector<plexclient::PlexServer>::iterator it = plexclient::plexgdm::GetInstance().GetPlexservers().begin(); it != plexclient::plexgdm::GetInstance().GetPlexservers().end(); ++it) {
+ //&(*it)
+ auto s1 = std::make_shared<plexclient::Plexservice>( &(*it) );
+ s1->StartUri = "/library/sections";
+ Add(new cPlexOsdItem(Poco::format(tr("%s - Library"), it->GetServerName()).c_str(), s1));
+
+ auto s2 = std::make_shared<plexclient::Plexservice>( &(*it) );
+ s2->StartUri = "/video";
+ Add(new cPlexOsdItem(Poco::format(tr("%s - Video Channels"), it->GetServerName()).c_str(), s2 ));
+ }
+
+ if(Count() < 1) {
+ Add(new cPlexOsdItem(tr("No Plex Media Server found.")), false);
+ }
+}
+
+cOsdMenu* cPlexMenu::ProcessMenu()
+{
+ if(cMyPlugin::CalledFromCode) {
+ cMyPlugin::CalledFromCode = false;
+ return cPlexBrowser::RecoverLastState();
+ }
+
+ if (cPlexMenu::eShow == menuShow::BROWSER) {
+ return new cPlexBrowser(tr("Browse Plex"), pPlexService);
+ }
+ return new cPlexMenu("Plex");
+}
+
+
+/**
+** Handle play plugin menu key event.
+**
+** @param key key event
+*/
+eOSState cPlexMenu::ProcessKey(eKeys key)
+{
+ eOSState state;
+
+ //if (key != kNone) {
+ // dsyslog("[plex]%s: key=%d\n", __FUNCTION__, key);
+ //}
+ // call standard function
+ state = cOsdMenu::ProcessKey(key);
+
+ int current = Current(); // get current menu item index
+ cPlexOsdItem *item = static_cast<cPlexOsdItem*>(Get(current));
+
+ switch (state) {
+ case osUnknown:
+ switch (key) {
+ case kOk:
+ pPlexService = item->GetAttachedService();
+ cPlexMenu::eShow = menuShow::BROWSER;
+ return osPlugin; // restart with OSD browser
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+ return state;
+}
+
+