summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PVideo.cpp83
-rw-r--r--PVideo.h5
-rw-r--r--Stream.cpp12
-rw-r--r--Stream.h4
4 files changed, 99 insertions, 5 deletions
diff --git a/PVideo.cpp b/PVideo.cpp
index 22f36e7..0518afb 100644
--- a/PVideo.cpp
+++ b/PVideo.cpp
@@ -1,5 +1,10 @@
#include "PVideo.h"
#include <Poco/Format.h>
+#include <Poco/Net/HTTPRequest.h>
+#include <Poco/Net/HTTPResponse.h>
+
+#include <vdr/tools.h>
+#include "PlexHelper.h"
namespace plexclient
{
@@ -9,6 +14,57 @@ Video::Video(Poco::XML::Node* pNode, PlexServer Server, MediaContainer* parent)
m_iMyPlayOffset = 0;
m_lViewoffset = 0;
m_Server = Server;
+ Parse(pNode);
+
+ if (m_iParentIndex < 0) {
+ m_iParentIndex = parent->m_iParentIndex;
+ }
+}
+
+bool Video::UpdateFromServer()
+{
+ try {
+ Poco::URI fileuri(Poco::format("%s/library/metadata/%d", m_Server.GetUri(), m_iRatingKey));
+ 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());
+
+ session.sendRequest(request);
+ Poco::Net::HTTPResponse response;
+ std::istream &rs = session.receiveResponse(response);
+
+ if(response.getStatus() == 200) {
+ // clear vectors
+ m_vCountry.clear();
+ m_vDirector.clear();
+ m_vGenre.clear();
+ m_vRole.clear();
+ m_vWriter.clear();
+
+ InputSource src(rs);
+ DOMParser parser;
+ Poco::XML::AutoPtr<Document> pDoc = parser.parse(&src);
+
+ NodeIterator it(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
+ Poco::XML::Node* pNode = it.nextNode();
+ while(pNode) {
+ if(Poco::icompare(pNode->nodeName(), "Video") == 0) {
+ Parse(pNode);
+ }
+
+ pNode = it.nextNode();
+ }
+ return true;
+ }
+ } catch (Poco::Exception &exc) {
+ esyslog("[plex]: %s: %s", __FUNCTION__, exc.displayText().c_str());
+ }
+ return false;
+}
+
+void Video::Parse(Poco::XML::Node* pNode)
+{
NodeIterator it(pNode, Poco::XML::NodeFilter::SHOW_ALL);
Poco::XML::Node* pChildNode = it.nextNode();
@@ -18,7 +74,6 @@ Video::Video(Poco::XML::Node* pNode, PlexServer Server, MediaContainer* parent)
Poco::XML::AutoPtr<Poco::XML::NamedNodeMap> pAttribs = pNode->attributes();
m_iRatingKey = GetNodeValueAsInt(pAttribs->getNamedItem("ratingKey"));
- m_iIndex = GetNodeValueAsInt(pAttribs->getNamedItem("index"));
m_iParentIndex = GetNodeValueAsInt(pAttribs->getNamedItem("parentIndex"));
m_sKey = GetNodeValue(pAttribs->getNamedItem("key"));
m_sStudio = GetNodeValue(pAttribs->getNamedItem("studio"));
@@ -55,9 +110,6 @@ Video::Video(Poco::XML::Node* pNode, PlexServer Server, MediaContainer* parent)
}
pChildNode = it.nextNode();
}
- if (m_iParentIndex < 0) {
- m_iParentIndex = parent->m_iParentIndex;
- }
}
std::string Video::GetTitle()
@@ -76,4 +128,27 @@ std::string Video::GetTitle()
return res;
}
+bool Video::SetStream(Stream* stream)
+{
+ try {
+ Poco::Net::HTTPClientSession session(m_Server.GetIpAdress(), m_Server.GetPort());
+
+ std::string uri = Poco::format("/library/parts/%d?%s", m_Media.m_iPartId, stream->GetSetStreamQuery());
+ Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_PUT, uri);
+ session.sendRequest(req);
+
+ Poco::Net::HTTPResponse resp;
+ session.receiveResponse(resp);
+
+ if(resp.getStatus() == 200) {
+ dsyslog("[plex]: Set Stream: %s", uri.c_str());
+ return true;
+ }
+ return false;
+ } catch (Poco::Exception &exc) {
+ esyslog("[plex]: %s: %s", __FUNCTION__, exc.displayText().c_str());
+ return false;
+ }
+}
+
} // Namespace
diff --git a/PVideo.h b/PVideo.h
index 6c25011..c8f7c82 100644
--- a/PVideo.h
+++ b/PVideo.h
@@ -34,6 +34,9 @@ class MediaContainer;
class Video: XmlObject
{
+private:
+ void Parse(Poco::XML::Node* pNode);
+
public:
Video(Poco::XML::Node* pNode, PlexServer Server, MediaContainer* parent);
Video() {};
@@ -69,6 +72,8 @@ public:
int m_iParentIndex;
std::string GetTitle();
+ bool SetStream(Stream* stream);
+ bool UpdateFromServer();
};
}
diff --git a/Stream.cpp b/Stream.cpp
index 1611f72..7c02b5e 100644
--- a/Stream.cpp
+++ b/Stream.cpp
@@ -1,4 +1,5 @@
#include "Stream.h"
+#include <Poco/Format.h>
namespace plexclient
{
@@ -8,7 +9,8 @@ Stream::Stream(Poco::XML::Node* pNode)
if(Poco::icompare(pNode->nodeName(), "Stream") == 0) {
Poco::XML::AutoPtr<Poco::XML::NamedNodeMap> pAttribs = pNode->attributes();
-
+
+ m_bSelected = GetNodeValueAsBool(pAttribs->getNamedItem("selected"));
m_iID = GetNodeValueAsInt(pAttribs->getNamedItem("id"));
m_iStreamType = GetNodeValueAsInt(pAttribs->getNamedItem("streamType"));
m_iIndex = GetNodeValueAsInt(pAttribs->getNamedItem("index"));
@@ -23,4 +25,12 @@ Stream::Stream(Poco::XML::Node* pNode)
}
}
+std::string Stream::GetSetStreamQuery()
+{
+ if(m_eStreamType == sAUDIO) return Poco::format("audioStreamID=%d", m_iID);
+ else if(m_eStreamType == sSUBTITLE && m_iID >= 0) return Poco::format("subtitleStreamID=%d", m_iID);
+ else if(m_eStreamType == sSUBTITLE && m_iID < 0) return "subtitleStreamID=";
+ else return "";
+}
+
} // namespace
diff --git a/Stream.h b/Stream.h
index f8a392c..5d9b94a 100644
--- a/Stream.h
+++ b/Stream.h
@@ -33,8 +33,10 @@ class Stream: XmlObject
{
public:
Stream(Poco::XML::Node* pNode);
+ Stream() {};
public:
+ bool m_bSelected;
int m_iID;
int m_iStreamType;
int m_iIndex;
@@ -44,6 +46,8 @@ public:
std::string m_sLanguage;
std::string m_sLanguageCode;
StreamType m_eStreamType;
+
+ std::string GetSetStreamQuery();
};
}