diff options
author | chriszero <zerov83@gmail.com> | 2015-03-15 12:46:04 +0100 |
---|---|---|
committer | chriszero <zerov83@gmail.com> | 2015-03-15 12:46:04 +0100 |
commit | 5ffd91556f73336f91e1fc96da2af36e6e7e5660 (patch) | |
tree | e397497642a9a154a1ef4fde82c8265c3cd4331d /plexOsd.cpp | |
parent | 2788b2cbe68b4b481f3a080658cc433d2927b4fb (diff) | |
download | vdr-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.cpp | 288 |
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; +} + + |