summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Directory.cpp8
-rw-r--r--PVideo.cpp27
-rw-r--r--Plexservice.cpp38
-rw-r--r--README.md17
-rw-r--r--pictureCache.cpp42
-rw-r--r--plexOsd.cpp22
-rw-r--r--plexgdm.cpp12
-rw-r--r--po/de_DE.po22
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;
}
diff --git a/PVideo.cpp b/PVideo.cpp
index d92caae..d5e279c 100644
--- a/PVideo.cpp
+++ b/PVideo.cpp
@@ -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();
}
diff --git a/README.md b/README.md
index bd18dd8..bd5f72b 100644
--- a/README.md
+++ b/README.md
@@ -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"