summaryrefslogtreecommitdiff
path: root/PlexHTTPRequestHandler.cpp
diff options
context:
space:
mode:
authorchriszero <zerov83@gmail.com>2014-11-15 19:43:07 +0100
committerchriszero <zerov83@gmail.com>2014-11-15 19:43:07 +0100
commit23f9f7712bfa33b5a488a447a6fabe6035cc3240 (patch)
tree06bbe8e0bc52496c5ad3c41accc7524aa597e670 /PlexHTTPRequestHandler.cpp
parenta40adaf76fb1267d38b4c5e6386933ddb2d0d328 (diff)
downloadvdr-plugin-plex-23f9f7712bfa33b5a488a447a6fabe6035cc3240.tar.gz
vdr-plugin-plex-23f9f7712bfa33b5a488a447a6fabe6035cc3240.tar.bz2
initial commit
Diffstat (limited to 'PlexHTTPRequestHandler.cpp')
-rw-r--r--PlexHTTPRequestHandler.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/PlexHTTPRequestHandler.cpp b/PlexHTTPRequestHandler.cpp
new file mode 100644
index 0000000..c0c01b1
--- /dev/null
+++ b/PlexHTTPRequestHandler.cpp
@@ -0,0 +1,182 @@
+#include "PlexHTTPRequestHandler.h"
+#include <vdr/remote.h>
+#include <unistd.h>
+
+namespace plexclient
+{
+
+void PlexHTTPRequestHandler::AddHeaders(Poco::Net::HTTPServerResponse& response, Poco::Net::HTTPServerRequest& request) {
+ if(request.getMethod() == Poco::Net::HTTPRequest::HTTP_OPTIONS) {
+ response.setContentType("text/plain");
+
+ response.add("X-Plex-Client-Identifier", Config::GetInstance().GetUUID());
+ response.add("Connection", "Close");
+ response.add("Access-Control-Max-Age", "1209600");
+ response.add("Access-Control-Allow-Origin", "*");
+ response.add("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, HEAD");
+ response.add("Access-Control-Allow-Headers", "x-plex-version, x-plex-platform-version, "
+ "x-plex-username, x-plex-client-identifier, "
+ "x-plex-target-client-identifier, x-plex-device-name, "
+ "x-plex-platform, x-plex-product, accept, x-plex-device");
+ } else {
+ response.setContentType("application/x-www-form-urlencoded");
+
+ response.add("Access-Control-Allow-Origin", "*");
+ response.add("X-Plex-Version", VERSION);
+ response.add("X-Plex-Client-Identifier", Config::GetInstance().GetUUID());
+ response.add("X-Plex-Product", "player");
+ response.add("X-Plex-Product", "PlexVDR");
+ response.add("X-Plex-Device-Name", Config::GetInstance().GetHostname());
+ response.add("X-Plex-Platform", "VDR");
+ response.add("X-Plex-Model", "Linux");
+ response.add("X-Plex-Device", "PC");
+ response.add("X-Plex-Username", Config::GetInstance().GetUsername());
+ }
+ //header.MessageHeader(header);
+}
+
+std::map<std::string, std::string> PlexHTTPRequestHandler::ParseQuery(std::string query) {
+ std::map<std::string, std::string> querymap;
+ Poco::StringTokenizer queryTokens(query, "&");
+ for(auto& token : queryTokens) {
+ Poco::StringTokenizer subTokens(token, "=");
+ querymap[subTokens[0]] = subTokens[1];
+ }
+ return querymap;
+}
+
+std::string PlexHTTPRequestHandler::GetOKMsg() {
+ return "<?xml version=\"1.0\" encoding=\"utf-8\"?> <Response code=\"200\" status=\"OK\" />";
+}
+
+void PlexHTTPRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response){
+ AddHeaders(response, request);
+ std::ostream& ostr = response.send();
+ ostr << GetOKMsg();
+}
+
+void SubscribeRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response){
+ // parse query
+ Poco::URI uri(request.getURI());
+ auto query = ParseQuery(uri.getQuery()); // port=32400&commandID=0&protocol=http
+ std::string path = uri.getPath(); // /player/timeline/subscribe
+
+ std::string uuid = request.get("X-Plex-Client-Identifier");
+ int port = std::stoi(query["port"]);
+ int command = std::stoi(query["commandID"]);
+ SubscriptionManager::GetInstance().AddSubscriber(Subscriber(query["protocol"], request.getHost(), port, uuid, command));
+
+ AddHeaders(response, request);
+
+ std::ostream& ostr = response.send();
+ ostr << GetOKMsg();
+ response.setStatus(Poco::Net::HTTPResponse::HTTP_REASON_OK);
+}
+
+void ResourceRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response){
+ AddHeaders(response, request);
+
+ std::ostream& ostr = response.send();
+ ostr << "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ "<MediaContainer>"
+ "<Player title=\"" << Config::GetInstance().GetHostname() << "\""
+ " protocol=\"plex\""
+ " protocolVersion=\"1\""
+ " protocolCapabilities=\"navigation,playback,timeline\""
+ " machineIdentifier=\"" << Config::GetInstance().GetUUID() << "\""
+ " product=\"PlexVDR\""
+ " platform=\"Linux\""
+ " platformVersion=\"" << VERSION << "\""
+ " deviceClass=\"HTPC\""
+ "/> </MediaContainer>";
+
+ response.setStatus(Poco::Net::HTTPResponse::HTTP_REASON_OK);
+
+
+ std::cout << "Resources Response sent..." << std::endl;
+}
+
+void PlayerRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response){
+ Poco::URI uri(request.getURI());
+ //Poco::StringTokenizer pathTokens(uri, "/");
+ auto query = ParseQuery(uri.getQuery());
+
+ if(query.find("wait") != query.end() && std::stoi(query["wait"]) == 1) {
+ usleep(900 * 1000);
+ }
+
+ if(request.getMethod() == Poco::Net::HTTPRequest::HTTP_OPTIONS) {
+ AddHeaders(response, request);
+ //response.setStatus(Poco::Net::HTTPResponse::HTTP_REASON_OK);
+ std::ostream& ostr = response.send(); // Stream must not be empty!
+ ostr << " ";
+ response.setStatus(Poco::Net::HTTPResponse::HTTP_REASON_OK);
+ std::cout << "OPTION Reply send" << std::endl;
+ return;
+ }
+
+ if(request.getURI().find("/poll")!= std::string::npos) {
+ response.add("X-Plex-Client-Identifier",Config::GetInstance().GetUUID());
+ response.add("Access-Control-Expose-Headers","X-Plex-Client-Identifier");
+ response.add("Access-Control-Allow-Origin","*");
+ response.setContentType("text/xml");
+
+ std::ostream& ostr = response.send();
+ ostr << SubscriptionManager::GetInstance().GetMsg(query["commandID"]);
+ response.setStatus(Poco::Net::HTTPResponse::HTTP_REASON_OK);
+
+ }
+ else if(request.getURI().find("/playback/playMedia")!= std::string::npos) {
+ std::cout << "playMedia_1" << std::endl;
+ AddHeaders(response, request);
+
+ std::cout << "playMedia_2" << std::endl;
+ std::string protocol = query["protocol"];
+ std::string address = query["address"];
+ std::string port = query["port"];
+ std::string key = query["key"];
+ std::cout << "playMedia_3" << std::endl;
+
+ std::string fullUrl = protocol + "://" + address + ":" + port + key; // Metainfo
+ std::cout << "FullUrl: " << fullUrl << std::endl;
+
+ MediaContainer *pCont = Plexservice::GetMediaContainer(fullUrl);
+ std::string filePath = pCont->m_vVideos[0].m_pMedia->m_sPartKey;
+ Poco::URI fileuri(fullUrl);
+ fileuri.setPath(filePath);
+
+ // MUSS im Maintread des Plugins/VDR gestartet werden
+ ActionManager::GetInstance().AddAction(fileuri.toString());
+
+ std::ostream& ostr = response.send();
+ ostr << GetOKMsg();
+ response.setStatus(Poco::Net::HTTPResponse::HTTP_REASON_OK);
+ SubscriptionManager::GetInstance().Notify();
+ }
+ else if(request.getURI().find("/navigation")!= std::string::npos) {
+ if(request.getURI().find("/moveUp")!= std::string::npos) {
+ cRemote::Put(eKeys::kUp);
+ }
+ else if(request.getURI().find("/moveDown")!= std::string::npos) {
+ cRemote::Put(eKeys::kDown);
+ }
+ else if(request.getURI().find("/moveLeft")!= std::string::npos) {
+ cRemote::Put(eKeys::kLeft);
+ }
+ else if(request.getURI().find("/moveRight")!= std::string::npos) {
+ cRemote::Put(eKeys::kRight);
+ }
+ else if(request.getURI().find("/select")!= std::string::npos) {
+ cRemote::Put(eKeys::kOk);
+ }
+ else if(request.getURI().find("/home")!= std::string::npos) {
+ cRemote::Put(eKeys::kMenu);
+ }
+ else if(request.getURI().find("/back")!= std::string::npos) {
+ cRemote::Put(eKeys::kBack);
+ }
+ }
+
+}
+
+}