diff options
-rw-r--r-- | PVideo.cpp | 83 | ||||
-rw-r--r-- | PVideo.h | 5 | ||||
-rw-r--r-- | Stream.cpp | 12 | ||||
-rw-r--r-- | Stream.h | 4 |
4 files changed, 99 insertions, 5 deletions
@@ -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 @@ -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(); }; } @@ -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 @@ -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(); }; } |