Refactor reruns

This commit is contained in:
kamel5 2020-07-13 11:49:21 +02:00
parent f156e44599
commit 6f14ddae8a
9 changed files with 77 additions and 68 deletions

View File

@ -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);

View File

@ -110,6 +110,7 @@ public:
int limitLogoCache;
int numLogosMax;
int debugImageLoading;
int useSubtitleRerun;
int rerunAmount;
int rerunDistance;
int rerunMaxChannel;

View File

@ -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<Epgsearch_searchresults_v1_0::cServiceSearchResult> *reruns = LoadReruns();
int numReruns = NumReruns(reruns);
int numReruns = 0;
if (reruns && reruns->Count() > 0)
numReruns = reruns->Count();
vector<int> 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<Epgsearch_searchresults_v1_0::cServiceSearchResult> *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<Epgsearch_searchresults_v1_0::cServiceSearchResult> *result = NULL;
if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data))
result = data.pResultList;
return result;
}
int cViewDetailEpg::NumReruns(cList<Epgsearch_searchresults_v1_0::cServiceSearchResult> *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<Epgsearch_searchresults_v1_0::cServiceSearchResult> *reruns = NULL;
if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) {
cList<Epgsearch_searchresults_v1_0::cServiceSearchResult> *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<Epgsearch_searchresults_v1_0::cServiceSearchResult>;
reruns->Add(r);
i++;
}
}
}
return i;
return reruns;
}
void cViewDetailEpg::SetReruns(cList<Epgsearch_searchresults_v1_0::cServiceSearchResult> *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(cList<Epgsearch_searchresults_v1_0::cServiceSearc
tokenContainer->AddLoopToken(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());

View File

@ -44,7 +44,6 @@ protected:
int rerunsIndex;
int actorsIndex;
cList<Epgsearch_searchresults_v1_0::cServiceSearchResult> *LoadReruns(void);
int NumReruns(cList<Epgsearch_searchresults_v1_0::cServiceSearchResult> *reruns);
void SetReruns(cList<Epgsearch_searchresults_v1_0::cServiceSearchResult> *reruns);
void SetEpgPictures(int eventId);
public:
@ -112,4 +111,4 @@ public:
void Set(skindesignerapi::cTokenContainer *tk);
bool Parse(bool forced = false);
};
#endif //__VIEWDETAIL_H
#endif //__VIEWDETAIL_H

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-skindesigner 0.0.1\n"
"Report-Msgid-Bugs-To: <see README>\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 <louis.braun@gmx.de>\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"

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-skindesigner 0.2.0\n"
"Report-Msgid-Bugs-To: <see README>\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ä"

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-skindesigner 0.0.1\n"
"Report-Msgid-Bugs-To: <see README>\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"

View File

@ -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")));

View File

@ -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
#endif //__SKINDESIGNER_SETUP_H