diff options
-rw-r--r-- | Directory.cpp | 8 | ||||
-rw-r--r-- | PVideo.cpp | 27 | ||||
-rw-r--r-- | Plexservice.cpp | 38 | ||||
-rw-r--r-- | README.md | 17 | ||||
-rw-r--r-- | pictureCache.cpp | 42 | ||||
-rw-r--r-- | plexOsd.cpp | 22 | ||||
-rw-r--r-- | plexgdm.cpp | 12 | ||||
-rw-r--r-- | po/de_DE.po | 22 |
8 files changed, 117 insertions, 71 deletions
diff --git a/Directory.cpp b/Directory.cpp index 16877f3..6f58091 100644 --- a/Directory.cpp +++ b/Directory.cpp @@ -60,9 +60,13 @@ Directory::Directory(Poco::XML::Node* pNode, PlexServer* Server, MediaContainer* std::string Directory::GetTitle() { + std::string seriesTitle = m_sParentTitle; + if(seriesTitle.empty() && m_pParent) + seriesTitle = m_pParent->m_sParentTitle; + switch(m_eType) { - case SEASON: - return Poco::format(tr("%s - Season %d"), m_sTitle2, m_iIndex); + case SEASON: + return Poco::format(tr("%s - Season %d"), seriesTitle, m_iIndex); default: return m_sTitle; } @@ -143,6 +143,11 @@ void Video::Parse(Poco::XML::Node* pNode) std::string Video::GetTitle() { std::string res = m_sTitle; + + std::string seriesTitle = m_sGrandparentTitle; + if(seriesTitle.empty() && m_pParent) + seriesTitle = m_pParent->m_sGrandparentTitle; + switch(m_tType) { case MOVIE: if(m_iYear > 0) { @@ -152,7 +157,7 @@ std::string Video::GetTitle() } break; case EPISODE: - res = Poco::format("%02dx%02d - %s", m_iParentIndex, m_iIndex, m_sTitle); + res = Poco::format("%s - %02dx%02d - %s", seriesTitle, m_iParentIndex, m_iIndex, m_sTitle); break; default: break; @@ -165,7 +170,7 @@ bool Video::SetStream(Stream* stream) try { Poco::Net::HTTPClientSession session(m_pServer->GetHost(), m_pServer->GetPort()); - std::string uri = Poco::format("/library/parts/%d?%s", m_Media.m_iPartId, stream->GetSetStreamQuery()); + std::string uri = Poco::format("/library/parts/%d?%s&X-Plex-Token=%s", m_Media.m_iPartId, stream->GetSetStreamQuery(), m_pServer->GetAuthToken()); Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_PUT, uri); session.sendRequest(req); @@ -186,14 +191,11 @@ bool Video::SetStream(Stream* stream) bool Video::SetUnwatched() { try { - Poco::Net::HTTPClientSession session(m_pServer->GetHost(), m_pServer->GetPort()); - std::string uri = Poco::format("/:/unscrobble?key=%d&identifier=com.plexapp.plugins.library", m_iRatingKey); - Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, uri); - session.sendRequest(req); Poco::Net::HTTPResponse resp; - session.receiveResponse(resp); + bool ok; + m_pServer->MakeRequest(resp, ok, uri); if(resp.getStatus() == 200) { dsyslog("[plex]: Set Unwatched: %s", uri.c_str()); @@ -209,16 +211,13 @@ bool Video::SetUnwatched() bool Video::SetWatched() { try { - Poco::Net::HTTPClientSession session(m_pServer->GetHost(), m_pServer->GetPort()); - std::string uri = Poco::format("/:/scrobble?key=%d&identifier=com.plexapp.plugins.library", m_iRatingKey); - Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, uri); - session.sendRequest(req); - + Poco::Net::HTTPResponse resp; - session.receiveResponse(resp); + bool ok; + m_pServer->MakeRequest(resp, ok, uri); - if(resp.getStatus() == 200) { + if(ok) { dsyslog("[plex]: Set Watched: %s", uri.c_str()); return true; } diff --git a/Plexservice.cpp b/Plexservice.cpp index caa6489..d4a0da7 100644 --- a/Plexservice.cpp +++ b/Plexservice.cpp @@ -246,7 +246,26 @@ std::string Plexservice::GetUniversalTranscodeUrl(Video* video, int offset, Plex { PlexServer* pSrv = server ? server : video->m_pServer; Poco::URI transcodeUri(pSrv->GetUri()); - transcodeUri.setPath("/video/:/transcode/universal/start.m3u8"); + if(!http) { + transcodeUri.setPath("/video/:/transcode/universal/start.m3u8"); + transcodeUri.addQueryParameter("protocol", "hls"); + transcodeUri.addQueryParameter("includeCodecs", "1"); + transcodeUri.addQueryParameter("copyts", "1"); + transcodeUri.addQueryParameter("directPlay", "0"); + transcodeUri.addQueryParameter("directStream", "1"); + transcodeUri.addQueryParameter("subtitles", "burn"); + transcodeUri.addQueryParameter("audioBoost", "100"); + } else { + transcodeUri.setScheme("http"); // mpv segfaults with https... :-( + transcodeUri.setPath("/video/:/transcode/universal/start"); + transcodeUri.addQueryParameter("protocol", "http"); + + transcodeUri.addQueryParameter("X-Plex-Client-Identifier", Config::GetInstance().GetUUID()); + transcodeUri.addQueryParameter("X-Plex-Product", "Chromecast"); + transcodeUri.addQueryParameter("X-Plex-Platform", "Chromecast"); + transcodeUri.addQueryParameter("X-Plex-Token", pSrv->GetAuthToken()); + } + // Force set localhost and http Poco::URI pathUri(pSrv->GetUri()+video->m_sKey); @@ -256,13 +275,9 @@ std::string Plexservice::GetUniversalTranscodeUrl(Video* video, int offset, Plex transcodeUri.addQueryParameter("path", pathUri.toString()); transcodeUri.addQueryParameter("mediaIndex", "0"); transcodeUri.addQueryParameter("partIndex", "0"); - transcodeUri.addQueryParameter("protocol", "hls"); transcodeUri.addQueryParameter("offset", std::to_string(offset) ); transcodeUri.addQueryParameter("fastSeek", "1"); - transcodeUri.addQueryParameter("directPlay", "0"); - transcodeUri.addQueryParameter("directStream", "1"); - transcodeUri.addQueryParameter("subtitles", "burn"); - transcodeUri.addQueryParameter("audioBoost", "100"); + if(pSrv->IsLocal()) { transcodeUri.addQueryParameter("videoResolution", "1920x1080"); @@ -274,15 +289,20 @@ std::string Plexservice::GetUniversalTranscodeUrl(Video* video, int offset, Plex transcodeUri.addQueryParameter("videoQuality", "100"); } transcodeUri.addQueryParameter("session", Config::GetInstance().GetUUID()); // TODO: generate Random SessionID - transcodeUri.addQueryParameter("includeCodecs", "1"); - transcodeUri.addQueryParameter("copyts", "1"); - if(Config::GetInstance().UseAc3) { + + if(Config::GetInstance().UseAc3 && !http) { transcodeUri.addQueryParameter("X-Plex-Client-Profile-Extra", "add-transcode-target-audio-codec(type=videoProfile&context=streaming&protocol=hls&audioCodec=ac3"); //params << encode("+add-limitation(scope=videoCodec&scopeName=h264&type=lowerBound&name=video.height&value=1080)"); //params << encode("+add-limitation(scope=videoCodec&scopeName=h264&type=lowerBound&name=video.frameRate&value=25)"); //params << encode("+add-limitation(scope=videoCodec&scopeName=h264&type=upperBound&name=video.frameRate&value=25)"); } + if(http) { + + + } + std::cout << transcodeUri.toString() << std::endl; + return transcodeUri.toString(); } @@ -1,11 +1,20 @@ vdr-plugin-plex =============== -ALPHA!! May not work - A Plex plugin for Linux VDR -Plays files via the Plexmediaserver transcoder directly in VDR +Plays files via the Plexmediaserver transcoder directly in VDR +At the moment ONLY video files are played. deps: -libpoco >= 1.4 +libpoco >= 1.6 libpcrepp +libskindesignerapi +C++11 Compiler + +optional: +vdr-plugin-skindesigner and a supported skin +vdr-plugin-mpv + +There are no commandline parameters. + +To use remote servers you have to use a plex.tv account diff --git a/pictureCache.cpp b/pictureCache.cpp index 556a75d..4dbb992 100644 --- a/pictureCache.cpp +++ b/pictureCache.cpp @@ -57,14 +57,13 @@ bool cPictureCache::DownloadFileAndSave(std::string Uri, std::string localFile) { try { Poco::URI fileUri(Uri); - Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, fileUri.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1); + plexclient::PlexServer* pServer = plexclient::plexgdm::GetInstance().GetServer(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); + bool ok; + std::istream &rs = pServer->MakeRequest(response, ok, fileUri.getPathAndQuery()); - if (response.getStatus() != Poco::Net::HTTPResponse::HTTPStatus::HTTP_OK) + if (!ok) return false; std::string type = response.getContentType(); @@ -105,7 +104,12 @@ bool cPictureCache::DownloadFileAndSave(std::string Uri, std::string localFile) std::string cPictureCache::FileName(std::string uri, int width) { Poco::URI u(uri); - std::string file = Poco::format("%s_%d", u.getPathAndQuery(), width); + plexclient::PlexServer* pServer = plexclient::plexgdm::GetInstance().GetServer(u.getHost(), u.getPort()); + std::string uuid = "default"; + if(pServer && !pServer->GetUuid().empty()) { + uuid = pServer->GetUuid(); + } + std::string file = Poco::format("%s/%s_%d", uuid, u.getPathAndQuery(), width); Poco::Path path(m_cacheDir); path.append(file); @@ -115,19 +119,21 @@ std::string cPictureCache::FileName(std::string uri, int width) std::string cPictureCache::TranscodeUri(std::string uri, int width, int height) { - std::string escapedUri; - Poco::URI::encode(uri, " !\"#$%&'()*+,/:;=?@[]", escapedUri); + // We have to transform the uri a little... + // httpX://ServerUri/.../queryUri=localhost + Poco::URI u(uri); - int port = u.getPort(); - std::string host = u.getHost(); - auto plServer = plexclient::plexgdm::GetInstance().GetFirstServer(); - if (plServer) { - host = plServer->GetHost(); - port = plServer->GetPort(); - } - - std::string tUri = Poco::format("http://%s:%d/photo/:/transcode?width=%d&height=%d&url=%s", host, port, width, height, escapedUri); - return tUri; + auto plServer = plexclient::plexgdm::GetInstance().GetServer(u.getHost(), u.getPort()); + u.setHost("127.0.0.1"); // set to localhost and http only! + u.setScheme("http"); + + Poco::URI serverUri(plServer->GetUri()); + serverUri.setPath("/photo/:/transcode"); + serverUri.addQueryParameter("width", std::to_string(width)); + serverUri.addQueryParameter("height", std::to_string(height)); + serverUri.addQueryParameter("url", u.toString()); + + return serverUri.toString(); } bool cPictureCache::Cached(std::string uri, int width) diff --git a/plexOsd.cpp b/plexOsd.cpp index ba498d5..c74153e 100644 --- a/plexOsd.cpp +++ b/plexOsd.cpp @@ -89,7 +89,6 @@ eOSState cPlexBrowser::ProcessKey(eKeys key) case kBack: return LevelUp(); case kRed: - std::cout << "RED"; if(item->IsVideo()) { std::cout << " Video Info"; } @@ -180,16 +179,19 @@ cPlexMenu::cPlexMenu(const char *title, int c0, int c1, int c2, int c3, int c4) SetHasHotkeys(); for(std::vector<plexclient::PlexServer>::iterator it = plexclient::plexgdm::GetInstance().GetPlexservers().begin(); it != plexclient::plexgdm::GetInstance().GetPlexservers().end(); ++it) { - //&(*it) - auto s1 = std::make_shared<plexclient::Plexservice>( &(*it) ); - s1->StartUri = "/library/sections"; - Add(new cPlexOsdItem(Poco::format(tr("%s - Library"), it->GetServerName()).c_str(), s1)); - - auto s2 = std::make_shared<plexclient::Plexservice>( &(*it) ); - s2->StartUri = "/video"; - Add(new cPlexOsdItem(Poco::format(tr("%s - Video Channels"), it->GetServerName()).c_str(), s2 )); + for(std::vector<ViewEntry>::iterator vEntry = Config::GetInstance().m_serverViewentries.begin(); vEntry != Config::GetInstance().m_serverViewentries.end(); ++vEntry) { + auto plexService = std::make_shared<plexclient::Plexservice>( &(*it) ); + plexService->StartUri = vEntry->PlexPath; + Add(new cPlexOsdItem(Poco::format("%s - %s", it->GetServerName(), vEntry->Name ).c_str(), plexService )); + } + for(std::vector<ViewEntry>::iterator vEntry = Config::GetInstance().m_viewentries.begin(); vEntry != Config::GetInstance().m_viewentries.end(); ++vEntry) { + auto plexService = std::make_shared<plexclient::Plexservice>( &(*it) ); + plexService->StartUri = vEntry->PlexPath; + Add(new cPlexOsdItem(Poco::format("%s - %s", it->GetServerName(), vEntry->Name ).c_str(), plexService )); + } } - + + if(Count() < 1) { Add(new cPlexOsdItem(tr("No Plex Media Server found.")), false); } diff --git a/plexgdm.cpp b/plexgdm.cpp index b63363e..e274689 100644 --- a/plexgdm.cpp +++ b/plexgdm.cpp @@ -211,10 +211,18 @@ PlexServer* plexgdm::GetServer(std::string ip, int port) return &m_vServers[m_vServers.size()-1]; } +/* + * Returns the first owned online server, if there is no owned server it will return the first remote server, or NULL + */ PlexServer* plexgdm::GetFirstServer() { - if(m_vServers.size() > 0 && !m_vServers[0].Offline) return &m_vServers[0]; - else return NULL; + for(std::vector<PlexServer>::iterator s_it = m_vServers.begin(); s_it != m_vServers.end(); ++s_it) { + if(s_it->IsOwned() && !s_it->Offline) { + return &(*s_it); + } + } + if (m_vServers.size() > 0) return &m_vServers[0]; + return NULL; } PlexServer* plexgdm::GetServer(std::string uuid) diff --git a/po/de_DE.po b/po/de_DE.po index f08f70a..9248a00 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: vdr-plex 0.1.0\n" "Report-Msgid-Bugs-To: <see README>\n" -"POT-Creation-Date: 2015-12-15 20:56+0100\n" +"POT-Creation-Date: 2015-12-23 20:47+0100\n" "PO-Revision-Date: 2015-11-07 16:38+0200\n" "Last-Translator: Chris <zerov83@gmail.com>\n" "Language-Team: German\n" @@ -18,6 +18,9 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" +msgid "Recently Added" +msgstr "Kürzlich hinzugefügt" + msgid "Hide main menu entry" msgstr "Verstecke Hauptmenüeintrag" @@ -134,14 +137,6 @@ msgstr "Info" msgid "Browse Plex - %s" msgstr "Durchsuche Plex - %s" -#, c-format -msgid "%s - Library" -msgstr "%s - Bilbliotek" - -#, c-format -msgid "%s - Video Channels" -msgstr "%s - Video Kanäle" - msgid "Browse Plex" msgstr "Durchsuche Plex" @@ -158,9 +153,6 @@ msgstr "Ungesehen" msgid "Recently Released" msgstr "Kürzlich veröffentlicht" -msgid "Recently Added" -msgstr "Kürzlich hinzugefügt" - msgid "Recently Viewed" msgstr "Kürzlich angesehen" @@ -224,6 +216,12 @@ msgstr "Kürzlich angesehene Folgen" msgid "Recently Viewed Shows" msgstr "Kürzlich angesehene Serien" +#~ msgid "%s - Video Channels" +#~ msgstr "%s - Video Kanäle" + +#~ msgid "%s - Library" +#~ msgstr "%s - Bilbliotek" + #~ msgid "Grid Columns" #~ msgstr "Raster Spalten" |