1 from Screen import Screen
2 from Components.Button import Button
3 from Components.ServiceList import ServiceList
4 from Components.ActionMap import NumberActionMap, ActionMap
5 from Components.MenuList import MenuList
6 from EpgSelection import EPGSelection
7 from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB
8 from Components.config import config, configElement, ConfigSubsection, configText, currentConfigSelectionElement
9 from Screens.FixedMenu import FixedMenu
10 from Tools.NumericalTextInput import NumericalTextInput
11 from Components.NimManager import nimmanager
12 from Components.Sources.Clock import Clock
13 from Components.Input import Input
14 from Screens.InputBox import InputBox
15 from ServiceReference import ServiceReference
19 FLAG_SERVICE_NEW_FOUND = 64 #define in lib/dvb/idvb.h as dxNewFound = 64
21 import xml.dom.minidom
23 class BouquetSelector(Screen):
24 def __init__(self, session, bouquets, selectedFunc, enableWrapAround=False):
25 Screen.__init__(self, session)
27 self.selectedFunc=selectedFunc
29 self["actions"] = ActionMap(["OkCancelActions"],
31 "ok": self.okbuttonClick,
32 "cancel": self.cancelClick
36 entrys.append((x[0], x[1]))
37 self["menu"] = MenuList(entrys, enableWrapAround)
40 cur = self["menu"].getCurrent()
43 def okbuttonClick(self):
44 self.selectedFunc(self.getCurrent())
52 def cancelClick(self):
55 class ChannelContextMenu(Screen):
56 def __init__(self, session, csel):
57 Screen.__init__(self, session)
61 self["actions"] = ActionMap(["OkCancelActions"],
63 "ok": self.okbuttonClick,
64 "cancel": self.cancelClick
68 current_root = csel.getRoot()
69 current_sel_path = csel.getCurrentSelection().getPath()
70 current_sel_flags = csel.getCurrentSelection().flags
71 inBouquetRootList = current_root and current_root.getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
72 inBouquet = csel.getMutableList() is not None
73 haveBouquets = csel.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1
75 if not csel.bouquet_mark_edit and not csel.movemode:
76 if not inBouquetRootList:
77 if (csel.getCurrentSelection().flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory:
79 menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected))
81 menu.append((_("add service to favourites"), self.addServiceToBouquetSelected))
84 if not inBouquet and current_sel_path.find("PROVIDERS") == -1:
85 menu.append((_("copy to favourites"), self.copyCurrentToBouquetList))
86 if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
87 menu.append((_("remove all new found flags"), self.removeAllNewFoundFlags))
89 menu.append((_("remove service"), self.removeCurrentService))
90 if current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
91 menu.append((_("remove new found flag"), self.removeNewFoundFlag))
93 menu.append((_("remove bouquet"), self.removeBouquet))
95 if inBouquet: # current list is editable?
96 if not csel.bouquet_mark_edit:
98 menu.append((_("enable move mode"), self.toggleMoveMode))
99 menu.append((_("add bouquet..."), self.showBouquetInputBox))
100 if not inBouquetRootList:
102 menu.append((_("enable bouquet edit"), self.bouquetMarkStart))
104 menu.append((_("enable favourite edit"), self.bouquetMarkStart))
106 menu.append((_("disable move mode"), self.toggleMoveMode))
107 elif not inBouquetRootList:
109 menu.append((_("end bouquet edit"), self.bouquetMarkEnd))
110 menu.append((_("abort bouquet edit"), self.bouquetMarkAbort))
112 menu.append((_("end favourites edit"), self.bouquetMarkEnd))
113 menu.append((_("abort favourites edit"), self.bouquetMarkAbort))
115 menu.append((_("back"), self.cancelClick))
116 self["menu"] = MenuList(menu)
118 def okbuttonClick(self):
119 self["menu"].getCurrent()[1]()
121 def cancelClick(self):
124 def showBouquetInputBox(self):
125 self.session.openWithCallback(self.bouquetInputCallback, InputBox, title=_("Please enter a name for the new bouquet"), text="bouquetname", maxSize=False, type=Input.TEXT)
127 def bouquetInputCallback(self, bouquet):
128 if bouquet is not None:
129 self.csel.addBouquet(bouquet, None, True)
131 def addServiceToBouquetSelected(self):
132 bouquets = self.csel.getBouquetList()
137 if cnt > 1: # show bouquet list
138 self.bsel = self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.addCurrentServiceToBouquet)
139 elif cnt == 1: # add to only one existing bouquet
140 self.addCurrentServiceToBouquet(bouquets[0][1])
141 else: #no bouquets in root.. so assume only one favourite list is used
142 self.addCurrentServiceToBouquet(self.csel.bouquet_root)
144 def bouquetSelClosed(self, recursive):
149 def copyCurrentToBouquetList(self):
150 self.csel.copyCurrentToBouquetList()
153 def removeBouquet(self):
154 self.csel.removeBouquet()
157 def addCurrentServiceToBouquet(self, dest):
158 self.csel.addCurrentServiceToBouquet(dest)
159 if self.bsel is not None:
160 self.bsel.close(True)
162 self.close(True) # close bouquet selection
164 def removeCurrentService(self):
165 self.csel.removeCurrentService()
168 def toggleMoveMode(self):
169 self.csel.toggleMoveMode()
172 def bouquetMarkStart(self):
173 self.csel.startMarkedEdit()
176 def bouquetMarkEnd(self):
177 self.csel.endMarkedEdit(abort=False)
180 def bouquetMarkAbort(self):
181 self.csel.endMarkedEdit(abort=True)
184 def removeNewFoundFlag(self):
185 eDVBDB.getInstance().removeFlag(self.csel.getCurrentSelection(), FLAG_SERVICE_NEW_FOUND)
188 def removeAllNewFoundFlags(self):
189 curpath = self.csel.getCurrentSelection().getPath()
190 idx = curpath.find("satellitePosition == ")
192 tmp = curpath[idx+21:]
195 satpos = int(tmp[:idx])
196 eDVBDB.getInstance().removeFlags(FLAG_SERVICE_NEW_FOUND, -1, -1, -1, satpos)
199 class ChannelSelectionEPG:
201 self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"],
203 "showEPGList": self.showEPGList,
206 def showEPGList(self):
207 ref=self.getCurrentSelection()
208 ptr=eEPGCache.getInstance()
209 if ptr.startTimeQuery(ref) != -1:
210 self.session.open(EPGSelection, ref)
212 print 'no epg for service', ref.toString()
214 class ChannelSelectionEdit:
216 self.entry_marked = False
217 self.movemode = False
218 self.bouquet_mark_edit = False
219 self.mutableList = None
221 self.saved_title = None
222 self.saved_root = None
224 class ChannelSelectionEditActionMap(ActionMap):
225 def __init__(self, csel, contexts = [ ], actions = { }, prio=0):
226 ActionMap.__init__(self, contexts, actions, prio)
229 def action(self, contexts, action):
230 if action == "cancel":
231 self.csel.handleEditCancel()
232 return 0 # fall-trough
234 return 0 # fall-trough
236 return ActionMap.action(self, contexts, action)
238 self["ChannelSelectEditActions"] = ChannelSelectionEditActionMap(self, ["ChannelSelectEditActions", "OkCancelActions"],
240 "contextMenu": self.doContext,
243 def getMutableList(self, root=eServiceReference()):
244 if not self.mutableList is None:
245 return self.mutableList
246 serviceHandler = eServiceCenter.getInstance()
249 list = root and serviceHandler.list(root)
251 return list.startEdit()
254 def buildBouquetID(self, str):
258 if (c >= 'a' and c <= 'z') or (c >= '0' and c <= '9'):
264 def addBouquet(self, bName, services, refresh=False):
265 serviceHandler = eServiceCenter.getInstance()
266 mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit()
267 if mutableBouquetList:
268 if self.mode == MODE_TV:
270 str = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(bName))
273 str = '1:7:2:0:0:0:0:0:0:0:(type == 2) FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(bName))
274 new_bouquet_ref = eServiceReference(str)
275 if not mutableBouquetList.addService(new_bouquet_ref):
276 self.bouquetNumOffsetCache = { }
277 mutableBouquetList.flushChanges()
278 eDVBDB.getInstance().reloadBouquets()
279 mutableBouquet = serviceHandler.list(new_bouquet_ref).startEdit()
281 mutableBouquet.setListName(bName)
282 if services is not None:
283 for service in services:
284 if mutableBouquet.addService(service):
285 print "add", service.toString(), "to new bouquet failed"
286 mutableBouquet.flushChanges()
288 self.setRoot(self.getRoot())
290 print "get mutable list for new created bouquet failed"
292 print "add", str, "to bouquets failed"
294 print "bouquetlist is not editable"
296 def copyCurrentToBouquetList(self):
297 provider = ServiceReference(self.getCurrentSelection())
298 providerName = provider.getServiceName()
299 serviceHandler = eServiceCenter.getInstance()
300 services = serviceHandler.list(provider.ref)
301 self.addBouquet(providerName, services and services.getContent('R', True))
303 def removeBouquet(self):
304 refstr = self.getCurrentSelection().toString()
305 self.bouquetNumOffsetCache = { }
306 pos = refstr.find('FROM BOUQUET "')
308 refstr = refstr[pos+14:]
309 pos = refstr.find('"')
311 filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2
312 self.removeCurrentService()
316 print "error during remove of", filename
317 eDVBDB.getInstance().reloadBouquets()
319 # multiple marked entry stuff ( edit mode, later multiepg selection )
320 def startMarkedEdit(self):
321 self.mutableList = self.getMutableList()
322 # add all services from the current list to internal marked set in listboxservicecontent
323 self.clearMarks() # this clears the internal marked set in the listboxservicecontent
324 self.saved_title = self.instance.getTitle()
325 pos = self.saved_title.find(')')
326 new_title = self.saved_title[:pos+1]
327 if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1:
328 new_title += ' ' + _("[bouquet edit]")
330 new_title += ' ' + _("[favourite edit]")
331 self.setTitle(new_title)
332 self.bouquet_mark_edit = True
333 self.__marked = self.servicelist.getRootServices()
334 for x in self.__marked:
335 self.servicelist.addMarked(eServiceReference(x))
336 self.savedPath = self.servicePath[:]
337 self.showAllServices()
339 def endMarkedEdit(self, abort):
340 if not abort and self.mutableList is not None:
341 self.bouquetNumOffsetCache = { }
342 new_marked = set(self.servicelist.getMarked())
343 old_marked = set(self.__marked)
344 removed = old_marked - new_marked
345 added = new_marked - old_marked
349 self.mutableList.removeService(eServiceReference(x))
352 self.mutableList.addService(eServiceReference(x))
354 self.mutableList.flushChanges()
357 self.bouquet_mark_edit = False
358 self.mutableList = None
359 self.setTitle(self.saved_title)
360 self.saved_title = None
361 # self.servicePath is just a reference to servicePathTv or Radio...
362 # so we never ever do use the asignment operator in self.servicePath
363 del self.servicePath[:] # remove all elements
364 self.servicePath += self.savedPath # add saved elements
366 self.setRoot(self.servicePath[len(self.servicePath)-1])
368 def clearMarks(self):
369 self.servicelist.clearMarks()
372 ref = self.servicelist.getCurrent()
373 if self.servicelist.isMarked(ref):
374 self.servicelist.removeMarked(ref)
376 self.servicelist.addMarked(ref)
378 def removeCurrentService(self):
379 ref = self.servicelist.getCurrent()
380 mutableList = self.getMutableList()
381 if ref.valid() and mutableList is not None:
382 if not mutableList.removeService(ref):
383 self.bouquetNumOffsetCache = { }
384 mutableList.flushChanges() #FIXME dont flush on each single removed service
385 self.setRoot(self.getRoot())
387 def addCurrentServiceToBouquet(self, dest):
388 mutableList = self.getMutableList(dest)
389 if not mutableList is None:
390 if not mutableList.addService(self.servicelist.getCurrent()):
391 self.bouquetNumOffsetCache = { }
392 mutableList.flushChanges()
394 def toggleMoveMode(self):
396 if self.entry_marked:
397 self.toggleMoveMarked() # unmark current entry
398 self.movemode = False
399 self.pathChangedDisabled = False # re-enable path change
400 self.mutableList.flushChanges() # FIXME add check if changes was made
401 self.mutableList = None
402 self.setTitle(self.saved_title)
403 self.saved_title = None
404 if self.getRoot() == self.bouquet_root:
405 self.bouquetNumOffsetCache = { }
407 self.mutableList = self.getMutableList()
409 self.pathChangedDisabled = True # no path change allowed in movemode
410 self.saved_title = self.instance.getTitle()
411 new_title = self.saved_title
412 pos = self.saved_title.find(')')
413 new_title = self.saved_title[:pos+1] + ' ' + _("[move mode]") + self.saved_title[pos+1:]
414 self.setTitle(new_title);
416 def handleEditCancel(self):
417 if self.movemode: #movemode active?
418 self.channelSelected() # unmark
419 self.toggleMoveMode() # disable move mode
420 elif self.bouquet_mark_edit:
421 self.endMarkedEdit(True) # abort edit mode
423 def toggleMoveMarked(self):
424 if self.entry_marked:
425 self.servicelist.setCurrentMarked(False)
426 self.entry_marked = False
428 self.servicelist.setCurrentMarked(True)
429 self.entry_marked = True
432 self.session.open(ChannelContextMenu, self)
437 class ChannelSelectionBase(Screen):
438 def __init__(self, session):
439 Screen.__init__(self, session)
441 # this makes it much simple to implement a selectable radio or tv mode :)
442 self.service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25)'
443 self.service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)'
445 self["key_red"] = Button(_("All"))
446 self["key_green"] = Button(_("Satellites"))
447 self["key_yellow"] = Button(_("Provider"))
448 self["key_blue"] = Button(_("Favourites"))
450 self["list"] = ServiceList()
451 self.servicelist = self["list"]
453 self.numericalTextInput = NumericalTextInput()
455 self.servicePathTV = [ ]
456 self.servicePathRadio = [ ]
457 self.servicePath = [ ]
461 self.pathChangedDisabled = False
463 self.bouquetNumOffsetCache = { }
465 self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions"],
467 "showFavourites": self.showFavourites,
468 "showAllServices": self.showAllServices,
469 "showProviders": self.showProviders,
470 "showSatellites": self.showSatellites,
471 "nextBouquet": self.nextBouquet,
472 "prevBouquet": self.prevBouquet,
473 "1": self.keyNumberGlobal,
474 "2": self.keyNumberGlobal,
475 "3": self.keyNumberGlobal,
476 "4": self.keyNumberGlobal,
477 "5": self.keyNumberGlobal,
478 "6": self.keyNumberGlobal,
479 "7": self.keyNumberGlobal,
480 "8": self.keyNumberGlobal,
481 "9": self.keyNumberGlobal,
485 def appendDVBTypes(self, ref):
487 pos = path.find(' FROM BOUQUET')
489 return eServiceReference(self.service_types + path[pos:])
492 def getBouquetNumOffset(self, bouquet):
493 if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK
495 bouquet = self.appendDVBTypes(bouquet)
497 return self.bouquetNumOffsetCache[bouquet.toString()]
500 serviceHandler = eServiceCenter.getInstance()
501 bouquetlist = serviceHandler.list(self.bouquet_root)
502 if not bouquetlist is None:
504 bouquetIterator = self.appendDVBTypes(bouquetlist.getNext())
505 if not bouquetIterator.valid(): #end of list
507 self.bouquetNumOffsetCache[bouquetIterator.toString()]=offsetCount
508 if ((bouquetIterator.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory):
510 servicelist = serviceHandler.list(bouquetIterator)
511 if not servicelist is None:
513 serviceIterator = servicelist.getNext()
514 if not serviceIterator.valid(): #check if end of list
516 if serviceIterator.flags: #playable services have no flags
519 return self.bouquetNumOffsetCache.get(bouquet.toString(), offsetCount)
521 def recallBouquetMode(self):
522 if self.mode == MODE_TV:
523 self.service_types = self.service_types_tv
524 if currentConfigSelectionElement(config.usage.multibouquet) == "yes":
525 self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet'
527 self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'%(self.service_types)
529 self.service_types = self.service_types_radio
530 if currentConfigSelectionElement(config.usage.multibouquet) == "yes":
531 self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.radio" ORDER BY bouquet'
533 self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet'%(self.service_types)
534 self.bouquet_root = eServiceReference(self.bouquet_rootstr)
538 self.servicePath = self.servicePathTV
539 self.recallBouquetMode()
540 title = self.instance.getTitle()
541 pos = title.find(" (")
547 def setRadioMode(self):
548 self.mode = MODE_RADIO
549 self.servicePath = self.servicePathRadio
550 self.recallBouquetMode()
551 title = self.instance.getTitle()
552 pos = title.find(" (")
558 def setRoot(self, root, justSet=False):
559 path = root.getPath()
560 inBouquetRootList = path.find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
561 pos = path.find(' FROM BOUQUET')
562 isBouquet = pos != -1
563 if not inBouquetRootList and isBouquet:
564 self.servicelist.setMode(ServiceList.MODE_FAVOURITES)
565 self.servicelist.setNumberOffset(self.getBouquetNumOffset(root))
566 refstr = self.service_types + path[pos:]
567 root = eServiceReference(refstr)
569 self.servicelist.setMode(ServiceList.MODE_NORMAL)
570 self.servicelist.setRoot(root, justSet)
571 self.buildTitleString()
573 def removeModeStr(self, str):
574 if self.mode == MODE_TV:
575 pos = str.find(' (TV)')
577 pos = str.find(' (Radio)')
582 def getServiceName(self, ref):
583 str = self.removeModeStr(ServiceReference(ref).getServiceName())
585 pathstr = ref.getPath()
586 if pathstr.find('FROM PROVIDERS') != -1:
588 if pathstr.find('FROM SATELLITES') != -1:
589 return _("Satellites")
590 if pathstr.find(') ORDER BY name') != -1:
594 def buildTitleString(self):
595 titleStr = self.instance.getTitle()
596 pos = titleStr.find(']')
598 pos = titleStr.find(')')
600 titleStr = titleStr[:pos+1]
601 Len = len(self.servicePath)
603 base_ref = self.servicePath[0]
605 end_ref = self.servicePath[Len-1]
608 nameStr = self.getServiceName(base_ref)
609 titleStr += ' ' + nameStr
610 if end_ref is not None:
615 nameStr = self.getServiceName(end_ref)
617 self.setTitle(titleStr)
620 self.servicelist.moveUp()
623 self.servicelist.moveDown()
626 del self.servicePath[:]
628 def enterPath(self, ref, justSet=False):
629 self.servicePath.append(ref)
630 self.setRoot(ref, justSet)
632 def pathUp(self, justSet=False):
633 prev = self.servicePath.pop()
634 length = len(self.servicePath)
636 current = self.servicePath[length-1]
637 self.setRoot(current, justSet)
639 self.setCurrentSelection(prev)
642 def isBasePathEqual(self, ref):
643 if len(self.servicePath) > 1 and self.servicePath[0] == ref:
647 def isPrevPathEqual(self, ref):
648 length = len(self.servicePath)
649 if length > 1 and self.servicePath[length-2] == ref:
653 def preEnterPath(self, refstr):
656 def showAllServices(self):
657 if not self.pathChangedDisabled:
658 refstr = '%s ORDER BY name'%(self.service_types)
659 if not self.preEnterPath(refstr):
660 ref = eServiceReference(refstr)
661 currentRoot = self.getRoot()
662 if currentRoot is None or currentRoot != ref:
666 def showSatellites(self):
667 if not self.pathChangedDisabled:
668 refstr = '%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types)
669 if not self.preEnterPath(refstr):
670 ref = eServiceReference(refstr)
674 if self.isBasePathEqual(ref):
675 if self.isPrevPathEqual(ref):
677 prev = self.pathUp(justSet)
679 currentRoot = self.getRoot()
680 if currentRoot is None or currentRoot != ref:
683 self.enterPath(ref, True)
685 serviceHandler = eServiceCenter.getInstance()
686 servicelist = serviceHandler.list(ref)
687 if not servicelist is None:
689 service = servicelist.getNext()
690 if not service.valid(): #check if end of list
692 orbpos = service.getUnsignedData(4) >> 16
693 if service.getPath().find("FROM PROVIDER") != -1:
694 service_name = _("Providers")
695 elif service.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
696 service_name = _("New")
698 service_name = _("Services")
700 service_name += str(' - %s'%(nimmanager.getSatDescription(orbpos)))
701 service.setName(service_name) # why we need this cast?
703 if orbpos == 0xFFFF: #Cable
704 n = ("%s (%s)") % (service_name, _("Cable"))
705 elif orbpos == 0xEEEE: #Terrestrial
706 n = ("%s (%s)") % (service_name, _("Terrestrial"))
708 if orbpos > 1800: # west
709 orbpos = 3600 - orbpos
713 n = ("%s (%d.%d" + h + ")") % (service_name, orbpos / 10, orbpos % 10)
715 self.servicelist.addService(service)
716 self.servicelist.finishFill()
718 self.setCurrentSelection(prev)
720 def showProviders(self):
721 if not self.pathChangedDisabled:
722 refstr = '%s FROM PROVIDERS ORDER BY name'%(self.service_types)
723 if not self.preEnterPath(refstr):
724 ref = eServiceReference(refstr)
725 if self.isBasePathEqual(ref):
728 currentRoot = self.getRoot()
729 if currentRoot is None or currentRoot != ref:
733 def changeBouquet(self, direction):
734 if not self.pathChangedDisabled:
735 if self.isBasePathEqual(self.bouquet_root):
741 ref = self.getCurrentSelection()
745 return self.isBasePathEqual(self.bouquet_root)
748 return self.servicelist.atBegin()
751 return self.servicelist.atEnd()
753 def nextBouquet(self):
754 self.changeBouquet(+1)
756 def prevBouquet(self):
757 self.changeBouquet(-1)
759 def showFavourites(self):
760 if not self.pathChangedDisabled:
761 if not self.preEnterPath(self.bouquet_rootstr):
762 if self.isBasePathEqual(self.bouquet_root):
765 currentRoot = self.getRoot()
766 if currentRoot is None or currentRoot != self.bouquet_root:
768 self.enterPath(self.bouquet_root)
770 def keyNumberGlobal(self, number):
771 char = self.numericalTextInput.getKey(number)
772 self.servicelist.moveToChar(char)
775 return self.servicelist.getRoot()
777 def getCurrentSelection(self):
778 return self.servicelist.getCurrent()
780 def setCurrentSelection(self, service):
781 servicepath = service.getPath()
782 pos = servicepath.find(" FROM BOUQUET")
784 if self.mode == MODE_TV:
785 servicepath = '(type == 1)' + servicepath[pos:]
787 servicepath = '(type == 2)' + servicepath[pos:]
788 service.setPath(servicepath)
789 self.servicelist.setCurrent(service)
791 def getBouquetList(self):
794 serviceHandler = eServiceCenter.getInstance()
795 list = serviceHandler.list(self.bouquet_root)
801 if ((s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory):
802 info = serviceHandler.info(s)
804 bouquets.append((info.getName(s), s))
807 if len(bouquets) == 0 and serviceCount > 0:
808 info = serviceHandler.info(self.bouquet_root)
810 bouquets.append((info.getName(self.bouquet_root), self.bouquet_root))
814 def keyNumber0(self, num):
815 if len(self.servicePath) > 1:
818 self.keyNumberGlobal(num)
821 if len(self.servicePath) > 1:
822 if self.isBasePathEqual(self.bouquet_root):
823 self.showFavourites()
825 ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types))
826 if self.isBasePathEqual(ref):
827 self.showSatellites()
829 ref = eServiceReference('%s FROM PROVIDERS ORDER BY name'%(self.service_types))
830 if self.isBasePathEqual(ref):
833 self.showAllServices()
837 #config for lastservice
838 config.tv = ConfigSubsection()
839 config.tv.lastservice = configElement("config.tv.lastservice", configText, "", 0)
840 config.tv.lastroot = configElement("config.tv.lastroot", configText, "", 0)
841 config.radio = ConfigSubsection()
842 config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0)
843 config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0)
844 config.servicelist = ConfigSubsection()
845 config.servicelist.lastmode = configElement("config.servicelist.lastmode", configText, "tv", 0)
847 class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
848 def __init__(self, session):
849 ChannelSelectionBase.__init__(self,session)
850 ChannelSelectionEdit.__init__(self)
851 ChannelSelectionEPG.__init__(self)
853 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
855 "cancel": self.cancel,
856 "ok": self.channelSelected,
857 "keyRadio": self.setModeRadio,
858 "keyTV": self.setModeTv,
861 self.onShown.append(self.__onShown)
863 self.lastChannelRootTimer = eTimer()
864 self.lastChannelRootTimer.timeout.get().append(self.__onCreate)
865 self.lastChannelRootTimer.start(100,True)
867 self.history_tv = [ ]
868 self.history_radio = [ ]
869 self.history = self.history_tv
872 self.lastservice = config.tv.lastservice
873 self.lastroot = config.tv.lastroot
874 self.revertMode = None
878 lastservice=eServiceReference(self.lastservice.value)
879 if lastservice.valid():
880 self.setCurrentSelection(lastservice)
883 if self.revertMode is None and config.servicelist.lastmode.value == "radio":
884 self.revertMode = MODE_RADIO
885 self.history = self.history_tv
886 self.lastservice = config.tv.lastservice
887 self.lastroot = config.tv.lastroot
888 config.servicelist.lastmode.value = "tv"
892 def setModeRadio(self):
893 if self.revertMode is None and config.servicelist.lastmode.value == "tv":
894 self.revertMode = MODE_TV
895 if currentConfigSelectionElement(config.usage.e1like_radio_mode) == "yes":
896 self.history = self.history_radio
897 self.lastservice = config.radio.lastservice
898 self.lastroot = config.radio.lastroot
899 config.servicelist.lastmode.value = "radio"
903 def __onCreate(self):
904 if currentConfigSelectionElement(config.usage.e1like_radio_mode) == "yes":
905 if config.servicelist.lastmode.value == "tv":
911 lastservice=eServiceReference(self.lastservice.value)
912 if lastservice.valid():
916 self.recallBouquetMode()
917 ref = self.session.nav.getCurrentlyPlayingServiceReference()
918 if ref is not None and ref.valid() and ref.getPath() == "":
919 self.servicelist.setPlayableIgnoreService(ref)
921 self.servicelist.setPlayableIgnoreService(eServiceReference())
923 def channelSelected(self):
924 ref = self.getCurrentSelection()
926 self.toggleMoveMarked()
927 elif (ref.flags & 7) == 7:
929 elif self.bouquet_mark_edit:
935 #called from infoBar and channelSelected
938 ref = self.session.nav.getCurrentlyPlayingServiceReference()
939 nref = self.getCurrentSelection()
940 if ref is None or ref != nref:
941 self.session.nav.playService(nref)
944 config.servicelist.lastmode.save()
945 self.addToHistory(nref)
947 def addToHistory(self, ref):
948 if self.servicePath is not None:
949 tmp=self.servicePath[:]
952 del self.history[self.history_pos+1:]
955 self.history.append(tmp)
956 hlen = len(self.history)
957 if hlen > HISTORYSIZE:
960 self.history_pos = hlen-1
962 def historyBack(self):
963 hlen = len(self.history)
964 if hlen > 1 and self.history_pos > 0:
965 self.history_pos -= 1
966 self.setHistoryPath()
968 def historyNext(self):
969 hlen = len(self.history)
970 if hlen > 1 and self.history_pos < (hlen-1):
971 self.history_pos += 1
972 self.setHistoryPath()
974 def setHistoryPath(self):
975 path = self.history[self.history_pos][:]
977 del self.servicePath[:]
978 self.servicePath += path
982 if self.getRoot() != root:
984 self.session.nav.playService(ref)
985 self.setCurrentSelection(ref)
990 for i in self.servicePath:
993 if len(path) and path != self.lastroot.value:
994 self.lastroot.value = path
997 def restoreRoot(self):
1000 tmp = re.findall(self.lastroot.value)
1003 self.servicePath.append(eServiceReference(i[:len(i)-1]))
1006 path = self.servicePath.pop()
1007 self.enterPath(path)
1009 self.showFavourites()
1012 def preEnterPath(self, refstr):
1013 if len(self.servicePath) and self.servicePath[0] != eServiceReference(refstr):
1014 pathstr = self.lastroot.value
1015 if pathstr is not None and pathstr.find(refstr) == 0:
1017 lastservice=eServiceReference(self.lastservice.value)
1018 if lastservice.valid():
1019 self.setCurrentSelection(lastservice)
1023 def saveChannel(self):
1024 ref = self.session.nav.getCurrentlyPlayingServiceReference()
1026 refstr = ref.toString()
1029 if refstr != self.lastservice.value:
1030 self.lastservice.value = refstr
1031 self.lastservice.save()
1033 def setCurrentServicePath(self, path):
1034 hlen = len(self.history)
1036 self.history[self.history_pos] = path
1038 self.history.append(path)
1039 self.setHistoryPath()
1041 def getCurrentServicePath(self):
1042 hlen = len(self.history)
1044 return self.history[self.history_pos]
1047 def recallPrevService(self):
1048 hlen = len(self.history)
1050 if self.history_pos == hlen-1:
1051 tmp = self.history[self.history_pos]
1052 self.history[self.history_pos] = self.history[self.history_pos-1]
1053 self.history[self.history_pos-1] = tmp
1055 tmp = self.history[self.history_pos+1]
1056 self.history[self.history_pos+1] = self.history[self.history_pos]
1057 self.history[self.history_pos] = tmp
1058 self.setHistoryPath()
1061 if self.revertMode is None:
1063 lastservice=eServiceReference(self.lastservice.value)
1064 if lastservice.valid() and self.getCurrentSelection() != lastservice:
1065 self.setCurrentSelection(lastservice)
1066 elif self.revertMode == MODE_TV:
1068 elif self.revertMode == MODE_RADIO:
1070 self.revertMode = None
1073 from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord
1075 class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord):
1076 def __init__(self, session):
1077 Screen.__init__(self, session)
1078 InfoBarEvent.__init__(self)
1079 InfoBarServiceName.__init__(self)
1080 InfoBarInstantRecord.__init__(self)
1081 self["CurrentTime"] = Clock()
1083 class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
1084 def __init__(self, session):
1085 ChannelSelectionBase.__init__(self, session)
1086 ChannelSelectionEdit.__init__(self)
1087 ChannelSelectionEPG.__init__(self)
1089 config.radio = ConfigSubsection();
1090 config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0);
1091 config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0);
1092 self.onLayoutFinish.append(self.onCreate)
1094 self.info = session.instantiateDialog(RadioInfoBar)
1096 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
1098 "keyTV": self.closeRadio,
1099 "keyRadio": self.closeRadio,
1100 "cancel": self.closeRadio,
1101 "ok": self.channelSelected,
1106 for i in self.servicePathRadio:
1107 path += i.toString()
1109 if len(path) and path != config.radio.lastroot.value:
1110 config.radio.lastroot.value = path
1111 config.radio.lastroot.save()
1113 def restoreRoot(self):
1115 re = compile('.+?;')
1116 tmp = re.findall(config.radio.lastroot.value)
1119 self.servicePathRadio.append(eServiceReference(i[:len(i)-1]))
1122 path = self.servicePathRadio.pop()
1123 self.enterPath(path)
1125 self.showFavourites()
1128 def preEnterPath(self, refstr):
1129 if len(self.servicePathRadio) and self.servicePathRadio[0] != eServiceReference(refstr):
1130 pathstr = config.radio.lastroot.value
1131 if pathstr is not None and pathstr.find(refstr) == 0:
1133 lastservice=eServiceReference(config.radio.lastservice.value)
1134 if lastservice.valid():
1135 self.setCurrentSelection(lastservice)
1142 lastservice=eServiceReference(config.radio.lastservice.value)
1143 if lastservice.valid():
1144 self.servicelist.setCurrent(lastservice)
1145 self.session.nav.playService(lastservice)
1146 self.servicelist.setPlayableIgnoreService(lastservice)
1149 def channelSelected(self): # just return selected service
1150 ref = self.getCurrentSelection()
1152 self.toggleMoveMarked()
1153 elif (ref.flags & 7) == 7:
1155 elif self.bouquet_mark_edit:
1158 playingref = self.session.nav.getCurrentlyPlayingServiceReference()
1159 if playingref is None or playingref != ref:
1160 self.session.nav.playService(ref)
1161 self.servicelist.setPlayableIgnoreService(ref)
1162 config.radio.lastservice.value = ref.toString()
1163 config.radio.lastservice.save()
1166 def closeRadio(self):
1168 #set previous tv service
1169 lastservice=eServiceReference(config.tv.lastservice.value)
1170 self.session.nav.playService(lastservice)
1173 class SimpleChannelSelection(ChannelSelectionBase):
1174 def __init__(self, session, title):
1175 ChannelSelectionBase.__init__(self, session)
1177 self.onShown.append(self.__onExecCallback)
1179 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
1181 "cancel": self.close,
1182 "ok": self.channelSelected,
1183 "keyRadio": self.setModeRadio,
1184 "keyTV": self.setModeTv,
1187 def __onExecCallback(self):
1188 self.setTitle(self.title)
1191 def channelSelected(self): # just return selected service
1192 ref = self.getCurrentSelection()
1193 if (ref.flags & 7) == 7:
1196 ref = self.getCurrentSelection()
1199 def setModeTv(self):
1201 self.showFavourites()
1203 def setModeRadio(self):
1205 self.showFavourites()