diff options
Diffstat (limited to 'pages/ibox.ecpp')
-rw-r--r-- | pages/ibox.ecpp | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/pages/ibox.ecpp b/pages/ibox.ecpp new file mode 100644 index 0000000..badd690 --- /dev/null +++ b/pages/ibox.ecpp @@ -0,0 +1,177 @@ +<%pre> +#include <vdr/plugin.h> +#include <vdr/config.h> +#include <vdr/recording.h> +#include <vdr/channels.h> +#include <vdr/menu.h> +#include <vdr/device.h> + +#include "exception.h" +#include "tools.h" +#include "epg_events.h" + +using namespace vdrlive; +using namespace std; + +</%pre> +<%args> + int update; +</%args> +<%cpp> + EpgEvents epgEvents; + string EMPTY_STR; + tChannelID prev_chan; + tChannelID next_chan; + + reply.setContentType( "application/xml" ); + + if (cReplayControl::NowReplaying()) { + cThreadLock RecordingsLock(&Recordings); + cRecording *Recording = Recordings.GetByName(cReplayControl::NowReplaying()); + if (Recording) { + const cRecordingInfo* info = Recording->Info(); + if (info) { + EpgEventPtr epgEvent(new EpgEvent("recording", + Recording->Name(), + info->Title() ? info->Title() : Recording->Name(), + info->ShortText() ? info->ShortText() : "", + info->Description() ? info->Description() : "", + Recording->start, + Recording->start)); + epgEvents.push_back(epgEvent); + } + } + } + else { + string CHANNEL_STR("channel"); + ReadLock channelsLock( Channels ); + + if (cDevice::CurrentChannel()) { + cChannel* Channel = Channels.GetByNumber(cDevice::CurrentChannel()); + + cChannel* tmp = Channels.GetByNumber(Channels.GetPrevNormal(cDevice::CurrentChannel())); + if (tmp) + prev_chan = tmp->GetChannelID(); + tmp = Channels.GetByNumber(Channels.GetNextNormal(cDevice::CurrentChannel())); + if (tmp) + next_chan = tmp->GetChannelID(); + + string chanName(Channel->Name()); + cSchedulesLock schedulesLock; + const cSchedules* Schedules = cSchedules::Schedules(schedulesLock); + const cSchedule *Schedule = Schedules->GetSchedule(Channel); + + if (Schedule) { + const cEvent *Event = Schedule->GetPresentEvent(); + if (Event) { + EpgEventPtr epgEvent(new EpgEvent(CHANNEL_STR, + Event, + Channel->Name())); + epgEvents.push_back(epgEvent); + } + else { + string noInfo(tr("no epg info for current event!")); + EpgEventPtr epgEvent(new EpgEvent(CHANNEL_STR, + chanName, + noInfo, + EMPTY_STR, EMPTY_STR, + time(0), + time(0))); + epgEvents.push_back(epgEvent); + } + } + else { + string noInfo(tr("no epg info for current channel!")); + EpgEventPtr epgEvent(new EpgEvent(CHANNEL_STR, + Channel->Name(), + noInfo, + EMPTY_STR, EMPTY_STR, + time(0), + time(0))); + epgEvents.push_back(epgEvent); + } + } + else { + string chanName(tr("no current channel!")); + EpgEventPtr epgEvent(new EpgEvent(CHANNEL_STR, + chanName, + chanName, + EMPTY_STR, EMPTY_STR, + time(0), + time(0))); + epgEvents.push_back(epgEvent); + } + } + if (epgEvents.size() == 0) { + string ERROR_STR("error"); + string noInfo(tr("error retrieving status info!")); + string chanName(tr("no current channel!")); + EpgEventPtr epgEvent(new EpgEvent(ERROR_STR, + chanName, + noInfo, + EMPTY_STR, EMPTY_STR, + time(0), + time(0))); + epgEvents.push_back(epgEvent); + } + for (vector<EpgEventPtr>::iterator i = epgEvents.begin(); i != epgEvents.end(); ++i) { + EpgEventPtr epg = *i; + if (prev_chan.Valid() && next_chan.Valid()) + { +</%cpp> +<& xmlresponse update=(update) type=(epg->Id()) caption=(epg->Caption()) currentTime=(epg->CurrentTime(tr("%I:%M:%S %p"))) duration=(epg->StartTime(tr("%I:%M %p")) + string(" - ") + epg->EndTime(tr("%I:%M %p"))) title=(epg->Title()) elapsed=(epg->Elapsed()) prev_chan=(prev_chan) next_chan=(next_chan) &> +<%cpp> + } + else if (prev_chan.Valid()) { +</%cpp> +<& xmlresponse update=(update) type=(epg->Id()) caption=(epg->Caption()) currentTime=(epg->CurrentTime(tr("%I:%M:%S %p"))) duration=(epg->StartTime(tr("%I:%M %p")) + string(" - ") + epg->EndTime(tr("%I:%M %p"))) title=(epg->Title()) elapsed=(epg->Elapsed()) prev_chan=(prev_chan) &> +<%cpp> + } + else if (next_chan.Valid()) { +</%cpp> +<& xmlresponse update=(update) type=(epg->Id()) caption=(epg->Caption()) currentTime=(epg->CurrentTime(tr("%I:%M:%S %p"))) duration=(epg->StartTime(tr("%I:%M %p")) + string(" - ") + epg->EndTime(tr("%I:%M %p"))) title=(epg->Title()) elapsed=(epg->Elapsed()) next_chan=(next_chan) &> +<%cpp> + } + else { +</%cpp> +<& xmlresponse update=(update) type=(epg->Id()) caption=(epg->Caption()) currentTime=(epg->CurrentTime(tr("%I:%M:%S %p"))) duration=(epg->StartTime(tr("%I:%M %p")) + string(" - ") + epg->EndTime(tr("%I:%M %p"))) title=(epg->Title()) elapsed=(epg->Elapsed()) &> +<%cpp> + } + break; + } +</%cpp> + +<%def xmlresponse> +<%args> + int update; + string type; + string currentTime; + string caption; + string title; + string duration; + int elapsed; + string prev_chan; + string next_chan; +</%args> +<?xml version="1.0"?> +<service> + <request name="ibox"> + <param name="update"><$ update $></param> + </request> + <response>1</response> + <error></error> + <values> + <update><$ update $></update> + <epginfo> + <type><$ type $></type> + <caption><$ caption $></caption> + <timenow><$ currentTime $></timenow> + <name><$ title $></name> + <duration><$ duration $></duration> + <elapsed><$ elapsed $></elapsed> + <nextchan><$ next_chan $></nextchan> + <prevchan><$ prev_chan $></prevchan> + </epginfo> + </values> +</service> +</%def> |