diff options
author | chriszero <zerov83@gmail.com> | 2015-05-03 17:20:03 +0200 |
---|---|---|
committer | chriszero <zerov83@gmail.com> | 2015-05-03 17:20:03 +0200 |
commit | f7196f23bc0ed500dcf1f60b794caa9a9f76a751 (patch) | |
tree | 7fcab9a27a06ca43818e9cdd63977769753fb92f | |
parent | 6708c32ab31bb90781bb5e3743cb81ae72748edd (diff) | |
download | vdr-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.cpp | 16 | ||||
-rw-r--r-- | Media.h | 8 | ||||
-rw-r--r-- | PVideo.cpp | 3 | ||||
-rw-r--r-- | hlsPlayer.cpp | 2 | ||||
-rw-r--r-- | plex.cpp | 26 | ||||
-rw-r--r-- | plexSdOsd.cpp | 135 | ||||
-rw-r--r-- | plexSdOsd.h | 6 | ||||
-rw-r--r-- | po/de_DE.po | 26 | ||||
-rw-r--r-- | skins/blackhole/xmlfiles/plug-plex-root.xml | 33 | ||||
-rw-r--r-- | templates/plug-plex-root.xml | 19 |
10 files changed, 194 insertions, 80 deletions
@@ -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); +} + } @@ -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); }; } @@ -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) @@ -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(®)) { 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} |