vdr-plugin-tvguide/detailview.c

177 lines
5.5 KiB
C
Raw Normal View History

2013-01-17 13:16:44 +01:00
#include "detailview.h"
cDetailView::cDetailView(const cEvent *event, cFooter *footer) : cThread("DetailView") {
2013-07-09 00:17:42 +02:00
this->event = event;
this->footer = footer;
2013-01-17 13:16:44 +01:00
}
cDetailView::~cDetailView(void){
Cancel(3);
2013-08-25 13:57:10 +02:00
while (Active())
cCondWait::SleepMs(10);
#if VDRVERSNUM >= 20301
2018-03-08 13:02:38 +01:00
LOCK_CHANNELS_READ;
footer->LeaveDetailedViewMode(Channels->GetByChannelID(event->ChannelID()));
#else
footer->LeaveDetailedViewMode(Channels.GetByChannelID(event->ChannelID()));
2018-03-08 13:02:38 +01:00
#endif
2014-05-11 09:00:21 +02:00
if (view)
delete view;
2013-01-17 13:16:44 +01:00
}
2014-05-11 09:00:21 +02:00
void cDetailView::InitiateView(void) {
2018-03-08 13:10:09 +01:00
static cPlugin *pScraper = GetScraperPlugin();
2014-05-11 09:00:21 +02:00
ScraperGetEventType call;
if (!event)
return;
call.event = event;
2018-03-08 13:10:09 +01:00
if (!pScraper) {
2014-05-11 09:00:21 +02:00
view = new cEPGView();
2018-03-08 13:10:09 +01:00
} else if (pScraper->Service("GetEventType", &call)) {
2014-05-11 09:00:21 +02:00
if (call.type == tMovie) {
view = new cMovieView(call.movieId);
} else if (call.type == tSeries) {
view = new cSeriesView(call.seriesId, call.episodeId);
} else {
view = new cEPGView();
}
2013-12-21 11:25:03 +01:00
} else {
2014-05-11 09:00:21 +02:00
view = new cEPGView();
}
view->SetTitle(event->Title());
view->SetSubTitle(event->ShortText());
view->SetInfoText(event->Description());
cString dateTime;
time_t vps = event->Vps();
if (vps) {
dateTime = cString::sprintf("%s %s - %s (%d %s) VPS: %s", *event->GetDateString(), *event->GetTimeString(), *event->GetEndTimeString(), event->Duration()/60, tr("min"), *TimeString(vps));
2013-07-20 13:46:26 +02:00
} else {
2014-05-11 09:00:21 +02:00
dateTime = cString::sprintf("%s %s - %s (%d %s)", *event->GetDateString(), *event->GetTimeString(), *event->GetEndTimeString(), event->Duration()/60, tr("min"));
2013-07-20 13:46:26 +02:00
}
2014-05-11 09:00:21 +02:00
view->SetDateTime(*dateTime);
#if VDRVERSNUM >= 20301
2018-03-08 13:02:38 +01:00
LOCK_CHANNELS_READ;
view->SetChannel(Channels->GetByChannelID(event->ChannelID(), true));
#else
2014-05-11 09:00:21 +02:00
view->SetChannel(Channels.GetByChannelID(event->ChannelID(), true));
2018-03-08 13:02:38 +01:00
#endif
2014-05-11 09:00:21 +02:00
view->SetEventID(event->EventID());
view->SetEvent(event);
2013-01-17 13:16:44 +01:00
}
2014-05-11 09:00:21 +02:00
std::string cDetailView::LoadReruns(void) {
if (!event)
return "";
2013-05-26 11:38:05 +02:00
2013-05-26 17:44:04 +02:00
cPlugin *epgSearchPlugin = cPluginManager::GetPlugin("epgsearch");
2014-05-11 09:00:21 +02:00
if (!epgSearchPlugin)
return "";
2013-05-26 17:44:04 +02:00
2014-05-11 09:00:21 +02:00
if (isempty(event->Title()))
return "";
std::stringstream sstrReruns;
sstrReruns << tr("Reruns of ") << "\"" << event->Title() << "\":" << std::endl << std::endl;
2014-05-11 09:00:21 +02:00
Epgsearch_searchresults_v1_0 data;
std::string strQuery = event->Title();
2013-08-25 13:57:10 +02:00
2019-07-11 11:28:11 +02:00
if (config.displayRerunsDetailEPGView > 0) {
if (config.useSubtitleRerun == 2 && !isempty(event->ShortText())) {
2014-05-11 09:00:21 +02:00
strQuery += "~";
strQuery += event->ShortText();
2013-08-25 13:57:10 +02:00
}
2014-05-11 09:00:21 +02:00
data.useSubTitle = true;
} else {
data.useSubTitle = false;
}
data.query = (char *)strQuery.c_str();
data.mode = 0;
data.channelNr = 0;
data.useTitle = true;
data.useDescription = false;
bool foundRerun = false;
if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) {
cList<Epgsearch_searchresults_v1_0::cServiceSearchResult>* list = data.pResultList;
if (list && (list->Count() > 1)) {
foundRerun = true;
int i = 0;
2019-07-11 11:28:11 +02:00
for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = list->First(); r && i < config.numReruns; r = list->Next(r)) {
2014-05-11 09:00:21 +02:00
if ((event->ChannelID() == r->event->ChannelID()) && (event->StartTime() == r->event->StartTime()))
continue;
i++;
sstrReruns << *DayDateTime(r->event->StartTime());
#if VDRVERSNUM >= 20301
2018-03-08 13:02:38 +01:00
LOCK_CHANNELS_READ;
const cChannel *channel = Channels->GetByChannelID(r->event->ChannelID(), true, true);
#else
2014-05-11 09:00:21 +02:00
cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true);
2018-03-08 13:02:38 +01:00
#endif
2014-05-11 09:00:21 +02:00
if (channel) {
sstrReruns << ", " << trVDR("Channel") << " " << channel->Number() << ":";
sstrReruns << " " << channel->ShortName(true);
}
sstrReruns << "\n" << r->event->Title();
if (!isempty(r->event->ShortText()))
sstrReruns << "~" << r->event->ShortText();
sstrReruns << std::endl << std::endl;
}
2014-05-11 09:00:21 +02:00
delete list;
2013-08-25 13:57:10 +02:00
}
}
2014-05-11 09:00:21 +02:00
if (!foundRerun) {
sstrReruns << std::endl << tr("No reruns found");
2013-08-25 13:57:10 +02:00
}
2014-05-11 09:00:21 +02:00
return sstrReruns.str();
2013-08-25 13:57:10 +02:00
}
2014-05-11 09:00:21 +02:00
void cDetailView::Action(void) {
InitiateView();
if (!view)
2013-08-25 13:57:10 +02:00
return;
2014-05-11 09:00:21 +02:00
view->SetFonts();
view->SetGeometry();
view->LoadMedia();
view->Start();
if (event)
view->SetAdditionalInfoText(LoadReruns());
2013-08-25 13:57:10 +02:00
}
2013-07-09 00:17:42 +02:00
eOSState cDetailView::ProcessKey(eKeys Key) {
eOSState state = osContinue;
2014-05-11 09:00:21 +02:00
if (Running())
return state;
2013-07-09 00:17:42 +02:00
switch (Key & ~k_Repeat) {
2014-05-11 09:00:21 +02:00
case kUp: {
bool scrolled = view->KeyUp();
if (scrolled) {
view->DrawScrollbar();
2019-11-10 15:37:28 +01:00
osdManager.Flush();
2014-05-11 09:00:21 +02:00
}
break; }
case kDown: {
bool scrolled = view->KeyDown();
if (scrolled) {
view->DrawScrollbar();
2019-11-10 15:37:28 +01:00
osdManager.Flush();
2014-05-11 09:00:21 +02:00
}
break; }
case kLeft:
2014-05-11 09:00:21 +02:00
view->KeyLeft();
view->Start();
break;
case kRight:
2014-05-11 09:00:21 +02:00
view->KeyRight();
view->Start();
break;
2013-07-09 00:17:42 +02:00
case kOk:
case kBack:
state = osEnd;
2013-05-26 11:38:05 +02:00
break;
2013-01-17 13:16:44 +01:00
}
2013-07-09 00:17:42 +02:00
return state;
2019-07-11 11:07:13 +02:00
}