From: Andreas Monzner Date: Sat, 25 Feb 2006 01:35:04 +0000 (+0000) Subject: store a .eit file for each recoring this holds raw eit event informations X-Git-Tag: 2.6.0~3989 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/673d85e4aace04805fe958bbe8cb741b21ccbc1b store a .eit file for each recoring this holds raw eit event informations including audio track informations, event description, event title...... for information about the file format look in EN300468 (www.etsi.org) make info button useable when playbacking a movie --- diff --git a/RecordTimer.py b/RecordTimer.py index 9bb1da71..cf4160cc 100644 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -86,7 +86,10 @@ class RecordTimerEntry(timer.TimerEntry): self.log(1, "'record service' failed") return False else: - prep_res = self.record_service.prepare(self.Filename + ".ts") + event_id = self.eit + if event_id is None: + event_id = -1 + prep_res = self.record_service.prepare(self.Filename + ".ts", self.begin, self.end, event_id ) if prep_res: self.log(2, "'prepare' failed: error %d" % prep_res) self.record_service = None diff --git a/lib/dvb/eit.cpp b/lib/dvb/eit.cpp index 9f3169f9..fa776b94 100644 --- a/lib/dvb/eit.cpp +++ b/lib/dvb/eit.cpp @@ -32,6 +32,15 @@ void eDVBServiceEITHandler::EITready(int error) m_eit_changed(); } +void eDVBServiceEITHandler::inject(ePtr &event, int nownext) +{ + if (nownext) + m_event_next = event; + else + m_event_now = event; + m_eit_changed(); +} + eDVBServiceEITHandler::eDVBServiceEITHandler() { CONNECT(m_EIT.tableReady, eDVBServiceEITHandler::EITready); diff --git a/lib/dvb/eit.h b/lib/dvb/eit.h index bc52e146..2c065ab2 100644 --- a/lib/dvb/eit.h +++ b/lib/dvb/eit.h @@ -17,7 +17,8 @@ class eDVBServiceEITHandler: public Object ePtr m_event_now, m_event_next; public: eDVBServiceEITHandler(); - + + void inject(ePtr &event, int nownext); void start(iDVBDemux *demux, int sid); void startOther(iDVBDemux *demux, int sid); diff --git a/lib/python/Screens/EventView.py b/lib/python/Screens/EventView.py index ba4ea57e..01695dfb 100644 --- a/lib/python/Screens/EventView.py +++ b/lib/python/Screens/EventView.py @@ -12,13 +12,17 @@ class EventViewBase: def __init__(self, Event, Ref, callback=None): self.cbFunc = callback self.currentService=Ref + self.isRecording = len(Ref.ref.getPath()) self.event = Event self["epg_description"] = ScrollLabel() self["datetime"] = Label() self["channel"] = Label() self["duration"] = Label() self["key_red"] = Button("") - self["key_green"] = Button(_("Add timer")) + if self.isRecording: + self["key_green"] = Button("") + else: + self["key_green"] = Button(_("Add timer")) self["key_yellow"] = Button("") self["key_blue"] = Button("") self["actions"] = ActionMap(["OkCancelActions", "EventViewActions"], @@ -46,8 +50,9 @@ class EventViewBase: self.cbFunc(self.setEvent, self.setService, +1) def timerAdd(self): - newEntry = RecordTimerEntry(self.currentService, *parseEvent(self.event)) - self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry) + if not self.isRecording: + newEntry = RecordTimerEntry(self.currentService, *parseEvent(self.event)) + self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry) def timerEditFinished(self, answer): if (answer[0]): @@ -57,11 +62,14 @@ class EventViewBase: def setService(self, service): self.currentService=service - name = self.currentService.getServiceName() - if name is not None: - self["channel"].setText(name) + if self.isRecording: + self["channel"].setText(_("Recording")) else: - self["channel"].setText(_("unknown service")) + name = self.currentService.getServiceName() + if name is not None: + self["channel"].setText(name) + else: + self["channel"].setText(_("unknown service")) def setEvent(self, event): self.event = event diff --git a/lib/python/Screens/InfoBar.py b/lib/python/Screens/InfoBar.py index 66996c6a..cfc35294 100644 --- a/lib/python/Screens/InfoBar.py +++ b/lib/python/Screens/InfoBar.py @@ -16,7 +16,7 @@ from Screens.InfoBarGenerics import InfoBarShowHide, \ InfoBarEPG, InfoBarEvent, InfoBarServiceName, InfoBarSeek, InfoBarInstantRecord, \ InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, \ InfoBarSubserviceSelection, InfoBarTuner, InfoBarShowMovies, InfoBarTimeshift, \ - InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport + InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView from Screens.HelpMenu import HelpableScreen, HelpMenu @@ -66,7 +66,7 @@ class InfoBar(Screen, InfoBarShowHide, InfoBarPowerKey, class MoviePlayer(Screen, InfoBarShowHide, InfoBarPowerKey, \ InfoBarMenu, \ InfoBarServiceName, InfoBarSeek, InfoBarShowMovies, InfoBarAudioSelection, HelpableScreen, InfoBarNotifications, - InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport): + InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView): def __init__(self, session, service): Screen.__init__(self, session) @@ -78,7 +78,7 @@ class MoviePlayer(Screen, InfoBarShowHide, InfoBarPowerKey, \ for x in HelpableScreen, InfoBarShowHide, InfoBarPowerKey, InfoBarMenu, \ InfoBarServiceName, InfoBarSeek, InfoBarShowMovies, \ - InfoBarAudioSelection, InfoBarNotifications, \ + InfoBarAudioSelection, InfoBarNotifications, InfoBarSimpleEventView, \ InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport: x.__init__(self) diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 308dcf1e..195f6d0a 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -18,7 +18,7 @@ from EpgSelection import EPGSelection from Screens.MessageBox import MessageBox from Screens.Dish import Dish from Screens.Standby import Standby -from Screens.EventView import EventViewEPGSelect +from Screens.EventView import EventViewEPGSelect, EventViewSimple from Screens.MinuteInput import MinuteInput from Components.Harddisk import harddiskmanager @@ -326,6 +326,35 @@ class InfoBarMenu: assert menu.tagName == "menu", "root element in menu must be 'menu'!" self.session.open(MainMenu, menu, menu.childNodes) +class InfoBarSimpleEventView: + """ Opens the Eventview for now/next """ + def __init__(self): + self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions", + { + "showEventInfo": (self.openEventView, _("show event details")), + }) + + def openEventView(self): + self.epglist = [ ] + service = self.session.nav.getCurrentService() + ref = self.session.nav.getCurrentlyPlayingServiceReference() + info = service.info() + ptr=info.getEvent(0) + if ptr: + self.epglist.append(ptr) + ptr=info.getEvent(1) + if ptr: + self.epglist.append(ptr) + if len(self.epglist) > 0: + self.session.open(EventViewSimple, self.epglist[0], ServiceReference(ref), self.eventViewCallback) + + def eventViewCallback(self, setEvent, setService, val): #used for now/next displaying + if len(self.epglist) > 1: + tmp = self.epglist[0] + self.epglist[0]=self.epglist[1] + self.epglist[1]=tmp + setEvent(self.epglist[0]) + class InfoBarEPG: """ EPG - Opens an EPG list when the showEPGList action fires """ def __init__(self): @@ -959,17 +988,19 @@ class InfoBarInstantRecord: event = None try: service = self.session.nav.getCurrentService() - info = service.info() - ev = info.getEvent(0) - event = ev + epg = eEPGCache.getInstance() + event = epg.lookupEventTime(serviceref, -1, 0) + if event is None: + info = service.info() + ev = info.getEvent(0) + event = ev except: pass - + if event is not None: data = parseEvent(event) begin = time.time() end = begin + 3600 * 10 - data = (begin, end, data[2], data[3], data[4]) else: data = (time.time(), time.time() + 3600 * 10, "instant record", "", None) diff --git a/lib/service/iservice.h b/lib/service/iservice.h index bc0fc974..436d3554 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -444,7 +444,7 @@ class iRecordableService: public iObject ~iRecordableService(); #endif public: - virtual RESULT prepare(const char *filename)=0; + virtual RESULT prepare(const char *filename, time_t begTime=-1, time_t endTime=-1, int eit_event_id=-1)=0; virtual RESULT start()=0; virtual RESULT stop()=0; }; diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 3d551016..f9bb877f 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,8 @@ #include #include +#include + #ifndef BYTE_ORDER #error no byte order defined! #endif @@ -248,6 +251,7 @@ RESULT eDVBPVRServiceOfflineOperations::getListOfFilenames(std::list -1 ) + { + __u8 buf[4096]; + int rd = ::read(fd, buf, 4096); + ::close(fd); + if ( rd > 12 /*EIT_LOOP_SIZE*/ ) + { + Event ev(buf); + ePtr event = new eServiceEvent; + ePtr empty; + event->parseFrom(&ev, (service.getTransportStreamID().get()<<16)|service.getOriginalNetworkID().get()); + m_event_handler.inject(event, 0); + m_event_handler.inject(empty, 1); + eDebug("injected"); + } + } + } m_event(this, evStart); m_event((iPlayableService*)this, evSeekableStatusChanged); return 0; diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp index bded7cc9..a0359351 100644 --- a/lib/service/servicedvbrecord.cpp +++ b/lib/service/servicedvbrecord.cpp @@ -1,5 +1,6 @@ #include #include +#include #include @@ -37,11 +38,54 @@ void eDVBServiceRecord::serviceEvent(int event) } } -RESULT eDVBServiceRecord::prepare(const char *filename) +RESULT eDVBServiceRecord::prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id) { m_filename = filename; if (m_state == stateIdle) - return doPrepare(); + { + int ret = doPrepare(); + if (!ret) + { + eEPGCache::getInstance()->Lock(); + const eit_event_struct *event = 0; + if ( eit_event_id != -1 ) + { + eDebug("query epg event id %d", eit_event_id); + eEPGCache::getInstance()->lookupEventId(m_ref, eit_event_id, event); + } + if ( !event && (begTime != -1 && endTime != -1) ) + { + time_t queryTime = begTime + ((endTime-begTime)/2); + tm beg, end, query; + localtime_r(&begTime, &beg); + localtime_r(&endTime, &end); + localtime_r(&queryTime, &query); + eDebug("query stime %d:%d:%d, etime %d:%d:%d, qtime %d:%d:%d", + beg.tm_hour, beg.tm_min, beg.tm_sec, + end.tm_hour, end.tm_min, end.tm_sec, + query.tm_hour, query.tm_min, query.tm_sec); + eEPGCache::getInstance()->lookupEventTime(m_ref, queryTime, event); + } + if ( event ) + { + eDebug("found event.. store to disc"); + std::string fname = filename; + fname.erase(fname.length()-2, 2); + fname+="eit"; + int fd = open(fname.c_str(), O_CREAT|O_WRONLY, 0777); + if (fd>-1) + { + int evLen=HILO(event->descriptors_loop_length)+12/*EIT_LOOP_SIZE*/; + int wr = ::write( fd, (unsigned char*)event, evLen ); + if ( wr != evLen ) + eDebug("eit write error (%m)"); + ::close(fd); + } + } + eEPGCache::getInstance()->Unlock(); + } + return ret; + } else return -1; } diff --git a/lib/service/servicedvbrecord.h b/lib/service/servicedvbrecord.h index 7f08c554..25ca3e56 100644 --- a/lib/service/servicedvbrecord.h +++ b/lib/service/servicedvbrecord.h @@ -14,7 +14,7 @@ class eDVBServiceRecord: public iRecordableService, public Object { DECLARE_REF(eDVBServiceRecord); public: - RESULT prepare(const char *filename); + RESULT prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id); RESULT start(); RESULT stop(); private: