From 6f14ddae8a91feed5272cd475f320bf9a9ca9214 Mon Sep 17 00:00:00 2001 From: kamel5 Date: Mon, 13 Jul 2020 11:49:21 +0200 Subject: [PATCH] Refactor reruns --- config.c | 2 + config.h | 1 + coreengine/viewdetail.c | 117 +++++++++++++++++++--------------------- coreengine/viewdetail.h | 3 +- po/de_DE.po | 5 +- po/fi_FI.po | 5 +- po/it_IT.po | 5 +- setup.c | 4 ++ setup.h | 3 +- 9 files changed, 77 insertions(+), 68 deletions(-) diff --git a/config.c b/config.c index bb4bff7..9ee0083 100644 --- a/config.c +++ b/config.c @@ -16,6 +16,7 @@ cDesignerConfig::cDesignerConfig() { debugImageLoading = 0; replaceDecPoint = false; //settings for rerun display + useSubtitleRerun = 0; rerunAmount = 10; rerunDistance = 2; rerunMaxChannel = 0; @@ -510,6 +511,7 @@ bool cDesignerConfig::SetupParse(const char *Name, const char *Value) { else if (!strcasecmp(Name, "LimitChannelLogoCache")) limitLogoCache = atoi(Value); else if (!strcasecmp(Name, "NumberLogosInitially")) numLogosPerSizeInitial = atoi(Value); else if (!strcasecmp(Name, "NumberLogosMax")) numLogosMax = atoi(Value); + else if (!strcasecmp(Name, "UseSubtitleRerun")) useSubtitleRerun = atoi(Value); else if (!strcasecmp(Name, "RerunAmount")) rerunAmount = atoi(Value); else if (!strcasecmp(Name, "RerunDistance")) rerunDistance = atoi(Value); else if (!strcasecmp(Name, "RerunMaxChannel")) rerunMaxChannel = atoi(Value); diff --git a/config.h b/config.h index 39efc52..50860de 100644 --- a/config.h +++ b/config.h @@ -110,6 +110,7 @@ public: int limitLogoCache; int numLogosMax; int debugImageLoading; + int useSubtitleRerun; int rerunAmount; int rerunDistance; int rerunMaxChannel; diff --git a/coreengine/viewdetail.c b/coreengine/viewdetail.c index 0bb8555..db9cbc1 100644 --- a/coreengine/viewdetail.c +++ b/coreengine/viewdetail.c @@ -353,13 +353,15 @@ bool cViewDetailEpg::Parse(bool forced) { tokenContainer->AddIntToken((int)eDmDetailedEpgIT::year, sStartTime->tm_year + 1900); tokenContainer->AddIntToken((int)eDmDetailedEpgIT::daynumeric, sStartTime->tm_mday); tokenContainer->AddIntToken((int)eDmDetailedEpgIT::month, sStartTime->tm_mon+1); + const cChannel* channel = NULL; #if defined (APIVERSNUM) && (APIVERSNUM >= 20301) + { LOCK_CHANNELS_READ; - const cChannels* channels = Channels; + channel = Channels->GetByChannelID(event->ChannelID()); + } #else - cChannels* channels = &Channels; + channel = Channels.GetByChannelID(event->ChannelID()); #endif - const cChannel *channel = channels->GetByChannelID(event->ChannelID()); if (channel) { tokenContainer->AddStringToken((int)eDmDetailedEpgST::channelname, channel->Name()); tokenContainer->AddIntToken((int)eDmDetailedEpgIT::channelnumber, channel->Number()); @@ -385,7 +387,10 @@ bool cViewDetailEpg::Parse(bool forced) { tokenContainer->AddStringToken((int)eDmDetailedEpgST::vps, *event->GetVpsString()); cList *reruns = LoadReruns(); - int numReruns = NumReruns(reruns); + int numReruns = 0; + if (reruns && reruns->Count() > 0) + numReruns = reruns->Count(); + vector loopInfo; //num reruns loopInfo.push_back(numReruns); @@ -395,7 +400,7 @@ bool cViewDetailEpg::Parse(bool forced) { loopInfo.push_back(numActors); tokenContainer->CreateLoopTokenContainer(&loopInfo); if (numReruns > 0) { - tokenContainer->AddIntToken((int)eDmDetailedEpgIT::hasreruns, 1); + tokenContainer->AddIntToken((int)eDmDetailedEpgIT::hasreruns, numReruns); SetReruns(reruns); } if (scrapInfoAvailable) { @@ -411,88 +416,75 @@ cList *cViewDetailEpg::LoadR if (!epgSearchPlugin) return NULL; - if (isempty(event->Title())) + if (!event || isempty(event->Title())) return NULL; Epgsearch_searchresults_v1_0 data; - data.query = (char*)event->Title(); + std::string strQuery = event->Title(); + + if (config.useSubtitleRerun && !isempty(event->ShortText())) { + strQuery += "~"; + strQuery += event->ShortText(); + } + + data.query = (char *)strQuery.c_str(); data.mode = 0; data.channelNr = 0; data.useTitle = true; data.useSubTitle = true; data.useDescription = false; - cList *result = NULL; - if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) - result = data.pResultList; - return result; -} - -int cViewDetailEpg::NumReruns(cList *reruns) { - if (!reruns || reruns->Count() < 2) - return 0; - int maxNumReruns = config.rerunAmount; int rerunDistance = config.rerunDistance * 3600; int rerunMaxChannel = config.rerunMaxChannel; int i = 0; - for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = reruns->First(); r && i < maxNumReruns; r = reruns->Next(r)) { - time_t eventStart = event->StartTime(); - time_t rerunStart = r->event->StartTime(); + + cList *reruns = NULL; + if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) { + cList *result = data.pResultList; + if (result) { + for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = result->First(); r && i < maxNumReruns; r = result->Next(r)) { + time_t eventStart = event->StartTime(); + time_t rerunStart = r->event->StartTime(); #if defined (APIVERSNUM) && (APIVERSNUM >= 20301) - LOCK_CHANNELS_READ; - const cChannels* channels = Channels; + LOCK_CHANNELS_READ; + const cChannel *channel = Channels->GetByChannelID(r->event->ChannelID(), true, true); #else - cChannels* channels = &Channels; + const cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true); #endif - const cChannel *channel = channels->GetByChannelID(r->event->ChannelID(), true, true); - //check for identical event - if ((event->ChannelID() == r->event->ChannelID()) && (eventStart == rerunStart)) - continue; - //check for timely distance - if (rerunDistance > 0) - if (rerunStart - eventStart < rerunDistance) - continue; - //check for maxchannel - if (rerunMaxChannel > 0) - if (channel && channel->Number() > rerunMaxChannel) - continue; - i++; + //check for identical event + if ((event->ChannelID() == r->event->ChannelID()) && (eventStart == rerunStart)) + continue; + //check for timely distance + if (rerunDistance > 0) + if (rerunStart - eventStart < rerunDistance) + continue; + //check for maxchannel + if (rerunMaxChannel > 0) + if (channel && channel->Number() > rerunMaxChannel) + continue; + if (!reruns) reruns = new cList; + reruns->Add(r); + i++; + } + } } - return i; + return reruns; } void cViewDetailEpg::SetReruns(cList *reruns) { - if (!reruns || reruns->Count() < 2) + if (!reruns || reruns->Count() < 1) return; - int maxNumReruns = config.rerunAmount; - int rerunDistance = config.rerunDistance * 3600; - int rerunMaxChannel = config.rerunMaxChannel; - int i = 0; - for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = reruns->First(); r && i < maxNumReruns; r = reruns->Next(r)) { - time_t eventStart = event->StartTime(); - time_t rerunStart = r->event->StartTime(); + for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = reruns->First(); r; r = reruns->Next(r)) { #if defined (APIVERSNUM) && (APIVERSNUM >= 20301) LOCK_CHANNELS_READ; - const cChannels* channels = Channels; + const cChannel *channel = Channels->GetByChannelID(r->event->ChannelID(), true, true); #else - cChannels* channels = &Channels; + const cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true); #endif - const cChannel *channel = channels->GetByChannelID(r->event->ChannelID(), true, true); - //check for identical event - if ((event->ChannelID() == r->event->ChannelID()) && (eventStart == rerunStart)) - continue; - //check for timely distance - if (rerunDistance > 0) - if (rerunStart - eventStart < rerunDistance) - continue; - //check for maxchannel - if (rerunMaxChannel > 0) - if (channel && channel->Number() > rerunMaxChannel) - continue; tokenContainer->AddLoopToken(rerunsIndex, i, (int)eRerunsLT::title, r->event->Title()); tokenContainer->AddLoopToken(rerunsIndex, i, (int)eRerunsLT::shorttext, r->event->ShortText()); tokenContainer->AddLoopToken(rerunsIndex, i, (int)eRerunsLT::start, *(r->event->GetTimeString())); @@ -511,6 +503,8 @@ void cViewDetailEpg::SetReruns(cListAddLoopToken(rerunsIndex, i, (int)eRerunsLT::channelname, ""); tokenContainer->AddLoopToken(rerunsIndex, i, (int)eRerunsLT::channelnumber, ""); } + if (r == reruns->Last()) + break; i++; } } @@ -812,11 +806,10 @@ void cViewDetailRec::SetRecInfos(void) { if (info) { #if defined (APIVERSNUM) && (APIVERSNUM >= 20301) LOCK_CHANNELS_READ; - const cChannels* channels = Channels; + const cChannel *channel = Channels->GetByChannelID(info->ChannelID()); #else - cChannels* channels = &Channels; + const cChannel *channel = Channels.GetByChannelID(info->ChannelID()); #endif - const cChannel *channel = channels->GetByChannelID(info->ChannelID()); if (channel) { tokenContainer->AddStringToken((int)eDmDetailedRecST::recchannelname, channel->Name()); tokenContainer->AddStringToken((int)eDmDetailedRecST::recchannelid, *channel->GetChannelID().ToString()); diff --git a/coreengine/viewdetail.h b/coreengine/viewdetail.h index 0d53a5a..25e558b 100644 --- a/coreengine/viewdetail.h +++ b/coreengine/viewdetail.h @@ -44,7 +44,6 @@ protected: int rerunsIndex; int actorsIndex; cList *LoadReruns(void); - int NumReruns(cList *reruns); void SetReruns(cList *reruns); void SetEpgPictures(int eventId); public: @@ -112,4 +111,4 @@ public: void Set(skindesignerapi::cTokenContainer *tk); bool Parse(bool forced = false); }; -#endif //__VIEWDETAIL_H \ No newline at end of file +#endif //__VIEWDETAIL_H diff --git a/po/de_DE.po b/po/de_DE.po index cc10989..ed3ed5e 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: vdr-skindesigner 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-03 07:31+0200\n" +"POT-Creation-Date: 2020-07-15 13:04+0200\n" "PO-Revision-Date: 2014-09-27 11:02+0200\n" "Last-Translator: Louis Braun \n" "Language-Team: \n" @@ -96,6 +96,9 @@ msgstr "Maximale Anzahl Custom Tokens" msgid "Reruns" msgstr "Wiederholungen" +msgid "Use Subtitle for reruns" +msgstr "Untertitel vergleichen" + msgid "Maximum number of reruns to display" msgstr "Anzahl anzuzeigender Wiederholungen" diff --git a/po/fi_FI.po b/po/fi_FI.po index a94f013..c28beb4 100644 --- a/po/fi_FI.po +++ b/po/fi_FI.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: vdr-skindesigner 0.2.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-03 07:31+0200\n" +"POT-Creation-Date: 2020-07-15 13:04+0200\n" "PO-Revision-Date: 2015-01-25 01:25+0200\n" "Last-Translator: Rolf Ahrenberg\n" "Language-Team: Finnish\n" @@ -96,6 +96,9 @@ msgstr "Mukautettujen tokenien maksimimäärä" msgid "Reruns" msgstr "Uusinnat" +msgid "Use Subtitle for reruns" +msgstr "" + msgid "Maximum number of reruns to display" msgstr "Näytettävien uusintojen maksimimäärä" diff --git a/po/it_IT.po b/po/it_IT.po index 7a3a937..b639395 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: vdr-skindesigner 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-03 07:31+0200\n" +"POT-Creation-Date: 2020-07-15 13:04+0200\n" "PO-Revision-Date: 2015-08-09 11:02+0200\n" "Last-Translator: fiveten_59\n" "Language-Team: Italian\n" @@ -96,6 +96,9 @@ msgstr "Numero massimo di token personalizzati" msgid "Reruns" msgstr "Riavvii" +msgid "Use Subtitle for reruns" +msgstr "" + msgid "Maximum number of reruns to display" msgstr "NUmero massimo di riavvii da visualizzare" diff --git a/setup.c b/setup.c index f62af7b..c24d7d7 100644 --- a/setup.c +++ b/setup.c @@ -128,6 +128,7 @@ cSkinDesignerSetup::cSkinDesignerSetup(skindesignerapi::cPluginStructure *skinPr limitLogoCache = config.limitLogoCache; numLogosMax = config.numLogosMax; debugImageLoading = config.debugImageLoading; + useSubtitleRerun = config.useSubtitleRerun; rerunAmount = config.rerunAmount; rerunDistance = config.rerunDistance; rerunMaxChannel = config.rerunMaxChannel; @@ -269,6 +270,7 @@ void cSkinDesignerSetup::Store(void) { config.limitLogoCache = limitLogoCache; config.numLogosMax = numLogosMax; config.debugImageLoading = debugImageLoading; + config.useSubtitleRerun = useSubtitleRerun; config.rerunAmount = rerunAmount; config.rerunDistance = rerunDistance; config.rerunMaxChannel = rerunMaxChannel; @@ -294,6 +296,7 @@ void cSkinDesignerSetup::Store(void) { SetupStore("LimitChannelLogoCache", limitLogoCache); SetupStore("NumberLogosInitially", numLogosPerSizeInitial); SetupStore("NumberLogosMax", numLogosMax); + SetupStore("UseSubtitleRerun", useSubtitleRerun); SetupStore("RerunAmount", rerunAmount); SetupStore("RerunDistance", rerunDistance); SetupStore("RerunMaxChannel", rerunMaxChannel); @@ -315,6 +318,7 @@ void cSkinDesignerSetup::PluginSetup(void) { Add(new cMenuEditIntItem(tr("Maximum number of custom tokens"), &numCustomTokens, 0, 100)); Add(InfoItem(tr("Reruns"))); + Add(new cMenuEditBoolItem(tr("Use Subtitle for reruns"), &useSubtitleRerun)); Add(new cMenuEditIntItem(tr("Maximum number of reruns to display"), &rerunAmount, 1, 100)); Add(new cMenuEditIntItem(tr("Minimum timely distance of rerun (in hours)"), &rerunDistance, 0, 1000)); Add(new cMenuEditIntItem(tr("Limit Channel Numbers"), &rerunMaxChannel, 0, 1000, tr("no limit"))); diff --git a/setup.h b/setup.h index 5df80a9..ed199c7 100644 --- a/setup.h +++ b/setup.h @@ -45,6 +45,7 @@ private: int limitLogoCache; int numLogosMax; int debugImageLoading; + int useSubtitleRerun; int rerunAmount; int rerunDistance; int rerunMaxChannel; @@ -124,4 +125,4 @@ public: static void DefineTokens(skindesignerapi::cTokenContainer *tk); void Display(void); }; -#endif //__SKINDESIGNER_SETUP_H \ No newline at end of file +#endif //__SKINDESIGNER_SETUP_H