X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/b2cb2cf5a88d2df60af474ced13e3c90891cf841..90ae5b35bc948a6738d3ef9c9bc0a6885e48d756:/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py diff --git a/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py b/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py index fe217289..814f174a 100644 --- a/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py +++ b/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py @@ -36,6 +36,16 @@ def removeAlternative(service1, service2): del alternatives[service1] if len(alternatives[service2]) == 0: del alternatives[service2] + +def loadAlternatives(): + doc = xml.dom.minidom.parse(resolveFilename(SCOPE_CONFIG, "alternatives.xml")) + + root = doc.childNodes[0] + for service in elementsWithTag(root.childNodes, 'service'): + newService = str(service.getAttribute('ref')) + for alternative in elementsWithTag(service.childNodes, 'alternative'): + newAlternative = str(alternative.getAttribute('ref')) + addAlternative(newService, newAlternative) def sortKey(x): return str.lower(ServiceReference(x).getServiceName().strip()) @@ -47,8 +57,8 @@ class AlternativeZapping(Screen): - - + + """ def __init__(self, session): self.skin = AlternativeZapping.skin @@ -206,14 +216,15 @@ class AlternativeZapping(Screen): def greenKey(self): self.session.openWithCallback(self.finishedChannelSelection, SimpleChannelSelection, _("Select reference service")) - def finishedChannelSelection(self, args): - serviceString = str(ServiceReference(args)) - if not self.alternatives.has_key(serviceString): - self.alternatives[serviceString] = [] - self.updateServices() - self.updateAlternatives() - self.selectService(serviceString) - + def finishedChannelSelection(self, *args): + if len(args): + serviceString = str(ServiceReference(args[0])) + if not self.alternatives.has_key(serviceString): + self.alternatives[serviceString] = [] + self.updateServices() + self.selectService(serviceString) + self.updateAlternatives() + def yellowKey(self): if len(self.serviceslist) > 0: self.session.openWithCallback(self.finishedAlternativeSelection, SimpleChannelSelection, _("Select alternative service")) @@ -222,24 +233,74 @@ class AlternativeZapping(Screen): pass -oldPlayService = NavigationInstance.instance.playService +oldPlayService = None + +from Components.PerServiceDisplay import PerServiceDisplay + +class ServiceChanged(PerServiceDisplay): + def __init__(self, navcore): + PerServiceDisplay.__init__(self, navcore, + { + iPlayableService.evTuneFailed: self.tuneFailed, + iPlayableService.evStart: self.start + }) + + self.lastPlayAction = None + self.nextPlayTry = 0 + + def start(self): +# print "+++++++++++++++++++++++++++++++++++++++++++++++++Start", self.lastPlayAction + if self.lastPlayAction is not None: + self.lastPlayAction = None + + def tuneFailed(self): +# print "+++++++++++++++++++++++++++++++++++++++++++++++++Tuning failed!", self.lastPlayAction + ref = self.lastPlayAction +# print "Ref:", ref +# print "Alternatives: failed to play service" + if ref is not None: + if alternatives.has_key(ref): +# print "Alternatives: trying alternatives" + if len(alternatives[ref]) > self.nextPlayTry: +# print "Alternatives: trying alternative", alternatives[ref][self.nextPlayTry] + if oldPlayService(ServiceReference(alternatives[ref][self.nextPlayTry]).ref) == 0: + self.nextPlayTry += 1 +# print "Alternatives: Alternative found!" + else: + self.nextPlayTry += 1 +# print "Alternatives: Alternative doesn't play either" + self.tuneFailed() + else: + self.lastPlayAction = None + + #print "Alternatives: No playable alternative found!" -def playService(self, ref): - if not oldPlayService(ref): - if alternatives.has_key(str(ServiceReference(ref))): - for x in alternatives[str(ServiceReference(ref))]: - if oldPlayService(ServiceReference(x).ref): - return 1 - return 0 - return 1 +servicechanged = None -def autostart(reason): +def playService(self, ref, **kwargs): + #print "--------------------Alternatives: trying to play service", str(ServiceReference(ref)) + if ref is not None: + servicechanged.lastPlayAction = str(ServiceReference(ref)) + servicechanged.nextPlayTry = 0 + result = oldPlayService(ref, **kwargs) + return result + +def sessionstart(reason, session, **kwargs): if reason == 0: - NavigationInstance.instance.playService = type(NavigationInstance.instance.playService)(playService, NavigationInstance, Navigation) + try: + loadAlternatives() + except: # FIXME, THIS IS ILLEGAL CODE AND WILL BE PROSECUTED! + pass + + # attach to this sessions navigation instance. + global oldPlayService, servicechanged + oldPlayService = session.nav.playService + session.nav.playService = type(session.nav.playService)(playService, NavigationInstance, Navigation) + servicechanged = ServiceChanged(session.nav) -def AlternativeZappingSetup(session): +def AlternativeZappingSetup(session, **kwargs): session.open(AlternativeZapping) -def Plugins(): - return [PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart), +def Plugins(**kwargs): + return [PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart), PluginDescriptor(name="Alternative services setup" , description="Defines alternatives for services.", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=AlternativeZappingSetup)]