X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/1837e66b4c16260152cc9e98d7331dea368ea565..df0caf48b4590bbb469ec065ac08284903292394:/lib/python/Screens/ChannelSelection.py diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index cd159681..b203b24e 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -1,27 +1,39 @@ +from Tools.Profile import profile + from Screen import Screen from Components.Button import Button from Components.ServiceList import ServiceList -from Components.ActionMap import NumberActionMap, ActionMap +from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap from Components.MenuList import MenuList +from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase +profile("ChannelSelection.py 1") from EpgSelection import EPGSelection -from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB -from Components.config import config, configElement, ConfigSubsection, configText, currentConfigSelectionElement -from Screens.FixedMenu import FixedMenu +from enigma import eServiceReference, eEPGCache, eServiceCenter, eRCInput, eTimer, eDVBDB, iPlayableService, iServiceInformation, getPrevAsciiCode +from Components.config import config, ConfigSubsection, ConfigText from Tools.NumericalTextInput import NumericalTextInput +profile("ChannelSelection.py 2") from Components.NimManager import nimmanager -from Components.ServiceName import ServiceName -from Components.Sources.Clock import Clock -from Components.EventInfo import EventInfo +profile("ChannelSelection.py 2.1") +from Components.Sources.RdsDecoder import RdsDecoder +profile("ChannelSelection.py 2.2") +from Components.Sources.ServiceEvent import ServiceEvent +profile("ChannelSelection.py 2.3") from Components.Input import Input -from Screens.InputBox import InputBox +profile("ChannelSelection.py 3") +from Components.ParentalControl import parentalControl +from Screens.InputBox import InputBox, PinInput +from Screens.MessageBox import MessageBox +from Screens.ServiceInfo import ServiceInfo +profile("ChannelSelection.py 4") +from Screens.RdsDisplay import RassInteractive from ServiceReference import ServiceReference -from re import * +from Tools.BoundFunction import boundFunction +from re import compile from os import remove +profile("ChannelSelection.py after imports") FLAG_SERVICE_NEW_FOUND = 64 #define in lib/dvb/idvb.h as dxNewFound = 64 -import xml.dom.minidom - class BouquetSelector(Screen): def __init__(self, session, bouquets, selectedFunc, enableWrapAround=False): Screen.__init__(self, session) @@ -33,9 +45,7 @@ class BouquetSelector(Screen): "ok": self.okbuttonClick, "cancel": self.cancelClick }) - entrys = [ ] - for x in bouquets: - entrys.append((x[0], x[1])) + entrys = [ (x[0], x[1]) for x in bouquets ] self["menu"] = MenuList(entrys, enableWrapAround) def getCurrent(self): @@ -54,9 +64,19 @@ class BouquetSelector(Screen): def cancelClick(self): self.close(False) +# csel.bouquet_mark_edit values +OFF = 0 +EDIT_BOUQUET = 1 +EDIT_ALTERNATIVES = 2 + +def append_when_current_valid(current, menu, args, level = 0): + if current and current.valid() and level <= config.usage.setup_level.index: + menu.append(args) + class ChannelContextMenu(Screen): def __init__(self, session, csel): Screen.__init__(self, session) + #raise "we need a better summary screen here" self.csel = csel self.bsel = None @@ -67,52 +87,74 @@ class ChannelContextMenu(Screen): }) menu = [ ] + current = csel.getCurrentSelection() current_root = csel.getRoot() - current_sel_path = csel.getCurrentSelection().getPath() - current_sel_flags = csel.getCurrentSelection().flags + current_sel_path = current.getPath() + current_sel_flags = current.flags inBouquetRootList = current_root and current_root.getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK inBouquet = csel.getMutableList() is not None - haveBouquets = csel.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1 + haveBouquets = config.usage.multibouquet.value - if not csel.bouquet_mark_edit and not csel.movemode: + if not (len(current_sel_path) or current_sel_flags & (eServiceReference.isDirectory|eServiceReference.isMarker)): + append_when_current_valid(current, menu, (_("show transponder info"), self.showServiceInformations), level = 2) + if csel.bouquet_mark_edit == OFF and not csel.movemode: if not inBouquetRootList: - if (csel.getCurrentSelection().flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory: + isPlayable = not (current_sel_flags & (eServiceReference.isMarker|eServiceReference.isDirectory)) + if isPlayable: + if config.ParentalControl.configured.value: + if parentalControl.getProtectionLevel(csel.getCurrentSelection().toCompareString()) == -1: + append_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())), level = 0) + else: + append_when_current_valid(current, menu, (_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection())), level = 0) if haveBouquets: - menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected)) + append_when_current_valid(current, menu, (_("add service to bouquet"), self.addServiceToBouquetSelected), level = 0) else: - menu.append((_("add service to favourites"), self.addServiceToBouquetSelected)) + append_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected), level = 0) else: + if current_root.getPath().find('FROM SATELLITES') != -1: + append_when_current_valid(current, menu, (_("remove selected satellite"), self.removeSatelliteServices), level = 0) if haveBouquets: if not inBouquet and current_sel_path.find("PROVIDERS") == -1: - menu.append((_("copy to favourites"), self.copyCurrentToBouquetList)) + append_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList), level = 0) if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: - menu.append((_("remove all new found flags"), self.removeAllNewFoundFlags)) + append_when_current_valid(current, menu, (_("remove all new found flags"), self.removeAllNewFoundFlags), level = 0) if inBouquet: - menu.append((_("remove service"), self.removeCurrentService)) - if current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: - menu.append((_("remove new found flag"), self.removeNewFoundFlag)) - elif haveBouquets: - menu.append((_("remove bouquet"), self.removeBouquet)) + append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0) + if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: + append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0) + else: + menu.append((_("add bouquet"), self.showBouquetInputBox)) + append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0) if inBouquet: # current list is editable? - if not csel.bouquet_mark_edit: + if csel.bouquet_mark_edit == OFF: if not csel.movemode: - menu.append((_("enable move mode"), self.toggleMoveMode)) - menu.append((_("add bouquet..."), self.showBouquetInputBox)) - if not inBouquetRootList: + append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1) + if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup): + menu.append((_("add marker"), self.showMarkerInputBox)) if haveBouquets: - menu.append((_("enable bouquet edit"), self.bouquetMarkStart)) + append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0) else: - menu.append((_("enable favourite edit"), self.bouquetMarkStart)) + append_when_current_valid(current, menu, (_("enable favourite edit"), self.bouquetMarkStart), level = 0) + if current_sel_flags & eServiceReference.isGroup: + append_when_current_valid(current, menu, (_("edit alternatives"), self.editAlternativeServices), level = 2) + append_when_current_valid(current, menu, (_("show alternatives"), self.showAlternativeServices), level = 2) + append_when_current_valid(current, menu, (_("remove all alternatives"), self.removeAlternativeServices), level = 2) + elif not current_sel_flags & eServiceReference.isMarker: + append_when_current_valid(current, menu, (_("add alternatives"), self.addAlternativeServices), level = 2) else: - menu.append((_("disable move mode"), self.toggleMoveMode)) - elif not inBouquetRootList: - if haveBouquets: - menu.append((_("end bouquet edit"), self.bouquetMarkEnd)) - menu.append((_("abort bouquet edit"), self.bouquetMarkAbort)) + append_when_current_valid(current, menu, (_("disable move mode"), self.toggleMoveMode), level = 0) + else: + if csel.bouquet_mark_edit == EDIT_BOUQUET: + if haveBouquets: + append_when_current_valid(current, menu, (_("end bouquet edit"), self.bouquetMarkEnd), level = 0) + append_when_current_valid(current, menu, (_("abort bouquet edit"), self.bouquetMarkAbort), level = 0) + else: + append_when_current_valid(current, menu, (_("end favourites edit"), self.bouquetMarkEnd), level = 0) + append_when_current_valid(current, menu, (_("abort favourites edit"), self.bouquetMarkAbort), level = 0) else: - menu.append((_("end favourites edit"), self.bouquetMarkEnd)) - menu.append((_("abort favourites edit"), self.bouquetMarkAbort)) + append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0) + append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0) menu.append((_("back"), self.cancelClick)) self["menu"] = MenuList(menu) @@ -122,13 +164,31 @@ class ChannelContextMenu(Screen): def cancelClick(self): self.close(False) - + + def showServiceInformations(self): + self.session.open( ServiceInfo, self.csel.getCurrentSelection() ) + def showBouquetInputBox(self): - self.session.openWithCallback(self.bouquetInputCallback, InputBox, title=_("Please enter a name for the new bouquet"), text="bouquetname", maxSize=False, type=Input.TEXT) + self.session.openWithCallback(self.bouquetInputCallback, InputBox, title=_("Please enter a name for the new bouquet"), text="bouquetname", maxSize=False, visible_width = 56, type=Input.TEXT) def bouquetInputCallback(self, bouquet): if bouquet is not None: - self.csel.addBouquet(bouquet, None, True) + self.csel.addBouquet(bouquet, None) + self.close() + + def addParentalProtection(self, service): + parentalControl.protectService(service.toCompareString()) + self.close() + + def removeParentalProtection(self, service): + self.session.openWithCallback(boundFunction(self.pinEntered, service.toCompareString()), PinInput, pinList = [config.ParentalControl.servicepin[0].value], triesEntry = config.ParentalControl.retries.servicepin, title = _("Enter the service pin"), windowTitle = _("Change pin code")) + + def pinEntered(self, service, result): + if result: + parentalControl.unProtectService(service) + self.close() + else: + self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR) def addServiceToBouquetSelected(self): bouquets = self.csel.getBouquetList() @@ -140,14 +200,23 @@ class ChannelContextMenu(Screen): self.bsel = self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.addCurrentServiceToBouquet) elif cnt == 1: # add to only one existing bouquet self.addCurrentServiceToBouquet(bouquets[0][1]) - else: #no bouquets in root.. so assume only one favourite list is used - self.addCurrentServiceToBouquet(self.csel.bouquet_root) def bouquetSelClosed(self, recursive): self.bsel = None if recursive: self.close(False) + def removeSatelliteServices(self): + curpath = self.csel.getCurrentSelection().getPath() + idx = curpath.find("satellitePosition == ") + if idx != -1: + tmp = curpath[idx+21:] + idx = tmp.find(')') + if idx != -1: + satpos = int(tmp[:idx]) + eDVBDB.getInstance().removeServices(-1, -1, -1, satpos) + self.close() + def copyCurrentToBouquetList(self): self.csel.copyCurrentToBouquetList() self.close() @@ -156,8 +225,16 @@ class ChannelContextMenu(Screen): self.csel.removeBouquet() self.close() + def showMarkerInputBox(self): + self.session.openWithCallback(self.markerInputCallback, InputBox, title=_("Please enter a name for the new marker"), text="markername", maxSize=False, visible_width = 56, type=Input.TEXT) + + def markerInputCallback(self, marker): + if marker is not None: + self.csel.addMarker(marker) + self.close() + def addCurrentServiceToBouquet(self, dest): - self.csel.addCurrentServiceToBouquet(dest) + self.csel.addServiceToBouquet(dest) if self.bsel is not None: self.bsel.close(True) else: @@ -172,7 +249,7 @@ class ChannelContextMenu(Screen): self.close() def bouquetMarkStart(self): - self.csel.startMarkedEdit() + self.csel.startMarkedEdit(EDIT_BOUQUET) self.close() def bouquetMarkEnd(self): @@ -198,6 +275,39 @@ class ChannelContextMenu(Screen): eDVBDB.getInstance().removeFlags(FLAG_SERVICE_NEW_FOUND, -1, -1, -1, satpos) self.close() + def editAlternativeServices(self): + self.csel.startMarkedEdit(EDIT_ALTERNATIVES) + self.close() + + def showAlternativeServices(self): + self.csel.enterPath(self.csel.getCurrentSelection()) + self.close() + + def removeAlternativeServices(self): + self.csel.removeAlternativeServices() + self.close() + + def addAlternativeServices(self): + self.csel.addAlternativeServices() + self.csel.startMarkedEdit(EDIT_ALTERNATIVES) + self.close() + +class SelectionEventInfo: + def __init__(self): + self["ServiceEvent"] = ServiceEvent() + self.servicelist.connectSelChanged(self.__selectionChanged) + self.timer = eTimer() + self.timer.callback.append(self.updateEventInfo) + self.onShown.append(self.__selectionChanged) + + def __selectionChanged(self): + if self.execing: + self.timer.start(100, True) + + def updateEventInfo(self): + cur = self.getCurrentSelection() + self["ServiceEvent"].newService(cur) + class ChannelSelectionEPG: def __init__(self): self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"], @@ -217,7 +327,7 @@ class ChannelSelectionEdit: def __init__(self): self.entry_marked = False self.movemode = False - self.bouquet_mark_edit = False + self.bouquet_mark_edit = OFF self.mutableList = None self.__marked = [ ] self.saved_title = None @@ -263,19 +373,69 @@ class ChannelSelectionEdit: name += '_' return name - def addBouquet(self, bName, services, refresh=False): + def addMarker(self, name): + current = self.servicelist.getCurrent() + mutableList = self.getMutableList() + cnt = 0 + while mutableList: + str = '1:64:%d:0:0:0:0:0:0:0::%s'%(cnt, name) + ref = eServiceReference(str) + if current and current.valid(): + if not mutableList.addService(ref, current): + self.servicelist.addService(ref, True) + mutableList.flushChanges() + break + elif not mutableList.addService(ref): + self.servicelist.addService(ref, True) + mutableList.flushChanges() + break + cnt+=1 + + def addAlternativeServices(self): + cur_service = ServiceReference(self.getCurrentSelection()) + root = self.getRoot() + cur_root = root and ServiceReference(root) + mutableBouquet = cur_root.list().startEdit() + if mutableBouquet: + name = cur_service.getServiceName() + print "NAME", name + if self.mode == MODE_TV: + str = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(name)) + else: + str = '1:134:2:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(name)) + new_ref = ServiceReference(str) + if not mutableBouquet.addService(new_ref.ref, cur_service.ref): + mutableBouquet.removeService(cur_service.ref) + mutableBouquet.flushChanges() + eDVBDB.getInstance().reloadBouquets() + mutableAlternatives = new_ref.list().startEdit() + if mutableAlternatives: + mutableAlternatives.setListName(name) + if mutableAlternatives.addService(cur_service.ref): + print "add", cur_service.toString(), "to new alternatives failed" + mutableAlternatives.flushChanges() + self.servicelist.addService(new_ref.ref, True) + self.servicelist.removeCurrent() + self.servicelist.moveUp() + else: + print "get mutable list for new created alternatives failed" + else: + print "add", str, "to", cur_root.getServiceName(), "failed" + else: + print "bouquetlist is not editable" + + def addBouquet(self, bName, services): serviceHandler = eServiceCenter.getInstance() mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit() if mutableBouquetList: if self.mode == MODE_TV: bName += " (TV)" - str = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(bName)) + str = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(bName)) else: bName += " (Radio)" - str = '1:7:2:0:0:0:0:0:0:0:(type == 2) FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(bName)) + str = '1:7:2:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(bName)) new_bouquet_ref = eServiceReference(str) if not mutableBouquetList.addService(new_bouquet_ref): - self.bouquetNumOffsetCache = { } mutableBouquetList.flushChanges() eDVBDB.getInstance().reloadBouquets() mutableBouquet = serviceHandler.list(new_bouquet_ref).startEdit() @@ -286,10 +446,15 @@ class ChannelSelectionEdit: if mutableBouquet.addService(service): print "add", service.toString(), "to new bouquet failed" mutableBouquet.flushChanges() - if refresh: - self.setRoot(self.getRoot()) else: print "get mutable list for new created bouquet failed" + # do some voodoo to check if current_root is equal to bouquet_root + cur_root = self.getRoot(); + str1 = cur_root and cur_root.toString() + pos1 = str1 and str1.find("FROM BOUQUET") or -1 + pos2 = self.bouquet_rootstr.find("FROM BOUQUET") + if pos1 != -1 and pos2 != -1 and str1[pos1:] == self.bouquet_rootstr[pos2:]: + self.servicelist.addService(new_bouquet_ref) else: print "add", str, "to bouquets failed" else: @@ -302,10 +467,32 @@ class ChannelSelectionEdit: services = serviceHandler.list(provider.ref) self.addBouquet(providerName, services and services.getContent('R', True)) + def removeAlternativeServices(self): + cur_service = ServiceReference(self.getCurrentSelection()) + root = self.getRoot() + cur_root = root and ServiceReference(root) + list = cur_service.list() + first_in_alternative = list and list.getNext() + if first_in_alternative: + edit_root = cur_root and cur_root.list().startEdit() + if edit_root: + if not edit_root.addService(first_in_alternative, cur_service.ref): + self.servicelist.addService(first_in_alternative, True) + else: + print "couldn't add first alternative service to current root" + else: + print "couldn't edit current root!!" + else: + print "remove empty alternative list !!" + self.removeBouquet() + self.servicelist.moveUp() + def removeBouquet(self): refstr = self.getCurrentSelection().toString() + print "removeBouquet", refstr self.bouquetNumOffsetCache = { } pos = refstr.find('FROM BOUQUET "') + filename = None if pos != -1: refstr = refstr[pos+14:] pos = refstr.find('"') @@ -313,29 +500,35 @@ class ChannelSelectionEdit: filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2 self.removeCurrentService() try: - remove(filename) + if filename is not None: + remove(filename) except OSError: print "error during remove of", filename - eDVBDB.getInstance().reloadBouquets() # multiple marked entry stuff ( edit mode, later multiepg selection ) - def startMarkedEdit(self): + def startMarkedEdit(self, type): + self.savedPath = self.servicePath[:] + if type == EDIT_ALTERNATIVES: + self.enterPath(self.getCurrentSelection()) self.mutableList = self.getMutableList() # add all services from the current list to internal marked set in listboxservicecontent self.clearMarks() # this clears the internal marked set in the listboxservicecontent self.saved_title = self.instance.getTitle() pos = self.saved_title.find(')') new_title = self.saved_title[:pos+1] - if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1: - new_title += ' ' + _("[bouquet edit]") + if type == EDIT_ALTERNATIVES: + self.bouquet_mark_edit = EDIT_ALTERNATIVES + new_title += ' ' + _("[alternative edit]") else: - new_title += ' ' + _("[favourite edit]") + self.bouquet_mark_edit = EDIT_BOUQUET + if config.usage.multibouquet.value: + new_title += ' ' + _("[bouquet edit]") + else: + new_title += ' ' + _("[favourite edit]") self.setTitle(new_title) - self.bouquet_mark_edit = True self.__marked = self.servicelist.getRootServices() for x in self.__marked: self.servicelist.addMarked(eServiceReference(x)) - self.savedPath = self.servicePath[:] self.showAllServices() def endMarkedEdit(self, abort): @@ -356,7 +549,7 @@ class ChannelSelectionEdit: self.mutableList.flushChanges() self.__marked = [] self.clearMarks() - self.bouquet_mark_edit = False + self.bouquet_mark_edit = OFF self.mutableList = None self.setTitle(self.saved_title) self.saved_title = None @@ -384,31 +577,42 @@ class ChannelSelectionEdit: if not mutableList.removeService(ref): self.bouquetNumOffsetCache = { } mutableList.flushChanges() #FIXME dont flush on each single removed service - self.setRoot(self.getRoot()) + self.servicelist.removeCurrent() - def addCurrentServiceToBouquet(self, dest): + def addServiceToBouquet(self, dest, service=None): mutableList = self.getMutableList(dest) if not mutableList is None: - if not mutableList.addService(self.servicelist.getCurrent()): + if service is None: #use current selected service + service = self.servicelist.getCurrent() + if not mutableList.addService(service): self.bouquetNumOffsetCache = { } mutableList.flushChanges() + # do some voodoo to check if current_root is equal to dest + cur_root = self.getRoot(); + str1 = cur_root and cur_root.toString() or -1 + str2 = dest.toString() + pos1 = str1.find("FROM BOUQUET") + pos2 = str2.find("FROM BOUQUET") + if pos1 != -1 and pos2 != -1 and str1[pos1:] == str2[pos2:]: + self.servicelist.addService(service) def toggleMoveMode(self): if self.movemode: if self.entry_marked: self.toggleMoveMarked() # unmark current entry self.movemode = False - self.pathChangedDisabled = False # re-enable path change + self.pathChangeDisabled = False # re-enable path change self.mutableList.flushChanges() # FIXME add check if changes was made self.mutableList = None self.setTitle(self.saved_title) self.saved_title = None - if self.getRoot() == self.bouquet_root: + cur_root = self.getRoot() + if cur_root and cur_root == self.bouquet_root: self.bouquetNumOffsetCache = { } else: self.mutableList = self.getMutableList() self.movemode = True - self.pathChangedDisabled = True # no path change allowed in movemode + self.pathChangeDisabled = True # no path change allowed in movemode self.saved_title = self.instance.getTitle() new_title = self.saved_title pos = self.saved_title.find(')') @@ -419,7 +623,7 @@ class ChannelSelectionEdit: if self.movemode: #movemode active? self.channelSelected() # unmark self.toggleMoveMode() # disable move mode - elif self.bouquet_mark_edit: + elif self.bouquet_mark_edit != OFF: self.endMarkedEdit(True) # abort edit mode def toggleMoveMarked(self): @@ -436,14 +640,14 @@ class ChannelSelectionEdit: MODE_TV = 0 MODE_RADIO = 1 +# this makes it much simple to implement a selectable radio or tv mode :) +service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25) || (type == 134)' +service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)' + class ChannelSelectionBase(Screen): def __init__(self, session): Screen.__init__(self, session) - # this makes it much simple to implement a selectable radio or tv mode :) - self.service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25)' - self.service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)' - self["key_red"] = Button(_("All")) self["key_green"] = Button(_("Satellites")) self["key_yellow"] = Button(_("Provider")) @@ -453,6 +657,7 @@ class ChannelSelectionBase(Screen): self.servicelist = self["list"] self.numericalTextInput = NumericalTextInput() + self.numericalTextInput.setUseableChars(u'1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ') self.servicePathTV = [ ] self.servicePathRadio = [ ] @@ -460,11 +665,11 @@ class ChannelSelectionBase(Screen): self.mode = MODE_TV - self.pathChangedDisabled = False + self.pathChangeDisabled = False self.bouquetNumOffsetCache = { } - self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions"], + self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions", "InputAsciiActions"], { "showFavourites": self.showFavourites, "showAllServices": self.showAllServices, @@ -472,6 +677,9 @@ class ChannelSelectionBase(Screen): "showSatellites": self.showSatellites, "nextBouquet": self.nextBouquet, "prevBouquet": self.prevBouquet, + "nextMarker": self.nextMarker, + "prevMarker": self.prevMarker, + "gotAsciiCode": self.keyAsciiCode, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, @@ -483,31 +691,23 @@ class ChannelSelectionBase(Screen): "9": self.keyNumberGlobal, "0": self.keyNumber0 }) - - def appendDVBTypes(self, ref): - path = ref.getPath() - pos = path.find(' FROM BOUQUET') - if pos != -1: - return eServiceReference(self.service_types + path[pos:]) - return ref + self.recallBouquetMode() def getBouquetNumOffset(self, bouquet): - if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK + if not config.usage.multibouquet.value: return 0 - bouquet = self.appendDVBTypes(bouquet) - try: - return self.bouquetNumOffsetCache[bouquet.toString()] - except: - offsetCount = 0 + str = bouquet.toString() + offsetCount = 0 + if not self.bouquetNumOffsetCache.has_key(str): serviceHandler = eServiceCenter.getInstance() bouquetlist = serviceHandler.list(self.bouquet_root) if not bouquetlist is None: while True: - bouquetIterator = self.appendDVBTypes(bouquetlist.getNext()) + bouquetIterator = bouquetlist.getNext() if not bouquetIterator.valid(): #end of list break self.bouquetNumOffsetCache[bouquetIterator.toString()]=offsetCount - if ((bouquetIterator.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory): + if not (bouquetIterator.flags & eServiceReference.isDirectory): continue servicelist = serviceHandler.list(bouquetIterator) if not servicelist is None: @@ -515,22 +715,22 @@ class ChannelSelectionBase(Screen): serviceIterator = servicelist.getNext() if not serviceIterator.valid(): #check if end of list break - if serviceIterator.flags: #playable services have no flags - continue - offsetCount += 1 - return self.bouquetNumOffsetCache.get(bouquet.toString(), offsetCount) + playable = not (serviceIterator.flags & (eServiceReference.isDirectory|eServiceReference.isMarker)) + if playable: + offsetCount += 1 + return self.bouquetNumOffsetCache.get(str, offsetCount) def recallBouquetMode(self): if self.mode == MODE_TV: - self.service_types = self.service_types_tv - if currentConfigSelectionElement(config.usage.multibouquet) == "yes": - self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet' + self.service_types = service_types_tv + if config.usage.multibouquet.value: + self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet' else: self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'%(self.service_types) else: - self.service_types = self.service_types_radio - if currentConfigSelectionElement(config.usage.multibouquet) == "yes": - self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.radio" ORDER BY bouquet' + self.service_types = service_types_radio + if config.usage.multibouquet.value: + self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.radio" ORDER BY bouquet' else: self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet'%(self.service_types) self.bouquet_root = eServiceReference(self.bouquet_rootstr) @@ -560,13 +760,11 @@ class ChannelSelectionBase(Screen): def setRoot(self, root, justSet=False): path = root.getPath() inBouquetRootList = path.find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK - pos = path.find(' FROM BOUQUET') - isBouquet = pos != -1 + pos = path.find('FROM BOUQUET') + isBouquet = (pos != -1) and (root.flags & eServiceReference.isDirectory) if not inBouquetRootList and isBouquet: self.servicelist.setMode(ServiceList.MODE_FAVOURITES) self.servicelist.setNumberOffset(self.getBouquetNumOffset(root)) - refstr = self.service_types + path[pos:] - root = eServiceReference(refstr) else: self.servicelist.setMode(ServiceList.MODE_NORMAL) self.servicelist.setRoot(root, justSet) @@ -656,7 +854,7 @@ class ChannelSelectionBase(Screen): return False def showAllServices(self): - if not self.pathChangedDisabled: + if not self.pathChangeDisabled: refstr = '%s ORDER BY name'%(self.service_types) if not self.preEnterPath(refstr): ref = eServiceReference(refstr) @@ -666,7 +864,7 @@ class ChannelSelectionBase(Screen): self.enterPath(ref) def showSatellites(self): - if not self.pathChangedDisabled: + if not self.pathChangeDisabled: refstr = '%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types) if not self.preEnterPath(refstr): ref = eServiceReference(refstr) @@ -691,36 +889,50 @@ class ChannelSelectionBase(Screen): service = servicelist.getNext() if not service.valid(): #check if end of list break - orbpos = service.getUnsignedData(4) >> 16 + unsigned_orbpos = service.getUnsignedData(4) >> 16 + orbpos = service.getData(4) >> 16 + if orbpos < 0: + orbpos += 3600 if service.getPath().find("FROM PROVIDER") != -1: - service_name = _("Providers") + service_type = _("Providers") elif service.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: - service_name = _("New") + service_type = _("New") else: - service_name = _("Services") + service_type = _("Services") try: - service_name += str(' - %s'%(nimmanager.getSatDescription(orbpos))) - service.setName(service_name) # why we need this cast? + # why we need this cast? + service_name = str(nimmanager.getSatDescription(orbpos)) except: - if orbpos == 0xFFFF: #Cable - n = ("%s (%s)") % (service_name, _("Cable")) - elif orbpos == 0xEEEE: #Terrestrial - n = ("%s (%s)") % (service_name, _("Terrestrial")) + if unsigned_orbpos == 0xFFFF: #Cable + service_name = _("Cable") + elif unsigned_orbpos == 0xEEEE: #Terrestrial + service_name = _("Terrestrial") else: if orbpos > 1800: # west orbpos = 3600 - orbpos h = _("W") else: h = _("E") - n = ("%s (%d.%d" + h + ")") % (service_name, orbpos / 10, orbpos % 10) - service.setName(n) + service_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10) + service.setName("%s - %s" % (service_name, service_type)) self.servicelist.addService(service) - self.servicelist.finishFill() - if prev is not None: - self.setCurrentSelection(prev) + cur_ref = self.session.nav.getCurrentlyPlayingServiceReference() + if cur_ref: + pos = self.service_types.rfind(':') + refstr = '%s (channelID == %08x%04x%04x) && %s ORDER BY name' %(self.service_types[:pos+1], + cur_ref.getUnsignedData(4), # NAMESPACE + cur_ref.getUnsignedData(2), # TSID + cur_ref.getUnsignedData(3), # ONID + self.service_types[pos+1:]) + ref = eServiceReference(refstr) + ref.setName(_("Current Transponder")) + self.servicelist.addService(ref) + self.servicelist.finishFill() + if prev is not None: + self.setCurrentSelection(prev) def showProviders(self): - if not self.pathChangedDisabled: + if not self.pathChangeDisabled: refstr = '%s FROM PROVIDERS ORDER BY name'%(self.service_types) if not self.preEnterPath(refstr): ref = eServiceReference(refstr) @@ -733,9 +945,14 @@ class ChannelSelectionBase(Screen): self.enterPath(ref) def changeBouquet(self, direction): - if not self.pathChangedDisabled: - if self.isBasePathEqual(self.bouquet_root): - self.pathUp() + if not self.pathChangeDisabled: + if len(self.servicePath) > 1: + #when enter satellite root list we must do some magic stuff.. + ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types)) + if self.isBasePathEqual(ref): + self.showSatellites() + else: + self.pathUp() if direction < 0: self.moveUp() else: @@ -744,7 +961,9 @@ class ChannelSelectionBase(Screen): self.enterPath(ref) def inBouquet(self): - return self.isBasePathEqual(self.bouquet_root) + if len(self.servicePath) > 0 and self.servicePath[0] == self.bouquet_root: + return True + return False def atBegin(self): return self.servicelist.atBegin() @@ -759,7 +978,7 @@ class ChannelSelectionBase(Screen): self.changeBouquet(-1) def showFavourites(self): - if not self.pathChangedDisabled: + if not self.pathChangeDisabled: if not self.preEnterPath(self.bouquet_rootstr): if self.isBasePathEqual(self.bouquet_root): self.pathUp() @@ -770,8 +989,16 @@ class ChannelSelectionBase(Screen): self.enterPath(self.bouquet_root) def keyNumberGlobal(self, number): - char = self.numericalTextInput.getKey(number) - self.servicelist.moveToChar(char) + unichar = self.numericalTextInput.getKey(number) + charstr = unichar.encode("utf-8") + if len(charstr) == 1: + self.servicelist.moveToChar(charstr[0]) + + def keyAsciiCode(self): + unichar = unichr(getPrevAsciiCode()) + charstr = unichar.encode("utf-8") + if len(charstr) == 1: + self.servicelist.moveToChar(charstr[0]) def getRoot(self): return self.servicelist.getRoot() @@ -780,36 +1007,27 @@ class ChannelSelectionBase(Screen): return self.servicelist.getCurrent() def setCurrentSelection(self, service): - servicepath = service.getPath() - pos = servicepath.find(" FROM BOUQUET") - if pos != -1: - if self.mode == MODE_TV: - servicepath = '(type == 1)' + servicepath[pos:] - else: - servicepath = '(type == 2)' + servicepath[pos:] - service.setPath(servicepath) self.servicelist.setCurrent(service) def getBouquetList(self): - serviceCount=0 bouquets = [ ] serviceHandler = eServiceCenter.getInstance() - list = serviceHandler.list(self.bouquet_root) - if not list is None: - while True: - s = list.getNext() - if not s.valid(): - break - if ((s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory): - info = serviceHandler.info(s) - if not info is None: - bouquets.append((info.getName(s), s)) - else: - serviceCount += 1 - if len(bouquets) == 0 and serviceCount > 0: - info = serviceHandler.info(self.bouquet_root) - if not info is None: - bouquets.append((info.getName(self.bouquet_root), self.bouquet_root)) + if config.usage.multibouquet.value: + list = serviceHandler.list(self.bouquet_root) + if list: + while True: + s = list.getNext() + if not s.valid(): + break + if s.flags & eServiceReference.isDirectory: + info = serviceHandler.info(s) + if info: + bouquets.append((info.getName(s), s)) + return bouquets + else: + info = serviceHandler.info(self.bouquet_root) + if info: + bouquets.append((info.getName(self.bouquet_root), self.bouquet_root)) return bouquets return None @@ -834,23 +1052,30 @@ class ChannelSelectionBase(Screen): else: self.showAllServices() + def nextMarker(self): + self.servicelist.moveToNextMarker() + + def prevMarker(self): + self.servicelist.moveToPrevMarker() + HISTORYSIZE = 20 #config for lastservice config.tv = ConfigSubsection() -config.tv.lastservice = configElement("config.tv.lastservice", configText, "", 0) -config.tv.lastroot = configElement("config.tv.lastroot", configText, "", 0) +config.tv.lastservice = ConfigText() +config.tv.lastroot = ConfigText() config.radio = ConfigSubsection() -config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0) -config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0) +config.radio.lastservice = ConfigText() +config.radio.lastroot = ConfigText() config.servicelist = ConfigSubsection() -config.servicelist.lastmode = configElement("config.servicelist.lastmode", configText, "tv", 0) +config.servicelist.lastmode = ConfigText(default = "tv") -class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): +class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, SelectionEventInfo): def __init__(self, session): ChannelSelectionBase.__init__(self,session) ChannelSelectionEdit.__init__(self) ChannelSelectionEPG.__init__(self) + SelectionEventInfo.__init__(self) self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"], { @@ -860,10 +1085,14 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect "keyTV": self.setModeTv, }) - self.onShown.append(self.__onShown) + self.__event_tracker = ServiceEventTracker(screen=self, eventmap= + { + iPlayableService.evStart: self.__evServiceStart, + iPlayableService.evEnd: self.__evServiceEnd + }) self.lastChannelRootTimer = eTimer() - self.lastChannelRootTimer.timeout.get().append(self.__onCreate) + self.lastChannelRootTimer.callback.append(self.__onCreate) self.lastChannelRootTimer.start(100,True) self.history_tv = [ ] @@ -874,6 +1103,31 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.lastservice = config.tv.lastservice self.lastroot = config.tv.lastroot self.revertMode = None + config.usage.multibouquet.addNotifier(self.multibouquet_config_changed) + self.new_service_played = False + self.onExecBegin.append(self.asciiOn) + + def asciiOn(self): + rcinput = eRCInput.getInstance() + rcinput.setKeyboardMode(rcinput.kmAscii) + + def asciiOff(self): + rcinput = eRCInput.getInstance() + rcinput.setKeyboardMode(rcinput.kmNone) + + def multibouquet_config_changed(self, val): + self.recallBouquetMode() + + def __evServiceStart(self): + service = self.session.nav.getCurrentService() + if service: + info = service.info() + if info: + refstr = info.getInfoString(iServiceInformation.sServiceref) + self.servicelist.setPlayableIgnoreService(eServiceReference(refstr)) + + def __evServiceEnd(self): + self.servicelist.setPlayableIgnoreService(eServiceReference()) def setMode(self): self.restoreRoot() @@ -894,7 +1148,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect def setModeRadio(self): if self.revertMode is None and config.servicelist.lastmode.value == "tv": self.revertMode = MODE_TV - if currentConfigSelectionElement(config.usage.e1like_radio_mode) == "yes": + if config.usage.e1like_radio_mode.value: self.history = self.history_radio self.lastservice = config.radio.lastservice self.lastroot = config.radio.lastroot @@ -903,7 +1157,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.setMode() def __onCreate(self): - if currentConfigSelectionElement(config.usage.e1like_radio_mode) == "yes": + if config.usage.e1like_radio_mode.value: if config.servicelist.lastmode.value == "tv": self.setModeTv() else: @@ -914,25 +1168,21 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect if lastservice.valid(): self.zap() - def __onShown(self): - self.recallBouquetMode() - ref = self.session.nav.getCurrentlyPlayingServiceReference() - if ref is not None and ref.valid() and ref.getPath() == "": - self.servicelist.setPlayableIgnoreService(ref) - else: - self.servicelist.setPlayableIgnoreService(eServiceReference()) - def channelSelected(self): ref = self.getCurrentSelection() if self.movemode: self.toggleMoveMarked() elif (ref.flags & 7) == 7: self.enterPath(ref) - elif self.bouquet_mark_edit: - self.doMark() - else: - self.zap() - self.close(ref) + elif self.bouquet_mark_edit != OFF: + if not (self.bouquet_mark_edit == EDIT_ALTERNATIVES and ref.flags & eServiceReference.isGroup): + self.doMark() + elif not (ref.flags & eServiceReference.isMarker): # no marker + root = self.getRoot() + if not root or not (root.flags & eServiceReference.isGroup): + self.zap() + self.asciiOff() + self.close(ref) #called from infoBar and channelSelected def zap(self): @@ -940,12 +1190,18 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect ref = self.session.nav.getCurrentlyPlayingServiceReference() nref = self.getCurrentSelection() if ref is None or ref != nref: + self.new_service_played = True self.session.nav.playService(nref) self.saveRoot() - self.saveChannel() + self.saveChannel(nref) config.servicelist.lastmode.save() self.addToHistory(nref) + def newServicePlayed(self): + ret = self.new_service_played + self.new_service_played = False + return ret + def addToHistory(self, ref): if self.servicePath is not None: tmp=self.servicePath[:] @@ -981,11 +1237,12 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.saveRoot() plen = len(path) root = path[plen-1] - if self.getRoot() != root: + cur_root = self.getRoot() + if cur_root and cur_root != root: self.setRoot(root) self.session.nav.playService(ref) self.setCurrentSelection(ref) - self.saveChannel() + self.saveChannel(ref) def saveRoot(self): path = '' @@ -1022,8 +1279,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect return True return False - def saveChannel(self): - ref = self.session.nav.getCurrentlyPlayingServiceReference() + def saveChannel(self, ref): if ref is not None: refstr = ref.toString() else: @@ -1070,30 +1326,26 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect elif self.revertMode == MODE_RADIO: self.setModeRadio() self.revertMode = None + self.asciiOff() self.close(None) -from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord - -class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord): +class RadioInfoBar(Screen): def __init__(self, session): Screen.__init__(self, session) - InfoBarEvent.__init__(self) - InfoBarServiceName.__init__(self) - InfoBarInstantRecord.__init__(self) - self["CurrentTime"] = Clock() + self["RdsDecoder"] = RdsDecoder(self.session.nav) -class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): - def __init__(self, session): +class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarBase): + ALLOW_SUSPEND = True + + def __init__(self, session, infobar): ChannelSelectionBase.__init__(self, session) ChannelSelectionEdit.__init__(self) ChannelSelectionEPG.__init__(self) - - config.radio = ConfigSubsection(); - config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0); - config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0); + InfoBarBase.__init__(self) + self.infobar = infobar self.onLayoutFinish.append(self.onCreate) - self.info = session.instantiateDialog(RadioInfoBar) + self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"], { @@ -1103,6 +1355,57 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS "ok": self.channelSelected, }) + self.__event_tracker = ServiceEventTracker(screen=self, eventmap= + { + iPlayableService.evStart: self.__evServiceStart, + iPlayableService.evEnd: self.__evServiceEnd + }) + +########## RDS Radiotext / Rass Support BEGIN + self.infobar = infobar # reference to real infobar (the one and only) + self["RdsDecoder"] = self.info["RdsDecoder"] + self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions", + { + "startRassInteractive": (self.startRassInteractive, _("View Rass interactive...")) + },-1) + self["RdsActions"].setEnabled(False) + infobar.rds_display.onRassInteractivePossibilityChanged.append(self.RassInteractivePossibilityChanged) + self.onClose.append(self.__onClose) + + def __onClose(self): + lastservice=eServiceReference(config.tv.lastservice.value) + self.session.nav.playService(lastservice) + + def startRassInteractive(self): + self.info.hide(); + self.infobar.rass_interactive = self.session.openWithCallback(self.RassInteractiveClosed, RassInteractive) + + def RassInteractiveClosed(self): + self.info.show() + self.infobar.rass_interactive = None + self.infobar.RassSlidePicChanged() + + def RassInteractivePossibilityChanged(self, state): + self["RdsActions"].setEnabled(state) +########## RDS Radiotext / Rass Support END + + def closeRadio(self): + self.infobar.rds_display.onRassInteractivePossibilityChanged.remove(self.RassInteractivePossibilityChanged) + self.info.hide() + #set previous tv service + self.close(None) + + def __evServiceStart(self): + service = self.session.nav.getCurrentService() + if service: + info = service.info() + if info: + refstr = info.getInfoString(iServiceInformation.sServiceref) + self.servicelist.setPlayableIgnoreService(eServiceReference(refstr)) + + def __evServiceEnd(self): + self.servicelist.setPlayableIgnoreService(eServiceReference()) + def saveRoot(self): path = '' for i in self.servicePathRadio: @@ -1145,7 +1448,8 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS if lastservice.valid(): self.servicelist.setCurrent(lastservice) self.session.nav.playService(lastservice) - self.servicelist.setPlayableIgnoreService(lastservice) + else: + self.session.nav.stopService() self.info.show() def channelSelected(self): # just return selected service @@ -1154,23 +1458,18 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS self.toggleMoveMarked() elif (ref.flags & 7) == 7: self.enterPath(ref) - elif self.bouquet_mark_edit: - self.doMark() - else: - playingref = self.session.nav.getCurrentlyPlayingServiceReference() - if playingref is None or playingref != ref: - self.session.nav.playService(ref) - self.servicelist.setPlayableIgnoreService(ref) - config.radio.lastservice.value = ref.toString() - config.radio.lastservice.save() - self.saveRoot() - - def closeRadio(self): - self.info.hide() - #set previous tv service - lastservice=eServiceReference(config.tv.lastservice.value) - self.session.nav.playService(lastservice) - self.close(None) + elif self.bouquet_mark_edit != OFF: + if not (self.bouquet_mark_edit == EDIT_ALTERNATIVES and ref.flags & eServiceReference.isGroup): + self.doMark() + elif not (ref.flags & eServiceReference.isMarker): # no marker + cur_root = self.getRoot() + if not cur_root or not (cur_root.flags & eServiceReference.isGroup): + playingref = self.session.nav.getCurrentlyPlayingServiceReference() + if playingref is None or playingref != ref: + self.session.nav.playService(ref) + config.radio.lastservice.value = ref.toString() + config.radio.lastservice.save() + self.saveRoot() class SimpleChannelSelection(ChannelSelectionBase): def __init__(self, session, title): @@ -1194,7 +1493,7 @@ class SimpleChannelSelection(ChannelSelectionBase): ref = self.getCurrentSelection() if (ref.flags & 7) == 7: self.enterPath(ref) - else: + elif not (ref.flags & eServiceReference.isMarker): ref = self.getCurrentSelection() self.close(ref)