From d388ec7f497a9aea859b203b185b1d8a91583a6d Mon Sep 17 00:00:00 2001 From: Rico Schulte Date: Mon, 15 Jun 2009 09:05:47 +0000 Subject: [PATCH] adding similar event epg search /web/epgsimilar?sRef=&eventid= --- webinterface/src/WebComponents/Sources/EPG.py | 346 +++++++++++++------------- webinterface/src/WebScreens.py | 81 +++--- webinterface/src/web/epgsimilar.xml | 14 ++ 3 files changed, 233 insertions(+), 208 deletions(-) create mode 100644 webinterface/src/web/epgsimilar.xml diff --git a/webinterface/src/WebComponents/Sources/EPG.py b/webinterface/src/WebComponents/Sources/EPG.py index b4e3f3c..c7ebe25 100644 --- a/webinterface/src/WebComponents/Sources/EPG.py +++ b/webinterface/src/WebComponents/Sources/EPG.py @@ -3,171 +3,181 @@ from ServiceReference import ServiceReference from enigma import eServiceCenter, eServiceReference, eEPGCache class EPG(Source): - BOUQUETNOW = 0 - BOUQUETNEXT = 1 - SERVICENOW = 2 - SERVICENEXT = 3 - SERVICE = 4 - SEARCH = 5 - BOUQUET = 6 - - def __init__(self, navcore, func=BOUQUETNOW, endtm=False): - self.func = func - Source.__init__(self) - self.navcore = navcore - self.epgcache = eEPGCache.getInstance() - self.command = None - self.endtime = endtm - - def handleCommand(self, cmd): - self.command = cmd - - def do_func(self): - if not self.command is None: - if self.func is self.SEARCH: - func = self.searchEvent - elif self.func is self.SERVICE: - func = self.getEPGofService - elif self.func is self.BOUQUETNOW: - func = self.getBouquetEPGNow - elif self.func is self.BOUQUETNEXT: - func = self.getBouquetEPGNext - elif self.func is self.BOUQUET: - func = self.getEPGofBouquet - elif self.func is self.SERVICENOW: - func = self.getServiceEPGNow - elif self.func is self.SERVICENEXT: - func = self.getServiceEPGNext - - return func(self.command) - return [] - - def getBouquetEPGNow(self, ref): - return self.getEPGNowNext(ref, 0) - - def getBouquetEPGNext(self, ref): - return self.getEPGNowNext(ref, 1) - - def getServiceEPGNow(self, ref): - return self.getEPGNowNext(ref, 0, True) - - def getServiceEPGNext(self, ref): - return self.getEPGNowNext(ref, 1, True) - - def getEPGNowNext(self, ref, type, service=False): - print "[WebComponents.EPG] getting EPG NOW/NEXT", ref - - if service: - events = self.epgcache.lookupEvent(['IBDTSERNX', (ref, type, -1)]) - else: - serviceHandler = eServiceCenter.getInstance() - list = serviceHandler.list(eServiceReference(ref)) - services = list and list.getContent('S') - search = ['IBDTSERNX'] - - if services: # It's a Bouquet - search.extend([(service, type, -1) for service in services]) - - events = self.epgcache.lookupEvent(search) - - if events: - return events - return [] - - def getEPGofService(self, ref, options='IBDTSERN'): - print "getting EPG of Service", ref - events = self.epgcache.lookupEvent([options , (ref, 0, -1, -1)]); - if events: - if self.endtime: - list = self.insertEndTime(events) - return list - - return events - return [] - - def insertEndTime(self, events): - list = [] - for event in events: - i = 0 - evt = [] - end = event[1] + event[2] - for item in event: - if i == 3: - evt.append(end) - i += 1 - - evt.append(item) - i += 1 - - list.append(evt) - - return list - - def getEPGofBouquet(self, param): - print "[WebComponents.EPG] getting EPG for Bouquet", param - - if not param.has_key('bRef'): - return [] - - time = -1 - if param.has_key('time'): - if param['time'] is not None: - time = int(float(param['time'])) - if time < 0: - time = -1 - - bRef = param['bRef'] - - serviceHandler = eServiceCenter.getInstance() - sl = serviceHandler.list(eServiceReference(bRef)) - services = sl and sl.getContent('S') - - search = ['IBDTSERN'] - search.extend([(service, 0, time) for service in services]) - - events = self.epgcache.lookupEvent(search) - - if events: - return events - return [] - - def searchEvent(self, needle): - print "[WebComponents.EPG] searching EPG: ", needle - - events = self.epgcache.search(('IBDTSERN', 256, eEPGCache.PARTIAL_TITLE_SEARCH, needle, 1)); - if events: - return events - return [] - - def getLut(self): - if self.endtime: - lut = { - "EventID": 0, - "TimeStart": 1, - "Duration": 2, - "TimeEnd": 3, - "Title": 4, - "Description": 5, - "DescriptionExtended": 6, - "ServiceReference": 7, - "ServiceName": 8 - } - return lut - else: - lut = { - "EventID": 0, - "TimeStart": 1, - "Duration": 2, - "Title": 3, - "Description": 4, - "DescriptionExtended": 5, - "ServiceReference": 6, - "ServiceName": 7 - } - - return lut - - list = property(do_func) - - lut = property(getLut) - \ No newline at end of file + BOUQUETNOW = 0 + BOUQUETNEXT = 1 + SERVICENOW = 2 + SERVICENEXT = 3 + SERVICE = 4 + SEARCH = 5 + BOUQUET = 6 + SEARCHSIMILAR = 7 + def __init__(self, navcore, func=BOUQUETNOW, endtm=False): + self.func = func + Source.__init__(self) + self.navcore = navcore + self.epgcache = eEPGCache.getInstance() + self.command = None + self.endtime = endtm + + def handleCommand(self, cmd): + print "#"*20,"handleCommand",cmd + self.command = cmd + + def do_func(self): + if not self.command is None: + if self.func is self.SEARCHSIMILAR: + func = self.searchSimilarEvent + elif self.func is self.SEARCH: + func = self.searchEvent + elif self.func is self.SERVICE: + func = self.getEPGofService + elif self.func is self.BOUQUETNOW: + func = self.getBouquetEPGNow + elif self.func is self.BOUQUETNEXT: + func = self.getBouquetEPGNext + elif self.func is self.BOUQUET: + func = self.getEPGofBouquet + elif self.func is self.SERVICENOW: + func = self.getServiceEPGNow + elif self.func is self.SERVICENEXT: + func = self.getServiceEPGNext + + return func(self.command) + return [] + + def getBouquetEPGNow(self, ref): + return self.getEPGNowNext(ref, 0) + + def getBouquetEPGNext(self, ref): + return self.getEPGNowNext(ref, 1) + + def getServiceEPGNow(self, ref): + return self.getEPGNowNext(ref, 0, True) + + def getServiceEPGNext(self, ref): + return self.getEPGNowNext(ref, 1, True) + + def getEPGNowNext(self, ref, type, service=False): + print "[WebComponents.EPG] getting EPG NOW/NEXT", ref + + if service: + events = self.epgcache.lookupEvent(['IBDTSERNX', (ref, type, -1)]) + else: + serviceHandler = eServiceCenter.getInstance() + list = serviceHandler.list(eServiceReference(ref)) + services = list and list.getContent('S') + search = ['IBDTSERNX'] + + if services: # It's a Bouquet + search.extend([(service, type, -1) for service in services]) + + events = self.epgcache.lookupEvent(search) + + if events: + return events + return [] + + def getEPGofService(self, ref, options='IBDTSERN'): + print "getting EPG of Service", ref + events = self.epgcache.lookupEvent([options , (ref, 0, -1, -1)]); + if events: + if self.endtime: + list = self.insertEndTime(events) + return list + + return events + return [] + + def insertEndTime(self, events): + list = [] + for event in events: + i = 0 + evt = [] + end = event[1] + event[2] + for item in event: + if i == 3: + evt.append(end) + i += 1 + + evt.append(item) + i += 1 + + list.append(evt) + + return list + + def getEPGofBouquet(self, param): + print "[WebComponents.EPG] getting EPG for Bouquet", param + + if not param.has_key('bRef'): + return [] + + time = -1 + if param.has_key('time'): + if param['time'] is not None: + time = int(float(param['time'])) + if time < 0: + time = -1 + + bRef = param['bRef'] + + serviceHandler = eServiceCenter.getInstance() + sl = serviceHandler.list(eServiceReference(bRef)) + services = sl and sl.getContent('S') + + search = ['IBDTSERN'] + search.extend([(service, 0, time) for service in services]) + + events = self.epgcache.lookupEvent(search) + + if events: + return events + return [] + + def searchEvent(self, needle): + print "[WebComponents.EPG] searching EPG: ", needle + + events = self.epgcache.search(('IBDTSERN', 256, eEPGCache.PARTIAL_TITLE_SEARCH, needle, 1)); + if events: + return events + return [] + + def searchSimilarEvent(self, needle): + print "[WebComponents.EPG] searching similar eventid: ",needle + + events = self.epgcache.search(('IBDTSERN', 256, eEPGCache.SIMILAR_BROADCASTINGS_SEARCH, needle['sRef'], int(needle['eventid']))); + if events: + return events + return [] + + def getLut(self): + if self.endtime: + lut = { + "EventID": 0, + "TimeStart": 1, + "Duration": 2, + "TimeEnd": 3, + "Title": 4, + "Description": 5, + "DescriptionExtended": 6, + "ServiceReference": 7, + "ServiceName": 8 + } + return lut + else: + lut = { + "EventID": 0, + "TimeStart": 1, + "Duration": 2, + "Title": 3, + "Description": 4, + "DescriptionExtended": 5, + "ServiceReference": 6, + "ServiceName": 7 + } + + return lut + + list = property(do_func) + + lut = property(getLut) diff --git a/webinterface/src/WebScreens.py b/webinterface/src/WebScreens.py index 82c6d67..4468404 100644 --- a/webinterface/src/WebScreens.py +++ b/webinterface/src/WebScreens.py @@ -7,7 +7,7 @@ class WebScreen(Screen): Screen.__init__(self, session) self.stand_alone = True self.request = request - self.instance = None + self.instance = None class DummyWebScreen(WebScreen): #use it, if you dont need any source, just to can do a static file with an xml-file @@ -18,15 +18,15 @@ class UpdateWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from Components.Sources.Clock import Clock - + self["CurrentTime"] = Clock() - + class MessageWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.Message import Message - + self["Message"] = Message(session, func=Message.PRINT) self["GetAnswer"] = Message(session, func=Message.ANSWER) @@ -34,14 +34,14 @@ class ServiceListReloadWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.ServiceListReload import ServiceListReload - + self["ServiceListReload"] = ServiceListReload(session) class AudioWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.AudioTracks import AudioTracks - + self["AudioTracks"] = AudioTracks(session, func=AudioTracks.GET) self["SelectAudioTrack"] = AudioTracks(session, func=AudioTracks.SET) @@ -51,52 +51,52 @@ class AboutWebScreen(WebScreen): from WebComponents.Sources.About import About from WebComponents.Sources.Frontend import Frontend from WebComponents.Sources.Hdd import Hdd - from WebComponents.Sources.Network import Network + from WebComponents.Sources.Network import Network from Components.config import config from Components.About import about from Components.Sources.StaticText import StaticText from Tools.DreamboxHardware import getFPVersion from Tools.HardwareInfo import HardwareInfo - + hw = HardwareInfo() - - self["About"] = About(session) - + + self["About"] = About(session) + self["Network"] = Network() self["Hdd"] = Hdd() - self["Frontends"] = Frontend() + self["Frontends"] = Frontend() self["EnigmaVersion"] = StaticText(about.getEnigmaVersionString()) self["ImageVersion"] = StaticText(about.getVersionString()) self["WebIfVersion"] = StaticText(config.plugins.Webinterface.version.value) self["FpVersion"] = StaticText(str(getFPVersion())) - self["DeviceName"] = StaticText(hw.get_device_name()) + self["DeviceName"] = StaticText(hw.get_device_name()) class VolumeWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) - - from WebComponents.Sources.Volume import Volume + + from WebComponents.Sources.Volume import Volume self["Volume"] = Volume(session) class SettingsWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.Settings import Settings - + self["Settings"] = Settings(session) class SubServiceWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.SubServices import SubServices - + self["SubServices"] = SubServices(session) class StreamSubServiceWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.SubServices import SubServices - + self["StreamSubServices"] = SubServices(session, streamingScreens) class ServiceWebScreen(WebScreen): @@ -105,7 +105,7 @@ class ServiceWebScreen(WebScreen): from WebComponents.Sources.ServiceListRecursive import ServiceListRecursive from Components.Sources.ServiceList import ServiceList from Screens.ChannelSelection import service_types_tv - + fav = eServiceReference(service_types_tv + ' FROM BOUQUET "bouquets.tv" ORDER BY bouquet') self["SwitchService"] = ServiceList(fav, command_func=self.zapTo, validate_commands=False) self["ServiceList"] = ServiceList(fav, command_func=self.getServiceList, validate_commands=False) @@ -133,7 +133,7 @@ class LocationsAndTagsWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.LocationsAndTags import LocationsAndTags - + self["CurrentLocation"] = LocationsAndTags(session, LocationsAndTags.CURRLOCATION) self["Locations"] = LocationsAndTags(session, LocationsAndTags.LOCATIONS) self["Tags"] = LocationsAndTags(session, LocationsAndTags.TAGS) @@ -144,14 +144,15 @@ class EpgWebScreen(WebScreen): from WebComponents.Sources.EPG import EPG self["EpgSearch"] = EPG(session, func=EPG.SEARCH) - self["EpgService"] = EPG(session, func=EPG.SERVICE) + self["EpgSearchSimilar"] = EPG(session, func=EPG.SEARCHSIMILAR) + self["EpgService"] = EPG(session, func=EPG.SERVICE) self["EpgBouquetNow"] = EPG(session, func=EPG.BOUQUETNOW) self["EpgBouquetNext"] = EPG(session, func=EPG.BOUQUETNEXT) self["EpgServiceNow"] = EPG(session, func=EPG.SERVICENOW) self["EpgServiceNext"] = EPG(session, func=EPG.SERVICENEXT) self["EpgBouquet"] = EPG(session, func=EPG.BOUQUET) self["localip"] = RequestData(request, what=RequestData.HOST) - + self["EPGSERVICEWAP"] = EPG(session, func=EPG.SERVICE, endtm=True) def getServiceList(self, sRef): @@ -159,11 +160,11 @@ class EpgWebScreen(WebScreen): class MovieWebScreen(WebScreen): def __init__(self, session, request): - WebScreen.__init__(self, session, request) + WebScreen.__init__(self, session, request) from Components.MovieList import MovieList from Tools.Directories import resolveFilename, SCOPE_HDD from WebComponents.Sources.Movie import Movie - + movielist = MovieList(eServiceReference("2:0:1:0:0:0:0:0:0:0:" + resolveFilename(SCOPE_HDD))) self["MovieList"] = Movie(session, movielist, func=Movie.LIST) self["MovieFileDel"] = Movie(session, movielist, func=Movie.DEL) @@ -173,7 +174,7 @@ class MediaPlayerWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.MP import MP - + self["FileList"] = MP(session, func=MP.LIST) self["PlayFile"] = MP(session, func=MP.PLAY) self["Command"] = MP(session, func=MP.COMMAND) @@ -183,15 +184,15 @@ class AutoTimerWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.AT import AT - + self["AutoTimerList"] = AT(session, func=AT.LIST) self["AutoTimerWrite"] = AT(session, func=AT.WRITE) class TimerWebScreen(WebScreen): def __init__(self, session, request): - WebScreen.__init__(self, session, request) + WebScreen.__init__(self, session, request) from WebComponents.Sources.Timer import Timer - + self["TimerList"] = Timer(session, func=Timer.LIST) self["TimerAddEventID"] = Timer(session, func=Timer.ADDBYID) self["TimerAdd"] = Timer(session, func=Timer.ADD) @@ -206,28 +207,28 @@ class RemoteWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.RemoteControl import RemoteControl - + self["RemoteControl"] = RemoteControl(session) class PowerWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.PowerState import PowerState - + self["PowerState"] = PowerState(session) class ParentControlWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.ParentControl import ParentControl - + self["ParentControlList"] = ParentControl(session) class WapWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.WAPfunctions import WAPfunctions - + self["WAPFillOptionListYear"] = WAPfunctions(session, func=WAPfunctions.LISTTIME) self["WAPFillOptionListDay"] = WAPfunctions(session, func=WAPfunctions.LISTTIME) self["WAPFillOptionListMonth"] = WAPfunctions(session, func=WAPfunctions.LISTTIME) @@ -255,15 +256,15 @@ class StreamingWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from Components.Sources.StreamService import StreamService - self["StreamService"] = StreamService(self.session.nav) + self["StreamService"] = StreamService(self.session.nav) streamingScreens.append(self) self.screenIndex = len(streamingScreens) - 1 - + def getRecordService(self): if self.has_key("StreamService"): return self["StreamService"].getService() return None - + def getRecordServiceRef(self): if self.has_key("StreamService"): return self["StreamService"].ref @@ -282,7 +283,7 @@ class M3uStreamingCurrentServiceWebScreen(WebScreen): def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.CurrentService import CurrentService - + self["CurrentService"] = CurrentService(session) self["localip"] = RequestData(request, what=RequestData.HOST) @@ -323,18 +324,18 @@ class DeviceInfoWebScreen(WebScreen): WebScreen.__init__(self, session, request) from WebComponents.Sources.Network import Network from WebComponents.Sources.Hdd import Hdd - from WebComponents.Sources.Frontend import Frontend + from WebComponents.Sources.Frontend import Frontend from Components.config import config from Components.About import about from Components.Sources.StaticText import StaticText from Tools.DreamboxHardware import getFPVersion from Tools.HardwareInfo import HardwareInfo - + hw = HardwareInfo() - + self["Network"] = Network() self["Hdd"] = Hdd() - self["Frontends"] = Frontend() + self["Frontends"] = Frontend() self["EnigmaVersion"] = StaticText(about.getEnigmaVersionString()) self["ImageVersion"] = StaticText(about.getVersionString()) self["WebIfVersion"] = StaticText(config.plugins.Webinterface.version.value) diff --git a/webinterface/src/web/epgsimilar.xml b/webinterface/src/web/epgsimilar.xml new file mode 100644 index 0000000..fd9a30b --- /dev/null +++ b/webinterface/src/web/epgsimilar.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> + + <e2event> + <e2eventid></e2eventid> + <e2eventstart></e2eventstart> + <e2eventduration></e2eventduration> + <e2eventtitle></e2eventtitle> + <e2eventdescription></e2eventdescription> + <e2eventdescriptionextended></e2eventdescriptionextended> + <e2eventservicereference></e2eventservicereference> + <e2eventservicename></e2eventservicename> + </e2event> + + \ No newline at end of file -- 2.7.4