adding similar event epg search
authorRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Mon, 15 Jun 2009 09:05:47 +0000 (09:05 +0000)
committerRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Mon, 15 Jun 2009 09:05:47 +0000 (09:05 +0000)
/web/epgsimilar?sRef=<servicereference>&eventid=<eventid>

webinterface/src/WebComponents/Sources/EPG.py
webinterface/src/WebScreens.py
webinterface/src/web/epgsimilar.xml [new file with mode: 0644]

index b4e3f3c..c7ebe25 100644 (file)
@@ -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)
index 82c6d67..4468404 100644 (file)
@@ -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 (file)
index 0000000..fd9a30b
--- /dev/null
@@ -0,0 +1,14 @@
+<e2:screen name="EpgWebScreen">&lt;?xml version="1.0" encoding="UTF-8"?>
+<e2eventlist><e2:element source="EpgSearchSimilar" id="sRef,eventid"><e2:convert type="web:ListFiller" >
+       &lt;e2event>
+               &lt;e2eventid><e2:item name="EventID"/>&lt;/e2eventid>
+               &lt;e2eventstart><e2:item name="TimeStart"/>&lt;/e2eventstart>
+               &lt;e2eventduration><e2:item name="Duration"/>&lt;/e2eventduration>
+               &lt;e2eventtitle><e2:item name="Title" filter="xml"/>&lt;/e2eventtitle>
+               &lt;e2eventdescription><e2:item name="Description" filter="xml"/>&lt;/e2eventdescription>
+               &lt;e2eventdescriptionextended><e2:item name="DescriptionExtended" filter="xml"/>&lt;/e2eventdescriptionextended>
+               &lt;e2eventservicereference><e2:item name="ServiceReference" filter="xml"/>&lt;/e2eventservicereference>
+               &lt;e2eventservicename><e2:item name="ServiceName" filter="xml"/>&lt;/e2eventservicename>
+       &lt;/e2event></e2:convert><e2:convert type="web:TextToHTML" /></e2:element>
+</e2eventlist>
+</e2:screen>
\ No newline at end of file