X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2FScreens%2FChannelSelection.py;h=db2789d0ac366d2a700efd21579c6fea42ae4fb5;hp=5c5cc700aca917b8bd2b6de79466ed104ce99786;hb=d4ac90a0740a22c86e8f18a49a594e9a8f3746df;hpb=4e9ca16e100b19dbf0095706182aab6be5141579 diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 5c5cc70..db2789d 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -3,23 +3,30 @@ from Components.Button import Button from Components.ServiceList import ServiceList from Components.ActionMap import NumberActionMap, ActionMap from Components.MenuList import MenuList +from Components.ServiceEventTracker import ServiceEventTracker 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 enigma import eServiceReference, eEPGCache, eServiceCenter, eTimer, eDVBDB, iPlayableService, iServiceInformation +from Components.config import config, ConfigSubsection, ConfigText from Screens.FixedMenu import FixedMenu from Tools.NumericalTextInput import NumericalTextInput from Components.NimManager import nimmanager -from Components.ServiceName import ServiceName -from Components.Clock import Clock -from Components.EventInfo import EventInfo +from Components.Sources.Clock import Clock +from Components.Input import Input +from Components.ParentalControl import parentalControl +from Screens.InputBox import InputBox, PinInput +from Screens.MessageBox import MessageBox +from Screens.ServiceInfo import ServiceInfo from ServiceReference import ServiceReference +from Tools.BoundFunction import boundFunction from re import * from os import remove +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): + def __init__(self, session, bouquets, selectedFunc, enableWrapAround=False): Screen.__init__(self, session) self.selectedFunc=selectedFunc @@ -32,18 +39,34 @@ class BouquetSelector(Screen): entrys = [ ] for x in bouquets: entrys.append((x[0], x[1])) - self["menu"] = MenuList(entrys) + self["menu"] = MenuList(entrys, enableWrapAround) + + def getCurrent(self): + cur = self["menu"].getCurrent() + return cur and cur[1] def okbuttonClick(self): - self.selectedFunc(self["menu"].getCurrent()[1]) + self.selectedFunc(self.getCurrent()) + + def up(self): + self["menu"].up() + + def down(self): + self["menu"].down() def cancelClick(self): self.close(False) +# csel.bouquet_mark_edit values +OFF = 0 +EDIT_BOUQUET = 1 +EDIT_ALTERNATIVES = 2 + class ChannelContextMenu(Screen): def __init__(self, session, csel): Screen.__init__(self, session) self.csel = csel + self.bsel = None self["actions"] = ActionMap(["OkCancelActions"], { @@ -52,43 +75,71 @@ class ChannelContextMenu(Screen): }) menu = [ ] - inBouquetRootList = csel.getRoot().getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK + current_root = csel.getRoot() + current_sel_path = csel.getCurrentSelection().getPath() + current_sel_flags = csel.getCurrentSelection().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): + menu.append((_("show transponder info"), self.showServiceInformations)) + 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: + menu.append((_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection()))) + else: + menu.append((_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection()))) if haveBouquets: menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected)) else: menu.append((_("add service to favourites"), self.addServiceToBouquetSelected)) - elif haveBouquets: - if not inBouquet and csel.getCurrentSelection().getPath().find("PROVIDERS") == -1: - menu.append((_("copy to favourites"), csel.copyCurrentToBouquetList)) + else: + if haveBouquets: + if not inBouquet and current_sel_path.find("PROVIDERS") == -1: + menu.append((_("copy to bouquets"), self.copyCurrentToBouquetList)) + if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: + menu.append((_("remove all new found flags"), self.removeAllNewFoundFlags)) if inBouquet: - menu.append((_("remove service"), self.removeCurrentService)) - elif haveBouquets: - menu.append((_("remove bouquet"), csel.removeBouquet)) + menu.append((_("remove entry"), self.removeCurrentService)) + if current_root is not None and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: + menu.append((_("remove new found flag"), self.removeNewFoundFlag)) + else: + menu.append((_("add bouquet"), self.showBouquetInputBox)) + menu.append((_("remove entry"), self.removeBouquet)) 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)) - if not inBouquetRootList: + if not inBouquetRootList and not current_root.flags & eServiceReference.isGroup: + menu.append((_("add marker"), self.showMarkerInputBox)) if haveBouquets: menu.append((_("enable bouquet edit"), self.bouquetMarkStart)) else: menu.append((_("enable favourite edit"), self.bouquetMarkStart)) + if current_sel_flags & eServiceReference.isGroup: + menu.append((_("edit alternatives"), self.editAlternativeServices)) + menu.append((_("show alternatives"), self.showAlternativeServices)) + menu.append((_("remove all alternatives"), self.removeAlternativeServices)) + else: + menu.append((_("add alternatives"), self.addAlternativeServices)) 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)) + else: + if csel.bouquet_mark_edit == EDIT_BOUQUET: + if haveBouquets: + menu.append((_("end bouquet edit"), self.bouquetMarkEnd)) + menu.append((_("abort bouquet edit"), self.bouquetMarkAbort)) + else: + menu.append((_("end favourites edit"), self.bouquetMarkEnd)) + menu.append((_("abort favourites edit"), self.bouquetMarkAbort)) else: - menu.append((_("end favourites edit"), self.bouquetMarkEnd)) - menu.append((_("abort favourites edit"), self.bouquetMarkAbort)) + menu.append((_("end alternatives edit"), self.bouquetMarkEnd)) + menu.append((_("abort alternatives edit"), self.bouquetMarkAbort)) menu.append((_("back"), self.cancelClick)) self["menu"] = MenuList(menu) @@ -99,6 +150,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) + + def bouquetInputCallback(self, bouquet): + if bouquet is not None: + 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() if bouquets is None: @@ -106,13 +182,12 @@ class ChannelContextMenu(Screen): else: cnt = len(bouquets) if cnt > 1: # show bouquet list - self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.addCurrentServiceToBouquet) + 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) @@ -124,9 +199,20 @@ 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, 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.close(True) # close bouquet selection + self.csel.addServiceToBouquet(dest) + if self.bsel is not None: + self.bsel.close(True) + else: + self.close(True) # close bouquet selection def removeCurrentService(self): self.csel.removeCurrentService() @@ -137,7 +223,7 @@ class ChannelContextMenu(Screen): self.close() def bouquetMarkStart(self): - self.csel.startMarkedEdit() + self.csel.startMarkedEdit(EDIT_BOUQUET) self.close() def bouquetMarkEnd(self): @@ -148,6 +234,38 @@ class ChannelContextMenu(Screen): self.csel.endMarkedEdit(abort=True) self.close() + def removeNewFoundFlag(self): + eDVBDB.getInstance().removeFlag(self.csel.getCurrentSelection(), FLAG_SERVICE_NEW_FOUND) + self.close() + + def removeAllNewFoundFlags(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().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 ChannelSelectionEPG: def __init__(self): self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"], @@ -167,7 +285,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 @@ -177,13 +295,16 @@ class ChannelSelectionEdit: def __init__(self, csel, contexts = [ ], actions = { }, prio=0): ActionMap.__init__(self, contexts, actions, prio) self.csel = csel + def action(self, contexts, action): if action == "cancel": self.csel.handleEditCancel() + return 0 # fall-trough elif action == "ok": - pass # avoid typo warning... + return 0 # fall-trough else: - ActionMap.action(self, contexts, action) + return ActionMap.action(self, contexts, action) + self["ChannelSelectEditActions"] = ChannelSelectionEditActionMap(self, ["ChannelSelectEditActions", "OkCancelActions"], { "contextMenu": self.doContext, @@ -195,7 +316,7 @@ class ChannelSelectionEdit: serviceHandler = eServiceCenter.getInstance() if not root.valid(): root=self.getRoot() - list = serviceHandler.list(root) + list = root and serviceHandler.list(root) if list is not None: return list.startEdit() return None @@ -210,74 +331,160 @@ class ChannelSelectionEdit: name += '_' return name - def copyCurrentToBouquetList(self): - provider = ServiceReference(self.getCurrentSelection()) + 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()) + cur_root = ServiceReference(self.getRoot()) + 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:(type == 1) FROM BOUQUET \"alternatives.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(name)) + else: + str = '1:134:2:0:0:0:0:0:0:0:(type == 2) 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: - providerName = provider.getServiceName() if self.mode == MODE_TV: - str = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(providerName)) + 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)) else: - str = '1:7:2:0:0:0:0:0:0:0:(type == 2) FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(providerName)) + 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)) 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() if mutableBouquet: - mutableBouquet.setListName(providerName) - list = [ ] - services = serviceHandler.list(provider.ref) - if not services is None: - if not services.getContent(list, True): - for service in list: - if mutableBouquet.addService(service): - print "add", service.toString(), "to new bouquet failed" - mutableBouquet.flushChanges() - else: - print "getContent failed" - else: - print "list provider", providerName, "failed" + mutableBouquet.setListName(bName) + if services is not None: + for service in services: + if mutableBouquet.addService(service): + print "add", service.toString(), "to new bouquet failed" + mutableBouquet.flushChanges() 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.toString() + pos1 = str1.find("FROM BOUQUET") + 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: print "bouquetlist is not editable" + def copyCurrentToBouquetList(self): + provider = ServiceReference(self.getCurrentSelection()) + providerName = provider.getServiceName() + serviceHandler = eServiceCenter.getInstance() + services = serviceHandler.list(provider.ref) + self.addBouquet(providerName, services and services.getContent('R', True)) + + def removeAlternativeServices(self): + cur_service = ServiceReference(self.getCurrentSelection()) + cur_root = ServiceReference(self.getRoot()) + list = cur_service.list() + first_in_alternative = list and list.getNext() + if first_in_alternative: + edit_root = 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('"') if pos != -1: filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2 self.removeCurrentService() - remove(filename) - eDVBDB.getInstance().reloadBouquets() + try: + if filename is not None: + remove(filename) + except OSError: + print "error during remove of", filename # 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.instance.setTitle(new_title) - self.bouquet_mark_edit = True + 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.__marked = self.servicelist.getRootServices() for x in self.__marked: self.servicelist.addMarked(eServiceReference(x)) - self.savedPath = self.servicePath[:] self.showAllServices() def endMarkedEdit(self, abort): @@ -298,11 +505,14 @@ class ChannelSelectionEdit: self.mutableList.flushChanges() self.__marked = [] self.clearMarks() - self.bouquet_mark_edit = False + self.bouquet_mark_edit = OFF self.mutableList = None - self.instance.setTitle(self.saved_title) + self.setTitle(self.saved_title) self.saved_title = None - self.servicePath = self.savedPath[:] + # self.servicePath is just a reference to servicePathTv or Radio... + # so we never ever do use the asignment operator in self.servicePath + del self.servicePath[:] # remove all elements + self.servicePath += self.savedPath # add saved elements del self.savedPath self.setRoot(self.servicePath[len(self.servicePath)-1]) @@ -322,49 +532,53 @@ class ChannelSelectionEdit: if ref.valid() and mutableList is not None: if not mutableList.removeService(ref): self.bouquetNumOffsetCache = { } - currentIndex = self.servicelist.getCurrentIndex() - self.servicelist.moveDown() - if self.servicelist.getCurrentIndex() == currentIndex: - currentIndex -= 1 mutableList.flushChanges() #FIXME dont flush on each single removed service - self.setRoot(self.getRoot()) - self.servicelist.moveToIndex(currentIndex) + 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() - self.close() + # do some voodoo to check if current_root is equal to dest + cur_root = self.getRoot(); + str1 = cur_root.toString() + 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.instance.setTitle(self.saved_title) + self.setTitle(self.saved_title) self.saved_title = None if self.getRoot() == 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(')') new_title = self.saved_title[:pos+1] + ' ' + _("[move mode]") + self.saved_title[pos+1:] - self.instance.setTitle(new_title); + self.setTitle(new_title); def handleEditCancel(self): 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): @@ -381,14 +595,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)' +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)' - 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")) @@ -398,12 +612,15 @@ class ChannelSelectionBase(Screen): self.servicelist = self["list"] self.numericalTextInput = NumericalTextInput() + self.numericalTextInput.setUseableChars(u'1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ') self.servicePathTV = [ ] self.servicePathRadio = [ ] - self.servicePath = None + self.servicePath = [ ] + + self.mode = MODE_TV - self.pathChangedDisabled = False + self.pathChangeDisabled = False self.bouquetNumOffsetCache = { } @@ -415,6 +632,8 @@ class ChannelSelectionBase(Screen): "showSatellites": self.showSatellites, "nextBouquet": self.nextBouquet, "prevBouquet": self.prevBouquet, + "nextMarker": self.nextMarker, + "prevMarker": self.prevMarker, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, @@ -424,8 +643,9 @@ class ChannelSelectionBase(Screen): "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, - "0": self.keyNumberGlobal + "0": self.keyNumber0 }) + self.recallBouquetMode() def appendDVBTypes(self, ref): path = ref.getPath() @@ -435,13 +655,12 @@ class ChannelSelectionBase(Screen): return ref 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: @@ -450,7 +669,7 @@ class ChannelSelectionBase(Screen): 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: @@ -458,21 +677,21 @@ 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.service_types = service_types_tv + if config.usage.multibouquet.value: self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) 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.service_types = service_types_radio + if config.usage.multibouquet.value: self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.radio" ORDER BY bouquet' else: self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet'%(self.service_types) @@ -487,7 +706,7 @@ class ChannelSelectionBase(Screen): if pos != -1: title = title[:pos] title += " (TV)" - self.instance.setTitle(title) + self.setTitle(title) def setRadioMode(self): self.mode = MODE_RADIO @@ -498,13 +717,13 @@ class ChannelSelectionBase(Screen): if pos != -1: title = title[:pos] title += " (Radio)" - self.instance.setTitle(title) + self.setTitle(title) 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 + 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)) @@ -559,7 +778,7 @@ class ChannelSelectionBase(Screen): titleStr += '/' nameStr = self.getServiceName(end_ref) titleStr += nameStr - self.instance.setTitle(titleStr) + self.setTitle(titleStr) def moveUp(self): self.servicelist.moveUp() @@ -579,9 +798,9 @@ class ChannelSelectionBase(Screen): length = len(self.servicePath) if length: current = self.servicePath[length-1] - self.setRoot(current, justSet) - if not justSet: - self.setCurrentSelection(prev) + self.setRoot(current, justSet) + if not justSet: + self.setCurrentSelection(prev) return prev def isBasePathEqual(self, ref): @@ -599,7 +818,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) @@ -609,7 +828,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) @@ -634,26 +853,36 @@ class ChannelSelectionBase(Screen): service = servicelist.getNext() if not service.valid(): #check if end of list break - orbpos = service.getData(4) >> 16 + orbpos = service.getUnsignedData(4) >> 16 if service.getPath().find("FROM PROVIDER") != -1: service_name = _("Providers") + elif service.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: + service_name = _("New") else: service_name = _("Services") try: service_name += str(' - %s'%(nimmanager.getSatDescription(orbpos))) service.setName(service_name) # why we need this cast? except: - if orbpos > 1800: # west - service.setName("%s (%3.1f" + _("W") + ")" %(str, (0 - (orbpos - 3600)) / 10.0)) + if orbpos == 0xFFFF: #Cable + n = ("%s (%s)") % (service_name, _("Cable")) + elif orbpos == 0xEEEE: #Terrestrial + n = ("%s (%s)") % (service_name, _("Terrestrial")) else: - service.setName("%s (%3.1f" + _("E") + ")" % (str, orbpos / 10.0)) + 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) self.servicelist.addService(service) - self.servicelist.finishFill() - if prev is not None: - self.setCurrentSelection(prev) + 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) @@ -666,9 +895,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: @@ -692,7 +926,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() @@ -703,8 +937,10 @@ 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 getRoot(self): return self.servicelist.getRoot() @@ -724,72 +960,152 @@ class ChannelSelectionBase(Screen): 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 + def keyNumber0(self, num): + if len(self.servicePath) > 1: + self.keyGoUp() + else: + self.keyNumberGlobal(num) + + def keyGoUp(self): + if len(self.servicePath) > 1: + if self.isBasePathEqual(self.bouquet_root): + self.showFavourites() + else: + ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types)) + if self.isBasePathEqual(ref): + self.showSatellites() + else: + ref = eServiceReference('%s FROM PROVIDERS ORDER BY name'%(self.service_types)) + if self.isBasePathEqual(ref): + self.showProviders() + 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 = ConfigText() +config.tv.lastroot = ConfigText() +config.radio = ConfigSubsection() +config.radio.lastservice = ConfigText() +config.radio.lastroot = ConfigText() +config.servicelist = ConfigSubsection() +config.servicelist.lastmode = ConfigText(default = "tv") + class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): def __init__(self, session): ChannelSelectionBase.__init__(self,session) ChannelSelectionEdit.__init__(self) ChannelSelectionEPG.__init__(self) - #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.prevservice = configElement("config.tv.prevservice", configText, "", 0); - config.tv.prevroot = configElement("config.tv.prevroot", configText, "", 0); - - self["actions"] = ActionMap(["OkCancelActions"], + self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"], { "cancel": self.cancel, "ok": self.channelSelected, + "keyRadio": self.setModeRadio, + "keyTV": self.setModeTv, + }) + + self.__event_tracker = ServiceEventTracker(screen=self, eventmap= + { + iPlayableService.evStart: self.__evServiceStart, + iPlayableService.evEnd: self.__evServiceEnd }) - self.onShown.append(self.__onShown) self.lastChannelRootTimer = eTimer() self.lastChannelRootTimer.timeout.get().append(self.__onCreate) self.lastChannelRootTimer.start(100,True) - self.history = [ ] + self.history_tv = [ ] + self.history_radio = [ ] + self.history = self.history_tv self.history_pos = 0 - def __onCreate(self): - self.setTvMode() + self.lastservice = config.tv.lastservice + self.lastroot = config.tv.lastroot + self.revertMode = None + config.usage.multibouquet.addNotifier(self.multibouquet_config_changed) + + 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() - lastservice=eServiceReference(config.tv.lastservice.value) + lastservice=eServiceReference(self.lastservice.value) if lastservice.valid(): self.setCurrentSelection(lastservice) - 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) + def setModeTv(self): + if self.revertMode is None and config.servicelist.lastmode.value == "radio": + self.revertMode = MODE_RADIO + self.history = self.history_tv + self.lastservice = config.tv.lastservice + self.lastroot = config.tv.lastroot + config.servicelist.lastmode.value = "tv" + self.setTvMode() + self.setMode() + + def setModeRadio(self): + if self.revertMode is None and config.servicelist.lastmode.value == "tv": + self.revertMode = MODE_TV + if config.usage.e1like_radio_mode.value: + self.history = self.history_radio + self.lastservice = config.radio.lastservice + self.lastroot = config.radio.lastroot + config.servicelist.lastmode.value = "radio" + self.setRadioMode() + self.setMode() + + def __onCreate(self): + if config.usage.e1like_radio_mode.value: + if config.servicelist.lastmode.value == "tv": + self.setModeTv() + else: + self.setModeRadio() else: - self.servicelist.setPlayableIgnoreService(eServiceReference()) + self.setModeTv() + lastservice=eServiceReference(self.lastservice.value) + if lastservice.valid(): + self.zap() def channelSelected(self): ref = self.getCurrentSelection() @@ -797,32 +1113,40 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect 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 + if not (self.getRoot().flags & eServiceReference.isGroup): + self.zap() + self.close(ref) #called from infoBar and channelSelected def zap(self): + self.revertMode=None ref = self.session.nav.getCurrentlyPlayingServiceReference() nref = self.getCurrentSelection() if ref is None or ref != nref: self.session.nav.playService(nref) - self.saveRoot() - self.saveChannel() - tmp=self.servicePath[:] - tmp.append(nref) - try: - del self.history[self.history_pos+1:] - except: - pass - self.history.append(tmp) - hlen = len(self.history) - if hlen > HISTORYSIZE: - del self.history[0] - hlen -= 1 - self.history_pos = hlen-1 + self.saveRoot() + self.saveChannel(nref) + config.servicelist.lastmode.save() + self.addToHistory(nref) + + def addToHistory(self, ref): + if self.servicePath is not None: + tmp=self.servicePath[:] + tmp.append(ref) + try: + del self.history[self.history_pos+1:] + except: + pass + self.history.append(tmp) + hlen = len(self.history) + if hlen > HISTORYSIZE: + del self.history[0] + hlen -= 1 + self.history_pos = hlen-1 def historyBack(self): hlen = len(self.history) @@ -839,7 +1163,8 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect def setHistoryPath(self): path = self.history[self.history_pos][:] ref = path.pop() - self.servicePath = path + del self.servicePath[:] + self.servicePath += path self.saveRoot() plen = len(path) root = path[plen-1] @@ -847,85 +1172,93 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.setRoot(root) self.session.nav.playService(ref) self.setCurrentSelection(ref) - self.saveChannel() + self.saveChannel(ref) def saveRoot(self): path = '' - for i in self.servicePathTV: + for i in self.servicePath: path += i.toString() path += ';' - if config.tv.prevroot.value != config.tv.lastroot.value: - config.tv.prevroot.value = config.tv.lastroot.value - config.tv.prevroot.save() - if len(path) and path != config.tv.lastroot.value: - config.tv.lastroot.value = path - config.tv.lastroot.save() + if len(path) and path != self.lastroot.value: + self.lastroot.value = path + self.lastroot.save() def restoreRoot(self): self.clearPath() re = compile('.+?;') - tmp = re.findall(config.tv.lastroot.value) + tmp = re.findall(self.lastroot.value) cnt = 0 for i in tmp: - self.servicePathTV.append(eServiceReference(i[:len(i)-1])) + self.servicePath.append(eServiceReference(i[:len(i)-1])) cnt += 1 if cnt: - path = self.servicePathTV.pop() + path = self.servicePath.pop() self.enterPath(path) else: self.showFavourites() self.saveRoot() def preEnterPath(self, refstr): - if len(self.servicePathTV) and self.servicePathTV[0] != eServiceReference(refstr): - pathstr = config.tv.lastroot.value + if len(self.servicePath) and self.servicePath[0] != eServiceReference(refstr): + pathstr = self.lastroot.value if pathstr is not None and pathstr.find(refstr) == 0: self.restoreRoot() - lastservice=eServiceReference(config.tv.lastservice.value) - if lastservice is not None: + lastservice=eServiceReference(self.lastservice.value) + if lastservice.valid(): self.setCurrentSelection(lastservice) 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: refstr = "" - if refstr != config.tv.lastservice.value: - config.tv.prevservice.value = config.tv.lastservice.value - config.tv.prevservice.save() - config.tv.lastservice.value = refstr - config.tv.lastservice.save() + if refstr != self.lastservice.value: + self.lastservice.value = refstr + self.lastservice.save() + + def setCurrentServicePath(self, path): + hlen = len(self.history) + if hlen > 0: + self.history[self.history_pos] = path + else: + self.history.append(path) + self.setHistoryPath() + + def getCurrentServicePath(self): + hlen = len(self.history) + if hlen > 0: + return self.history[self.history_pos] + return None def recallPrevService(self): - if len(config.tv.prevservice.value) and len(config.tv.prevroot.value): - if config.tv.lastroot.value != config.tv.prevroot.value: - tmp = config.tv.lastroot.value - config.tv.lastroot.value = config.tv.prevroot.value - config.tv.lastroot.save() - config.tv.prevroot.value = tmp - config.tv.prevroot.save() - self.restoreRoot() - if config.tv.lastservice.value != config.tv.prevservice.value: - tmp = config.tv.lastservice.value - config.tv.lastservice.value = config.tv.prevservice.value - config.tv.lastservice.save() - config.tv.prevservice.value = tmp - config.tv.prevservice.save() - lastservice=eServiceReference(config.tv.lastservice.value) - self.session.nav.playService(lastservice) - self.setCurrentSelection(lastservice) + hlen = len(self.history) + if hlen > 1: + if self.history_pos == hlen-1: + tmp = self.history[self.history_pos] + self.history[self.history_pos] = self.history[self.history_pos-1] + self.history[self.history_pos-1] = tmp + else: + tmp = self.history[self.history_pos+1] + self.history[self.history_pos+1] = self.history[self.history_pos] + self.history[self.history_pos] = tmp + self.setHistoryPath() def cancel(self): + if self.revertMode is None: + self.restoreRoot() + lastservice=eServiceReference(self.lastservice.value) + if lastservice.valid() and self.getCurrentSelection() != lastservice: + self.setCurrentSelection(lastservice) + elif self.revertMode == MODE_TV: + self.setModeTv() + elif self.revertMode == MODE_RADIO: + self.setModeRadio() + self.revertMode = None self.close(None) - self.restoreRoot() - lastservice=eServiceReference(config.tv.lastservice.value) - if lastservice.valid() and self.getCurrentSelection() != lastservice: - self.setCurrentSelection(lastservice) -from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord +from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarRadioText class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord): def __init__(self, session): @@ -933,17 +1266,21 @@ class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecor InfoBarEvent.__init__(self) InfoBarServiceName.__init__(self) InfoBarInstantRecord.__init__(self) - self["Clock"] = Clock() + self["CurrentTime"] = Clock() + +class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarRadioText): + + ALLOW_SUSPEND = True -class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): def __init__(self, session): ChannelSelectionBase.__init__(self, session) ChannelSelectionEdit.__init__(self) ChannelSelectionEPG.__init__(self) + InfoBarRadioText.__init__(self) 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() self.onLayoutFinish.append(self.onCreate) self.info = session.instantiateDialog(RadioInfoBar) @@ -956,6 +1293,23 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS "ok": self.channelSelected, }) + self.__event_tracker = ServiceEventTracker(screen=self, eventmap= + { + iPlayableService.evStart: self.__evServiceStart, + iPlayableService.evEnd: self.__evServiceEnd + }) + + 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: @@ -986,7 +1340,7 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS if pathstr is not None and pathstr.find(refstr) == 0: self.restoreRoot() lastservice=eServiceReference(config.radio.lastservice.value) - if lastservice is not None: + if lastservice.valid(): self.setCurrentSelection(lastservice) return True return False @@ -998,7 +1352,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS if lastservice.valid(): self.servicelist.setCurrent(lastservice) self.session.nav.playService(lastservice) - self.servicelist.setPlayableIgnoreService(lastservice) self.info.show() def channelSelected(self): # just return selected service @@ -1007,16 +1360,17 @@ 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() + 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 + if not (self.getRoot().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() def closeRadio(self): self.info.hide() @@ -1040,14 +1394,14 @@ class SimpleChannelSelection(ChannelSelectionBase): }) def __onExecCallback(self): - self.session.currentDialog.instance.setTitle(self.title) + self.setTitle(self.title) self.setModeTv() def channelSelected(self): # just return selected service ref = self.getCurrentSelection() if (ref.flags & 7) == 7: self.enterPath(ref) - else: + elif not (ref.flags & eServiceReference.isMarker): ref = self.getCurrentSelection() self.close(ref)