fix audio selector when service doesn't support audio track selection
[enigma2.git] / lib / python / Screens / InfoBarGenerics.py
index 7f9cafee3f0f82944dbb672e4ca11e943efd3b0b..c2d600449179cd025eb2998f3ef0e91e1ec5876d 100644 (file)
@@ -299,16 +299,36 @@ class InfoBarChannelSelection:
                self.session.execDialog(self.servicelist)
 
        def zapUp(self):
-               if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes":
-                       if self.servicelist.inBouquet() and self.servicelist.atBegin():
-                               self.servicelist.prevBouquet()
-               self.servicelist.moveUp()
+               if self.servicelist.inBouquet():
+                       prev = self.servicelist.getCurrentSelection()
+                       if prev:
+                               prev = prev.toString()
+                               while True:
+                                       if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes":
+                                               if self.servicelist.atBegin():
+                                                       self.servicelist.prevBouquet()
+                                       self.servicelist.moveUp()
+                                       cur = self.servicelist.getCurrentSelection()
+                                       if not cur or (not (cur.flags & 64)) or cur.toString() == prev:
+                                               break
+               else:
+                       self.servicelist.moveUp()
                self.servicelist.zap()
                self.doShow()
 
        def zapDown(self):
-               if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes" and self.servicelist.inBouquet() and self.servicelist.atEnd():
-                       self.servicelist.nextBouquet()
+               if self.servicelist.inBouquet():
+                       prev = self.servicelist.getCurrentSelection()
+                       if prev:
+                               prev = prev.toString()
+                               while True:
+                                       if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes" and self.servicelist.atEnd():
+                                               self.servicelist.nextBouquet()
+                                       else:
+                                               self.servicelist.moveDown()
+                                       cur = self.servicelist.getCurrentSelection()
+                                       if not cur or (not (cur.flags & 64)) or cur.toString() == prev:
+                                               break
                else:
                        self.servicelist.moveDown()
                self.servicelist.zap()
@@ -672,7 +692,7 @@ class InfoBarSeek:
                print "unpause"
                if self.seekstate == self.SEEK_STATE_PLAY:
                        return 0
-               self.setSeekState(self.SEEK_STATE_PLAY);
+               self.setSeekState(self.SEEK_STATE_PLAY)
        
        def doSeek(self, seektime):
                print "doseek", seektime
@@ -829,7 +849,6 @@ class InfoBarTimeshiftState(InfoBarPVRState):
        def __init__(self):
                InfoBarPVRState.__init__(self, screen=TimeshiftState)
 
-
 class InfoBarShowMovies:
 
        # i don't really like this class. 
@@ -1003,8 +1022,9 @@ class InfoBarTimeshift:
 from Screens.PiPSetup import PiPSetup
 
 class InfoBarExtensions:
-       def __init__(self):
+       def __init__(self, useServicePath = True):
                self.session.pipshown = False
