diff options
-rw-r--r-- | PlexServer.cpp | 1 | ||||
-rw-r--r-- | PlexServer.h | 1 | ||||
-rw-r--r-- | Plexservice.cpp | 38 | ||||
-rw-r--r-- | Plexservice.h | 2 | ||||
-rw-r--r-- | browserGrid.cpp | 56 | ||||
-rw-r--r-- | browserGrid.h | 5 | ||||
-rw-r--r-- | hlsPlayerControl.cpp | 11 | ||||
-rw-r--r-- | plexSdOsd.cpp | 5 | ||||
-rw-r--r-- | plexgdm.cpp | 3 | ||||
-rw-r--r-- | viewGridNavigator.cpp | 9 | ||||
-rw-r--r-- | viewGridNavigator.h | 2 |
11 files changed, 89 insertions, 44 deletions
diff --git a/PlexServer.cpp b/PlexServer.cpp index 70fc1b7..6b3f0ae 100644 --- a/PlexServer.cpp +++ b/PlexServer.cpp @@ -14,6 +14,7 @@ void PlexServer::ParseData(std::string data, std::string ip) m_sIpAddress = ip; std::istringstream f(data); std::string s; + Offline = false; while(std::getline(f, s)) { int pos = s.find(':'); if(pos > 0) { diff --git a/PlexServer.h b/PlexServer.h index 8f1b23a..0a36adb 100644 --- a/PlexServer.h +++ b/PlexServer.h @@ -60,6 +60,7 @@ public: std::string GetUri(); void DiscoverSettings(); + bool Offline; protected: PlexServer(std::string data, std::string ip); diff --git a/Plexservice.cpp b/Plexservice.cpp index b86dac3..20db51e 100644 --- a/Plexservice.cpp +++ b/Plexservice.cpp @@ -3,6 +3,7 @@ #include "PlexHelper.h" #include "plexgdm.h" #include <memory> +#include <Poco/Net/NetException.h> namespace plexclient { @@ -72,7 +73,7 @@ void Plexservice::Authenticate() try { std::string token = GetMyPlexToken(); auto pRequest = CreateRequest("/?X-Plex-Token=" + token); - + Poco::Net::HTTPClientSession session(pServer->GetIpAdress(), pServer->GetPort()); session.sendRequest(*pRequest); Poco::Net::HTTPResponse response; @@ -114,11 +115,12 @@ std::shared_ptr<MediaContainer> Plexservice::GetSection(std::string section, boo dsyslog("[plex] URI: http://%s:%d%s", pServer->GetIpAdress().c_str(), pServer->GetPort(), uri.c_str()); std::shared_ptr<MediaContainer> pAllsections(new MediaContainer(&rs, pServer)); - + session.abort(); return pAllsections; - } catch (Poco::Exception &exc) { + } catch (Poco::Net::NetException &exc) { + pServer->Offline = true; return 0; } } @@ -136,7 +138,7 @@ std::shared_ptr<MediaContainer> Plexservice::GetLastSection(bool current) return NULL; } -bool Plexservice::IsRoot() +bool Plexservice::IsRoot() { return m_vUriStack.size() <= 1; } @@ -158,22 +160,26 @@ std::unique_ptr<Poco::Net::HTTPRequest> Plexservice::CreateRequest(std::string p return pRequest; } -MediaContainer Plexservice::GetMediaContainer(std::string fullUrl) +std::shared_ptr<MediaContainer> Plexservice::GetMediaContainer(std::string fullUrl) { - Poco::URI fileuri(fullUrl); - Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, fileuri.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1); - PlexHelper::AddHttpHeader(request); + try { + Poco::URI fileuri(fullUrl); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, fileuri.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1); + PlexHelper::AddHttpHeader(request); - Poco::Net::HTTPClientSession session(fileuri.getHost(), fileuri.getPort()); + Poco::Net::HTTPClientSession session(fileuri.getHost(), fileuri.getPort()); - session.sendRequest(request); - Poco::Net::HTTPResponse response; - std::istream &rs = session.receiveResponse(response); + session.sendRequest(request); + Poco::Net::HTTPResponse response; + std::istream &rs = session.receiveResponse(response); - MediaContainer allsections(&rs, plexgdm::GetInstance().GetServer(fileuri.getHost(), fileuri.getPort())); - - session.abort(); - return allsections; + std::shared_ptr<MediaContainer> pAllsections(new MediaContainer(&rs, plexgdm::GetInstance().GetServer(fileuri.getHost(), fileuri.getPort()))); + + session.abort(); + return pAllsections; + } catch (Poco::Net::NetException &exc) { + return 0; + } } std::string Plexservice::encode(std::string message) diff --git a/Plexservice.h b/Plexservice.h index 4635ccd..5f3567b 100644 --- a/Plexservice.h +++ b/Plexservice.h @@ -52,7 +52,7 @@ public: static std::string GetUniversalTranscodeUrl(Video* video, int offset = 0, PlexServer* server = 0); static std::string GetMyPlexToken(); - static MediaContainer GetMediaContainer(std::string fullUrl); + static std::shared_ptr<MediaContainer> GetMediaContainer(std::string fullUrl); static std::string encode(std::string message); std::string StartUri; diff --git a/browserGrid.cpp b/browserGrid.cpp index b3d5341..4b6a620 100644 --- a/browserGrid.cpp +++ b/browserGrid.cpp @@ -62,6 +62,9 @@ void cBrowserGrid::Flush() void cBrowserGrid::SwitchView(ViewMode mode) { + auto selObj = SelectedObject(); + if(!selObj) return; + Config *conf = &Config::GetInstance(); conf->DefaultViewMode = mode; if(conf->DefaultViewMode == ViewMode::Cover) { @@ -74,8 +77,8 @@ void cBrowserGrid::SwitchView(ViewMode mode) SetViewGrid(std::shared_ptr<skindesignerapi::cViewGrid>(m_pRootView->GetViewGrid(eViewGrids::vgList) )); SetGridDimensions(conf->ListGridRows, conf->ListGridColumns); } - - int activePos = SelectedObject()->AbsolutePosition; + + int activePos = selObj->AbsolutePosition; //ProcessData(); for(std::vector<cGridElement*>::iterator it = m_vElements.begin(); it != m_vElements.end(); ++it) { @@ -111,25 +114,31 @@ void cBrowserGrid::SwitchGrid(int index) m_pHeader->Clear(); m_pHeader->ClearTokens(); - if(m_viewEntryIndex < Config::GetInstance().m_viewentries.size()) { - ViewEntry entry = Config::GetInstance().m_viewentries[index]; - m_pHeader->AddStringToken("tabname", tr(entry.Name.c_str())); - m_pService = std::shared_ptr<plexclient::Plexservice>(new plexclient::Plexservice( plexclient::plexgdm::GetInstance().GetFirstServer(), entry.PlexPath ) ); - m_pContainer = m_pService->GetSection(m_pService->StartUri); - m_bServersAreRoot = false; - m_vServerElements.clear(); + if(plexclient::plexgdm::GetInstance().GetFirstServer()) { + if(m_viewEntryIndex < Config::GetInstance().m_viewentries.size()) { + ViewEntry entry = Config::GetInstance().m_viewentries[index]; + m_pHeader->AddStringToken("tabname", tr(entry.Name.c_str())); + m_pService = std::shared_ptr<plexclient::Plexservice>(new plexclient::Plexservice( plexclient::plexgdm::GetInstance().GetFirstServer(), entry.PlexPath ) ); + m_pContainer = m_pService->GetSection(m_pService->StartUri); + m_bServersAreRoot = false; + m_vServerElements.clear(); + } else { + //Server View + m_pHeader->AddStringToken("tabname", tr("Library")); + m_pService = NULL; + m_pContainer = NULL; + m_bServersAreRoot = true; + SetServerElements(); + } } else { - //Server View - m_pHeader->AddStringToken("tabname", tr("Library")); + m_pHeader->AddStringToken("tabname", tr("No Plex Media Server found.")); + m_pInfopane->AddStringToken("title", tr("No Plex Media Server found.")); m_pService = NULL; m_pContainer = NULL; - m_bServersAreRoot = true; - SetServerElements(); } - ProcessData(); - - SelectedObject()->AddTokens(m_pHeader, false); + auto selObj = SelectedObject(); + if(selObj) selObj->AddTokens(m_pHeader, false); } void cBrowserGrid::SetServerElements() @@ -254,7 +263,7 @@ void cBrowserGrid::DrawBackground() void cBrowserGrid::DrawInfopane() { m_pInfopane->Clear(); - SelectedObject()->AddTokens(m_pInfopane, true); + if(SelectedObject()) SelectedObject()->AddTokens(m_pInfopane, true); } void cBrowserGrid::DrawFooter() @@ -410,12 +419,21 @@ bool cBrowserGrid::DrawTime() * cDummyElement */ +cDummyElement::cDummyElement() +{ + m_title = "../"; +} + +cDummyElement::cDummyElement(std::string title) +{ + m_title = title; +} + void cDummyElement::AddTokens(std::shared_ptr<skindesignerapi::cOsdElement> grid, bool clear, std::function<void(cGridElement*)> OnCached) { if(clear) grid->ClearTokens(); grid->AddIntToken("isdummy", 1); - grid->AddStringToken("title", "../"); - grid->AddIntToken("viewmode", Config::GetInstance().DefaultViewMode); + grid->AddStringToken("title", m_title); } std::string cDummyElement::GetTitle() diff --git a/browserGrid.h b/browserGrid.h index 549c081..6d50541 100644 --- a/browserGrid.h +++ b/browserGrid.h @@ -13,7 +13,12 @@ class cDummyElement : public cGridElement { +private: + std::string m_title; + public: + cDummyElement(std::string title); + cDummyElement(); virtual std::string GetTitle(); virtual void AddTokens(std::shared_ptr<skindesignerapi::cOsdElement> grid, bool clear = true, std::function<void(cGridElement*)> OnCached = NULL); }; diff --git a/hlsPlayerControl.cpp b/hlsPlayerControl.cpp index f2348f5..d8d847d 100644 --- a/hlsPlayerControl.cpp +++ b/hlsPlayerControl.cpp @@ -23,11 +23,12 @@ cControl* cHlsPlayerControl::Create(plexclient::Video Video) // get Metadata std::string uri = Video.m_pServer->GetUri() + Video.m_sKey; - plexclient::MediaContainer pmcontainer = plexclient::Plexservice::GetMediaContainer(uri); - - std::string transcodeUri = plexclient::Plexservice::GetUniversalTranscodeUrl(&pmcontainer.m_vVideos[0], Video.m_iMyPlayOffset); - cHlsPlayerControl* playerControl = new cHlsPlayerControl(new cHlsPlayer(transcodeUri, pmcontainer.m_vVideos[0], Video.m_iMyPlayOffset), pmcontainer.m_vVideos[0]); - playerControl->m_title = pmcontainer.m_vVideos[0].m_sTitle; + auto pmcontainer = plexclient::Plexservice::GetMediaContainer(uri); + if(pmcontainer == NULL) return NULL; + + std::string transcodeUri = plexclient::Plexservice::GetUniversalTranscodeUrl(&pmcontainer->m_vVideos[0], Video.m_iMyPlayOffset); + cHlsPlayerControl* playerControl = new cHlsPlayerControl(new cHlsPlayer(transcodeUri, pmcontainer->m_vVideos[0], Video.m_iMyPlayOffset), pmcontainer->m_vVideos[0]); + playerControl->m_title = pmcontainer->m_vVideos[0].m_sTitle; return playerControl; } diff --git a/plexSdOsd.cpp b/plexSdOsd.cpp index a8dbdf2..ac0c26a 100644 --- a/plexSdOsd.cpp +++ b/plexSdOsd.cpp @@ -64,12 +64,13 @@ void cPlexSdOsd::Flush() eOSState cPlexSdOsd::ProcessKey(eKeys Key) { eOSState state = eOSState::osContinue; - plexclient::Video* vid = dynamic_cast<plexclient::Video*>(m_pBrowserGrid->SelectedObject()); + plexclient::Video* vid = NULL; if (m_pBrowserGrid->DrawTime()) m_pBrowserGrid->Flush(); if(m_messageDisplayed) { + vid = dynamic_cast<plexclient::Video*>(m_pBrowserGrid->SelectedObject()); switch (Key & ~k_Repeat) { case kOk: vid->m_iMyPlayOffset = vid->m_lViewoffset/1000; @@ -111,6 +112,7 @@ eOSState cPlexSdOsd::ProcessKey(eKeys Key) Flush(); break; case kRed: + vid = dynamic_cast<plexclient::Video*>(m_pBrowserGrid->SelectedObject()); if(vid) { if(vid->m_iViewCount > 0) vid->SetUnwatched(); else vid->SetWatched(); @@ -133,6 +135,7 @@ eOSState cPlexSdOsd::ProcessKey(eKeys Key) } if(state == eOSState::osUser1) { + vid = dynamic_cast<plexclient::Video*>(m_pBrowserGrid->SelectedObject()); if(vid->m_iMyPlayOffset == 0 && vid->m_lViewoffset > 0 ) { cString message = cString::sprintf(tr("'Ok' to start from %ld minutes, 'Back' to start from beginning."), vid->m_lViewoffset / 60000); DrawMessage(std::string(message)); diff --git a/plexgdm.cpp b/plexgdm.cpp index 4878012..1ced172 100644 --- a/plexgdm.cpp +++ b/plexgdm.cpp @@ -161,6 +161,7 @@ void plexgdm::discover() if(s_it->GetIpAdress() == host) { flag = false; s_it->ParseData(data, host); + isyslog("[plex] Server Updated: %s", host.c_str()); } } if(flag) { @@ -193,7 +194,7 @@ PlexServer* plexgdm::GetServer(std::string ip, int port) PlexServer* plexgdm::GetFirstServer() { - if(m_vServers.size() > 0) return &m_vServers[0]; + if(m_vServers.size() > 0 && !m_vServers[0].Offline) return &m_vServers[0]; else return NULL; } diff --git a/viewGridNavigator.cpp b/viewGridNavigator.cpp index 50d0951..017c448 100644 --- a/viewGridNavigator.cpp +++ b/viewGridNavigator.cpp @@ -51,6 +51,8 @@ void cViewGridNavigator::ReDraw(cGridElement* element) void cViewGridNavigator::FilterElements(int scrollOffset) { + if(m_vElements.size() == 0) return; + int startOffset = scrollOffset; int endOffset = startOffset + (m_rows * m_columns); if(scrollOffset < 0) { @@ -132,6 +134,13 @@ void cViewGridNavigator::SetGridElementData(cGridElement *obj) } } +cGridElement* cViewGridNavigator::SelectedObject() +{ + if(!m_setIterator) + return *m_activeElementIter; + return NULL; +} + void cViewGridNavigator::SetGridDimensions(int rows, int columns) { m_rows = rows; diff --git a/viewGridNavigator.h b/viewGridNavigator.h index c746376..800acd3 100644 --- a/viewGridNavigator.h +++ b/viewGridNavigator.h @@ -65,7 +65,7 @@ public: virtual eOSState NavigateSelect() = 0; virtual eOSState NavigateBack() = 0; virtual void ReDraw(cGridElement* element); - cGridElement* SelectedObject() { return *m_activeElementIter; } + cGridElement* SelectedObject(); }; #endif // cViewGridNAVIGATOR_H |