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.ServiceName import ServiceName
13 from Components.Clock import Clock
14 from Components.EventInfo import EventInfo
15 from ServiceReference import ServiceReference
19 import xml.dom.minidom
21 class BouquetSelector(Screen):
22 def __init__(self, session, bouquets, selectedFunc):
23 Screen.__init__(self, session)
25 self.selectedFunc=selectedFunc
27 self["actions"] = ActionMap(["OkCancelActions"],
29 "ok": self.okbuttonClick,
30 "cancel": self.cancelClick
34 entrys.append((x[0], x[1]))
35 self["menu"] = MenuList(entrys)
37 def okbuttonClick(self):
38 self.selectedFunc(self["menu"].getCurrent()[1])
40 def cancelClick(self):
43 class ChannelContextMenu(Screen):
44 def __init__(self, session, csel):
45 Screen.__init__(self, session)
48 self["actions"] = ActionMap(["OkCancelActions"],
50 "ok": self.okbuttonClick,
51 "cancel": self.cancelClick
55 inBouquetRootList = csel.getRoot().getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
56 inBouquet = csel.getMutableList() is not None
57 haveBouquets = csel.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1
59 if not csel.bouquet_mark_edit and not csel.movemode:
60 if not inBouquetRootList:
61 if (csel.getCurrentSelection().flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory:
63 menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected))
65 menu.append((_("add service to favourites"), self.addServiceToBouquetSelected))
67 if not inBouquet and csel.getCurrentSelection().getPath().find("PROVIDERS") == -1:
68 menu.append((_("copy to favourites"), csel.copyCurrentToBouquetList))
70 menu.append((_("remove service"), self.removeCurrentService))
72 menu.append((_("remove bouquet"), csel.removeBouquet))
74 if inBouquet: # current list is editable?
75 if not csel.bouquet_mark_edit:
77 menu.append((_("enable move mode"), self.toggleMoveMode))
78 if not inBouquetRootList:
80 menu.append((_("enable bouquet edit"), self.bouquetMarkStart))
82 menu.append((_("enable favourite edit"), self.bouquetMarkStart))
84 menu.append((_("disable move mode"), self.toggleMoveMode))
85 elif not inBouquetRootList:
87 menu.append((_("end bouquet edit"), self.bouquetMarkEnd))
88 menu.append((_("abort bouquet edit"), self.bouquetMarkAbort))
90 menu.append((_("end favourites edit"), self.bouquetMarkEnd))
91 menu.append((_("abort favourites edit"), self.bouquetMarkAbort))
93 menu.append((_("back"), self.cancelClick))
94 self["menu"] = MenuList(menu)
96 def okbuttonClick(self):
97 self["menu"].getCurrent()[1]()
99 def cancelClick(self):
102 def addServiceToBouquetSelected(self):
103 bouquets = self.csel.getBouquetList()
108 if cnt > 1: # show bouquet list
109 self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.bouquetSelected)
110 elif cnt == 1: # add to only one existing bouquet
111 self.addCurrentServiceToBouquet(bouquets[0][1])
112 else: #no bouquets in root.. so assume only one favourite list is used
113 self.addCurrentServiceToBouquet(self.csel.bouquet_root)
115 def bouquetSelected(self, bouquet):
116 self.addCurrentServiceToBouquet(bouquet)
117 self.close(True) # close bouquet selection
119 def bouquetSelClosed(self, recursive):
123 def copyCurrentToBouquetList(self):
124 self.csel.copyCurrentToBouquetList()
127 def removeBouquet(self):
128 self.csel.removeBouquet()
131 def addCurrentServiceToBouquet(self, dest):
132 self.csel.addCurrentServiceToBouquet(dest)
134 def removeCurrentService(self):
135 self.csel.removeCurrentService()
138 def toggleMoveMode(self):
139 self.csel.toggleMoveMode()
142 def bouquetMarkStart(self):
143 self.csel.startMarkedEdit()
146 def bouquetMarkEnd(self):
147 self.csel.endMarkedEdit(abort=False)
150 def bouquetMarkAbort(self):
151 self.csel.endMarkedEdit(abort=True)
154 class ChannelSelectionEPG:
156 self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"],
158 "showEPGList": self.showEPGList,
161 def showEPGList(self):
162 ref=self.getCurrentSelection()
163 ptr=eEPGCache.getInstance()
164 if ptr.startTimeQuery(ref) != -1:
165 self.session.open(EPGSelection, ref)
167 print 'no epg for service', ref.toString()
169 class ChannelSelectionEdit:
171 self.entry_marked = False
172 self.movemode = False
173 self.bouquet_mark_edit = False
174 self.mutableList = None
176 self.saved_title = None
177 self.saved_root = None
179 class ChannelSelectionEditActionMap(ActionMap):
180 def __init__(self, csel, contexts = [ ], actions = { }, prio=0):
181 ActionMap.__init__(self, contexts, actions, prio)
183 def action(self, contexts, action):
184 if action == "cancel":
185 self.csel.handleEditCancel()
187 pass # avoid typo warning...
189 ActionMap.action(self, contexts, action)
190 self["ChannelSelectEditActions"] = ChannelSelectionEditActionMap(self, ["ChannelSelectEditActions", "OkCancelActions"],
192 "contextMenu": self.doContext,
195 def getMutableList(self, root=eServiceReference()):
196 if not self.mutableList is None:
197 return self.mutableList
198 serviceHandler = eServiceCenter.getInstance()
201 list = serviceHandler.list(root)
203 return list.startEdit()
206 def buildBouquetID(self, str):
210 if (c >= 'a' and c <= 'z') or (c >= '0' and c <= '9'):
216 def copyCurrentToBouquetList(self):
217 provider = ServiceReference(self.getCurrentSelection())
218 serviceHandler = eServiceCenter.getInstance()
219 mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit()
220 if mutableBouquetList:
221 providerName = provider.getServiceName()
222 if self.mode == MODE_TV:
223 str = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(providerName))
225 str = '1:7:2:0:0:0:0:0:0:0:(type == 2) FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(providerName))
226 new_bouquet_ref = eServiceReference(str)
227 if not mutableBouquetList.addService(new_bouquet_ref):
228 mutableBouquetList.flushChanges()
229 eDVBDB.getInstance().reloadBouquets()
230 mutableBouquet = serviceHandler.list(new_bouquet_ref).startEdit()
232 mutableBouquet.setListName(providerName)
234 services = serviceHandler.list(provider.ref)
235 if not services is None:
236 if not services.getContent(list, True):
238 if mutableBouquet.addService(service):
239 print "add", service.toString(), "to new bouquet failed"
240 mutableBouquet.flushChanges()
242 print "getContent failed"
244 print "list provider", providerName, "failed"
246 print "get mutable list for new created bouquet failed"
248 print "add", str, "to bouquets failed"
250 print "bouquetlist is not editable"
252 def removeBouquet(self):
253 refstr = self.getCurrentSelection().toString()
254 pos = refstr.find('FROM BOUQUET "')
256 refstr = refstr[pos+14:]
258 pos = refstr.find('"')
260 filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2
261 self.removeCurrentService()
263 eDVBDB.getInstance().reloadBouquets()
265 # multiple marked entry stuff ( edit mode, later multiepg selection )
266 def startMarkedEdit(self):
267 self.mutableList = self.getMutableList()
268 # add all services from the current list to internal marked set in listboxservicecontent
269 self.bouquetRoot = self.getRoot()
270 self.clearMarks() # this clears the internal marked set in the listboxservicecontent
271 self.saved_title = self.instance.getTitle()
272 new_title = self.saved_title
273 if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1:
274 new_title += ' ' + _("[bouquet edit]")
276 new_title += ' ' + _("[favourite edit]")
277 self.instance.setTitle(new_title)
278 self.bouquet_mark_edit = True
279 self.__marked = self.servicelist.getRootServices()
280 for x in self.__marked:
281 self.servicelist.addMarked(eServiceReference(x))
282 self.saved_root = self.getRoot()
283 self.showAllServices()
285 def endMarkedEdit(self, abort):
286 if not abort and self.mutableList is not None:
287 new_marked = set(self.servicelist.getMarked())
288 old_marked = set(self.__marked)
289 removed = old_marked - new_marked
290 added = new_marked - old_marked
294 self.mutableList.removeService(eServiceReference(x))
297 self.mutableList.addService(eServiceReference(x))
299 self.mutableList.flushChanges()
302 self.bouquet_mark_edit = False
303 self.bouquetRoot = None
304 self.mutableList = None
305 self.instance.setTitle(self.saved_title)
306 self.saved_title = None
307 self.setRoot(self.saved_root)
309 def clearMarks(self):
310 self.servicelist.clearMarks()
313 ref = self.servicelist.getCurrent()
314 if self.servicelist.isMarked(ref):
315 self.servicelist.removeMarked(ref)
317 self.servicelist.addMarked(ref)
319 def removeCurrentService(self):
320 ref = self.servicelist.getCurrent()
321 mutableList = self.getMutableList()
322 if ref.valid() and mutableList is not None:
323 if not mutableList.removeService(ref):
324 currentIndex = self.servicelist.getCurrentIndex()
325 self.servicelist.moveDown()
326 if self.servicelist.getCurrentIndex() == currentIndex:
328 mutableList.flushChanges() #FIXME dont flush on each single removed service
329 self.setRoot(self.getRoot())
330 self.servicelist.moveToIndex(currentIndex)
332 def addCurrentServiceToBouquet(self, dest):
333 mutableList = self.getMutableList(dest)
334 if not mutableList is None:
335 if not mutableList.addService(self.servicelist.getCurrent()):
336 mutableList.flushChanges()
339 def toggleMoveMode(self):
341 if self.entry_marked:
342 self.toggleMoveMarked() # unmark current entry
343 self.movemode = False
344 self.pathChangedDisabled = False # re-enable path change
345 self.mutableList.flushChanges() # FIXME add check if changes was made
346 self.mutableList = None
347 self.instance.setTitle(self.saved_title)
348 self.saved_title = None
350 self.mutableList = self.getMutableList()
352 self.pathChangedDisabled = True # no path change allowed in movemode
353 self.saved_title = self.instance.getTitle()
354 new_title = self.saved_title
355 new_title += ' ' + _("[move mode]");
356 self.instance.setTitle(new_title);
358 def handleEditCancel(self):
359 if self.movemode: #movemode active?
360 self.channelSelected() # unmark
361 self.toggleMoveMode() # disable move mode
362 elif self.bouquet_mark_edit:
363 self.endMarkedEdit(True) # abort edit mode
365 def toggleMoveMarked(self):
366 if self.entry_marked:
367 self.servicelist.setCurrentMarked(False)
368 self.entry_marked = False
370 self.servicelist.setCurrentMarked(True)
371 self.entry_marked = True
374 self.session.open(ChannelContextMenu, self)
379 class ChannelSelectionBase(Screen):
380 def __init__(self, session):
381 Screen.__init__(self, session)
383 # this makes it much simple to implement a selectable radio or tv mode :)
384 self.service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17)'
385 self.service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)'
387 self["key_red"] = Button(_("All"))
388 self["key_green"] = Button(_("Satellites"))
389 self["key_yellow"] = Button(_("Provider"))
390 self["key_blue"] = Button(_("Favourites"))
392 self["list"] = ServiceList()
393 self.servicelist = self["list"]
395 self.numericalTextInput = NumericalTextInput()
397 self.servicePathTV = [ ]
398 self.servicePathRadio = [ ]
400 self.pathChangedDisabled = False
402 self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions"],
404 "showFavourites": self.showFavourites,
405 "showAllServices": self.showAllServices,
406 "showProviders": self.showProviders,
407 "showSatellites": self.showSatellites,
408 "nextBouquet": self.nextBouquet,
409 "prevBouquet": self.prevBouquet,
410 "1": self.keyNumberGlobal,
411 "2": self.keyNumberGlobal,
412 "3": self.keyNumberGlobal,
413 "4": self.keyNumberGlobal,
414 "5": self.keyNumberGlobal,
415 "6": self.keyNumberGlobal,
416 "7": self.keyNumberGlobal,
417 "8": self.keyNumberGlobal,
418 "9": self.keyNumberGlobal,
419 "0": self.keyNumberGlobal
422 def appendDVBTypes(self, ref):
424 pos = path.find(' FROM BOUQUET')
426 return eServiceReference(self.service_types + path[pos:])
429 def getBouquetNumOffset(self, bouquet):
430 bouquet = self.appendDVBTypes(bouquet)
431 if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK
434 serviceHandler = eServiceCenter.getInstance()
435 bouquetlist = serviceHandler.list(self.bouquet_root)
436 if not bouquetlist is None:
438 bouquetIterator = self.appendDVBTypes(bouquetlist.getNext())
439 if not bouquetIterator.valid() or bouquetIterator == bouquet: #end of list or bouquet found
441 if ((bouquetIterator.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory):
443 servicelist = serviceHandler.list(bouquetIterator)
444 if not servicelist is None:
446 serviceIterator = servicelist.getNext()
447 if not serviceIterator.valid(): #check if end of list
449 if serviceIterator.flags: #playable services have no flags
454 def recallBouquetMode(self):
455 if self.mode == MODE_TV:
456 self.service_types = self.service_types_tv
457 if currentConfigSelectionElement(config.usage.multibouquet) == "yes":
458 self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet'
460 self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'%(self.service_types)
462 self.service_types = self.service_types_radio
463 if currentConfigSelectionElement(config.usage.multibouquet) == "yes":
464 self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.radio" ORDER BY bouquet'
466 self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet'%(self.service_types)
467 self.bouquet_root = eServiceReference(self.bouquet_rootstr)
470 title = self.instance.getTitle()
471 pos = title.find(" (")
475 self.instance.setTitle(title)
477 self.recallBouquetMode()
479 def setRadioMode(self):
480 title = self.instance.getTitle()
481 pos = title.find(" (")
485 self.instance.setTitle(title)
486 self.mode = MODE_RADIO
487 self.recallBouquetMode()
489 def setRoot(self, root, justSet=False):
490 path = root.getPath()
491 inBouquetRootList = path.find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
492 pos = path.find(' FROM BOUQUET')
493 isBouquet = pos != -1
494 if not inBouquetRootList and isBouquet:
495 self.servicelist.setMode(ServiceList.MODE_FAVOURITES)
496 self.servicelist.setNumberOffset(self.getBouquetNumOffset(root))
497 refstr = self.service_types + path[pos:]
498 root = eServiceReference(refstr)
500 self.servicelist.setMode(ServiceList.MODE_NORMAL)
501 self.servicelist.setRoot(root, justSet)
504 self.servicelist.moveUp()
507 self.servicelist.moveDown()
510 if self.mode == MODE_RADIO:
511 self.servicePathRadio = [ ]
513 self.servicePathTV = [ ]
515 def enterPath(self, ref, justSet=False):
516 if self.mode == MODE_RADIO:
517 self.servicePathRadio.append(ref)
519 self.servicePathTV.append(ref)
520 self.setRoot(ref, justSet)
522 def pathUp(self, justSet=False):
523 if self.mode == MODE_TV:
524 prev = self.servicePathTV.pop()
525 length = len(self.servicePathTV)
527 current = self.servicePathTV[length-1]
529 prev = self.servicePathRadio.pop()
530 length = len(self.servicePathRadio)
532 current = self.servicePathRadio[length-1]
533 self.setRoot(current, justSet)
535 self.setCurrentSelection(prev)
538 def isBasePathEqual(self, ref):
539 if self.mode == MODE_RADIO and len(self.servicePathRadio) > 1 and self.servicePathRadio[0] == ref:
541 elif self.mode == MODE_TV and len(self.servicePathTV) > 1 and self.servicePathTV[0] == ref:
545 def isPrevPathEqual(self, ref):
546 path = self.servicePathRadio
547 if self.mode == MODE_TV:
548 path = self.servicePathTV
550 if length > 1 and path[length-2] == ref:
554 def preEnterPath(self, refstr):
557 def showAllServices(self):
558 if not self.pathChangedDisabled:
559 refstr = '%s ORDER BY name'%(self.service_types)
560 if not self.preEnterPath(refstr):
561 ref = eServiceReference(refstr)
562 currentRoot = self.getRoot()
563 if currentRoot is None or currentRoot != ref:
567 def showSatellites(self):
568 if not self.pathChangedDisabled:
569 refstr = '%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types)
570 if not self.preEnterPath(refstr):
571 ref = eServiceReference(refstr)
575 if self.isBasePathEqual(ref):
576 if self.isPrevPathEqual(ref):
578 prev = self.pathUp(justSet)
580 currentRoot = self.getRoot()
581 if currentRoot is None or currentRoot != ref:
584 self.enterPath(ref, True)
586 serviceHandler = eServiceCenter.getInstance()
587 servicelist = serviceHandler.list(ref)
588 if not servicelist is None:
590 service = servicelist.getNext()
591 if not service.valid(): #check if end of list
593 orbpos = service.getData(4) >> 16
594 if service.getPath().find("FROM PROVIDER") != -1:
595 service_name = _("Providers")
597 service_name = _("Services")
599 service_name += str(' - %s'%(nimmanager.getSatDescription(orbpos)))
600 service.setName(service_name) # why we need this cast?
602 if orbpos > 1800: # west
603 service.setName("%s (%3.1f" + _("W") + ")" %(str, (0 - (orbpos - 3600)) / 10.0))
605 service.setName("%s (%3.1f" + _("E") + ")" % (str, orbpos / 10.0))
606 self.servicelist.addService(service)
607 self.servicelist.finishFill()
609 self.setCurrentSelection(prev)
611 def showProviders(self):
612 if not self.pathChangedDisabled:
613 refstr = '%s FROM PROVIDERS ORDER BY name'%(self.service_types)
614 if not self.preEnterPath(refstr):
615 ref = eServiceReference(refstr)
616 if self.isBasePathEqual(ref):
619 currentRoot = self.getRoot()
620 if currentRoot is None or currentRoot != ref:
624 def changeBouquet(self, direction):
625 if not self.pathChangedDisabled:
626 if self.isBasePathEqual(self.bouquet_root):
632 ref = self.getCurrentSelection()
635 def nextBouquet(self):
636 self.changeBouquet(+1)
638 def prevBouquet(self):
639 self.changeBouquet(-1)
641 def showFavourites(self):
642 if not self.pathChangedDisabled:
643 if not self.preEnterPath(self.bouquet_rootstr):
644 if self.isBasePathEqual(self.bouquet_root):
647 currentRoot = self.getRoot()
648 if currentRoot is None or currentRoot != self.bouquet_root:
650 self.enterPath(self.bouquet_root)
652 def keyNumberGlobal(self, number):
653 char = self.numericalTextInput.getKey(number)
654 self.servicelist.moveToChar(char)
657 return self.servicelist.getRoot()
659 def getCurrentSelection(self):
660 return self.servicelist.getCurrent()
662 def setCurrentSelection(self, service):
663 servicepath = service.getPath()
664 pos = servicepath.find(" FROM BOUQUET")
666 if self.mode == MODE_TV:
667 servicepath = '(type == 1)' + servicepath[pos:]
669 servicepath = '(type == 2)' + servicepath[pos:]
670 service.setPath(servicepath)
671 self.servicelist.setCurrent(service)
673 def getBouquetList(self):
676 serviceHandler = eServiceCenter.getInstance()
677 list = serviceHandler.list(self.bouquet_root)
683 if ((s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory):
684 info = serviceHandler.info(s)
686 bouquets.append((info.getName(s), s))
689 if len(bouquets) == 0 and serviceCount > 0:
690 info = serviceHandler.info(self.bouquet_root)
692 bouquets.append((info.getName(self.bouquet_root), self.bouquet_root))
696 class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
697 def __init__(self, session):
698 ChannelSelectionBase.__init__(self,session)
699 ChannelSelectionEdit.__init__(self)
700 ChannelSelectionEPG.__init__(self)
702 #config for lastservice
703 config.tv = ConfigSubsection();
704 config.tv.lastservice = configElement("config.tv.lastservice", configText, "", 0);
705 config.tv.lastroot = configElement("config.tv.lastroot", configText, "", 0);
706 config.tv.prevservice = configElement("config.tv.prevservice", configText, "", 0);
707 config.tv.prevroot = configElement("config.tv.prevroot", configText, "", 0);
709 self["actions"] = ActionMap(["OkCancelActions"],
711 "cancel": self.cancel,
712 "ok": self.channelSelected,
714 self.onShown.append(self.__onShown)
716 self.lastChannelRootTimer = eTimer()
717 self.lastChannelRootTimer.timeout.get().append(self.__onCreate)
718 self.lastChannelRootTimer.start(100,True)
720 def __onCreate(self):
722 self.servicePathTV = [ ]
724 lastservice=eServiceReference(config.tv.lastservice.value)
725 if lastservice.valid():
726 self.setCurrentSelection(lastservice)
727 self.session.nav.playService(lastservice)
730 self.recallBouquetMode()
731 ref = self.session.nav.getCurrentlyPlayingServiceReference()
732 if ref is not None and ref.valid() and ref.getPath() == "":
733 self.servicelist.setPlayableIgnoreService(ref)
735 self.servicelist.setPlayableIgnoreService(eServiceReference())
737 def channelSelected(self):
738 ref = self.getCurrentSelection()
740 self.toggleMoveMarked()
741 elif (ref.flags & 7) == 7:
743 elif self.bouquet_mark_edit:
749 #called from infoBar and channelSelected
751 ref = self.session.nav.getCurrentlyPlayingServiceReference()
752 if ref is None or ref != self.getCurrentSelection():
753 self.session.nav.playService(self.getCurrentSelection())
759 for i in self.servicePathTV:
762 if config.tv.prevroot.value != config.tv.lastroot.value:
763 config.tv.prevroot.value = config.tv.lastroot.value
764 config.tv.prevroot.save()
765 if len(path) and path != config.tv.lastroot.value:
766 config.tv.lastroot.value = path
767 config.tv.lastroot.save()
769 def restoreRoot(self):
770 self.servicePathTV = [ ]
772 tmp = re.findall(config.tv.lastroot.value)
775 self.servicePathTV.append(eServiceReference(i[:len(i)-1]))
778 path = self.servicePathTV.pop()
781 self.showFavourites()
784 def preEnterPath(self, refstr):
785 if len(self.servicePathTV) and self.servicePathTV[0] != eServiceReference(refstr):
786 pathstr = config.tv.lastroot.value
787 if pathstr is not None and pathstr.find(refstr) == 0:
789 lastservice=eServiceReference(config.tv.lastservice.value)
790 if lastservice is not None:
791 self.setCurrentSelection(lastservice)
795 def saveChannel(self):
796 ref = self.session.nav.getCurrentlyPlayingServiceReference()
798 refstr = ref.toString()
801 if refstr != config.tv.lastservice.value:
802 config.tv.prevservice.value = config.tv.lastservice.value
803 config.tv.prevservice.save()
804 config.tv.lastservice.value = refstr
805 config.tv.lastservice.save()
807 def recallPrevService(self):
808 if len(config.tv.prevservice.value) and len(config.tv.prevroot.value):
809 if config.tv.lastroot.value != config.tv.prevroot.value:
810 tmp = config.tv.lastroot.value
811 config.tv.lastroot.value = config.tv.prevroot.value
812 config.tv.lastroot.save()
813 config.tv.prevroot.value = tmp
814 config.tv.prevroot.save()
816 if config.tv.lastservice.value != config.tv.prevservice.value:
817 tmp = config.tv.lastservice.value
818 config.tv.lastservice.value = config.tv.prevservice.value
819 config.tv.lastservice.save()
820 config.tv.prevservice.value = tmp
821 config.tv.prevservice.save()
822 lastservice=eServiceReference(config.tv.lastservice.value)
823 self.session.nav.playService(lastservice)
824 self.setCurrentSelection(lastservice)
829 lastservice=eServiceReference(config.tv.lastservice.value)
830 if lastservice.valid() and self.getCurrentSelection() != lastservice:
831 self.setCurrentSelection(lastservice)
833 from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord
835 class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord):
836 def __init__(self, session):
837 Screen.__init__(self, session)
838 InfoBarEvent.__init__(self)
839 InfoBarServiceName.__init__(self)
840 InfoBarInstantRecord.__init__(self)
841 self["Clock"] = Clock()
843 class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
844 def __init__(self, session):
845 ChannelSelectionBase.__init__(self, session)
846 ChannelSelectionEdit.__init__(self)
847 ChannelSelectionEPG.__init__(self)
849 config.radio = ConfigSubsection();
850 config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0);
851 config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0);
852 self.onLayoutFinish.append(self.onCreate)
854 self.info = session.instantiateDialog(RadioInfoBar)
856 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
858 "keyTV": self.closeRadio,
859 "keyRadio": self.closeRadio,
860 "cancel": self.closeRadio,
861 "ok": self.channelSelected,
866 for i in self.servicePathRadio:
869 if len(path) and path != config.radio.lastroot.value:
870 config.radio.lastroot.value = path
871 config.radio.lastroot.save()
873 def restoreRoot(self):
874 self.servicePathRadio = [ ]
876 tmp = re.findall(config.radio.lastroot.value)
879 self.servicePathRadio.append(eServiceReference(i[:len(i)-1]))
882 path = self.servicePathRadio.pop()
885 self.showFavourites()
888 def preEnterPath(self, refstr):
889 if len(self.servicePathRadio) and self.servicePathRadio[0] != eServiceReference(refstr):
890 pathstr = config.radio.lastroot.value
891 if pathstr is not None and pathstr.find(refstr) == 0:
893 lastservice=eServiceReference(config.radio.lastservice.value)
894 if lastservice is not None:
895 self.setCurrentSelection(lastservice)
902 lastservice=eServiceReference(config.radio.lastservice.value)
903 if lastservice.valid():
904 self.servicelist.setCurrent(lastservice)
905 self.session.nav.playService(lastservice)
906 self.servicelist.setPlayableIgnoreService(lastservice)
909 def channelSelected(self): # just return selected service
910 ref = self.getCurrentSelection()
912 self.toggleMoveMarked()
913 elif (ref.flags & 7) == 7:
915 elif self.bouquet_mark_edit:
918 playingref = self.session.nav.getCurrentlyPlayingServiceReference()
919 if playingref is None or playingref != ref:
920 self.session.nav.playService(ref)
921 self.servicelist.setPlayableIgnoreService(ref)
922 config.radio.lastservice.value = ref.toString()
923 config.radio.lastservice.save()
926 def closeRadio(self):
928 #set previous tv service
929 lastservice=eServiceReference(config.tv.lastservice.value)
930 self.session.nav.playService(lastservice)
933 class SimpleChannelSelection(ChannelSelectionBase):
934 def __init__(self, session, title):
935 ChannelSelectionBase.__init__(self, session)
937 self.onShown.append(self.__onExecCallback)
939 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
941 "cancel": self.cancel,
942 "ok": self.channelSelected,
943 "keyRadio": self.setModeRadio,
944 "keyTV": self.setModeTv,
947 def __onExecCallback(self):
948 self.session.currentDialog.instance.setTitle(self.title)
951 def channelSelected(self): # just return selected service
952 ref = self.getCurrentSelection()
953 if (ref.flags & 7) == 7:
956 ref = self.getCurrentSelection()
961 self.showFavourites()
963 def setModeRadio(self):
965 self.showFavourites()