summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchriszero <zerov83@gmail.com>2015-05-20 21:18:14 +0200
committerchriszero <zerov83@gmail.com>2015-05-20 21:18:14 +0200
commit709ebb92273ae0af7aae79dfeb55e3ddf17324af (patch)
treeadf10eeaa71b65dfd5343c8d8c31b5728ec334b1
parent86cfa7fa64406971990160db56b71c7a71dcf3e5 (diff)
downloadvdr-plugin-plex-709ebb92273ae0af7aae79dfeb55e3ddf17324af.tar.gz
vdr-plugin-plex-709ebb92273ae0af7aae79dfeb55e3ddf17324af.tar.bz2
- Added handling for disapearing or not reachable plexservers
-rw-r--r--PlexServer.cpp1
-rw-r--r--PlexServer.h1
-rw-r--r--Plexservice.cpp38
-rw-r--r--Plexservice.h2
-rw-r--r--browserGrid.cpp56
-rw-r--r--browserGrid.h5
-rw-r--r--hlsPlayerControl.cpp11
-rw-r--r--plexSdOsd.cpp5
-rw-r--r--plexgdm.cpp3
-rw-r--r--viewGridNavigator.cpp9
-rw-r--r--viewGridNavigator.h2
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