summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchriszero <zerov83@gmail.com>2015-05-03 17:20:03 +0200
committerchriszero <zerov83@gmail.com>2015-05-03 17:20:03 +0200
commitf7196f23bc0ed500dcf1f60b794caa9a9f76a751 (patch)
tree7fcab9a27a06ca43818e9cdd63977769753fb92f
parent6708c32ab31bb90781bb5e3743cb81ae72748edd (diff)
downloadvdr-plugin-plex-f7196f23bc0ed500dcf1f60b794caa9a9f76a751.tar.gz
vdr-plugin-plex-f7196f23bc0ed500dcf1f60b794caa9a9f76a751.tar.bz2
- Playmarks for skindesigner
- More tokens (mediainfo, codes, etc) - Updated translation
-rw-r--r--Media.cpp16
-rw-r--r--Media.h8
-rw-r--r--PVideo.cpp3
-rw-r--r--hlsPlayer.cpp2
-rw-r--r--plex.cpp26
-rw-r--r--plexSdOsd.cpp135
-rw-r--r--plexSdOsd.h6
-rw-r--r--po/de_DE.po26
-rw-r--r--skins/blackhole/xmlfiles/plug-plex-root.xml33
-rw-r--r--templates/plug-plex-root.xml19
10 files changed, 194 insertions, 80 deletions
diff --git a/Media.cpp b/Media.cpp
index 8147e5c..b94bf1e 100644
--- a/Media.cpp
+++ b/Media.cpp
@@ -23,7 +23,7 @@ Media::Media(Poco::XML::Node* pNode)
m_sAudioCodec = GetNodeValue(pAttribs->getNamedItem("audioCodec"));
m_sVideoCodec = GetNodeValue(pAttribs->getNamedItem("videoCodec"));
m_sContainer = GetNodeValue(pAttribs->getNamedItem("container"));
- m_VideoFrameRate = GetNodeValueAsDouble(pAttribs->getNamedItem("videoFrameRate"));
+ m_VideoFrameRate = GetNodeValue(pAttribs->getNamedItem("videoFrameRate"));
pAttribs->release();
@@ -47,4 +47,18 @@ Media::Media(Poco::XML::Node* pNode)
}
}
+void Media::AddTokens(std::shared_ptr<skindesignerapi::cOsdElement> grid)
+{
+ grid->AddStringToken("videoResolution", m_sVideoResolution);
+ grid->AddIntToken("bitrate", m_iBitrate);
+ grid->AddIntToken("width", m_iWidth);
+ grid->AddIntToken("height", m_iHeight);
+ grid->AddIntToken("audioChannels", m_iAudioChannels);
+ grid->AddStringToken("aspectRatio", m_sAspectRatio);
+ grid->AddStringToken("audioCodec", m_sAudioCodec);
+ grid->AddStringToken("videoCodec", m_sVideoCodec);
+ grid->AddStringToken("container", m_sContainer);
+ grid->AddStringToken("videoFrameRate", m_VideoFrameRate);
+}
+
}
diff --git a/Media.h b/Media.h
index 4d9b89e..e0fc446 100644
--- a/Media.h
+++ b/Media.h
@@ -14,10 +14,14 @@
#include <vector>
#include <iostream>
+#include <libskindesignerapi/osdelements.h>
+#include <memory>
#include "XmlObject.h" // Base class: model::XmlObject
#include "Stream.h"
+
+
using Poco::XML::DOMParser;
using Poco::XML::Document;
using Poco::XML::NodeIterator;
@@ -47,7 +51,7 @@ public:
std::string m_sAudioCodec;
std::string m_sVideoCodec;
std::string m_sContainer;
- double m_VideoFrameRate;
+ std::string m_VideoFrameRate;
std::string m_sPartKey;
int m_iPartId;
@@ -57,6 +61,8 @@ public:
std::string m_sPartContainer;
std::vector<Stream> m_vStreams;
+
+ void AddTokens(std::shared_ptr<skindesignerapi::cOsdElement> grid);
};
}
diff --git a/PVideo.cpp b/PVideo.cpp
index aaf0547..73f1837 100644
--- a/PVideo.cpp
+++ b/PVideo.cpp
@@ -217,6 +217,7 @@ void Video::AddTokens(std::shared_ptr<skindesignerapi::cOsdElement> grid, bool c
grid->AddStringToken("summary", m_sSummary);
grid->AddStringToken("contentrating", m_sContentRating);
grid->AddStringToken("studio", m_sStudio);
+ grid->AddIntToken("viewCount", m_iViewCount);
grid->AddIntToken("viewoffset", m_lViewoffset/1000/60);
grid->AddIntToken("duration", m_iDuration/1000/60);
grid->AddIntToken("year", m_iYear);
@@ -268,6 +269,8 @@ void Video::AddTokens(std::shared_ptr<skindesignerapi::cOsdElement> grid, bool c
}
}
}
+
+ m_Media.AddTokens(grid);
}
std::string Video::ArtUri()
diff --git a/hlsPlayer.cpp b/hlsPlayer.cpp
index ed3fe2a..4a19a2a 100644
--- a/hlsPlayer.cpp
+++ b/hlsPlayer.cpp
@@ -609,7 +609,7 @@ void cHlsPlayer::Stop(void)
double cHlsPlayer::FramesPerSecond(void)
{
- return m_Video.m_Media.m_VideoFrameRate > 0 ? m_Video.m_Media.m_VideoFrameRate : DEFAULTFRAMESPERSECOND;
+ return m_Video.m_Media.m_VideoFrameRate == "24p" ? 24 : DEFAULTFRAMESPERSECOND;
}
void cHlsPlayer::JumpRelative(int seconds)
diff --git a/plex.cpp b/plex.cpp
index 5ce9bc0..72d40e0 100644
--- a/plex.cpp
+++ b/plex.cpp
@@ -69,12 +69,13 @@ bool cMyPlugin::Start(void)
reg.SetViewElement(viRootView, verInfopane, "infopane");
reg.SetViewElement(viRootView, verFooter, "footer");
reg.SetViewElement(viRootView, verWatch, "time");
-/*
- reg.SetSubView(viRootView, viDetailView, "detail.xml");
- reg.SetViewElement(viDetailView, vedBackground, "background");
- reg.SetViewElement(viDetailView, vedHeader, "header");
- reg.SetViewElement(viDetailView, vedFooter, "footer");
-*/
+ reg.SetViewElement(viRootView, verMessage, "message");
+ /*
+ reg.SetSubView(viRootView, viDetailView, "detail.xml");
+ reg.SetViewElement(viDetailView, vedBackground, "background");
+ reg.SetViewElement(viDetailView, vedHeader, "header");
+ reg.SetViewElement(viDetailView, vedFooter, "footer");
+ */
if (skindesignerapi::SkindesignerAPI::RegisterPlugin(&reg)) {
m_pSdCheck = new cPlexSdOsd();
cMyPlugin::bSkindesigner = m_pSdCheck->SdSupport();
@@ -178,15 +179,10 @@ void cMyPlugin::PlayFile(plexclient::Video Vid)
{
isyslog("[plex]: play file '%s'\n", Vid.m_sKey.c_str());
if(Vid.m_iMyPlayOffset == 0 && Vid.m_lViewoffset > 0 ) {
- if(cMyPlugin::bSkindesigner) {
- // we have skindesigner
-
- } else {
- cString message = cString::sprintf(tr("To start from %ld minutes, press Ok."), Vid.m_lViewoffset / 60000);
- eKeys response = Skins.Message(eMessageType::mtInfo, message, 5);
- if(response == kOk) {
- Vid.m_iMyPlayOffset = Vid.m_lViewoffset/1000;
- }
+ cString message = cString::sprintf(tr("To start from %ld minutes, press Ok."), Vid.m_lViewoffset / 60000);
+ eKeys response = Skins.Message(eMessageType::mtInfo, message, 5);
+ if(response == kOk) {
+ Vid.m_iMyPlayOffset = Vid.m_lViewoffset/1000;
}
}
cControl* control = cHlsPlayerControl::Create(Vid);
diff --git a/plexSdOsd.cpp b/plexSdOsd.cpp
index 949eb81..27f8157 100644
--- a/plexSdOsd.cpp
+++ b/plexSdOsd.cpp
@@ -9,11 +9,15 @@ cMutex cPlexSdOsd::RedrawMutex;
cPlexSdOsd::cPlexSdOsd()
{
+ m_pRootView = NULL;
}
cPlexSdOsd::~cPlexSdOsd()
{
- m_pBrowserGrid->Clear();
+ if(m_pBrowserGrid)
+ m_pBrowserGrid->Clear();
+ if(m_pMessage)
+ m_pMessage->Clear();
cPictureCache::GetInstance().RemoveAll();
delete m_pRootView;
}
@@ -46,6 +50,8 @@ void cPlexSdOsd::Show(void)
}
m_pBrowserGrid = std::shared_ptr<cBrowserGrid>(new cBrowserGrid(m_pRootView));
+ m_pMessage = std::shared_ptr<skindesignerapi::cViewElement>(m_pRootView->GetViewElement(eViewElementsRoot::verMessage));
+ m_messageDisplayed = false;
Flush();
}
@@ -59,60 +65,91 @@ eOSState cPlexSdOsd::ProcessKey(eKeys Key)
{
eOSState state = eOSState::osContinue;
plexclient::Video* vid = dynamic_cast<plexclient::Video*>(m_pBrowserGrid->SelectedObject());
-
+
if (m_pBrowserGrid->DrawTime())
- m_pBrowserGrid->Flush();
-
- switch (Key & ~k_Repeat) {
- case kUp:
- m_pBrowserGrid->NavigateUp();
- Flush();
- break;
- case kDown:
- m_pBrowserGrid->NavigateDown();
- Flush();
- break;
- case kLeft:
- m_pBrowserGrid->NavigateLeft();
- Flush();
- break;
- case kRight:
- m_pBrowserGrid->NavigateRight();
- Flush();
- break;
- case kOk:
- // Play movie or change dir
- state = m_pBrowserGrid->NavigateSelect();
- Flush();
- break;
- case kBack:
- state = m_pBrowserGrid->NavigateBack();
- Flush();
- break;
- case kRed:
- if(vid) {
- if(vid->m_iViewCount > 0) vid->SetUnwatched();
- else vid->SetWatched();
- vid->UpdateFromServer();
+ m_pBrowserGrid->Flush();
+
+ if(m_messageDisplayed) {
+ switch (Key & ~k_Repeat) {
+ case kOk:
+ vid->m_iMyPlayOffset = vid->m_lViewoffset/1000;
+ m_messageDisplayed = false;
+ state = eOSState::osUser1;
+ break;
+ case kBack:
+ vid->m_lViewoffset = 0;
+ state = eOSState::osUser1;
+ default:
+ break;
+ }
+ } else {
+
+ switch (Key & ~k_Repeat) {
+ case kUp:
+ m_pBrowserGrid->NavigateUp();
+ Flush();
+ break;
+ case kDown:
+ m_pBrowserGrid->NavigateDown();
+ Flush();
+ break;
+ case kLeft:
+ m_pBrowserGrid->NavigateLeft();
+ Flush();
+ break;
+ case kRight:
+ m_pBrowserGrid->NavigateRight();
+ Flush();
+ break;
+ case kOk:
+ // Play movie or change dir
+ state = m_pBrowserGrid->NavigateSelect();
Flush();
+ break;
+ case kBack:
+ state = m_pBrowserGrid->NavigateBack();
+ Flush();
+ break;
+ case kRed:
+ if(vid) {
+ if(vid->m_iViewCount > 0) vid->SetUnwatched();
+ else vid->SetWatched();
+ vid->UpdateFromServer();
+ Flush();
+ }
+ break;
+ case kGreen:
+ m_pBrowserGrid->PrevTab();
+ Flush();
+ break;
+ case kYellow:
+ m_pBrowserGrid->NextTab();
+ Flush();
+ break;
+ default:
+ break;
}
- break;
- case kGreen:
- m_pBrowserGrid->PrevTab();
- Flush();
- break;
- case kYellow:
- m_pBrowserGrid->NextTab();
- Flush();
- break;
- default:
- break;
+
}
if(state == eOSState::osUser1) {
- //plexclient::ActionManager::GetInstance().AddAction(*vid);
- cMyPlugin::PlayFile(*vid);
- state = eOSState::osEnd;
+ if(vid->m_iMyPlayOffset == 0 && vid->m_lViewoffset > 0 ) {
+ cString message = cString::sprintf(tr("'Ok' to start from %ld minutes, 'Back' to start from beginning."), vid->m_lViewoffset / 60000);
+ DrawMessage(std::string(message));
+ m_messageDisplayed = true;
+ } else {
+ cMyPlugin::PlayFile(*vid);
+ state = eOSState::osEnd;
+ }
}
return state;
}
+
+void cPlexSdOsd::DrawMessage(std::string message)
+{
+ m_pMessage->ClearTokens();
+ m_pMessage->AddStringToken("message", message);
+ m_pMessage->AddIntToken("displaymessage", true);
+ m_pMessage->Display();
+ m_pRootView->Display();
+}
diff --git a/plexSdOsd.h b/plexSdOsd.h
index 585e7e2..dc33160 100644
--- a/plexSdOsd.h
+++ b/plexSdOsd.h
@@ -30,7 +30,8 @@ enum eViewElementsRoot {
verHeader,
verFooter,
verInfopane,
- verWatch
+ verWatch,
+ verMessage
};
enum eViewGrids {
@@ -47,6 +48,8 @@ class cPlexSdOsd : public skindesignerapi::cSkindesignerOsdObject
{
private:
std::shared_ptr<cBrowserGrid> m_pBrowserGrid;
+ std::shared_ptr<skindesignerapi::cViewElement> m_pMessage;
+ bool m_messageDisplayed;
skindesignerapi::cOsdView* m_pRootView;
@@ -54,6 +57,7 @@ private:
void SwitchGrid(ePlexMenuTab currentTab);
void DrawBackground();
void DrawFooter();
+ void DrawMessage(std::string message);
public:
cPlexSdOsd();
diff --git a/po/de_DE.po b/po/de_DE.po
index 05500c9..9c82233 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-plex 0.1.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2015-04-06 19:45+0200\n"
-"PO-Revision-Date: 2015-03-05 20:08+0200\n"
+"POT-Creation-Date: 2015-05-03 17:16+0200\n"
+"PO-Revision-Date: 2015-05-03 17:17+0200\n"
"Last-Translator: Chris <zerov83@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: de\n"
@@ -19,10 +19,10 @@ msgstr ""
"X-Generator: Virtaal 0.7.1\n"
msgid "Prev. Tab"
-msgstr ""
+msgstr "Letzter Tab"
msgid "Next Tab"
-msgstr ""
+msgstr "Nächster Tab"
msgid "Unscrobble"
msgstr "Ungesehen"
@@ -46,19 +46,19 @@ msgid "Plex Password"
msgstr "Plex Passwort"
msgid "Use Custom Server"
-msgstr ""
+msgstr "Nutze eigenen Server"
msgid "Server Host"
-msgstr ""
+msgstr "Server Hostname/IP"
msgid "Server Port"
-msgstr ""
+msgstr "Server Port"
msgid "Grid Columns"
-msgstr ""
+msgstr "Raster Spalten"
msgid "Grid Rows"
-msgstr ""
+msgstr "Raster Reihen"
msgid "Current UUID"
msgstr "Aktuelle UUID"
@@ -112,6 +112,11 @@ msgstr "Kein Plexmediaserver gefunden."
msgid "Browse Plex"
msgstr "Durchsuche Plex"
+#, c-format
+msgid "'Ok' to start from %ld minutes, 'Back' to start from beginning."
+msgstr ""
+"'Ok' um von %ld weiter zu schauen, 'Zurück' um von Beginn an zu starten."
+
msgid "All Movies"
msgstr "Alle Filme"
@@ -186,3 +191,6 @@ msgstr "Kürzlich angesehene Folgen"
msgid "Recently Viewed Shows"
msgstr "Kürzlich angesehene Serien"
+
+msgid "Library"
+msgstr "Bibliothek"
diff --git a/skins/blackhole/xmlfiles/plug-plex-root.xml b/skins/blackhole/xmlfiles/plug-plex-root.xml
index 50e302c..64cbf60 100644
--- a/skins/blackhole/xmlfiles/plug-plex-root.xml
+++ b/skins/blackhole/xmlfiles/plug-plex-root.xml
@@ -21,6 +21,19 @@
</viewelement>
+ <!-- Available Variables message:
+ {displaymessage} bool: message displayed?
+ {message} string: message to display
+ -->
+ <viewelement name="message">
+ <area condition="{displaymessage}" x="5%" y="80%" width="90%" height="15%" layer="98">
+ <drawimage imagetype="skinpart" path="messageblue" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area condition="{displaymessage}" x="5%" y="80%" width="90%" height="15%" layer="99">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="40%" color="{clrWhite}" text="{message}" />
+ </area>
+ </viewelement>
+
<!-- Tokens available in background
{selecteditembackground} image
@@ -47,12 +60,14 @@
</viewelement>
<viewelement name="infopane">
- <area layer="2" x="75%" y="15%" width="25%" height="75%">
+ <area layer="2" x="75%" y="15%" width="25%" height="70%">
<drawtext x="1%" y="2%" width="98%" font="{light}" fontsize="5%" color="{clrWhite}" text="{title}" />
<drawimage condition="{hasart}++not{isepisode}" imagetype="image" path="{art}" x="0" y="8%" width="100%" height="35%" />
<drawimage condition="{hasthumb}++{isepisode}" imagetype="image" path="{thumb}" x="0" y="8%" width="100%" height="35%" />
- <drawtextbox condition="isset{summary}" x="1%" y="40%" width="96%" float="topright" font="{light}" fontsize="4%" color="{clrWhite}" text="{summary}" />
</area>
+ <areascroll orientation="vertical" mode="forthandback" delay="1000" scrollspeed="medium" x="75%" y="50%" width="25%" height="40%" layer="3">
+ <drawtextbox condition="isset{summary}" x="0%" y="0%" width="100%" font="{light}" fontsize="8%" color="{clrWhite}" text="{summary}" />
+ </areascroll>
</viewelement>
<!-- Tokens available in browser
@@ -97,6 +112,18 @@
{summary} Description, plot, summary
{studio} Studio
{year} Year of production
+ {viewCount} Unseen if less than 1
+
+ {videoResolution} string (sd, 720, 1080)
+ {bitrate} int
+ {width} int
+ {height} int
+ {audioChannels} int
+ {aspectRatio} string (1.33, 1.78, 1.85, 2.35)
+ {audioCodec} string (mp3, mp2, ac3, dca) hint: dca==DTS
+ {videoCodec} string (mpeg4, msmpeg4, h264)
+ {container} string (avi, mp4, mkv)
+ {videoFrameRate} string (PAL, NTSC, 24p)
{ismovie}
{isepisode}
@@ -128,7 +155,7 @@
<drawrectangle x="0" y="{height(thumb)}" width="{viewoffset}/{duration}*{areawidth}" height="2%" color="{clrBlue}" />
<drawtext condition="eq({viewgroup}, 4)" name="title" x="0" y="{height(thumb)}*1.1" width="100%" font="{bold}" fontsize="6%" color="{clrWhite}" text="{title}" />
<drawtext condition="lt({viewgroup}, 4)" name="title" x="0" y="{height(thumb)}*1.1" width="100%" font="{bold}" fontsize="6%" color="{clrWhite}" text="{seriestitle}" />
- <drawtext name="season" x="0" y="{posy(title)} + {height(title)}" width="50%" font="{light}" fontsize="6%" color="{clrWhite}" text="{printf('S%02d E%d02', season, episode)}" />
+ <drawtext name="season" x="0" y="{posy(title)} + {height(title)}" width="50%" font="{light}" fontsize="6%" color="{clrWhite}" text="{printf('S%02d E%02d', season, episode)}" />
</area>
<area layer="3" condition="{isdirectory}" >
<drawimage name="thumb" condition="not{hasthumb}" imagetype="skinpart" path="plexplaceholder" x="0" y="0" width="100%" height="76%" />
diff --git a/templates/plug-plex-root.xml b/templates/plug-plex-root.xml
index ba7cd16..3a8d7bf 100644
--- a/templates/plug-plex-root.xml
+++ b/templates/plug-plex-root.xml
@@ -20,6 +20,13 @@
<viewelement name="time">
</viewelement>
+ <!-- Available Variables message:
+ {displaymessage} bool: message displayed?
+ {message} string: message to display
+ -->
+ <viewelement name="message">
+ </viewelement>
+
<!-- Tokens available in background
{selecteditembackground} image
@@ -80,6 +87,18 @@
{summary} Description, plot, summary
{studio} Studio
{year} Year of production
+ {viewCount} Unseen if less than 1
+
+ {videoResolution} string (sd, 720, 1080)
+ {bitrate} int
+ {width} int
+ {height} int
+ {audioChannels} int
+ {aspectRatio} string (1.33, 1.78, 1.85, 2.35)
+ {audioCodec} string (aac, mp3, mp2, ac3, dca) hint: dca==DTS
+ {videoCodec} string (mpeg4, msmpeg4, h264)
+ {container} string (avi, mp4, mkv)
+ {videoFrameRate} string (PAL, NTSC, 24p)
{ismovie}
{isepisode}