X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d26280c98cf140bb1f48fbc501810a84b6f0fcda..e131b75fd194db84a37f2395b5ab88093e09192f:/lib/python/Screens/ChannelSelection.py diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 2bc6259a..df1bd6c0 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -18,10 +18,12 @@ from ServiceReference import ServiceReference 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 @@ -34,16 +36,25 @@ 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) class ChannelContextMenu(Screen): - def __init__(self, session, csel): Screen.__init__(self, session) self.csel = csel @@ -57,6 +68,8 @@ class ChannelContextMenu(Screen): menu = [ ] 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 @@ -68,11 +81,16 @@ class ChannelContextMenu(Screen): 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"), self.copyCurrentToBouquetList)) + else: + if haveBouquets: + if not inBouquet and current_sel_path.find("PROVIDERS") == -1: + menu.append((_("copy to favourites"), 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)) + 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)) @@ -110,7 +128,7 @@ class ChannelContextMenu(Screen): def bouquetInputCallback(self, bouquet): if bouquet is not None: - self.csel.addBouquet(bouquet) + self.csel.addBouquet(bouquet, None, True) def addServiceToBouquetSelected(self): bouquets = self.csel.getBouquetList() @@ -165,6 +183,21 @@ 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() + class ChannelSelectionEPG: def __init__(self): self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"], @@ -229,17 +262,17 @@ class ChannelSelectionEdit: else: name += '_' return name - - def addBouquet(self, providerName): + + def addBouquet(self, bName, services, refresh=False): serviceHandler = eServiceCenter.getInstance() mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit() if mutableBouquetList: if self.mode == MODE_TV: - providerName += " (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: - providerName += " (Radio)" - 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 = { } @@ -247,9 +280,14 @@ class ChannelSelectionEdit: eDVBDB.getInstance().reloadBouquets() mutableBouquet = serviceHandler.list(new_bouquet_ref).startEdit() if mutableBouquet: - mutableBouquet.setListName(providerName) + 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() - self.setRoot(self.getRoot()) + if refresh: + self.setRoot(self.getRoot()) else: print "get mutable list for new created bouquet failed" else: @@ -259,40 +297,10 @@ class ChannelSelectionEdit: def copyCurrentToBouquetList(self): provider = ServiceReference(self.getCurrentSelection()) + providerName = provider.getServiceName() 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)) - 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)) - 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" - else: - print "get mutable list for new created bouquet failed" - else: - print "add", str, "to bouquets failed" - else: - print "bouquetlist is not editable" + services = serviceHandler.list(provider.ref) + self.addBouquet(providerName, services and services.getContent('R', True)) def removeBouquet(self): refstr = self.getCurrentSelection().toString() @@ -433,7 +441,7 @@ class ChannelSelectionBase(Screen): 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_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")) @@ -683,21 +691,28 @@ 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 - orbpos = 3600 - orbpos - h = _("W") + if orbpos == 0xFFFF: #Cable + n = ("%s (%s)") % (service_name, _("Cable")) + elif orbpos == 0xEEEE: #Terrestrial + n = ("%s (%s)") % (service_name, _("Terrestrial")) else: - h = _("E") - n = ("%s (%d.%d" + h + ")") % (service_name, orbpos / 10, orbpos % 10) + 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() @@ -821,17 +836,17 @@ class ChannelSelectionBase(Screen): 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); + 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); - self["actions"] = ActionMap(["OkCancelActions"], { "cancel": self.cancel, @@ -880,11 +895,14 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect nref = self.getCurrentSelection() if ref is None or ref != nref: self.session.nav.playService(nref) - self.saveRoot() - self.saveChannel() + self.saveRoot() + self.saveChannel() + self.addToHistory(nref) + + def addToHistory(self, ref): if self.servicePath is not None: tmp=self.servicePath[:] - tmp.append(nref) + tmp.append(ref) try: del self.history[self.history_pos+1:] except: