From 2c17177f2faa9e03d29fad3e0e4d9b0a827ca401 Mon Sep 17 00:00:00 2001 From: louis Date: Mon, 20 Oct 2014 17:35:52 +0200 Subject: [PATCH] added extented recording information --- HISTORY | 3 +- Makefile | 1 + extrecinfo/template.txt | 4 ++ libcore/extrecinfo.c | 96 ++++++++++++++++++++++++++++++ libcore/extrecinfo.h | 36 +++++++++++ libcore/helpers.c | 43 +++++++++++++ libcore/helpers.h | 4 ++ views/displaychannelview.c | 41 ------------- views/displaychannelview.h | 2 - views/displaymenuitemcurrentview.c | 42 ++++++++++++- views/displayreplayview.c | 41 ------------- views/displayreplayview.h | 2 - 12 files changed, 226 insertions(+), 89 deletions(-) create mode 100644 extrecinfo/template.txt create mode 100644 libcore/extrecinfo.c create mode 100644 libcore/extrecinfo.h 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;%Format_Commercial%%BitRate%%Language% +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 << ""; + // 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 << ""; + // 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);