+               self.useServicePath = useServicePath
                
                self["InstantExtensionsActions"] = HelpableActionMap(self, "InfobarExtensions",
                        {
@@ -1030,7 +1050,7 @@ class InfoBarExtensions:
                l = s and s.getSubtitleList() or [ ]
                
                for x in l:
-                       list.append(("DEBUG: Enable Subtitles: " + x[0], self.ENABLE_SUBTITLE, x[1]))
+                       list.append(("Enable Subtitles: " + x[0], self.ENABLE_SUBTITLE, x[1]))
                
                self.session.openWithCallback(self.extensionCallback, ChoiceBox, title=_("Please choose an extension..."), list = list)
 
@@ -1041,7 +1061,8 @@ class InfoBarExtensions:
                                newservice = self.session.nav.getCurrentlyPlayingServiceReference()
                                if self.session.pip.playService(newservice):
                                        self.session.pipshown = True
-                                       self.session.pip.servicePath = self.servicelist.getCurrentServicePath()
+                                       if self.useServicePath:
+                                               self.session.pip.servicePath = self.servicelist.getCurrentServicePath()
                                else:
                                        self.session.pipshown = False
                                        del self.session.pip
@@ -1051,16 +1072,17 @@ class InfoBarExtensions:
                                self.session.pipshown = False
                        elif answer[1] == self.PIPSWAP:
                                swapservice = self.session.nav.getCurrentlyPlayingServiceReference()
-                               if self.session.pip.servicePath:
-                                       servicepath = self.servicelist.getCurrentServicePath()
-                                       ref=servicepath[len(servicepath)-1]
-                                       pipref=self.session.pip.getCurrentService()
-                                       self.session.pip.playService(swapservice)
-                                       self.servicelist.setCurrentServicePath(self.session.pip.servicePath)
-                                       if pipref.toString() != ref.toString(): # is a subservice ?
-                                               self.session.nav.stopService() # stop portal
-                                               self.session.nav.playService(pipref) # start subservice
-                                       self.session.pip.servicePath=servicepath
+                               if self.useServicePath:
+                                       if self.session.pip.servicePath:
+                                               servicepath = self.servicelist.getCurrentServicePath()
+                                               ref=servicepath[len(servicepath)-1]
+                                               pipref=self.session.pip.getCurrentService()
+                                               self.session.pip.playService(swapservice)
+                                               self.servicelist.setCurrentServicePath(self.session.pip.servicePath)
+                                               if pipref.toString() != ref.toString(): # is a subservice ?
+                                                       self.session.nav.stopService() # stop portal
+                                                       self.session.nav.playService(pipref) # start subservice
+                                               self.session.pip.servicePath=servicepath
                        elif answer[1] == self.MOVEPIP:
                                self.session.open(PiPSetup, pip = self.session.pip)
                        elif answer[1] == self.ENABLE_SUBTITLE:
@@ -1206,11 +1228,11 @@ class InfoBarAudioSelection:
                service = self.session.nav.getCurrentService()
                audio = service and service.audioTracks()
                self.audioTracks = audio
-               n = audio and audio.getNumberOfTracks()
+               n = audio and audio.getNumberOfTracks() or 0
                keys = [ "red", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n
                tlist = []
                print "tlist:", tlist
-               if n and n > 0:
+               if n > 0:
                        self.audioChannel = service.audioChannel()
 
                        for x in range(n):
@@ -1265,6 +1287,7 @@ class InfoBarAudioSelection:
                        self.audioChannel.selectChannel(mode[1])
                del self.audioChannel
 
+               
 class InfoBarSubserviceSelection:
        def __init__(self):
                self["SubserviceSelectionAction"] = HelpableActionMap(self, "InfobarSubserviceSelectionActions",
@@ -1331,12 +1354,21 @@ class InfoBarSubserviceSelection:
                                        selection = x
                                tlist.append((i.getName(), i))
 
-                       self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice..."), list = tlist, selection = selection)
+                       tlist = [(_("Quickzap"), "quickzap", service.subServices()), ("--", "")] + tlist
+
+                       keys = ["red", "",  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ] + [""] * n
+
+                       self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice..."), list = tlist, selection = selection + 2, keys = keys)
 
        def subserviceSelected(self, service):
                if not service is None:
-                       self["SubserviceQuickzapAction"].setEnabled(True)
-                       self.session.nav.playService(service[1])
+                       if isinstance(service[1], str):
+                               if service[1] == "quickzap":
+                                       from Screens.SubservicesQuickzap import SubservicesQuickzap
+                                       self.session.open(SubservicesQuickzap, service[2])
+                       else:
+                               self["SubserviceQuickzapAction"].setEnabled(True)
+                               self.session.nav.playService(service[1])
 
 class InfoBarAdditionalInfo:
        def __init__(self):
@@ -1424,6 +1456,9 @@ class InfoBarCueSheetSupport:
        CUT_TYPE_IN = 0
        CUT_TYPE_OUT = 1
        CUT_TYPE_MARK = 2
+       CUT_TYPE_LAST = 3
+       
+       ENABLE_RESUME_SUPPORT = False
        
        def __init__(self):
                self["CueSheetActions"] = HelpableActionMap(self, "InfobarCueSheetActions", 
@@ -1434,14 +1469,34 @@ class InfoBarCueSheetSupport:
                        }, prio=1) 
                
                self.cut_list = [ ]
+               self.is_closing = False
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
                                iPlayableService.evStart: self.__serviceStarted,
                        })
 
        def __serviceStarted(self):
+               if self.is_closing:
+                       return
                print "new service started! trying to download cuts!"
                self.downloadCuesheet()
+               
+               if self.ENABLE_RESUME_SUPPORT:
+                       last = None
+                       
+                       for (pts, what) in self.cut_list:
+                               if what == self.CUT_TYPE_LAST:
+                                       last = pts
+                       
+                       if last is not None:
+                               self.resume_point = last
+                               Notifications.AddNotificationWithCallback(self.playLastCB, MessageBox, _("Do you want to resume this playback?"), timeout=10)
+
+       def playLastCB(self, answer):
+               if answer == True:
+                       seekable = self.__getSeekable()
+                       if seekable is not None:
+                               seekable.seekTo(self.resume_point)
 
        def __getSeekable(self):
                service = self.session.nav.getCurrentService()