def readConfiguration(self): if not path.exists(CONFIG): return mtime = path.getmtime(CONFIG) if mtime == self.configMtime: return self.configMtime = mtime self.services[0].clear() self.services[1].clear() configuration = cet_parse(CONFIG).getroot() version = configuration.get("version", None) if version is None: factor = 60 else: factor = 1 for service in configuration.findall("service"): value = service.text if value: pos = value.rfind(':') # don't split alternative service if pos != -1 and not value.startswith('1:134:'): value = value[:pos + 1] duration = service.get('duration', None) duration = duration and int(duration) * factor self.services[0].add(EPGRefreshService(value, duration)) for bouquet in configuration.findall("bouquet"): value = bouquet.text if value: duration = bouquet.get('duration', None) duration = duration and int(duration) self.services[1].add(EPGRefreshService(value, duration))
def render(self, req): req.setResponseCode(http.OK) req.setHeader('Content-type', 'application/xhtml+xml') req.setHeader('charset', 'UTF-8') if 'sref' in req.args: services = OrderedSet() bouquets = OrderedSet() for sref in req.args.get('sref'): sref = unquote(sref) ref = eServiceReference(sref) if not ref.valid(): services = bouquets = None break elif (ref.flags & 7) == 7: epgservice = EPGRefreshService(sref, None) if epgservice not in bouquets: bouquets.add(epgservice) else: if not (ref.flags & eServiceReference.isGroup): # strip all after last : pos = sref.rfind(':') if pos != -1: if sref[pos - 1] == ':': pos -= 1 sref = sref[:pos + 1] epgservice = EPGRefreshService(sref, None) if epgservice not in services: services.add(epgservice) if services is not None and bouquets is not None: scanServices = epgrefresh.generateServicelist( services, bouquets) else: scanServices = [] else: scanServices = epgrefresh.generateServicelist( epgrefresh.services[0], epgrefresh.services[1]) returnlist = [ "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<e2servicelist>" ] extend = returnlist.extend for serviceref in scanServices: ref = ServiceReference(str(serviceref)) returnlist.extend(( ' <e2service>\n', ' <e2servicereference>', stringToXML(str(serviceref)), '</e2servicereference>\n', ' <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', '')), '</e2servicename>\n', ' </e2service>\n', )) returnlist.append('\n</e2servicelist>') return ''.join(returnlist)
def generateServicelist(self, services, bouquets): # This will hold services which are not explicitely in our list additionalServices = [] additionalBouquets = [] # See if we are supposed to read in autotimer services if config.plugins.epgrefresh.inherit_autotimer.value: removeInstance = False try: # Import Instance from Plugins.Extensions.AutoTimer.plugin import autotimer if autotimer is None: removeInstance = True # Create an instance from Plugins.Extensions.AutoTimer.AutoTimer import AutoTimer autotimer = AutoTimer() # Read in configuration autotimer.readXml() except Exception as e: print("[EPGRefresh] Could not inherit AutoTimer Services:", e) else: # Fetch services for timer in autotimer.getEnabledTimerList(): additionalServices.extend( [EPGRefreshService(x, None) for x in timer.services]) additionalBouquets.extend( [EPGRefreshService(x, None) for x in timer.bouquets]) finally: # Remove instance if there wasn't one before if removeInstance: autotimer = None scanServices = [] channelIdList = [] self.addServices(services, scanServices, channelIdList) serviceHandler = eServiceCenter.getInstance() for bouquet in bouquets.union(additionalBouquets): myref = eServiceReference(bouquet.sref) list = serviceHandler.list(myref) if list is not None: while 1: s = list.getNext() # TODO: I wonder if its sane to assume we get services here (and not just new lists) if s.valid(): additionalServices.append( EPGRefreshService(s.toString(), None)) else: break del additionalBouquets[:] self.addServices(additionalServices, scanServices, channelIdList) del additionalServices[:] return scanServices
def generateServicelist(self, services, bouquets): additionalServices = [] additionalBouquets = [] if config.plugins.epgrefresh.inherit_autotimer.value: try: from Plugins.Extensions.AutoTimer.plugin import autotimer if autotimer is None: from Plugins.Extensions.AutoTimer.AutoTimer import AutoTimer autotimer = AutoTimer() autotimer.readXml() except Exception as e: print("[EPGRefresh] Could not inherit AutoTimer Services:", e) else: for timer in autotimer.getEnabledTimerList(): additionalServices.extend( [EPGRefreshService(x, None) for x in timer.services]) additionalBouquets.extend( [EPGRefreshService(x, None) for x in timer.bouquets]) scanServices = [] channelIdList = [] self.addServices(services, scanServices, channelIdList) serviceHandler = eServiceCenter.getInstance() for bouquet in bouquets.union(additionalBouquets): myref = eServiceReference(bouquet.sref) list = serviceHandler.list(myref) if list is not None: while 1: s = list.getNext() if s and s.valid() and s.type == eServiceReference.idDVB: additionalServices.append( EPGRefreshService(s.toString(), None)) else: break del additionalBouquets[:] def sortServices(services): # sort by positions - better for motor unsortedServices = [] for service in services: ref = service.sref position = ref.split(":")[6][:-4] if not position: position = "0" auxiliarySortParameter = int(position, 16) if auxiliarySortParameter > 1800: auxiliarySortParameter = 3600 - auxiliarySortParameter unsortedServices.append((auxiliarySortParameter, service)) unsortedServices.sort() sortedServices = [] for service in unsortedServices: sortedServices.append(service[1]) return sortedServices self.addServices(additionalServices, scanServices, channelIdList) scanServices = sortServices(scanServices) del additionalServices[:] return scanServices
def readConfiguration(self): # Check if file exists if not path.exists(CONFIG): return # Check if file did not change mtime = path.getmtime(CONFIG) if mtime == self.configMtime: return # Keep mtime self.configMtime = mtime # Empty out list self.services[0].clear() self.services[1].clear() # Open file configuration = cet_parse(CONFIG).getroot() version = configuration.get("version", None) if version is None: factor = 60 else: #if version == "1" factor = 1 # Add References for service in configuration.findall("service"): value = service.text if value: # strip all after last : (custom name) pos = value.rfind(':') # don't split alternative service if value.find('1:134:1') == -1 and pos != -1: value = value[:pos + 1] duration = service.get('duration', None) duration = duration and int(duration) * factor self.services[0].add(EPGRefreshService(value, duration)) for bouquet in configuration.findall("bouquet"): value = bouquet.text if value: duration = bouquet.get('duration', None) duration = duration and int(duration) self.services[1].add(EPGRefreshService(value, duration))
def eventinfo(session, servicelist, **kwargs): ref = session.nav.getCurrentlyPlayingServiceReference() if not ref: return sref = ref.toString() # strip all after last : pos = sref.rfind(':') if pos != -1: sref = sref[:pos + 1] epgrefresh.services[0].add(EPGRefreshService(str(sref), None))
def finishedServiceSelection(self, *args): if args: list = self["config"].getList() list.append(getConfigListEntry( _("Refreshing"), NoSave(ConfigSelection(choices = [( EPGRefreshService(str(args[0].toString()), None), ServiceReference(args[0]).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') )])) )) self["config"].setList(list)
def addtoEPGRefresh(self, add): ref = self.csel.servicelist.getCurrent() if not ref: return sref = ref.toString() pos = sref.rfind(':') if pos != -1 and not value.startswith('1:134:'): sref = sref[:pos+1] try: epgrefresh.services[0].add(EPGRefreshService(str(sref), None)) except: pass try: epgrefresh.saveConfiguration() except: pass self.close()
def addtoEPGRefresh(self, add): ref = self.csel.servicelist.getCurrent() if not ref: return sref = ref.toString() # strip all after last : pos = sref.rfind(':') if pos != -1: sref = sref[:pos+1] try: epgrefresh.services[0].add(EPGRefreshService(str(sref), None)) except: pass try: epgrefresh.saveConfiguration() except: pass self.close()
def render(self, req): do_add = self.type == self.TYPE_ADD state = False if 'multi' in req.args: if epgrefresh.services[0]: epgrefresh.services[0].clear() state = True if epgrefresh.services[1]: epgrefresh.services[1].clear() state = True if 'sref' in req.args: duration = req.args.get("duration", None) try: duration = duration and int(duration) except ValueError as ve: output = 'invalid value for "duration": ' + str(duration) else: for sref in req.args.get('sref'): sref = unquote(sref) ref = eServiceReference(sref) if not ref.valid(): output = 'invalid value for "sref": ' + str(sref) elif (ref.flags & 7) == 7: epgservice = EPGRefreshService(sref, duration) # bouquet if epgservice in epgrefresh.services[1]: if do_add: output = "bouquet already in list" else: epgrefresh.services[1].remove(epgservice) output = "bouquet removed from list" state = True else: if do_add: epgrefresh.services[1].add(epgservice) output = "bouquet added to list" state = True else: output = "bouquet not in list" else: if not (ref.flags & eServiceReference.isGroup): # strip all after last : pos = sref.rfind(':') if pos != -1: if sref[pos - 1] == ':': pos -= 1 sref = sref[:pos + 1] epgservice = EPGRefreshService(sref, duration) # assume service if epgservice in epgrefresh.services[0]: if do_add: output = "service already in list" else: epgrefresh.services[0].remove(epgservice) output = "service removed from list" state = True else: if do_add: epgrefresh.services[0].add(epgservice) output = "service added to list" state = True else: output = "service not in list" # save if list changed if state: epgrefresh.saveConfiguration() else: output = 'missing argument "sref"' if 'multi' in req.args: output = 'service restriction changed' req.setResponseCode(http.OK) req.setHeader('Content-type', 'application/xhtml+xml') req.setHeader('charset', 'UTF-8') return """<?xml version=\"1.0\" encoding=\"UTF-8\" ?> <e2simplexmlresult> <e2state>%s</e2state> <e2statetext>%s</e2statetext> </e2simplexmlresult> """ % ('True' if state else 'False', output)
class EPGRefresh: """Simple Class to refresh EPGData""" def __init__(self): # Initialize self.services = (set(), set()) self.previousService = None self.forcedScan = False self.session = None self.beginOfTimespan = 0 # Mtime of configuration files self.configMtime = -1 # Read in Configuration self.readConfiguration() def readConfiguration(self): # Check if file exists if not path.exists(CONFIG): return # Check if file did not change mtime = path.getmtime(CONFIG) if mtime == self.configMtime: return # Keep mtime self.configMtime = mtime # Empty out list self.services[0].clear() self.services[1].clear() # Open file configuration = cet_parse(CONFIG).getroot() # Add References for service in configuration.findall("service"): value = service.text if value: # strip all after last : (custom name) pos = value.rfind(':') if pos != -1: value = value[:pos + 1] duration = service.get('duration', None) duration = duration and int(duration) self.services[0].add(EPGRefreshService(value, duration)) for bouquet in configuration.findall("bouquet"): value = bouquet.text if value: duration = bouquet.get('duration', None) duration = duration and int(duration) self.services[1].add(EPGRefreshService(value, duration)) def buildConfiguration(self, webif=False): list = ['<?xml version="1.0" ?>\n<epgrefresh>\n\n'] if webif: TAGSERVICE = 'e2servicereference' TAGBOUQUET = 'e2servicereference' TAGNAME = 'e2servicename' else: TAGSERVICE = 'service' TAGBOUQUET = 'bouquet' TAGNAME = '!--' for service in self.services[0]: ref = ServiceReference(service.sref) list.extend((' <', TAGNAME, '>', stringToXML(ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '')), '</', TAGNAME, '>\n')) list.extend((' <', TAGSERVICE)) if service.duration is not None: list.extend((' duration="', str(service.duration), '"')) list.extend( ('>', stringToXML(service.sref), '</', TAGSERVICE, '>\n')) for bouquet in self.services[1]: ref = ServiceReference(bouquet.sref) list.extend((' <', TAGNAME, '>', stringToXML(ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '')), '</', TAGNAME, '>\n')) list.extend((' <', TAGBOUQUET)) if bouquet.duration is not None: list.extend((' duration="', str(bouquet.duration), '"')) list.extend( ('>', stringToXML(bouquet.sref), '</', TAGBOUQUET, '>\n')) list.append('\n</epgrefresh>') return list def saveConfiguration(self): file = open(CONFIG, 'w') file.writelines(self.buildConfiguration()) file.close() def forceRefresh(self, session=None): print "[EPGRefresh] Forcing start of EPGRefresh" if self.session is None: if session is not None: self.session = session else: return False self.forcedScan = True self.prepareRefresh() return True def start(self, session=None): if session is not None: self.session = session epgrefreshtimer.setRefreshTimer(self.createWaitTimer) def stop(self): print "[EPGRefresh] Stopping Timer" epgrefreshtimer.clear() def prepareRefresh(self): print "[EPGRefresh] About to start refreshing EPG" # Keep service self.previousService = self.session.nav.getCurrentlyPlayingServiceReference( ) # Maybe read in configuration try: self.readConfiguration() except Exception, e: print "[EPGRefresh] Error occured while reading in configuration:", e # This will hold services which are not explicitely in our list additionalServices = [] additionalBouquets = [] # See if we are supposed to read in autotimer services if config.plugins.epgrefresh.inherit_autotimer.value: removeInstance = False try: # Import Instance from Plugins.Extensions.AutoTimer.plugin import autotimer if autotimer is None: removeInstance = True # Create an instance from Plugins.Extensions.AutoTimer.AutoTimer import AutoTimer autotimer = AutoTimer() # Read in configuration autotimer.readXml() except Exception, e: print "[EPGRefresh] Could not inherit AutoTimer Services:", e else: # Fetch services for timer in autotimer.getEnabledTimerList(): additionalServices.extend( [EPGRefreshService(x, None) for x in timer.services]) additionalBouquets.extend( [EPGRefreshService(x, None) for x in timer.bouquets]) finally:
finally: # Remove instance if there wasn't one before if removeInstance: autotimer = None serviceHandler = eServiceCenter.getInstance() for bouquet in self.services[1].union(additionalBouquets): myref = eServiceReference(bouquet.sref) list = serviceHandler.list(myref) if list is not None: while 1: s = list.getNext() # TODO: I wonder if its sane to assume we get services here (and not just new lists) if s.valid(): additionalServices.append( EPGRefreshService(s.toString(), None)) else: break del additionalBouquets[:] scanServices = [] channelIdList = [] for scanservice in self.services[0].union(additionalServices): service = eServiceReference(scanservice.sref) if not service.valid() \ or (service.flags & (eServiceReference.isMarker|eServiceReference.isDirectory)): continue channelID = '%08x%04x%04x' % ( service.getUnsignedData(4), # NAMESPACE
def render(self, req): do_add = self.type == self.TYPE_ADD state = False if 'multi' in req.args: if epgrefresh.services[0]: epgrefresh.services[0].clear() state = True if epgrefresh.services[1]: epgrefresh.services[1].clear() state = True if 'sref' in req.args: duration = req.args.get("duration", None) try: duration = duration and int(duration) except ValueError, ve: output = 'invalid value for "duration": ' + str(duration) else: for sref in req.args.get('sref'): sref = unquote(sref) ref = eServiceReference(sref) if not ref.valid(): output = 'invalid value for "sref": ' + str(sref) elif (ref.flags & 7) == 7: epgservice = EPGRefreshService(sref, duration) # bouquet if epgservice in epgrefresh.services[1]: if do_add: output = "bouquet already in list" else: epgrefresh.services[1].remove(epgservice) output = "bouquet removed from list" state = True else: if do_add: epgrefresh.services[1].add(epgservice) output = "bouquet added to list" state = True else: output = "bouquet not in list" else: if not (ref.flags & eServiceReference.isGroup): # strip all after last : pos = sref.rfind(':') if pos != -1: if sref[pos-1] == ':': pos -= 1 sref = sref[:pos+1] epgservice = EPGRefreshService(sref, duration) # assume service if epgservice in epgrefresh.services[0]: if do_add: output = "service already in list" else: epgrefresh.services[0].remove(epgservice) output = "service removed from list" state = True else: if do_add: epgrefresh.services[0].add(epgservice) output = "service added to list" state = True else: output = "service not in list" # save if list changed if state: epgrefresh.saveConfiguration()
def prepareRefresh(self): print("[EPGRefresh] About to start refreshing EPG") # Maybe read in configuration try: self.readConfiguration() except Exception as e: print("[EPGRefresh] Error occured while reading in configuration:", e) # This will hold services which are not explicitely in our list additionalServices = [] additionalBouquets = [] # See if we are supposed to read in autotimer services if config.plugins.epgrefresh.inherit_autotimer.value: removeInstance = False try: # Import Instance from Plugins.Extensions.AutoTimer.plugin import autotimer if autotimer is None: removeInstance = True # Create an instance from Plugins.Extensions.AutoTimer.AutoTimer import AutoTimer autotimer = AutoTimer() # Read in configuration autotimer.readXml() except Exception as e: print("[EPGRefresh] Could not inherit AutoTimer Services:", e) else: # Fetch services for timer in autotimer.getEnabledTimerList(): additionalServices.extend( [EPGRefreshService(x, None) for x in timer.services]) additionalBouquets.extend( [EPGRefreshService(x, None) for x in timer.bouquets]) finally: # Remove instance if there wasn't one before if removeInstance: autotimer = None scanServices = [] channelIdList = [] self.addServices(self.services[0], scanServices, channelIdList) serviceHandler = eServiceCenter.getInstance() for bouquet in self.services[1].union(additionalBouquets): myref = eServiceReference(bouquet.sref) list = serviceHandler.list(myref) if list is not None: while 1: s = list.getNext() # TODO: I wonder if its sane to assume we get services here (and not just new lists) if s.valid(): additionalServices.append( EPGRefreshService(s.toString(), None)) else: break del additionalBouquets[:] self.addServices(additionalServices, scanServices, channelIdList) del additionalServices[:] # Debug print("[EPGRefresh] Services we're going to scan:", ', '.join([repr(x) for x in scanServices])) self.maybeStopAdapter() # NOTE: start notification is handled in adapter initializer if config.plugins.epgrefresh.adapter.value.startswith("pip"): hidden = config.plugins.epgrefresh.adapter.value == "pip_hidden" refreshAdapter = PipAdapter(self.session, hide=hidden) elif config.plugins.epgrefresh.adapter.value.startswith("record"): refreshAdapter = RecordAdapter(self.session) else: refreshAdapter = MainPictureAdapter(self.session) if (not refreshAdapter.backgroundCapable and Screens.Standby.inStandby) or not refreshAdapter.prepare(): print( "[EPGRefresh] Adapter is not able to run in background or not available, falling back to MainPictureAdapter" ) refreshAdapter = MainPictureAdapter(self.session) refreshAdapter.prepare() self.refreshAdapter = refreshAdapter self.scanServices = scanServices self.refresh()
def render(self, req): do_add = self.type == self.TYPE_ADD state = False if 'sref' in req.args: sref = req.args["sref"][0] if do_add: # strip all after last : (custom name) pos = sref.rfind(':') if pos != -1: sref = sref[:pos + 1] duration = req.args.get("duration", None) try: duration = duration and int(duration) except ValueError, ve: output = 'invalid value for "duration": ' + str(duration) else: epgservice = EPGRefreshService(sref, duration) if sref: ref = eServiceReference(str(sref)) if not ref.valid(): output = 'invalid value for "sref": ' + str(sref) elif (ref.flags & 7) == 7: # bouquet if epgservice in epgrefresh.services[1]: if do_add: output = "bouquet already in list" else: epgrefresh.services[1].remove(epgservice) output = "bouquet removed from list" state = True else: if do_add: epgrefresh.services[1].add(epgservice) output = "bouquet added to list" state = True else: output = "bouquet not in list" else: # assume service if epgservice in epgrefresh.services[0]: if do_add: output = "service already in list" else: epgrefresh.services[0].remove(epgservice) output = "service removed from list" state = True else: if do_add: epgrefresh.services[0].add(epgservice) output = "service added to list" state = True else: output = "service not in list" # save if list changed if state: epgrefresh.saveConfiguration() else: output = 'invalid value for "sref": ' + str(sref)
additionalBouquets.extend([EPGRefreshService(x, None) for x in timer.bouquets]) finally: # Remove instance if there wasn't one before if removeInstance: autotimer = None serviceHandler = eServiceCenter.getInstance() for bouquet in self.services[1].union(additionalBouquets): myref = eServiceReference(bouquet.sref) list = serviceHandler.list(myref) if list is not None: while 1: s = list.getNext() # TODO: I wonder if its sane to assume we get services here (and not just new lists) if s.valid(): additionalServices.append(EPGRefreshService(s.toString(), None)) else: break del additionalBouquets[:] scanServices = [] channelIdList = [] for scanservice in self.services[0].union(additionalServices): service = eServiceReference(scanservice.sref) if not service.valid() \ or (service.flags & (eServiceReference.isMarker|eServiceReference.isDirectory)): continue channelID = '%08x%04x%04x' % ( service.getUnsignedData(4), # NAMESPACE