diff --git a/HISTORY b/HISTORY
index 2d735b3..6e0fd83 100644
--- a/HISTORY
+++ b/HISTORY
@@ -26,4 +26,5 @@ Version 0.0.2
- added setup option to choose Menu Item display method between "at one go" and "after one another"
- fixed bug that new skin was not properly loaded sometimes when skin was changed in OSD Setup menu
- fixed bug that new font was displayed first after VDR restart when font was changed in OSD Setup menu
-- display always newest recording of folders in recordings list, thanks@ Lars Hanisch for providing the patch
\ No newline at end of file
+- display always newest recording of folders in recordings list, thanks@ Lars Hanisch for providing the patch
+- added extented recording information
diff --git a/Makefile b/Makefile
index 171cf53..1bd789c 100644
--- a/Makefile
+++ b/Makefile
@@ -76,6 +76,7 @@ OBJS = $(PLUGIN).o \
libcore/helpers.o \
libcore/imageloader.o \
libcore/recfolderinfo.o \
+ libcore/extrecinfo.o \
libcore/timers.o \
libtemplate/globals.o \
libtemplate/parameter.o \
diff --git a/extrecinfo/template.txt b/extrecinfo/template.txt
new file mode 100644
index 0000000..5a7e76b
--- /dev/null
+++ b/extrecinfo/template.txt
@@ -0,0 +1,4 @@
+General;
+Video;%Width%%Height%%DisplayAspectRatio/String%%Codec%%Format_Commercial%%FrameRate%%Interlacement%
+Audio;
+File_End;
diff --git a/libcore/extrecinfo.c b/libcore/extrecinfo.c
new file mode 100644
index 0000000..435d43b
--- /dev/null
+++ b/libcore/extrecinfo.c
@@ -0,0 +1,96 @@
+#include "../config.h"
+#include "helpers.h"
+#include "extrecinfo.h"
+
+cExtRecInfo::cExtRecInfo(const char *xml) {
+ this->xml = xml;
+}
+
+cExtRecInfo::~cExtRecInfo(void) {
+
+}
+
+bool cExtRecInfo::Parse(void) {
+ //read media info
+ string mediaInfoXml;
+ StripXmlTag(xml, mediaInfoXml, "mediainfo");
+ if (mediaInfoXml.size() == 0) {
+ return false;
+ }
+ StripXmlTag(mediaInfoXml, resWidth, "res_width");
+ StripXmlTag(mediaInfoXml, resHeight, "res_height");
+ resString = GetScreenResolutionString(resWidth, resHeight, &isHD);
+ StripXmlTag(mediaInfoXml, aspectratio, "aspectratio");
+ isWideScreen = !aspectratio.compare("16:9");
+ StripXmlTag(mediaInfoXml, codec, "codec");
+ StripXmlTag(mediaInfoXml, format, "format");
+ StripXmlTag(mediaInfoXml, framerate, "framerate");
+ StripXmlTag(mediaInfoXml, interlace, "interlace");
+
+ size_t found = 0;
+ isDolby = false;
+ do {
+ string track;
+ found = StripXmlTag(mediaInfoXml, track, "track", found);
+ if (found == string::npos)
+ break;
+ tAudioTrack sTrack;
+ StripXmlTag(track, sTrack.codec, "codec");
+ StripXmlTag(track, sTrack.bitrate, "bitrate");
+ StripXmlTag(track, sTrack.language, "language");
+ if (!sTrack.codec.compare("AC-3"))
+ isDolby = true;
+ tracks.push_back(sTrack);
+ } while (found != string::npos);
+
+ return true;
+}
+
+//get content of ... inside xml
+size_t cExtRecInfo::StripXmlTag(string &xmlstring, string &content, const char *tag, int start) {
+ // set the search strings
+ stringstream strStart, strStop;
+ strStart << "<" << tag << ">";
+ strStop << "" << tag << ">";
+ // find the strings
+ size_t locStart = xmlstring.find(strStart.str(), start);
+ size_t locStop = xmlstring.find(strStop.str(), start);
+ if (locStart == string::npos || locStop == string::npos)
+ return string::npos;
+ // extract relevant text
+ int pos = locStart + strStart.str().size();
+ int len = locStop - pos;
+
+ content = (len < 0) ? "" : xmlstring.substr(pos, len);
+ return locStop + strStop.str().size();
+}
+
+size_t cExtRecInfo::StripXmlTag(string &xmlstring, int &content, const char *tag, int start) {
+ // set the search strings
+ stringstream strStart, strStop;
+ strStart << "<" << tag << ">";
+ strStop << "" << tag << ">";
+ // find the strings
+ size_t locStart = xmlstring.find(strStart.str(), start);
+ size_t locStop = xmlstring.find(strStop.str(), start);
+ if (locStart == string::npos || locStop == string::npos)
+ return string::npos;
+ // extract relevant text
+ int pos = locStart + strStart.str().size();
+ int len = locStop - pos;
+
+ string value = (len < 0) ? "" : xmlstring.substr(pos, len);
+ content = atoi(value.c_str());
+ return locStop + strStop.str().size();
+}
+
+void cExtRecInfo::Debug(void) {
+ dsyslog("skindesigner: extRecInfo xml: %s", xml.c_str());
+ dsyslog("skindesigner: : res_width %d, res_height %d, res %s, aspectratio %s, codec %s, format %s, framerate %s, interlace %s, hd %s, widescreen %s",
+ resWidth, resHeight, resString.c_str(), aspectratio.c_str(), codec.c_str(), format.c_str(), framerate.c_str(), interlace.c_str(),
+ isHD ? "true": "false", isWideScreen ? "true" : "false");
+ int numTrack = 1;
+ for (vector::iterator it = tracks.begin(); it != tracks.end(); it++) {
+ dsyslog("skindesigner: audio track %d, codec %s, bitrate %s, language: %s", numTrack++, (*it).codec.c_str(), (*it).bitrate.c_str(), (*it).language.c_str());
+ }
+}
diff --git a/libcore/extrecinfo.h b/libcore/extrecinfo.h
new file mode 100644
index 0000000..9fb5bab
--- /dev/null
+++ b/libcore/extrecinfo.h
@@ -0,0 +1,36 @@
+#ifndef __EXTRECINFO_H
+#define __EXTRECINFO_H
+
+#include
+
+struct tAudioTrack {
+ string codec;
+ string bitrate;
+ string language;
+};
+
+class cExtRecInfo {
+private:
+ string xml;
+ size_t StripXmlTag(string &xmlstring, string &content, const char *tag, int start = 0);
+ size_t StripXmlTag(string &xmlstring, int &content, const char *tag, int start = 0);
+public:
+ cExtRecInfo(const char *xml);
+ ~cExtRecInfo(void);
+ bool Parse(void);
+ void Debug(void);
+ int resWidth;
+ int resHeight;
+ string resString;
+ bool isHD;
+ string aspectratio;
+ bool isWideScreen;
+ string codec;
+ string format;
+ string framerate;
+ string interlace;
+ bool isDolby;
+ vector< tAudioTrack > tracks;
+};
+
+#endif // __EXTRECINFO_H
\ No newline at end of file
diff --git a/libcore/helpers.c b/libcore/helpers.c
index c8e7fe2..1934f3e 100644
--- a/libcore/helpers.c
+++ b/libcore/helpers.c
@@ -175,3 +175,46 @@ void cStopWatch::Report(const char* message) {
void cStopWatch::Stop(const char* message) {
dsyslog("skindesigner: %s - needed %d ms", message, (int)(cTimeMs::Now() - start));
}
+
+//View Helpers
+string GetScreenResolutionString(int width, int height, bool *isHD) {
+ string name = "";
+ switch (width) {
+ case 1920:
+ case 1440:
+ name = "hd1080i";
+ *isHD = true;
+ break;
+ case 1280:
+ if (height == 720)
+ name = "hd720p";
+ else
+ name = "hd1080i";
+ *isHD = true;
+ break;
+ case 720:
+ name = "sd576i";
+ break;
+ default:
+ name = "sd576i";
+ break;
+ }
+ return name;
+}
+
+string GetScreenAspectString(double aspect, bool *isWideScreen) {
+ string name = "";
+ *isWideScreen = false;
+ if (aspect == 4.0/3.0) {
+ name = "4:3";
+ *isWideScreen = false;
+ } else if (aspect == 16.0/9.0) {
+ name = "16:9";
+ *isWideScreen = true;
+ } else if (aspect == 2.21) {
+ name = "21:9";
+ *isWideScreen = true;
+ }
+ return name;
+}
+
diff --git a/libcore/helpers.h b/libcore/helpers.h
index 884738d..f489555 100644
--- a/libcore/helpers.h
+++ b/libcore/helpers.h
@@ -37,4 +37,8 @@ public:
void Report(const char* message);
void Stop(const char* message);
};
+
+string GetScreenResolutionString(int width, int height, bool *isHD);
+string GetScreenAspectString(double aspect, bool *isWideScreen);
+
#endif // __HELPERS_H
diff --git a/views/displaychannelview.c b/views/displaychannelview.c
index 6a68e25..880f9a1 100644
--- a/views/displaychannelview.c
+++ b/views/displaychannelview.c
@@ -309,47 +309,6 @@ void cDisplayChannelView::ClearScreenResolution(void) {
lastScreenHeight = 0;
}
-string cDisplayChannelView::GetScreenResolutionString(int width, int height, bool *isHD) {
- string name = "";
- switch (width) {
- case 1920:
- case 1440:
- name = "hd1080i";
- *isHD = true;
- break;
- case 1280:
- if (height == 720)
- name = "hd720p";
- else
- name = "hd1080i";
- *isHD = true;
- break;
- case 720:
- name = "sd576i";
- break;
- default:
- name = "sd576i";
- break;
- }
- return name;
-}
-
-string cDisplayChannelView::GetScreenAspectString(double aspect, bool *isWideScreen) {
- string name = "";
- *isWideScreen = false;
- if (aspect == 4.0/3.0) {
- name = "4:3";
- *isWideScreen = false;
- } else if (aspect == 16.0/9.0) {
- name = "16:9";
- *isWideScreen = true;
- } else if (aspect == 2.21) {
- name = "21:9";
- *isWideScreen = true;
- }
- return name;
-}
-
void cDisplayChannelView::DrawScraperContent(const cEvent *event) {
if (!event)
return;
diff --git a/views/displaychannelview.h b/views/displaychannelview.h
index c87c2a1..7df085d 100644
--- a/views/displaychannelview.h
+++ b/views/displaychannelview.h
@@ -16,8 +16,6 @@ private:
int lastAudioChannel;
string lastTracDesc;
string lastTrackLang;
- string GetScreenResolutionString(int width, int height, bool *isHD);
- string GetScreenAspectString(double aspect, bool *isWideScreen);
string GetChannelSep(const cChannel *channel, bool prev);
virtual void Action(void);
public:
diff --git a/views/displaymenuitemcurrentview.c b/views/displaymenuitemcurrentview.c
index 876c3a5..d9263c4 100644
--- a/views/displaymenuitemcurrentview.c
+++ b/views/displaymenuitemcurrentview.c
@@ -1,6 +1,7 @@
#include "../services/scraper2vdr.h"
#include "../libcore/helpers.h"
#include "../libcore/recfolderinfo.h"
+#include "../libcore/extrecinfo.h"
#include "displaymenuitemcurrentview.h"
@@ -504,6 +505,8 @@ void cDisplayMenuItemCurrentRecordingView::Prepare(void) {
void cDisplayMenuItemCurrentRecordingView::Render(void) {
if (!recording)
return;
+ map < string, vector< map< string, string > > > loopTokens;
+
bool isFolder = (total > 0) ? true : false;
intTokens.insert(pair("folder", isFolder));
@@ -553,9 +556,44 @@ void cDisplayMenuItemCurrentRecordingView::Render(void) {
SetScraperPoster(NULL, usedRecording);
+
const cRecordingInfo *info = usedRecording->Info();
if (!info) return;
-
+
+ bool extRecinfoAvailable = false;
+ if (info->Aux()) {
+ cExtRecInfo extRecInfo(info->Aux());
+ if (extRecInfo.Parse()) {
+ extRecinfoAvailable = true;
+ intTokens.insert(pair("screenwidth", extRecInfo.resWidth));
+ intTokens.insert(pair("screenheight", extRecInfo.resHeight));
+ intTokens.insert(pair("isHD", extRecInfo.isHD));
+ intTokens.insert(pair("isWideScreen", extRecInfo.isWideScreen));
+ intTokens.insert(pair("isDolby", extRecInfo.isDolby));
+ stringTokens.insert(pair("resolution", extRecInfo.resString));
+ stringTokens.insert(pair("aspect", extRecInfo.aspectratio));
+ stringTokens.insert(pair("codec", extRecInfo.codec));
+ stringTokens.insert(pair("format", extRecInfo.format));
+ stringTokens.insert(pair("framerate", extRecInfo.framerate));
+ stringTokens.insert(pair("interlace", extRecInfo.interlace));
+ intTokens.insert(pair("numtracks", extRecInfo.tracks.size()));
+ vector< map > trackTokens;
+ int trackNumber = 1;
+ for (vector::iterator track = extRecInfo.tracks.begin(); track != extRecInfo.tracks.end(); track++) {
+ map element;
+ stringstream trackNum;
+ trackNum << trackNumber++;
+ element.insert(pair("track[num]", trackNum.str()));
+ element.insert(pair("track[codec]", (*track).codec));
+ element.insert(pair("track[bitrate]", (*track).bitrate));
+ element.insert(pair("track[language]", (*track).language));
+ trackTokens.push_back(element);
+ }
+ loopTokens.insert(pair > >("track", trackTokens));
+ }
+ }
+ intTokens.insert(pair("extrecinfoavailable", extRecinfoAvailable));
+
stringTokens.insert(pair("shorttext", info->ShortText() ? info->ShortText() : ""));
stringTokens.insert(pair("description", info->Description() ? info->Description() : ""));
@@ -588,7 +626,7 @@ void cDisplayMenuItemCurrentRecordingView::Render(void) {
intTokens.insert(pair("durationeventhours", duration / 60));
stringTokens.insert(pair("durationeventminutes", *cString::sprintf("%.2d", duration%60)));
SetTokensPosMenuItem();
- DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens);
+ DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens, &loopTokens);
}
void cDisplayMenuItemCurrentRecordingView::Clear(void) {
diff --git a/views/displayreplayview.c b/views/displayreplayview.c
index bea64b7..0995dfe 100644
--- a/views/displayreplayview.c
+++ b/views/displayreplayview.c
@@ -333,44 +333,3 @@ void cDisplayReplayView::Action(void) {
DoFlush();
cView::Action();
}
-
-string cDisplayReplayView::GetScreenResolutionString(int width, int height, bool *isHD) {
- string name = "";
- switch (width) {
- case 1920:
- case 1440:
- name = "hd1080i";
- *isHD = true;
- break;
- case 1280:
- if (height == 720)
- name = "hd720p";
- else
- name = "hd1080i";
- *isHD = true;
- break;
- case 720:
- name = "sd576i";
- break;
- default:
- name = "sd576i";
- break;
- }
- return name;
-}
-
-string cDisplayReplayView::GetScreenAspectString(double aspect, bool *isWideScreen) {
- string name = "";
- *isWideScreen = false;
- if (aspect == 4.0/3.0) {
- name = "4:3";
- *isWideScreen = false;
- } else if (aspect == 16.0/9.0) {
- name = "16:9";
- *isWideScreen = true;
- } else if (aspect == 2.21) {
- name = "21:9";
- *isWideScreen = true;
- }
- return name;
-}
\ No newline at end of file
diff --git a/views/displayreplayview.h b/views/displayreplayview.h
index 9c81917..750ec95 100644
--- a/views/displayreplayview.h
+++ b/views/displayreplayview.h
@@ -7,8 +7,6 @@
class cDisplayReplayView : public cView {
private:
cString lastDate;
- string GetScreenResolutionString(int width, int height, bool *isHD);
- string GetScreenAspectString(double aspect, bool *isWideScreen);
virtual void Action(void);
public:
cDisplayReplayView(cTemplateView *tmplView);