X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d1de2263e4fff409a8fa16fc0069a923b4eff14d..51b1571e9e31d9f7ab1055f562a397a9bfa427ab:/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 25acc43f..814f174a 100644
--- a/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py
+++ b/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py
@@ -38,7 +38,7 @@ def removeAlternative(service1, service2):
del alternatives[service2]
def loadAlternatives():
- doc = xml.dom.minidom.parse(self.filename)
+ doc = xml.dom.minidom.parse(resolveFilename(SCOPE_CONFIG, "alternatives.xml"))
root = doc.childNodes[0]
for service in elementsWithTag(root.childNodes, 'service'):
@@ -57,8 +57,8 @@ class AlternativeZapping(Screen):
-
-
+
+
"""
def __init__(self, session):
self.skin = AlternativeZapping.skin
@@ -216,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"))
@@ -232,25 +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!"
+
+servicechanged = None
-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
+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 autostart(reason):
+def sessionstart(reason, session, **kwargs):
if reason == 0:
- loadAlternatives()
- 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)]