def setPiPService(self): if self.shown: service = self.source.getCurrentService() if self.currentRunningService is None or self.pipservice is None: self.currentRunningService = service # check, if tuner with the service is available service_center = eServiceCenter.getInstance() info = service_center.info(service) if info and info.isPlayable(service, self.currentRunningService): if service and (service.flags & eServiceReference.isGroup): ref = getBestPlayableServiceReference(service, eServiceReference()) else: ref = service if ref and not (ref.flags & (eServiceReference.isMarker|eServiceReference.isDirectory)): if self.pipServiceRelation is not None: n_service = self.pipServiceRelation.get(ref.toString(),None) if n_service is not None: self.pipservice = eServiceCenter.getInstance().play(eServiceReference(n_service)) else: self.pipservice = eServiceCenter.getInstance().play(ref) else: self.pipservice = eServiceCenter.getInstance().play(ref) if self.pipservice and not self.pipservice.setTarget(1): self.pipservice.start() return True self.pipservice = None return False
def getText(self): ref = self.source.service if ref is not None: if not isinstance(ref, iPlayableServicePtr): #bouquet or marker if ref.flags & (eServiceReference.isDirectory|eServiceReference.isMarker): info = eServiceCenter.getInstance().info(ref) if info: return info.getName(ref).replace(" ","_") #alternatives elif ref.flags & (eServiceReference.isGroup): if self.type == self.NAME: return eServiceCenter.getInstance().list(ref).getContent("N")[0].replace(" ","_") return eServiceCenter.getInstance().list(ref).getContent("S")[0] #channel if self.type == self.NAME: info = eServiceCenter.getInstance().info(ref) if info: return info.getName(ref).replace(" ", "_") return ref.toString() else: info = ref and ref.info() service = None if info: sRef = service and info.getInfoString(service, iServiceInformation.sServiceRef) or info.getInfoString(iServiceInformation.sServiceref) if sRef is None or sRef is "" or self.type == self.NAME: return info.getName().replace(" ","_") else: return sRef return ""
def playService(self, service): Notifications.RemovePopup("ZapPipError") if service is None: return False ref = self.resolveAlternatePipService(service) if ref: if SystemInfo["CanNotDoSimultaneousTranscodeAndPIP"] and StreamServiceList: self.pipservice = None self.currentService = None self.currentServiceReference = None if not config.usage.hide_zap_errors.value: Notifications.AddPopup(text = "PiP...\n" + _("Connected transcoding, limit - no PiP!"), type = MessageBox.TYPE_ERROR, timeout = 5, id = "ZapPipError") return False if self.isPlayableForPipService(ref): print "playing pip service", ref and ref.toString() else: if not config.usage.hide_zap_errors.value: Notifications.AddPopup(text = "PiP...\n" + _("No free tuner!"), type = MessageBox.TYPE_ERROR, timeout = 5, id = "ZapPipError") return False self.pipservice = eServiceCenter.getInstance().play(ref) if self.pipservice and not self.pipservice.setTarget(1, True): if hasattr(self, "dishpipActive") and self.dishpipActive is not None: self.dishpipActive.startPiPService(ref) self.pipservice.start() self.currentService = service self.currentServiceReference = ref return True else: self.pipservice = None self.currentService = None self.currentServiceReference = None if not config.usage.hide_zap_errors.value: Notifications.AddPopup(text = _("Incorrect type service for PiP!"), type = MessageBox.TYPE_ERROR, timeout = 5, id = "ZapPipError") return False
def getBouquetEpg(ref, begintime=-1, endtime=None): ref = unquote(ref) ret = [] services = eServiceCenter.getInstance().list(eServiceReference(ref)) if not services: return { "events": ret, "result": False } search = ['IBDCTSERN'] for service in services.getContent('S'): if endtime: search.append((service, 0, begintime, endtime)) else: search.append((service, 0, begintime)) epgcache = eEPGCache.getInstance() events = epgcache.lookupEvent(search) if events is not None: for event in events: ev = {} ev['id'] = event[0] ev['begin_timestamp'] = event[1] ev['duration_sec'] = event[2] ev['title'] = event[4] ev['shortdesc'] = convertDesc(event[5]) ev['longdesc'] = convertDesc(event[6]) ev['sref'] = event[7] ev['sname'] = filterName(event[8]) ev['now_timestamp'] = event[3] ret.append(ev) return { "events": ret, "result": True }
def removeMovie(session, sRef, Force=False): service = ServiceReference(sRef) result = False deleted = False message = "service error" if service is not None: serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(service.ref) info = serviceHandler.info(service.ref) name = info and info.getName(service.ref) or "this recording" if offline is not None: if Force == True: message = "force delete" elif hasattr(config.usage, "movielist_trashcan"): fullpath = service.ref.getPath() srcpath = "/".join(fullpath.split("/")[:-1]) + "/" # TODO: check trash # TODO: check enable trash default value if ".Trash" not in fullpath and config.usage.movielist_trashcan.value: result = False message = "trashcan" try: import Tools.Trashcan trash = Tools.Trashcan.createTrashFolder(srcpath) if trash: res = _moveMovie(session, sRef, destpath=trash) result = res["result"] message = res["message"] except ImportError: message = "trashcan exception" pass deleted = True elif hasattr(config.usage, "movielist_use_trash_dir"): fullpath = service.ref.getPath() srcpath = "/".join(fullpath.split("/")[:-1]) + "/" if TRASHDIRNAME not in fullpath and config.usage.movielist_use_trash_dir.value: message = "trashdir" try: trash = _getTrashDir(fullpath) if trash: res = _moveMovie(session, sRef, destpath=trash) result = res["result"] message = res["message"] except ImportError: message = "trashdir exception" pass deleted = True if not deleted: if not offline.deleteFromDisk(0): result = True else: message = "no offline object" if result == False: return {"result": False, "message": "Could not delete Movie '%s' / %s" % (name, message)} else: return {"result": True, "message": "The movie '%s' has been deleted successfully" % name}
def changed(self, what): if not self.suspended: service = self.source.service info = service and service.info() if info is None: self.text = " " return markersOffset = 0 myRoot = MYCHANSEL.getRoot() mySrv = MYCHANSEL.servicelist.getCurrent() chx = MYCHANSEL.servicelist.l.lookupService(mySrv) if not MYCHANSEL.inBouquet(): pass else: serviceHandler = eServiceCenter.getInstance() mySSS = serviceHandler.list(myRoot) SRVList = mySSS and mySSS.getContent("SN", True) for i in range(len(SRVList)): if chx == i: break testlinet = SRVList[i] testline = testlinet[0].split(":") if testline[1] == "64": markersOffset = markersOffset + 1 chx = (chx - markersOffset) + 1 rx = MYCHANSEL.getBouquetNumOffset(myRoot) self.text = str(chx + rx)
def __init__(self, directory, showDirectories = True, showFiles = True, showMountpoints = True, matchingPattern = None, useServiceRef = False, inhibitDirs = False, inhibitMounts = False, isTop = False, enableWrapAround = False, additionalExtensions = None): MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent) self.additional_extensions = additionalExtensions self.mountpoints = [] self.current_directory = None self.current_mountpoint = None self.useServiceRef = useServiceRef self.showDirectories = showDirectories self.showMountpoints = showMountpoints self.showFiles = showFiles if isTop: self.topDirectory = directory else: self.topDirectory = "/" # example: matching .nfi and .ts files: "^.*\.(nfi|ts)" if matchingPattern: self.matchingPattern = re.compile(matchingPattern) else: self.matchingPattern = None self.inhibitDirs = inhibitDirs or [] self.inhibitMounts = inhibitMounts or [] self.refreshMountpoints() self.changeDir(directory) font = skin.fonts.get("FileList", ("Regular", 18, 23)) self.l.setFont(0, gFont(font[0], font[1])) self.l.setItemHeight(font[2]) self.serviceHandler = eServiceCenter.getInstance()
def __init__(self, nextRecordTimerAfterEventActionAuto=False): if NavigationInstance.instance is not None: raise NavigationInstance.instance NavigationInstance.instance = self self.ServiceHandler = eServiceCenter.getInstance() import Navigation as Nav Nav.navcore = self self.pnav = pNavigation() self.pnav.m_event.get().append(self.dispatchEvent) self.pnav.m_record_event.get().append(self.dispatchRecordEvent) self.event = [ ] self.record_event = [ ] self.currentlyPlayingServiceReference = None self.currentlyPlayingServiceOrGroup = None self.currentlyPlayingService = None self.RecordTimer = RecordTimer.RecordTimer() if getFPWasTimerWakeup(): if nextRecordTimerAfterEventActionAuto: # We need to give the systemclock the chance to sync with the transponder time, # before we will make the decision about whether or not we need to shutdown # after the upcoming recording has completed self.recordshutdowntimer = eTimer() self.recordshutdowntimer.callback.append(self.checkShutdownAfterRecording) self.recordshutdowntimer.start(30000, True) self.SleepTimer = SleepTimer.SleepTimer()
def getNumber(actservice): # actservice must be an instance of eServiceReference from Screens.InfoBar import InfoBar Servicelist = None if InfoBar and InfoBar.instance: Servicelist = InfoBar.instance.servicelist mask = (eServiceReference.isMarker | eServiceReference.isDirectory) number = 0 bouquets = Servicelist and Servicelist.getBouquetList() if bouquets: #TODO get alternative for actbouquet actbouquet = Servicelist.getRoot() serviceHandler = eServiceCenter.getInstance() for name, bouquet in bouquets: if not bouquet.valid(): #check end of list break if bouquet.flags & eServiceReference.isDirectory: servicelist = serviceHandler.list(bouquet) if not servicelist is None: while True: service = servicelist.getNext() if not service.valid(): #check end of list break playable = not (service.flags & mask) if playable: number += 1 if actbouquet: if actbouquet == bouquet and actservice == service: return number else: if actservice == service: return number return None
def __init__(self, session, service=None, event=None): Screen.__init__(self, session) global instance instance = self self.session = session self.skinName = [ "SeriesPluginInfoScreen" ] self["logo"] = Pixmap() self["cover"] = Pixmap() self["state"] = Pixmap() self["event_title"] = Label() self["event_episode"] = Label() self["event_description"] = ScrollLabel() self["datetime"] = Label() self["channel"] = Label() self["duration"] = Label() self["key_red"] = Button("") # Rename or Record self["key_green"] = Button("") # Trakt Seen / Not Seen self["key_yellow"] = Button("") # Show all Episodes of current season self["key_blue"] = Button("") # Show all Seasons self.redButtonFunction = None #TODO HelpableActionMap self["actions"] = ActionMap(["OkCancelActions", "EventViewActions", "DirectionActions", "ColorActions"], { "cancel": self.close, "ok": self.close, "up": self["event_description"].pageUp, "down": self["event_description"].pageDown, "red": self.redButton, "prevEvent": self.prevEpisode, "nextEvent": self.nextEpisode, #TODO #"pageUp": self.pageUp, #"pageDown": self.pageDown, #"openSimilarList": self.openSimilarList }) splog("SPI: SeriesPluginInfo", service, event) self.service = service self.event = event self.name = "" self.short = "" self.data = None self.path = None self.eservice = None self.epg = eEPGCache.getInstance() self.serviceHandler = eServiceCenter.getInstance() self.seriesPlugin = getInstance() self.onLayoutFinish.append( self.layoutFinished )
def __init__(self, enableWrapAround=False): MenuList.__init__(self, [], enableWrapAround, eListboxPythonMultiContent) self.l.setFont(0, gFont("Regular", 18)) self.l.setItemHeight(23) self.currPlaying = -1 self.oldCurrPlaying = -1 self.serviceHandler = eServiceCenter.getInstance()
def confirmed3(self, arg): serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(self.service) path = self.path self.name = info.getName(self.service) descr = info.getInfoString(self.service, iServiceInformation.sDescription) self.session.openWithCallback(self.advcutConfirmed, AdvancedCutInput, self.name, path, descr)
def __init__(self, session, servicelist): Screen.__init__(self, session) ProtectedScreen.__init__(self) self.session = session self.servicelist = servicelist self.serviceHandler = eServiceCenter.getInstance() self.allowChanges = True self["list"] = ZapHistoryBrowserList([]) self["key_red"] = Label(_("Clear")) self["key_green"] = Label(_("Delete")) self["key_yellow"] = Label(_("Zap+Close")) self["key_blue"] = Label(_("Config")) self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self.zap, "cancel": self.close, "red": self.clear, "green": self.delete, "yellow": self.zapAndClose, "blue": self.config }, prio=-1) self.onLayoutFinish.append(self.buildList)
def getchannelnr(self): if InfoBar.instance is None: chnr = "---" return chnr MYCHANSEL = InfoBar.instance.servicelist markersOffset = 0 myRoot = MYCHANSEL.getRoot() mySrv = MYCHANSEL.servicelist.getCurrent() chx = MYCHANSEL.servicelist.l.lookupService(mySrv) if not MYCHANSEL.inBouquet(): pass else: serviceHandler = eServiceCenter.getInstance() mySSS = serviceHandler.list(myRoot) SRVList = mySSS and mySSS.getContent("SN", True) for i in range(len(SRVList)): if chx == i: break testlinet = SRVList[i] testline = testlinet[0].split(":") if testline[1] == "64": markersOffset = markersOffset + 1 chx = (chx - markersOffset) + 1 rx = MYCHANSEL.getBouquetNumOffset(myRoot) chnr = str(chx + rx) return chnr
def getAlternative(self, override_service): services = self.services if services: override = ':'.join(override_service.split(':')[3:]) serviceHandler = eServiceCenter.getInstance() for service in services: myref = eServiceReference(str(service)) if myref.flags & eServiceReference.isGroup: mylist = serviceHandler.list(myref) if mylist is not None: while 1: s = mylist.getNext() if s.valid(): # strip all after last : value = s.toString() pos = value.rfind(':') if pos != -1: if value[pos-1] == ':': pos -= 1 value = value[:pos+1] if ':'.join(value.split(':')[3:]) == override: return service else: break return override_service
def __init__(self): logDebug("Main: Init") self.thread = SeriesPluginWorker(self.gotResult) Modules.__init__(self) ChannelsBase.__init__(self) # Because of the same XMLFile base class we intantiate a new object self.xmltv = XMLTVBase() self.serviceHandler = eServiceCenter.getInstance() #http://bugs.python.org/issue7980 datetime.strptime('2012-01-01', '%Y-%m-%d') self.identifier_elapsed = self.instantiateModuleWithName( config.plugins.seriesplugin.identifier_elapsed.value ) #logDebug(self.identifier_elapsed) self.identifier_today = self.instantiateModuleWithName( config.plugins.seriesplugin.identifier_today.value ) #logDebug(self.identifier_today) self.identifier_future = self.instantiateModuleWithName( config.plugins.seriesplugin.identifier_future.value ) #logDebug(self.identifier_future) pattern = config.plugins.seriesplugin.pattern_title.value pattern = pattern.replace("{org:s}", "(.+)") pattern = re.sub('{season:?\d*d?}', '\d+', pattern) pattern = re.sub('{episode:?\d*d?}', '\d+', pattern) pattern = re.sub('{rawseason:s}', '.+', pattern) pattern = re.sub('{rawseason:s}', '.+', pattern) pattern = pattern.replace("{title:s}", ".+") self.compiledRegexpSeries = re.compile(pattern)
def __init__(self, session, service): self.session = session self.service = service self.serviceHandler = eServiceCenter.getInstance() self.info = self.serviceHandler.info(self.service) self.skin = MovieTagger.skin Screen.__init__(self, session) self["moviename"] = Label(self.info.getName(self.service)) self["buttonred"] = Label(_("red")) self["buttongreen"] = Label(_("green")) self["buttonyellow"] = Label(_("yellow")) self["buttonblue"] = Label(_("blue")) self["cTaglist"] = MenuList([]) self["aTaglist"] = TagMenuList([]) self["actions"] = ActionMap(["WizardActions","MenuActions","ShortcutActions"], { "back": self.close, "red": self.keyRed, "green": self.keyGreen, "yellow": self.keyYellow, "blue": self.keyBlue, "up": self.up, "down": self.down, "left": self.left, "right": self.right, }, -1) self.loadPreTags() self.updateCurrentTagList() self.updateAllTagList() self.currList =self["aTaglist"] self.onLayoutFinish.append(self.keyBlue)
def updateCurrentTagList(self): print "updating cTagList" self.serviceHandler = eServiceCenter.getInstance() self.info = self.serviceHandler.info(self.service) self.tags = self.info.getInfoString(self.service, iServiceInformation.sTags).split(' ') self.tags.sort() self["cTaglist"].l.setList(self.tags)
def isServicePlayable(self, ref, callback, session=None): self.session = session if not config.ParentalControl.servicepinactive.value: return True #Check if configuration has already been read or if the significant values have changed. #If true: read the configuration if self.storeServicePin != config.ParentalControl.storeservicepin.value: self.getConfigValues() service = ref.toCompareString() info = eServiceCenter.getInstance().info(ref) age = 0 if service.startswith("1:") and service.rsplit(":", 1)[1].startswith("/"): refstr = info and info.getInfoString(ref, iServiceInformation.sServiceref) service = refstr and eServiceReference(refstr).toCompareString() elif int(config.ParentalControl.age.value): event = info and info.getEvent(ref) rating = event and event.getParentalData() age = rating and rating.getRating() age = age and age <= 15 and age + 3 or 0 if (age and age >= int(config.ParentalControl.age.value)) or service and self.blacklist.has_key(service): #Check if the session pin is cached if self.sessionPinCached: return True self.callback = callback title = 'FROM BOUQUET "userbouquet.' in service and _("this bouquet is protected by a parental control pin") or _("this service is protected by a parental control pin") if session: Notifications.RemovePopup("Parental control") if self.PinDlg: self.PinDlg.close() self.PinDlg = session.openWithCallback(boundFunction(self.servicePinEntered, ref), PinInput, triesEntry=config.ParentalControl.retries.servicepin, pinList=self.getPinList(), service=ServiceReference(ref).getServiceName(), title=title, windowTitle=_("Parental control"), simple=False) else: Notifications.AddNotificationParentalControl(boundFunction(self.servicePinEntered, ref), PinInput, triesEntry=config.ParentalControl.retries.servicepin, pinList=self.getPinList(), service=ServiceReference(ref).getServiceName(), title=title, windowTitle=_("Parental control")) return False else: return True
def Partnerbox_EPGSelection__init__(self, session, service, zapFunc=None, eventid=None, bouquetChangeCB=None, serviceChangeCB=None): #check if alternatives are defined if isinstance(service, eServiceReference): if service.flags & (eServiceReference.isGroup): service = eServiceCenter.getInstance().list(eServiceReference("%s" %(service.toString()))).getContent("S")[0] baseEPGSelection__init__(self, session, service, zapFunc, eventid, bouquetChangeCB, serviceChangeCB) self.PartnerboxInit(True)
def getServiceList(bouquet, stime=-1, sRefOnly = False): services = [ ] servicelist = eServiceCenter.getInstance().list(bouquet) if not servicelist is None: while True: service = servicelist.getNext() if not service.valid(): # check if end of list break if service.flags & (eServiceReference.isDirectory | eServiceReference.isMarker): # ignore non playable services continue # alternative service? if service.flags & (eServiceReference.isGroup): altRoot = eServiceReference(service.toCompareString()) altList = EpgCenterList.eServiceCenterInstance.list(altRoot) if altList: while True: nextService = altList.getNext() if not nextService.valid(): break service = nextService break if sRefOnly: services.append(service.toCompareString()) else: services.append((service.toCompareString(), 0, stime)) return services
def getAllServices(): allServices = {} index = 1 EpgCenterList.lenChannelDigits = 0 totalServices = 0 # the number of services in all bouquets for bouquetEntry in EpgCenterList.bouquetList: servicelist = eServiceCenter.getInstance().list(bouquetEntry[1]) if not servicelist is None: numServices = 0 while True: service = servicelist.getNext() if not service.valid(): # check if end of list break if service.flags & (eServiceReference.isDirectory | eServiceReference.isMarker): # ignore non playable services continue info = EpgCenterList.eServiceCenterInstance.info(service) serviceName = info.getName(service) or ServiceReference(service).getServiceName() or "" allServices[service.toCompareString()] = serviceName numServices += 1 indexEntry = index index += numServices totalServices += numServices EpgCenterList.bouquetIndexRanges.append(indexEntry) EpgCenterList.lenChannelDigits = len(str(totalServices)) return allServices
def __evUpdatedInfo(self): if self.newService and config.plugins.threed.autothreed.value != "0" and self.session.nav.getCurrentlyPlayingServiceReference(): self.newService = False ref = self.session.nav.getCurrentService() serviceRef = self.session.nav.getCurrentlyPlayingServiceReference() spath = serviceRef.getPath() if spath: if spath[0] == '/': serviceHandler = eServiceCenter.getInstance() r = eServiceReference(ref.info().getInfoString(iServiceInformation.sServiceref)) info = serviceHandler.info(r) if info: name = ServiceReference(info.getInfoString(r, iServiceInformation.sServiceref)).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') else: name = os_basename(spath) # filename else: name = serviceRef.getName() # partnerbox servicename else: name = ServiceReference(ref.info().getInfoString(iServiceInformation.sServiceref)).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') if "3d" in name.lower(): if config.plugins.threed.autothreed.value == "1": mode = THREE_D_SIDE_BY_SIDE else: mode = THREE_D_TOP_BOTTOM else: mode = THREE_D_OFF if self.lastmode != mode: switchmode(mode)
def __init__(self, directory, showDirectories = True, showFiles = True, showMountpoints = True, matchingPattern = None, useServiceRef = False, inhibitDirs = False, inhibitMounts = False, isTop = False, enableWrapAround = True, additionalExtensions = None): MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent) self.additional_extensions = additionalExtensions self.mountpoints = [] self.current_directory = None self.current_mountpoint = None self.useServiceRef = useServiceRef self.showDirectories = showDirectories self.showMountpoints = showMountpoints self.showFiles = showFiles self.isTop = isTop self.matchingPattern = matchingPattern self.inhibitDirs = inhibitDirs or [] self.inhibitMounts = inhibitMounts or [] self.refreshMountpoints() direct = directory if directory.endswith("/"): se = directory else: se = os_path.basename(directory) direct = directory+"/" # print "direct,se",direct,se self.changeDir(direct,se) self.l.setFont(0, gFont("Regular", 18)) self.l.setItemHeight(26) self.serviceHandler = eServiceCenter.getInstance()
def parseEPG(self, simulateOnly=False, uniqueId=None, callback=None): from plugin import AUTOTIMER_VERSION doLog("AutoTimer Version: " + AUTOTIMER_VERSION) if NavigationInstance.instance is None: doLog("Navigation is not available, can't parse EPG") return (0, 0, 0, [], [], []) new = 0 modified = 0 timers = [] conflicting = [] similars = [] skipped = [] if currentThread().getName() == 'MainThread': doBlockingCallFromMainThread = lambda f, *a, **kw: f(*a, **kw) else: doBlockingCallFromMainThread = blockingCallFromMainThread # NOTE: the config option specifies "the next X days" which means today (== 1) + X delta = timedelta(days = config.plugins.autotimer.maxdaysinfuture.value + 1) evtLimit = mktime((date.today() + delta).timetuple()) checkEvtLimit = delta.days > 1 del delta # Read AutoTimer configuration self.readXml() # Get E2 instances epgcache = eEPGCache.getInstance() serviceHandler = eServiceCenter.getInstance() recordHandler = NavigationInstance.instance.RecordTimer # Save Timer in a dict to speed things up a little # We include processed timers as we might search for duplicate descriptions # NOTE: It is also possible to use RecordTimer isInTimer(), but we won't get the timer itself on a match timerdict = defaultdict(list) doBlockingCallFromMainThread(self.populateTimerdict, epgcache, recordHandler, timerdict) # Create dict of all movies in all folders used by an autotimer to compare with recordings # The moviedict will be filled only if one AutoTimer is configured to avoid duplicate description for any recordings moviedict = defaultdict(list) # Iterate Timer for timer in self.getEnabledTimerList(): if uniqueId == None or timer.id == uniqueId: tup = doBlockingCallFromMainThread(self.parseTimer, timer, epgcache, serviceHandler, recordHandler, checkEvtLimit, evtLimit, timers, conflicting, similars, skipped, timerdict, moviedict, simulateOnly=simulateOnly) if callback: callback(timers, conflicting, similars, skipped) del timers[:] del conflicting[:] del similars[:] del skipped[:] else: new += tup[0] modified += tup[1] return (len(timers), new, modified, timers, conflicting, similars)
def getEPGofBouquet(self, param): print "[WebComponents.EPG] getting EPG for Bouquet", param if 'bRef' not in param: return () time = -1 if "time" in param: if not param["time"] is None: time = int(float(param["time"])) if time < 0: time = -1 bRef = param['bRef'] serviceHandler = eServiceCenter.getInstance() sl = serviceHandler.list(eServiceReference(bRef)) services = sl and sl.getContent('S') search = ['IBDCTSERN'] search.extend([(service, 0, time) for service in services]) events = self.epgcache.lookupEvent(search) if events: return events return ()
def __init__(self, nextRecordTimerAfterEventActionAuto=False): if NavigationInstance.instance is not None: raise NavigationInstance.instance NavigationInstance.instance = self self.ServiceHandler = eServiceCenter.getInstance() import Navigation as Nav Nav.navcore = self self.pnav = pNavigation() self.pnav.m_event.get().append(self.dispatchEvent) self.pnav.m_record_event.get().append(self.dispatchRecordEvent) self.event = [ ] self.record_event = [ ] self.currentlyPlayingServiceReference = None self.currentlyPlayingService = None self.RecordTimer = RecordTimer.RecordTimer() if getFPWasTimerWakeup(): clearFPWasTimerWakeup() if getFPWasTimerWakeup(): # sanity check to detect if the FP driver is working correct! print "buggy fp driver detected!!! please update drivers.... ignore timer wakeup!" elif nextRecordTimerAfterEventActionAuto and (len(self.getRecordings()) or abs(self.RecordTimer.getNextRecordingTime() - time()) <= 360): if not Screens.Standby.inTryQuitMainloop: # not a shutdown messagebox is open RecordTimer.RecordTimerEntry.TryQuitMainloop(False) # start shutdown handling self.SleepTimer = SleepTimer.SleepTimer()
def deleteFile(self): if self.currList == "filelist": self.service = self.filelist.getServiceRef() else: self.service = self.playlist.getSelection() if self.service is None: return if self.service.type != 4098 and self.session.nav.getCurrentlyPlayingServiceReference() is not None: if self.service == self.session.nav.getCurrentlyPlayingServiceReference(): self.stopEntry() serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) info = serviceHandler.info(self.service) name = info and info.getName(self.service) result = False if offline is not None: # simulate first if not offline.deleteFromDisk(1): result = True if result == True: self.session.openWithCallback( self.deleteConfirmed_offline, MessageBox, _("Do you really want to delete %s?") % (name) ) else: self.session.openWithCallback(self.close, MessageBox, _("You cannot delete this!"), MessageBox.TYPE_ERROR)
def getProviderName(self, ref): if isinstance(ref, eServiceReference): from Screens.ChannelSelection import service_types_radio, service_types_tv typestr = ref.getData(0) in (2, 10) and service_types_radio or service_types_tv pos = typestr.rfind(":") rootstr = "%s (channelID == %08x%04x%04x) && %s FROM PROVIDERS ORDER BY name" % ( typestr[: pos + 1], ref.getUnsignedData(4), ref.getUnsignedData(2), ref.getUnsignedData(3), typestr[pos + 1 :], ) provider_root = eServiceReference(rootstr) serviceHandler = eServiceCenter.getInstance() providerlist = serviceHandler.list(provider_root) if providerlist is not None: while True: provider = providerlist.getNext() if not provider.valid(): break if provider.flags & eServiceReference.isDirectory: servicelist = serviceHandler.list(provider) if servicelist is not None: while True: service = servicelist.getNext() if not service.valid(): break if service == ref: info = serviceHandler.info(provider) return info and info.getName(provider) or "Unknown" return ""
def __init__(self): if NavigationInstance.instance is not None: raise NavigationInstance.instance NavigationInstance.instance = self self.ServiceHandler = eServiceCenter.getInstance() import Navigation as Nav Nav.navcore = self self.pnav = pNavigation() self.pnav.m_event.get().append(self.dispatchEvent) self.pnav.m_record_event.get().append(self.dispatchRecordEvent) self.event = [ ] self.record_event = [ ] self.currentlyPlayingServiceReference = None self.currentlyPlayingServiceOrGroup = None self.currentlyPlayingService = None self.RecordTimer = RecordTimer.RecordTimer() self.__wasTimerWakeup = getFPWasTimerWakeup() startup_to_standby = config.usage.startup_to_standby.value wakeup_time_type = config.misc.prev_wakeup_time_type.value if self.__wasTimerWakeup: RecordTimer.RecordTimerEntry.setWasInDeepStandby() if config.misc.RestartUI.value: config.misc.RestartUI.value = False config.misc.RestartUI.save() configfile.save() elif startup_to_standby == "yes" or self.__wasTimerWakeup and config.misc.prev_wakeup_time.value and ((wakeup_time_type == 0 or wakeup_time_type == 1) or ( wakeup_time_type == 3 and startup_to_standby == "except")): if not Screens.Standby.inTryQuitMainloop: Notifications.AddNotification(Screens.Standby.Standby) if config.misc.prev_wakeup_time.value: config.misc.prev_wakeup_time.value = 0 config.misc.prev_wakeup_time.save() configfile.save()
def getInfo(session=None, need_fullinfo=False): global STATICBOXINFO if not (STATICBOXINFO is None or need_fullinfo): return STATICBOXINFO info = { 'brand': getMachineBrand(), 'model': getMachineName(), 'boxtype': getBoxType(), 'machinebuild': getMachineBuild(), 'tag_data': TAG_DATA, } chipset = "unknown" if os.path.isfile("/etc/.box"): f = open("/etc/.box", 'r') model = f.readline().strip().lower() f.close() if model.startswith("ufs") or model.startswith("ufc"): if model in ("ufs910", "ufs922", "ufc960"): chipset = "SH4 @266MHz" else: chipset = "SH4 @450MHz" elif model in ("topf", "tf7700hdpvr"): chipset = "SH4 @266MHz" elif model.startswith("azbox"): f = open("/proc/stb/info/model", 'r') model = f.readline().strip().lower() f.close() if model == "me": chipset = "SIGMA 8655" elif model == "minime": chipset = "SIGMA 8653" else: chipset = "SIGMA 8634" elif model.startswith("spark"): if model == "spark7162": chipset = "SH4 @540MHz" else: chipset = "SH4 @450MHz" elif os.path.isfile("/proc/stb/info/azmodel"): f = open("/proc/stb/info/model", 'r') model = f.readline().strip().lower() f.close() if model == "me": chipset = "SIGMA 8655" elif model == "minime": chipset = "SIGMA 8653" else: chipset = "SIGMA 8634" elif os.path.isfile("/proc/stb/info/model"): f = open("/proc/stb/info/model", 'r') model = f.readline().strip().lower() f.close() if model == "tf7700hdpvr": chipset = "SH4 @266MHz" elif model == "nbox": chipset = "STi7100 @266MHz" elif model == "arivalink200": chipset = "STi7109 @266MHz" elif model in ("adb2850", "adb2849", "dsi87"): chipset = "STi7111 @450MHz" elif model in ("sagemcom88", "esi88"): chipset = "STi7105 @450MHz" elif model.startswith("spark"): if model == "spark7162": chipset = "STi7162 @540MHz" else: chipset = "STi7111 @450MHz" if os.path.isfile("/proc/stb/info/chipset"): f = open("/proc/stb/info/chipset", 'r') chipset = f.readline().strip() f.close() info['chipset'] = chipset memFree = 0 for line in open("/proc/meminfo", 'r'): parts = line.split(':') key = parts[0].strip() if key == "MemTotal": info['mem1'] = parts[1].strip().replace("kB", _("kB")) elif key in ("MemFree", "Buffers", "Cached"): memFree += int(parts[1].strip().split(' ', 1)[0]) info['mem2'] = "%s %s" % (memFree, _("kB")) info['mem3'] = _("%s free / %s total") % (info['mem2'], info['mem1']) try: f = open("/proc/uptime", "rb") uptime = int(float(f.readline().split(' ', 2)[0].strip())) f.close() uptimetext = '' if uptime > 86400: d = uptime / 86400 uptime = uptime % 86400 uptimetext += '%dd ' % d uptimetext += "%d:%.2d" % (uptime / 3600, (uptime % 3600) / 60) except BaseException: uptimetext = "?" info['uptime'] = uptimetext info["webifver"] = TAG_DATA['owif_version'] info['imagedistro'] = getImageDistro() info['friendlyimagedistro'] = getFriendlyImageDistro() info['oever'] = getOEVersion() info['imagever'] = getImageVersion() ib = getImageBuild() if ib: info['imagever'] = info['imagever'] + "." + ib info['enigmaver'] = getEnigmaVersionString() info['driverdate'] = getDriverDate() info['kernelver'] = about.getKernelVersionString() try: info['fp_version'] = getFPVersion() except BaseException: info['fp_version'] = None friendlychipsetdescription = _("Chipset") friendlychipsettext = info['chipset'].replace("bcm", "Broadcom ") if friendlychipsettext in ("7335", "7356", "7362", "73625", "7424", "7425", "7429"): friendlychipsettext = "Broadcom " + friendlychipsettext if not (info['fp_version'] is None or info['fp_version'] == 0): friendlychipsetdescription += " (" + _("Frontprocessor Version") + ")" friendlychipsettext += " (" + str(info['fp_version']) + ")" info['friendlychipsetdescription'] = friendlychipsetdescription info['friendlychipsettext'] = friendlychipsettext info['tuners'] = [] for i in range(0, nimmanager.getSlotCount()): ILOG.debug("tuner {!r} {!r} {!r}".format( i, nimmanager.getNimName(i), nimmanager.getNim(i).getSlotName())) info['tuners'].append({ "name": nimmanager.getNim(i).getSlotName(), "type": nimmanager.getNimName(i) + " (" + nimmanager.getNim(i).getFriendlyType() + ")", "rec": "", "live": "" }) info['ifaces'] = [] ifaces = iNetwork.getConfiguredAdapters() for iface in ifaces: info['ifaces'].append({ "name": iNetwork.getAdapterName(iface), "friendlynic": getFriendlyNICChipSet(iface), "linkspeed": getLinkSpeed(iface), "mac": iNetwork.getAdapterAttribute(iface, "mac"), "dhcp": iNetwork.getAdapterAttribute(iface, "dhcp"), "ipv4method": getIPv4Method(iface), "ip": formatIp(iNetwork.getAdapterAttribute(iface, "ip")), "mask": formatIp(iNetwork.getAdapterAttribute(iface, "netmask")), "v4prefix": sum([ bin(int(x)).count('1') for x in formatIp( iNetwork.getAdapterAttribute(iface, "netmask")).split('.') ]), "gw": formatIp(iNetwork.getAdapterAttribute(iface, "gateway")), "ipv6": getAdapterIPv6(iface)['addr'], "ipmethod": getIPMethod(iface), "firstpublic": getAdapterIPv6(iface)['firstpublic'] }) info['hdd'] = [] for hdd in harddiskmanager.hdd: dev = hdd.findMount() if dev: stat = os.statvfs(dev) free = int((stat.f_bfree / 1024) * (stat.f_bsize / 1024)) else: stat = (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1) free = -1 if free <= 1024: free = "%i %s" % (free, _("MB")) else: free = free / 1024. free = "%.1f %s" % (free, _("GB")) size = hdd.diskSize() * 1000000 / 1048576. if size > 1048576: size = "%.1f %s" % ((size / 1048576.), _("TB")) elif size > 1024: size = "%.1f %s" % ((size / 1024.), _("GB")) else: size = "%d %s" % (size, _("MB")) iecsize = hdd.diskSize() # Harddisks > 1000 decimal Gigabytes are labelled in TB if iecsize > 1000000: iecsize = (iecsize + 50000) // float(100000) / 10 # Omit decimal fraction if it is 0 if (iecsize % 1 > 0): iecsize = "%.1f %s" % (iecsize, _("TB")) else: iecsize = "%d %s" % (iecsize, _("TB")) # Round harddisk sizes beyond ~300GB to full tens: 320, 500, 640, 750GB elif iecsize > 300000: iecsize = "%d %s" % (((iecsize + 5000) // 10000 * 10), _("GB")) # ... be more precise for media < ~300GB (Sticks, SSDs, CF, MMC, ...): # 1, 2, 4, 8, 16 ... 256GB elif iecsize > 1000: iecsize = "%d %s" % (((iecsize + 500) // 1000), _("GB")) else: iecsize = "%d %s" % (iecsize, _("MB")) info['hdd'].append({ "model": hdd.model(), "capacity": size, "labelled_capacity": iecsize, "free": free, "mount": dev, "friendlycapacity": _("%s free / %s total") % (free, size + ' ("' + iecsize + '")'), "_statvfs_result": tuple(stat), }) info['shares'] = [] autofiles = ('/etc/auto.network', '/etc/auto.network_vti') for autofs in autofiles: if os.path.isfile(autofs): method = "autofs" for line in file(autofs).readlines(): if not line.startswith('#'): # Replace escaped spaces that can appear inside # credentials with underscores # Not elegant but we wouldn't want to expose credentials # on the OWIF anyways tmpline = line.replace("\ ", "_") tmp = tmpline.split() if not len(tmp) == 3: continue name = tmp[0].strip() kind = "unknown" if "cifs" in tmp[1]: # Linux still defaults to SMBv1 kind = "SMBv1.0" settings = tmp[1].split(",") for setting in settings: if setting.startswith("vers="): kind = setting.replace("vers=", "SMBv") elif "nfs" in tmp[1]: kind = "NFS" # Default is r/w mode = _("r/w") settings = tmp[1].split(",") for setting in settings: if setting == "ro": mode = _("r/o") uri = tmp[2] parts = tmp[2].split(':') if parts[0] is "": server = uri.split('/')[2] uri = uri.strip()[1:] else: server = parts[0] ipaddress = None if server: # Will fail on literal IPs try: # Try IPv6 first, as will Linux if has_ipv6: tmpaddress = None tmpaddress = getaddrinfo(server, 0, AF_INET6) if tmpaddress: ipaddress = "[" + \ list(tmpaddress)[0][4][0] + "]" # Use IPv4 if IPv6 fails or is not present if ipaddress is None: tmpaddress = None tmpaddress = getaddrinfo(server, 0, AF_INET) if tmpaddress: ipaddress = list(tmpaddress)[0][4][0] except BaseException: pass friendlyaddress = server if ipaddress is not None and not ipaddress == server: friendlyaddress = server + " (" + ipaddress + ")" info['shares'].append({ "name": name, "method": method, "type": kind, "mode": mode, "path": uri, "host": server, "ipaddress": ipaddress, "friendlyaddress": friendlyaddress }) # TODO: fstab info['transcoding'] = False #: models transcoding feature TC_MODELS = ("Uno4K", "Ultimo4K", "Solo4K", "Solo²", "Duo²", "Solo SE", "Quad", "Quad Plus") #: machinebuilds transcoding feature TC_MACHINEBUILD = ('inihdp', 'hd2400', 'et10000', 'et13000', 'sf5008', 'xpeedlx3', 'ew7356', 'dags7356', 'dags7252', 'formuler1tc', 'gb7356', 'gb7252', 'tiviaraplus', '8100s') if info['model'] in TC_MODELS or info['machinebuild'] in TC_MACHINEBUILD: prefixes = ( 'enigma2/python/Plugins/SystemPlugins/TransCodingSetup', 'enigma2/python/Plugins/SystemPlugins/TranscodingSetup', 'enigma2/python/Plugins/SystemPlugins/MultiTransCodingSetup') for pfx in prefixes: path = '/'.join(('${libdir}', pfx, 'plugin.pyo')) if os.path.exists(eEnv.resolve(path)): info['transcoding'] = True break info['kinopoisk'] = False lang = ['ru', 'uk', 'lv', 'lt', 'et'] current_language = language.getLanguage() for l in lang: if l in current_language: info['kinopoisk'] = True break info['EX'] = '' if session: try: recs = NavigationInstance.instance.getRecordings() if recs: # only one stream and only TV from ..stream import streamList s_name = '' ILOG.debug("streamList count {!r}".format(len(streamList))) if len(streamList) == 1: from Screens.ChannelSelection import service_types_tv service_handler = eServiceCenter.getInstance() services = service_handler.list( eServiceReference('%s ORDER BY name' % service_types_tv)) channels = services and services.getContent("SN", True) s = streamList[0] srefs = s.ref.toString() for channel in channels: if srefs == channel[0]: s_name = channel[1] + ' (' + s.clientIP + ')' break ILOG.debug("s_name {!r}".format(s_name)) for stream in streamList: srefs = stream.ref.toString() ILOG.debug("srefs {!r}".format(srefs)) sname = '' timers = [] r_timers = NavigationInstance.instance.RecordTimer.timer_list for timer in r_timers: if timer.isRunning() and not timer.justplay: sname = timer.service_ref.getServiceName() timers.append( mangle_epg_text( timer.service_ref.getServiceName())) ILOG.debug("timer {!r}".format(s_name)) # only one recording if len(timers) == 1: sname = timers[0] if sname == '' and s_name != '': sname = s_name ILOG.debug("recs count {!r}".format(len(recs))) for rec in recs: feinfo = rec.frontendInfo() frontend_data = feinfo and feinfo.getAll(True) if frontend_data is not None: cur_info = feinfo.getTransponderData(True) if cur_info: tno = info['tuners'][frontend_data['tuner_number']] label = getOrbitalText(cur_info) + ' / ' + sname tno['rec'] = mangle_epg_text(label) service = session.nav.getCurrentService() if service is not None: s_reference = session.nav.getCurrentlyPlayingServiceReference() service_information = service.info() sname = service_information.getName() feinfo = service.frontendInfo() frontend_data = feinfo and feinfo.getAll(True) if frontend_data is not None: cur_info = feinfo.getTransponderData(True) if cur_info: tno = info['tuners'][frontend_data['tuner_number']] label = getOrbitalText(cur_info) + ' / ' + sname tno['live'] = mangle_epg_text(label) tno['live_meta'] = { 'service_name': mangle_epg_text(sname), KEY_SERVICE_REFERENCE: s_reference.toString() } except Exception as error: info['EX'] = error STATICBOXINFO = info return info
def _moveMovie(session, sRef, destpath=None, newname=None): service = ServiceReference(sRef) result = True errText = 'unknown Error' if destpath is not None and not destpath[-1] == '/': destpath = destpath + '/' if service is not None: serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(service.ref) name = info and info.getName(service.ref) or "this recording" fullpath = service.ref.getPath() srcpath = '/'.join(fullpath.split('/')[:-1]) + '/' fullfilename = fullpath.split('/')[-1] fileName, fileExt = os.path.splitext(fullfilename) if newname is not None: newfullpath = srcpath + newname + fileExt # TODO: check splitted recording # TODO: use FileTransferJob def domove(): exists = os.path.exists move = os.rename errorlist = [] if fileExt == '.ts': suffixes = ".ts.meta", ".ts.cuts", ".ts.ap", ".ts.sc", ".eit", ".ts", ".jpg", ".ts_mp.jpg" else: suffixes = "%s.ts.meta" % fileExt, "%s.cuts" % fileExt, fileExt, '.jpg', '.eit' for suffix in suffixes: src = srcpath + fileName + suffix if exists(src): try: if newname is not None: # rename title in meta file if suffix == '.ts.meta': # todo error handling lines = [] with open(src, "r") as fin: for line in fin: lines.append(line) lines[1] = newname + '\n' lines[4] = '\n' with open(srcpath + newname + suffix, 'w') as fout: fout.write(''.join(lines)) os.remove(src) else: move(src, srcpath + newname + suffix) else: move(src, destpath + fileName + suffix) except IOError as e: errorlist.append("I/O error({0})".format(e)) break except OSError as ose: errorlist.append(str(ose)) return errorlist # MOVE if newname is None: if srcpath == destpath: result = False errText = 'Equal Source and Destination Path' elif not os.path.exists(fullpath): result = False errText = 'File not exist' elif not os.path.exists(destpath): result = False errText = 'Destination Path not exist' elif os.path.exists(destpath + fullfilename): errText = 'Destination File exist' result = False # rename else: if not os.path.exists(fullpath): result = False errText = 'File not exist' elif os.path.exists(newfullpath): result = False errText = 'New File exist' if result: errlist = domove() if not errlist: result = True else: errText = errlist[0] result = False etxt = "rename" if newname is None: etxt = "move" if result is False: return { "result": False, "message": "Could not %s recording '%s' Err: '%s'" % (etxt, name, errText) } else: return { "result": True, "message": "The recording '%s' has been %sd successfully" % (name, etxt) }
def changeDir(self, directory, select=None): self.list = [] # if we are just entering from the list of mount points: if self.current_directory is None: if directory and self.showMountpoints: self.current_mountpoint = self.getMountpointLink(directory) else: self.current_mountpoint = None self.current_directory = directory directories = [] files = [] if directory is None and self.showMountpoints: # present available mountpoints for p in harddiskmanager.getMountedPartitions(): path = os.path.join(p.mountpoint, "") if path not in self.inhibitMounts and not self.inParentDirs( path, self.inhibitDirs): self.list.append( MultiFileSelectEntryComponent(name=p.description, absolute=path, isDir=True)) files = [] directories = [] elif directory is None: files = [] directories = [] elif self.useServiceRef: root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory) if self.additional_extensions: root.setName(self.additional_extensions) serviceHandler = eServiceCenter.getInstance() list = serviceHandler.list(root) while 1: s = list.getNext() if not s.valid(): del list break if s.flags & s.mustDescent: directories.append(s.getPath()) else: files.append(s) directories.sort() files.sort() else: if fileExists(directory): try: files = os.listdir(directory) except: files = [] files.sort() tmpfiles = files[:] for x in tmpfiles: if os.path.isdir(directory + x): directories.append(directory + x + "/") files.remove(x) if self.showDirectories: if directory: if self.showMountpoints and directory == self.current_mountpoint: self.list.append( FileEntryComponent(name="<" + _("List of storage devices") + ">", absolute=None, isDir=True)) elif (directory != self.topDirectory) and not ( self.inhibitMounts and self.getMountpoint(directory) in self.inhibitMounts): self.list.append( FileEntryComponent( name="<" + _("Parent directory") + ">", absolute='/'.join(directory.split('/')[:-2]) + '/', isDir=True)) for x in directories: if not (self.inhibitMounts and self.getMountpoint(x) in self.inhibitMounts) and not self.inParentDirs( x, self.inhibitDirs): name = x.split('/')[-2] alreadySelected = (x in self.selectedFiles) or ( os.path.normpath(x) in self.selectedFiles) self.list.append( MultiFileSelectEntryComponent( name=name, absolute=x, isDir=True, selected=alreadySelected)) if self.showFiles: for x in files: if self.useServiceRef: path = x.getPath() name = path.split('/')[-1] else: path = directory + x name = x if (self.matchingPattern is None) or self.matchingPattern.search(path): alreadySelected = False for entry in self.selectedFiles: if os.path.basename(entry) == x: alreadySelected = True self.list.append( MultiFileSelectEntryComponent( name=name, absolute=x, isDir=False, selected=alreadySelected)) self.l.setList(self.list) if select is not None: i = 0 self.moveToIndex(0) for x in self.list: p = x[0][0] if isinstance(p, eServiceReference): p = p.getPath() if p == select: self.moveToIndex(i) i += 1
def getAlternativeChannels(service): alternativeServices = eServiceCenter.getInstance().list(eServiceReference(service)) return alternativeServices and alternativeServices.getContent("S", True)
def movielist(session, service, **kwargs): serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(service) name = info and info.getName(service) or '' session.open(EPGSearch, name)
def getText(self): service = self.source.service try: info = service and service.info() except: try: info = eServiceCenter.getInstance().info(service) except: pass if not info: return "" Ret_Text = "" Sec_Text = "" Res_Text = "" showCryptoInfo = False if (self.type == self.SMART_INFO_H or self.type == self.SERVICE_INFO or self.type == self.CRYPTO_INFO or self.type == self.FREQUENCY_INFO): # HORIZONTAL sep = " " sep2 = " - " elif (self.type == self.SMART_INFO_V): # VERTIKAL sep = "\n" sep2 = "\n" else: return "" # unsupported orientation if (self.type == self.FREQUENCY_INFO): try: feinfo = (service and service.frontendInfo()) prvd = info.getInfoString(iServiceInformation.sProvider) Ret_Text = self.short(prvd) frontendDataOrg = (feinfo and feinfo.getAll(True)) except: try: frontendDataOrg = info.getInfoObject( service, iServiceInformation.sTransponderData) prvd = info.getInfoString(service, iServiceInformation.sProvider) except: pass if (frontendDataOrg is not None): frontendData = ConvertToHumanReadable(frontendDataOrg) if ((frontendDataOrg.get("tuner_type") == "DVB-S") or (frontendDataOrg.get("tuner_type") == "DVB-C")): frequency = (str( (frontendData.get("frequency") / 1000)) + " MHz") symbolrate = (str( (frontendData.get("symbol_rate") / 1000))) fec_inner = frontendData.get("fec_inner") if (frontendDataOrg.get("tuner_type") == "DVB-S"): Ret_Text += sep + frontendData.get("system") orbital_pos = int(frontendDataOrg["orbital_position"]) if orbital_pos > 1800: if orbital_pos == 3590: orb_pos = 'Thor/Intelsat' elif orbital_pos == 3560: orb_pos = 'Amos (4' elif orbital_pos == 3550: orb_pos = 'Atlantic Bird' elif orbital_pos == 3530: orb_pos = 'Nilesat/Atlantic Bird' elif orbital_pos == 3520: orb_pos = 'Atlantic Bird' elif orbital_pos == 3475: orb_pos = 'Atlantic Bird' elif orbital_pos == 3460: orb_pos = 'Express' elif orbital_pos == 3450: orb_pos = 'Telstar' elif orbital_pos == 3420: orb_pos = 'Intelsat' elif orbital_pos == 3380: orb_pos = 'Nss' elif orbital_pos == 3355: orb_pos = 'Intelsat' elif orbital_pos == 3325: orb_pos = 'Intelsat' elif orbital_pos == 3300: orb_pos = 'Hispasat' elif orbital_pos == 3285: orb_pos = 'Intelsat' elif orbital_pos == 3170: orb_pos = 'Intelsat' elif orbital_pos == 3150: orb_pos = 'Intelsat' elif orbital_pos == 3070: orb_pos = 'Intelsat' elif orbital_pos == 3045: orb_pos = 'Intelsat' elif orbital_pos == 3020: orb_pos = 'Intelsat 9' elif orbital_pos == 2990: orb_pos = 'Amazonas' elif orbital_pos == 2900: orb_pos = 'Star One' elif orbital_pos == 2880: orb_pos = 'AMC 6 (72' elif orbital_pos == 2875: orb_pos = 'Echostar 6' elif orbital_pos == 2860: orb_pos = 'Horizons' elif orbital_pos == 2810: orb_pos = 'AMC5' elif orbital_pos == 2780: orb_pos = 'NIMIQ 4' elif orbital_pos == 2690: orb_pos = 'NIMIQ 1' elif orbital_pos == 3592: orb_pos = 'Thor/Intelsat' elif orbital_pos == 2985: orb_pos = 'Echostar 3,12' elif orbital_pos == 2830: orb_pos = 'Echostar 8' elif orbital_pos == 2630: orb_pos = 'Galaxy 19' elif orbital_pos == 2500: orb_pos = 'Echostar 10,11' elif orbital_pos == 2502: orb_pos = 'DirectTV 5' elif orbital_pos == 2410: orb_pos = 'Echostar 7 Anik F3' elif orbital_pos == 2391: orb_pos = 'Galaxy 23' elif orbital_pos == 2390: orb_pos = 'Echostar 9' elif orbital_pos == 2412: orb_pos = 'DirectTV 7S' elif orbital_pos == 2310: orb_pos = 'Galaxy 27' elif orbital_pos == 2311: orb_pos = 'Ciel 2' elif orbital_pos == 2120: orb_pos = 'Echostar 2' else: orb_pos = str( (float(3600 - orbital_pos)) / 10.0) + "W" elif orbital_pos > 0: if orbital_pos == 192: orb_pos = 'Astra 1F' elif orbital_pos == 130: orb_pos = 'Hot Bird 6,7A,8' elif orbital_pos == 235: orb_pos = 'Astra 1E' elif orbital_pos == 1100: orb_pos = 'BSat 1A,2A' elif orbital_pos == 1101: orb_pos = 'N-Sat 110' elif orbital_pos == 1131: orb_pos = 'KoreaSat 5' elif orbital_pos == 1440: orb_pos = 'SuperBird 7,C2' elif orbital_pos == 1006: orb_pos = 'AsiaSat 2' elif orbital_pos == 1030: orb_pos = 'Express A2' elif orbital_pos == 1056: orb_pos = 'Asiasat 3S' elif orbital_pos == 1082: orb_pos = 'NSS 11' elif orbital_pos == 881: orb_pos = 'ST1' elif orbital_pos == 900: orb_pos = 'Yamal 201' elif orbital_pos == 917: orb_pos = 'Mesat' elif orbital_pos == 950: orb_pos = 'Insat 4B' elif orbital_pos == 951: orb_pos = 'NSS 6' elif orbital_pos == 765: orb_pos = 'Telestar' elif orbital_pos == 785: orb_pos = 'ThaiCom 5' elif orbital_pos == 800: orb_pos = 'Express' elif orbital_pos == 830: orb_pos = 'Insat 4A' elif orbital_pos == 850: orb_pos = 'Intelsat 709' elif orbital_pos == 750: orb_pos = 'Abs' elif orbital_pos == 720: orb_pos = 'Intelsat' elif orbital_pos == 705: orb_pos = 'Eutelsat W5' elif orbital_pos == 685: orb_pos = 'Intelsat' elif orbital_pos == 620: orb_pos = 'Intelsat 902' elif orbital_pos == 600: orb_pos = 'Intelsat 904' elif orbital_pos == 570: orb_pos = 'Nss' elif orbital_pos == 530: orb_pos = 'Express AM22' elif orbital_pos == 480: orb_pos = 'Eutelsat 2F2' elif orbital_pos == 450: orb_pos = 'Intelsat' elif orbital_pos == 420: orb_pos = 'Turksat 2A' elif orbital_pos == 400: orb_pos = 'Express AM1' elif orbital_pos == 390: orb_pos = 'Hellas Sat 2' elif orbital_pos == 380: orb_pos = 'Paksat 1' elif orbital_pos == 360: orb_pos = 'Eutelsat Sesat' elif orbital_pos == 335: orb_pos = 'Astra 1M' elif orbital_pos == 330: orb_pos = 'Eurobird 3' elif orbital_pos == 328: orb_pos = 'Galaxy 11' elif orbital_pos == 315: orb_pos = 'Astra 5A' elif orbital_pos == 310: orb_pos = 'Turksat' elif orbital_pos == 305: orb_pos = 'Arabsat' elif orbital_pos == 285: orb_pos = 'Eurobird 1' elif orbital_pos == 284: orb_pos = 'Eurobird/Astra' elif orbital_pos == 282: orb_pos = 'Eurobird/Astra' elif orbital_pos == 1220: orb_pos = 'AsiaSat' elif orbital_pos == 1380: orb_pos = 'Telstar 18' elif orbital_pos == 260: orb_pos = 'Badr 3/4' elif orbital_pos == 255: orb_pos = 'Eurobird 2' elif orbital_pos == 215: orb_pos = 'Eutelsat' elif orbital_pos == 216: orb_pos = 'Eutelsat W6' elif orbital_pos == 210: orb_pos = 'AfriStar 1' elif orbital_pos == 160: orb_pos = 'Eutelsat W2' elif orbital_pos == 100: orb_pos = 'Eutelsat W1' elif orbital_pos == 90: orb_pos = 'Eurobird 9' elif orbital_pos == 70: orb_pos = 'Eutelsat W3A' elif orbital_pos == 50: orb_pos = 'Sirius 4' elif orbital_pos == 48: orb_pos = 'Sirius 4' elif orbital_pos == 30: orb_pos = 'Telecom 2' else: orb_pos = str( (float(orbital_pos)) / 10.0) + "E" Ret_Text += sep + orb_pos + "\n" Ret_Text += frequency + sep + frontendData.get( "polarization_abbreviation") Ret_Text += sep + symbolrate Ret_Text += sep + frontendData.get( "modulation") + "-" + fec_inner else: Ret_Text += sep + "DVB-C " + frequency + " MHz" + sep + fec_inner + sep + symbolrate elif (frontendData.get("tuner_type") == "DVB-T"): frequency = (str( (frontendData.get("frequency") / 1000)) + " MHz") Ret_Text = "Frequency: " + frequency if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.SERVICE_INFO): xresol = info.getInfo(iServiceInformation.sVideoWidth) yresol = info.getInfo(iServiceInformation.sVideoHeight) feinfo = (service and service.frontendInfo()) prvd = info.getInfoString(iServiceInformation.sProvider) Ret_Text = self.short(prvd) frontendDataOrg = (feinfo and feinfo.getAll(True)) if (frontendDataOrg is not None): frontendData = ConvertToHumanReadable(frontendDataOrg) if ((frontendDataOrg.get("tuner_type") == "DVB-S") or (frontendDataOrg.get("tuner_type") == "DVB-C")): frequency = (str((frontendData.get("frequency") / 1000))) symbolrate = (str( (frontendData.get("symbol_rate") / 1000))) fec_inner = frontendData.get("fec_inner") if (frontendDataOrg.get("tuner_type") == "DVB-S"): Ret_Text += sep + frontendData.get("system") Ret_Text += sep + frequency + frontendData.get( "polarization_abbreviation") Ret_Text += sep + symbolrate Ret_Text += sep + fec_inner + " " + frontendData.get( "modulation") orbital_pos = int(frontendDataOrg["orbital_position"]) if orbital_pos > 1800: orb_pos = str( (float(3600 - orbital_pos)) / 10.0) + "W" elif orbital_pos > 0: orb_pos = str((float(orbital_pos)) / 10.0) + "E" Ret_Text += sep + orb_pos else: Ret_Text += sep + "DVB-C " + frequency + " MHz" + sep + fec_inner + sep + symbolrate elif (frontendDataOrg.get("tuner_type") == "DVB-T"): frequency = (str((frontendData.get("frequency") / 1000))) Ret_Text += sep + "DVB-T" + sep + "Frequency:" + sep + frequency + " MHz" if (feinfo is not None) and (xresol > 0): from Components.Converter.PliExtraInfo import codec_data Res_Text += codec_data.get( self.info.getInfo(iServiceInformation.sVideoType), "N/A") Res_Text += str(xresol) + "x" + str(yresol) Res_Text += ("i", "p", "")[info.getInfo( iServiceInformation.sProgressive)] Res_Text += str( (info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000) if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.CRYPTO_INFO): decCI = "0" Sec_Text = "" if (info.getInfo(iServiceInformation.sIsCrypted) == 1): data = self.ecmdata.getEcmData() if not config.usage.show_cryptoinfo.value: showCryptoInfo = True Sec_Text = data[0] + "\n" decCI = data[1] provid = data[2] pid = data[3] if decCI != '0': decCIfull = "%04x" % int(decCI, 16) for idline in self.idnames: if int(decCI, 16) >= int(idline[0], 16) and int( decCI, 16) <= int(idline[1], 16): decCIfull = idline[2] + ":" + decCIfull break Sec_Text += decCIfull if provid != '0': Sec_Text += ":%04x" % int(provid, 16) else: Sec_Text += ":" if pid != '0': Sec_Text += ":%04x:%04x" % (info.getInfo( iServiceInformation.sSID), int(pid, 16)) elif not config.usage.show_cryptoinfo.value: showCryptoInfo = True Sec_Text = "FTA" res = "" searchIDs = (info.getInfoObject(iServiceInformation.sCAIDs)) for idline in self.idnames: if int(decCI, 16) >= int(idline[0], 16) and int( decCI, 16) <= int(idline[1], 16): color = "\c0000ff00" else: color = "\c007f7f7f" try: for oneID in searchIDs: if oneID >= int(idline[0], 16) and oneID <= int( idline[1], 16): color = "\c00ffff00" except: pass res += color + idline[3] + " " if (self.type != self.CRYPTO_INFO): Ret_Text += "\n" Ret_Text += res + "\c00ffffff " + Sec_Text if Res_Text != "": if showCryptoInfo: Ret_Text += sep + Res_Text else: Ret_Text += "\n" + Res_Text return Ret_Text
def getMovieDetails(sRef=None): service = ServiceReference(sRef) if service is not None: serviceref = service.ref length_minutes = 0 txtdesc = "" fullpath = serviceref.getPath() filename = '/'.join(fullpath.split("/")[1:]) filename = '/' + filename name, ext = os.path.splitext(filename) serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(serviceref) sourceRef = ServiceReference( info.getInfoString(serviceref, iServiceInformation.sServiceref)) rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) movie = { 'filename': filename, 'filename_stripped': filename.split("/")[-1], 'serviceref': serviceref.toString(), 'length': "?:??", 'lastseen': 0, 'filesize_readable': '', 'recordingtime': rtime, 'begintime': 'undefined', 'eventname': service.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), 'servicename': sourceRef.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), 'tags': info.getInfoString(serviceref, iServiceInformation.sTags), 'fullname': serviceref.toString(), } if rtime > 0: fuzzy_rtime = FuzzyTime(rtime) movie['begintime'] = fuzzy_rtime[0] + ", " + fuzzy_rtime[1] try: length_minutes = info.getLength(serviceref) except: # noqa: E722 pass if length_minutes: movie['length'] = "%d:%02d" % (length_minutes / 60, length_minutes % 60) movie['lastseen'] = _moviePlayState(filename + '.cuts', serviceref, length_minutes) or 0 txtfile = name + '.txt' if ext.lower() != '.ts' and os.path.isfile(txtfile): with open(txtfile, "rb") as handle: txtdesc = six.ensure_str(b''.join(handle.readlines())) event = info.getEvent(serviceref) extended_description = event and event.getExtendedDescription() or "" if extended_description == '' and txtdesc != '': extended_description = txtdesc movie['descriptionExtended'] = ConvertDesc(extended_description) desc = info.getInfoString(serviceref, iServiceInformation.sDescription) movie['description'] = ConvertDesc(desc) size = 0 sz = '' try: size = os.stat(filename).st_size if size > 1073741824: sz = "%.2f %s" % ((size / 1073741824.), _("GB")) elif size > 1048576: sz = "%.2f %s" % ((size / 1048576.), _("MB")) elif size > 1024: sz = "%.2f %s" % ((size / 1024.), _("kB")) except: # noqa: E722 pass movie['filesize'] = size movie['filesize_readable'] = sz return {"result": True, "movie": movie} else: return { "result": False, }
def __init__(self, ref): if not isinstance(ref, eServiceReference): self.ref = eServiceReference(ref or "") else: self.ref = ref self.serviceHandler = eServiceCenter.getInstance()
def confirm(self, confirmed): if confirmed and self.services: serviceHandler = eServiceCenter.getInstance() try: for service in self.services: seriesPlugin = getInstance() if isinstance(service, eServiceReference): service = service elif isinstance(service, ServiceReference): service = service.ref else: logDebug("SPR: Wrong instance") continue servicepath = service.getPath() if not os.path.exists(servicepath): logDebug("SPR: File not exists: " + servicepath) continue info = serviceHandler.info(service) if not info: logDebug("SPR: No info available: " + servicepath) continue name = service.getName() or info.getName(service) or "" if name[-2:] == 'ts': name = name[:-2] #logDebug("SPR: name", name) short = "" begin = None end = None duration = 0 event = info.getEvent(service) if event: short = event.getShortDescription() begin = event.getBeginTime() duration = event.getDuration() or 0 end = begin + duration or 0 # We got the exact start times, no need for margin handling if not begin: begin = info.getInfo( service, iServiceInformation.sTimeCreate) or -1 if begin != -1: end = begin + (info.getLength(service) or 0) else: end = os.path.getmtime(servicepath) begin = end - (info.getLength(service) or 0) #MAYBE we could also try to parse the filename # We don't know the exact margins, we will assume the E2 default margins begin -= (int(config.recording.margin_before.value) * 60) end += (int(config.recording.margin_after.value) * 60) rec_ref_str = info.getInfoString( service, iServiceInformation.sServiceref) #channel = ServiceReference(rec_ref_str).getServiceName() logDebug("SPR: getEpisode:", name, begin, end, rec_ref_str) seriesPlugin.getEpisode(boundFunction( self.renamerCallback, servicepath, name, short), name, begin, end, rec_ref_str, elapsed=True, rename=True) #result = seriesPlugin.getEpisodeBlocking( name, begin, end, rec_ref_str, elapsed=True ) #self.renamerCallback( servicepath, name, short, result ) except Exception as e: logDebug("SPR: Exception:", str(e))
def removeMovie(session, sRef, Force=False): service = ServiceReference(sRef) result = False deleted = False message = "service error" if service is not None: serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(service.ref) info = serviceHandler.info(service.ref) name = info and info.getName(service.ref) or "this recording" if offline is not None: if Force is True: message = "force delete" elif hasattr(config.usage, 'movielist_trashcan'): fullpath = service.ref.getPath() srcpath = '/'.join(fullpath.split('/')[:-1]) + '/' # TODO: check trash # TODO: check enable trash default value if '.Trash' not in fullpath and config.usage.movielist_trashcan.value: result = False message = "trashcan" try: import Tools.Trashcan trash = Tools.Trashcan.createTrashFolder(srcpath) MovieSelection.moveServiceFiles(service.ref, trash) result = True message = "The recording '%s' has been successfully moved to trashcan" % name except ImportError as e: message = "trashcan exception" pass except Exception as e: message = "Failed to move to .Trash folder: %s" + str(e) print(message) deleted = True elif hasattr(config.usage, 'movielist_use_trash_dir'): fullpath = service.ref.getPath() if TRASHDIRNAME not in fullpath and config.usage.movielist_use_trash_dir.value: message = "trashdir" try: from Screens.MovieSelection import getTrashDir from Components.FileTransfer import FileTransferJob from Components.Task import job_manager trash_dir = getTrashDir(fullpath) if trash_dir: src_file = str(fullpath) dst_file = trash_dir if dst_file.endswith("/"): dst_file = trash_dir[:-1] text = _("remove") job_manager.AddJob( FileTransferJob(src_file, dst_file, False, False, "%s : %s" % (text, src_file))) # No Result because of async job message = "The recording '%s' has been successfully moved to trashcan" % name result = True else: message = _( "Delete failed, because there is no movie trash !\nDisable movie trash in configuration to delete this item" ) except ImportError as e: message = "trashdir exception" pass except Exception as e: message = "Failed to move to trashdir: %s" + str(e) print(message) deleted = True if not deleted: if not offline.deleteFromDisk(0): result = True else: message = "no offline object" if result is False: return { "result": False, "message": "Could not delete Movie '%s' / %s" % (name, message) } else: return { "result": True, "message": "The movie '%s' has been deleted successfully" % name }
def getStatusInfo(self): statusinfo = {} # Get Current Volume and Mute Status vcontrol = eDVBVolumecontrol.getInstance() statusinfo['volume'] = vcontrol.getVolume() statusinfo['muted'] = vcontrol.isMuted() # Get currently running Service event = None serviceref = self.session.nav.getCurrentlyPlayingServiceReference() if serviceref is not None: serviceHandler = eServiceCenter.getInstance() serviceHandlerInfo = serviceHandler.info(serviceref) service = self.session.nav.getCurrentService() serviceinfo = service and service.info() event = serviceinfo and serviceinfo.getEvent(0) else: event = None if event is not None: curEvent = parseEvent(event) statusinfo['currservice_name'] = curEvent[2].replace( '\xc2\x86', '').replace('\xc2\x87', '') statusinfo['currservice_serviceref'] = serviceref.toString() statusinfo['currservice_begin'] = strftime("%H:%M", (localtime( int(curEvent[0]) + (config.recording.margin_before.getValue() * 60)))) statusinfo['currservice_end'] = strftime("%H:%M", (localtime( int(curEvent[1]) - (config.recording.margin_after.getValue() * 60)))) statusinfo['currservice_description'] = curEvent[3] if len(curEvent[3].decode('utf-8')) > 220: statusinfo['currservice_description'] = curEvent[3].decode( 'utf-8')[0:220].encode('utf-8') + "..." statusinfo['currservice_station'] = serviceHandlerInfo.getName( serviceref).replace('\xc2\x86', '').replace('\xc2\x87', '') else: statusinfo['currservice_name'] = "N/A" statusinfo['currservice_begin'] = "" statusinfo['currservice_end'] = "" statusinfo['currservice_description'] = "" if serviceref: statusinfo['currservice_serviceref'] = serviceref.toString() statusinfo['currservice_station'] = serviceHandlerInfo.getName( serviceref).replace('\xc2\x86', '').replace('\xc2\x87', '') # Get Standby State from Screens.Standby import inStandby if inStandby == None: statusinfo['inStandby'] = "false" else: statusinfo['inStandby'] = "true" # Get recording state recs = NavigationInstance.instance.getRecordings() if recs: statusinfo['isRecording'] = "true" else: statusinfo['isRecording'] = "false" return statusinfo
def __init__(self, wakeupData=None): if NavigationInstance.instance is not None: raise NavigationInstance.instance NavigationInstance.instance = self self.ServiceHandler = eServiceCenter.getInstance() import Navigation as Nav Nav.navcore = self self.pnav = pNavigation() self.pnav.m_event.get().append(self.dispatchEvent) self.pnav.m_record_event.get().append(self.dispatchRecordEvent) self.event = [ ] self.record_event = [ ] self.currentlyPlayingServiceReference = None self.currentlyPlayingServiceOrGroup = None self.currentlyPlayingService = None Screens.Standby.TVstate() self.skipWakeup = False self.RecordTimer = None self.isRecordTimerImageStandard = False for p in plugins.getPlugins(PluginDescriptor.WHERE_RECORDTIMER): self.RecordTimer = p() if self.RecordTimer: break if not self.RecordTimer: self.RecordTimer = RecordTimer.RecordTimer() self.isRecordTimerImageStandard = True self.PowerTimer = None self.PowerTimer = PowerTimer.PowerTimer() self.__wasTimerWakeup = False self.__wasRecTimerWakeup = False self.__wasPowerTimerWakeup = False #wakeup data now = time() try: self.lastshutdowntime, self.wakeuptime, self.timertime, self.wakeuptyp, self.getstandby, self.recordtime, self.forcerecord = [int(n) for n in wakeupData.split(',')] except: print "="*100 print "[NAVIGATION] ERROR: can't read wakeup data" self.lastshutdowntime, self.wakeuptime, self.timertime, self.wakeuptyp, self.getstandby, self.recordtime, self.forcerecord = int(now),-1,-1,0,0,-1,0 self.syncCount = 0 hasFakeTime = (now <= 31536000 or now - self.lastshutdowntime <= 120) and self.getstandby < 2 #set hasFakeTime only if lower than values and was last shutdown to deep standby wasTimerWakeup, wasTimerWakeup_failure = getFPWasTimerWakeup(True) #TODO: verify wakeup-state for boxes where only after shutdown removed the wakeup-state (for boxes where "/proc/stb/fp/was_timer_wakeup" is not writable (clearFPWasTimerWakeup() in StbHardware.py has no effect -> after x hours and restart/reboot is wasTimerWakeup = True) if 0: #debug print "#"*100 print "[NAVIGATION] timediff from last shutdown to now = %ds" %(now - self.lastshutdowntime) print "[NAVIGATION] shutdowntime: %s, wakeuptime: %s timertime: %s, recordtime: %s" %(ctime(self.lastshutdowntime), ctime(self.wakeuptime), ctime(self.timertime), ctime(self.recordtime)) print "[NAVIGATION] wakeuptyp: %s, getstandby: %s, forcerecord: %s" %({0:"record-timer",1:"zap-timer",2:"power-timer",3:"plugin-timer"}[self.wakeuptyp],{0:"no standby",1:"standby",2:"no standby (box was not in deepstandby)"}[self.getstandby],self.forcerecord) print "#"*100 print "="*100 print "[NAVIGATION] was timer wakeup = %s" %wasTimerWakeup print "[NAVIGATION] current time is %s -> it's fake-time suspected: %s" %(ctime(now),hasFakeTime) print "-"*100 thisBox = getBoxType() if not config.workaround.deeprecord.value and (wasTimerWakeup_failure or thisBox in ('ixussone', 'uniboxhd1', 'uniboxhd2', 'uniboxhd3', 'sezam5000hd', 'mbtwin', 'beyonwizt3', 'et8000') or getBrandOEM() in ('ebox', 'azbox', 'xp', 'ini', 'fulan', 'entwopia') or getMachineBuild() in ('dags7335' , 'dags7356', 'dags7362')): print"[NAVIGATION] FORCED DEEPSTANDBY-WORKAROUND FOR THIS BOXTYPE (%s)" %thisBox print "-"*100 config.workaround.deeprecord.setValue(True) config.workaround.deeprecord.save() config.save() if config.workaround.deeprecord.value: #work-around for boxes where driver not sent was_timer_wakeup signal to e2 print "[NAVIGATION] starting deepstandby-workaround" self.wakeupwindow_plus = self.timertime + 300 self.wakeupwindow_minus = self.wakeuptime - (config.workaround.wakeupwindow.value * 60) wasTimerWakeup = False if not hasFakeTime and now >= self.wakeupwindow_minus and now <= self.wakeupwindow_plus: # if there is a recording sheduled, set the wasTimerWakeup flag wasTimerWakeup = True f = open("/tmp/was_timer_wakeup_workaround.txt", "w") file = f.write(str(wasTimerWakeup)) f.close() else: #secure wakeup window to prevent a wrong 'wasTimerWakeup' value as timer wakeup detection self.wakeupwindow_plus = self.timertime + 900 self.wakeupwindow_minus = self.wakeuptime - 3600 if self.wakeuptime > 0: print "[NAVIGATION] wakeup time from deep-standby expected: *** %s ***" %(ctime(self.wakeuptime)) if config.workaround.deeprecord.value: print "[NAVIGATION] timer wakeup detection window: %s - %s" %(ctime(self.wakeupwindow_minus),ctime(self.wakeupwindow_plus)) else: print "[NAVIGATION] wakeup time was not set" print "-"*100 if wasTimerWakeup: self.__wasTimerWakeup = True if not hasFakeTime: self.wakeupCheck() return if hasFakeTime and self.wakeuptime > 0: # check for NTP-time sync, if no sync, wait for transponder time if Screens.Standby.TVinStandby.getTVstandby('waitfortimesync') and not wasTimerWakeup: Screens.Standby.TVinStandby.setTVstate('power') self.savedOldTime = now self.timesynctimer = eTimer() self.timesynctimer.callback.append(self.TimeSynctimer) self.timesynctimer.start(5000, True) print"[NAVIGATION] wait for time sync" print "~"*100 else: self.wakeupCheck(False)
def getServiceList(self): serviceHandler = eServiceCenter.getInstance() return serviceHandler.list(self.root)
def getText(self): service = self.source.service if isinstance(service, iPlayableServicePtr): info = service and service.info() ref = None else: # reference info = service and self.source.info ref = service if not info: return "" if ref: refstr = ref.toString() else: refstr = info.getInfoString(iServiceInformation.sServiceref) if refstr is None: refstr = '' if self.AlternativeControl: if ref and refstr.startswith("1:134:") and self.ref is None: nref = self.resolveAlternate(ref) if nref: self.ref = nref self.info = eServiceCenter.getInstance().info(self.ref) self.refstr = self.ref.toString() if not self.info: return "" if self.IPTVcontrol: if '%3a//' in refstr or (self.refstr and '%3a//' in self.refstr) or refstr.startswith("4097:"): self.isStream = True if self.type == self.NAME: name = ref and (info.getName(ref) or 'N/A') or (info.getName() or 'N/A') prefix = '' if self.ref: prefix = " (alter)" name += prefix return name.replace('\xc2\x86', '').replace('\xc2\x87', '') elif self.type == self.NUMBER: try: service = self.source.serviceref num = service and service.getChannelNum() or None except: num = None if num: return str(num) else: num, bouq = self.getServiceNumber(ref or eServiceReference(info.getInfoString(iServiceInformation.sServiceref))) return num and str(num) or '' elif self.type == self.BOUQUET: num, bouq = self.getServiceNumber(ref or eServiceReference(info.getInfoString(iServiceInformation.sServiceref))) return bouq elif self.type == self.PROVIDER: if self.isStream: if self.refstr and ('%3a//' in self.refstr or '%3a//' in self.refstr): return self.getIPTVProvider(self.refstr) return self.getIPTVProvider(refstr) else: if self.ref: return self.getProviderName(self.ref) if ref: return self.getProviderName(ref) else: return info.getInfoString(iServiceInformation.sProvider) or '' elif self.type == self.REFERENCE: if self.refstr: return self.refstr return refstr elif self.type == self.ORBPOS: if self.isStream: return "Stream" else: if self.ref and self.info: return self.getTransponderInfo(self.info, self.ref, 'O') return self.getTransponderInfo(info, ref, 'O') elif self.type == self.TPRDATA: if self.isStream: return _("Streaming") else: if self.ref and self.info: return self.getTransponderInfo(self.info, self.ref, 'T') return self.getTransponderInfo(info, ref, 'T') elif self.type == self.SATELLITE: if self.isStream: return _("Internet") else: if self.ref: return self.getSatelliteName(self.ref) #test# return self.getSatelliteName(ref or eServiceReference(info.getInfoString(iServiceInformation.sServiceref))) elif self.type == self.ALLREF: tmpref = self.getReferenceType(refstr, ref) if 'Bouquet' in tmpref or 'Satellit' in tmpref or 'Provider' in tmpref: return ' ' elif '%3a' in tmpref: return ':'.join(refstr.split(':')[:10]) return tmpref elif self.type == self.FORMAT: num = bouq = '' tmp = self.sfmt[:].split("%") if tmp: ret = tmp[0] tmp.remove(ret) else: return "" for line in tmp: f = line[:1] if f == 'N': # %N - Name name = ref and (info.getName(ref) or 'N/A') or (info.getName() or 'N/A') postfix = '' if self.ref: postfix = " (alter)" name += postfix ret += name.replace('\xc2\x86', '').replace('\xc2\x87', '') elif f == 'n': # %n - Number try: service = self.source.serviceref num = service and service.getChannelNum() or None except: num = None if num: ret += str(num) else: num, bouq = self.getServiceNumber(ref or eServiceReference(info.getInfoString(iServiceInformation.sServiceref))) ret += num and str(num) or '' elif f == 'B': # %B - Bouquet num, bouq = self.getServiceNumber(ref or eServiceReference(info.getInfoString(iServiceInformation.sServiceref))) ret += bouq elif f == 'P': # %P - Provider if self.isStream: if self.refstr and '%3a//' in self.refstr: ret += self.getIPTVProvider(self.refstr) else: ret += self.getIPTVProvider(refstr) else: if self.ref: ret += self.getProviderName(self.ref) else: if ref: ret += self.getProviderName(ref) else: ret += info.getInfoString(iServiceInformation.sProvider) or '' elif f == 'R': # %R - Reference if self.refstr: ret += self.refstr else: ret += refstr elif f == 'S': # %S - Satellite if self.isStream: ret += _("Internet") else: if self.ref: ret += self.getSatelliteName(self.ref) else: ret += self.getSatelliteName(ref or eServiceReference(info.getInfoString(iServiceInformation.sServiceref))) elif f == 'A': # %A - AllRef tmpref = self.getReferenceType(refstr, ref) if 'Bouquet' in tmpref or 'Satellit' in tmpref or 'Provider' in tmpref: ret += ' ' elif '%3a' in tmpref: ret += ':'.join(refstr.split(':')[:10]) else: ret += tmpref elif f in 'TtsFfiOMpYroclhmgbe': if self.ref: ret += self.getTransponderInfo(self.info, self.ref, f) else: ret += self.getTransponderInfo(info, ref, f) ret += line[1:] return '%s'%(ret.replace('N/A', '').strip())
def __init__(self, wakeupData=None): if NavigationInstance.instance is not None: raise NavigationInstance.instance NavigationInstance.instance = self self.ServiceHandler = eServiceCenter.getInstance() import Navigation as Nav Nav.navcore = self self.pnav = pNavigation() self.pnav.m_event.get().append(self.dispatchEvent) self.pnav.m_record_event.get().append(self.dispatchRecordEvent) self.event = [ ] self.record_event = [ ] self.currentlyPlayingServiceReference = None self.currentlyPlayingServiceOrGroup = None self.currentlyPlayingService = None self.RecordTimer = None self.isRecordTimerImageStandard = False for p in plugins.getPlugins(PluginDescriptor.WHERE_RECORDTIMER): self.RecordTimer = p() if self.RecordTimer: break if not self.RecordTimer: self.RecordTimer = RecordTimer.RecordTimer() self.isRecordTimerImageStandard = True self.PowerTimer = None self.PowerTimer = PowerTimer.PowerTimer() self.__wasTimerWakeup = False self.__wasRecTimerWakeup = False self.__wasPowerTimerWakeup = False #wakeup data try: self.wakeuptime, self.timertime, self.wakeuptyp, self.getstandby, self.recordtime, self.forcerecord = [int(n) for n in wakeupData.split(',')] except: print "="*100 print "[NAVIGATION] ERROR: can't read wakeup data" self.wakeuptime, self.timertime, self.wakeuptyp, self.getstandby, self.recordtime, self.forcerecord = -1,-1,0,0,-1,0 #print ctime(self.wakeuptime), ctime(self.timertime), self.wakeuptyp, self.getstandby, ctime(self.recordtime), self.forcerecord now = time() timediff_wakeup = self.wakeuptime - now timediff_timer = self.timertime - now self.syncCount = 0 wasTimerWakeup = getFPWasTimerWakeup() #TODO: verify wakeup-state for boxes where only after shutdown removed the wakeup-state (for boxes where "/proc/stb/fp/was_timer_wakeup" is not writable (clearFPWasTimerWakeup() in StbHardware.py has no effect -> after x hours and restart/reboot is wasTimerWakeup = True) print "="*100 thisBox = getBoxType() if not config.workaround.deeprecord.value and (thisBox in ('ixussone', 'uniboxhd1', 'uniboxhd2', 'uniboxhd3', 'sezam5000hd', 'mbtwin', 'beyonwizt3') or getBrandOEM() in ('ebox', 'azbox', 'xp', 'ini', 'dags', 'fulan', 'entwopia')): print"[NAVIGATION] FORCED DEEPSTANDBY-WORKAROUND FOR THIS BOXTYPE (%s)" %thisBox config.workaround.deeprecord.setValue(True) config.workaround.deeprecord.save() config.save() if config.workaround.deeprecord.value: #work-around for boxes where driver not sent was_timer_wakeup signal to e2 wasTimerWakeup = False print "[NAVIGATION] starting deepstandby-workaround" if now <= 31536000: # check for NTP-time sync, if no sync, wait for transponder time self.timesynctimer = eTimer() self.timesynctimer.callback.append(self.TimeSynctimer) self.timesynctimer.start(5000, True) print"[NAVIGATION] wait for time sync" print "~"*100 elif abs(timediff_wakeup) <= 600 or abs(timediff_timer) <= 600: # if there is a recording sheduled in the next 10 mins or starting before 10 mins, set the wasTimerWakeup flag (wakeup time is 5 min before timer starts, some boxes starts but earlier than is set) wasTimerWakeup = True f = open("/tmp/was_timer_wakeup_workaround.txt", "w") file = f.write(str(wasTimerWakeup)) f.close() print "[NAVIGATION] was timer wakeup = %s" % wasTimerWakeup print "[NAVIGATION] current time is %s" % ctime(now) if wasTimerWakeup: self.__wasTimerWakeup = True print "-"*100 if self.wakeuptime > 0: print "[NAVIGATION] wakeup time was %s" % ctime(self.wakeuptime) else: print "[NAVIGATION] wakeup time was not set" if now <= 31536000: self.timesynctimer = eTimer() self.timesynctimer.callback.append(self.TimeSynctimer) self.timesynctimer.start(5000, True) print"[NAVIGATION] wait for time sync" print "~"*100 else: self.wakeupCheck() else: if now > 31536000: if self.timertime > 0: print "[NAVIGATION] next '%s' starts at %s" % ({0:"record-timer",1:"zap-timer",2:"power-timer",3:"plugin-timer"}[self.wakeuptyp], ctime(self.timertime)) else: print "[NAVIGATION] no next timers" print "="*100
def getStatusInfo(self): statusinfo = {} # Get Current Volume and Mute Status vcontrol = eDVBVolumecontrol.getInstance() statusinfo['volume'] = vcontrol.getVolume() statusinfo['muted'] = vcontrol.isMuted() statusinfo['transcoding'] = getTranscodingSupport() # Get currently running Service event = None serviceref = self.session.nav.getCurrentlyPlayingServiceReference() if serviceref is not None: serviceHandler = eServiceCenter.getInstance() serviceHandlerInfo = serviceHandler.info(serviceref) service = self.session.nav.getCurrentService() serviceinfo = service and service.info() event = serviceinfo and serviceinfo.getEvent(0) else: event = None statusinfo['currservice_filename'] = "" if event is not None: curEvent = parseEvent(event) statusinfo['currservice_name'] = curEvent[2].replace('\xc2\x86', '').replace('\xc2\x87', '') statusinfo['currservice_serviceref'] = serviceref.toString() statusinfo['currservice_begin'] = strftime("%H:%M", (localtime(int(curEvent[0])+(config.recording.margin_before.value*60)))) statusinfo['currservice_end'] = strftime("%H:%M", (localtime(int(curEvent[1])-(config.recording.margin_after.value*60)))) statusinfo['currservice_description'] = curEvent[3] if len(curEvent[3].decode('utf-8')) > 220: statusinfo['currservice_description'] = curEvent[3].decode('utf-8')[0:220].encode('utf-8') + "..." statusinfo['currservice_station'] = serviceHandlerInfo.getName(serviceref).replace('\xc2\x86', '').replace('\xc2\x87', '') if statusinfo['currservice_serviceref'].startswith('1:0:0'): statusinfo['currservice_filename'] = '/' + '/'.join(serviceref.toString().split("/")[1:]) full_desc = statusinfo['currservice_name'] + '\n' full_desc += statusinfo['currservice_begin'] + " - " + statusinfo['currservice_end'] + '\n\n' full_desc += event.getExtendedDescription().replace('\xc2\x86', '').replace('\xc2\x87', '').replace('\xc2\x8a', '\n') statusinfo['currservice_fulldescription'] = full_desc else: statusinfo['currservice_name'] = "N/A" statusinfo['currservice_begin'] = "" statusinfo['currservice_end'] = "" statusinfo['currservice_description'] = "" statusinfo['currservice_fulldescription'] = "N/A" if serviceref: statusinfo['currservice_serviceref'] = serviceref.toString() if serviceHandlerInfo: statusinfo['currservice_station'] = serviceHandlerInfo.getName(serviceref).replace('\xc2\x86', '').replace('\xc2\x87', '') elif serviceref.toString().find("http") != -1: statusinfo['currservice_station'] = serviceref.toString().replace('%3a', ':')[serviceref.toString().find("http"):] else: statusinfo['currservice_station'] = "N/A" # Get Standby State from Screens.Standby import inStandby if inStandby == None: statusinfo['inStandby'] = "false" else: statusinfo['inStandby'] = "true" # Get recording state recs = NavigationInstance.instance.getRecordings() if recs: statusinfo['isRecording'] = "true" statusinfo['Recording_list'] = "\n" for timer in NavigationInstance.instance.RecordTimer.timer_list: if timer.state == TimerEntry.StateRunning: if not timer.justplay: statusinfo['Recording_list'] += timer.service_ref.getServiceName() + ": " + timer.name + "\n" else: statusinfo['isRecording'] = "false" return statusinfo
def __init__(self): global instance instance = eServiceCenter.getInstance() instance.info = self.info
def moveMovie(self, param): import os import threading if not param['sRef']: return False, _("Missing Parameter: sRef") elif not param['dirname']: return False, _("Missing Paramter: dirname") try: force = int(param['force']) if 'force' in param else False except Exception: force = False try: background = int(param['background']) if 'background' in param else False except Exception: background = False destdir = param['dirname'] if not destdir[-1] == '/': destdir = destdir + '/' service = ServiceReference(param['sRef']) result = False if service is not None: serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(service.ref) path = service.ref.getPath() name = info and info.getName(service.ref) or _("this recording") basedir = '/'.join(path.split('/')[:-1]) + '/' basename = path.split('/')[-1] if basedir == destdir: return False, _("Source and destination folders are the same.") elif not os.path.exists(path): return False, _("'%s' does not exist in source directory.") % name elif not force and os.path.exists(destdir + basename): return False, _("'%s' already exists in destination directory '%s', set force=1 to move anyway.") % (basename, destdir) elif not os.path.exists(destdir): return False, _("Destination dir '%s' does not exist.") % destdir # remove known movie suffixes wasTs = False forcedSuffix = None if basename.endswith('.ts'): wasTs = True basename = basename[:-3] elif basename.endswith(('.avi', '.mkv', '.mpg', '.mp4', '.m4v', '.flv', '.mov', '.iso', '.vob')): forcedSuffix = basename[-4:] basename = basename[:-4] elif basename.endswith(('.divx', '.mpeg', '.m2ts')): forcedSuffix = basename[-5:] basename = basename[:-5] else: suffix = basename.split('.')[-1] return False, _("Movie '%s' has unknown suffix '%s'.") % (name, suffix) def moveFunc(): exists = os.path.exists move = os.rename errorlist = [] if wasTs: suffixes = ".ts.meta", ".ts.cuts", ".ts.ap", ".ts.sc", ".eit", ".ts", ".jpg" else: suffixes = "%s.ts.meta" % forcedSuffix, "%s.cuts" % forcedSuffix, forcedSuffix, '.jpg', '.eit' for suffix in suffixes: src = basedir + basename + suffix if exists(src): try: move(src, destdir + basename + suffix) except OSError as ose: errorlist.append(str(ose)) return errorlist if background: class StupidThread(threading.Thread): def __init__(self, fnc): threading.Thread.__init__(self) self.fnc = fnc self.start() def run(self): self.fnc() StupidThread(moveFunc) return True, _("Moving Movie '%s' to '%s' in background.") % (name, destdir) else: errlist = moveFunc() if not errlist: return True, _("Movie '%s' moved to '%s' without errors.") % (name, destdir) else: return False, _("%d error while moving Movie '%s' to '%s': %s") % (len(errlist), name, destdir, ',\n'.join(errlist)) return ( result, _("Illegal Parameter Value: sRef - '%s'") % param['sRef'] )
def getText(self): service = self.source.service if isinstance(service, iPlayableServicePtr): info = service and service.info() ref = None else: # reference info = service and self.source.info ref = service if not info: return "" if ref: nref = resolveAlternate(ref) if nref: ref = nref info = eServiceCenter.getInstance().info(ref) transponderraw = info.getInfoObject( ref, iServiceInformation.sTransponderData) ref = ref.toString().replace("%3a", ":") else: transponderraw = info.getInfoObject( iServiceInformation.sTransponderData) ref = info.getInfoString(iServiceInformation.sServiceref) if transponderraw: transponderdata = ConvertToHumanReadable(transponderraw) # retreive onid and tsid from service reference [onid, tsid] = [int(x, 16) for x in ref.split(':')[4:6]] if not transponderdata["system"]: transponderdata["system"] = transponderraw.get( "tuner_type", "None") try: if "DVB-T" in transponderdata["system"]: return "%s %s-%s %s %d MHz %s" % ( transponderdata["system"], tsid, onid, transponderdata["channel"], transponderdata["frequency"] / 1000000 + 0.5, transponderdata["bandwidth"]) elif "DVB-C" in transponderdata["system"]: return "%s %s-%s %d MHz %d %s %s" % ( transponderdata["system"], tsid, onid, transponderdata["frequency"] / 1000 + 0.5, transponderdata["symbol_rate"] / 1000 + 0.5, transponderdata["fec_inner"], transponderdata["modulation"]) elif "ATSC" in transponderdata["system"]: return "%s %s-%s %d MHz %s" % ( transponderdata["system"], tsid, onid, transponderdata["frequency"] / 1000 + 0.5, transponderdata["modulation"]) return "%s %s-%s %d %s %d %s %s %s" % ( transponderdata["system"], tsid, onid, transponderdata["frequency"] / 1000 + 0.5, transponderdata["polarization_abbreviation"], transponderdata["symbol_rate"] / 1000 + 0.5, transponderdata["fec_inner"], transponderdata["modulation"], transponderdata[ "detailed_satpos" in self.type and "orbital_position" or "orb_pos"]) except: return "" if "://" in ref: return _("Stream") + " " + ref.rsplit("://", 1)[1].split("/")[0] return ""
def getServiceInfoValue(ref, what): info = eServiceCenter.getInstance().info(ref) v = ref and info.getInfo(ref, what) or info.getInfo(what) if v != iServiceInformation.resIsString: return '' return ref and info.getInfoString(ref, what) or info.getInfoString(what)
def __init__(self, session, menu_path="", serviceref=None): Screen.__init__(self, session) self.menu_path = menu_path self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self.close, "cancel": self.close, "red": self.close, "green": self.ShowECMInformation, "yellow": self.ShowServiceInformation, "blue": self.ShowTransponderInformation }, -1) self["infolist"] = ServiceInfoList([]) self["key_red"] = self["red"] = Label(_("Exit")) self["key_green"] = self["green"] = Label(_("ECM Info")) self.transponder_info = self.info = self.feinfo = None play_service = session.nav.getCurrentlyPlayingServiceReference() if serviceref and not play_service and play_service != serviceref: screentitle = _("Transponder Information") self.type = TYPE_TRANSPONDER_INFO self.skinName="ServiceInfoSimple" self.transponder_info = eServiceCenter.getInstance().info(serviceref).getInfoObject(serviceref, iServiceInformation.sTransponderData) # info is a iStaticServiceInformation, not a iServiceInformation else: screentitle = _("Service") self.type = TYPE_SERVICE_INFO service = session.nav.getCurrentService() if service: self.transponder_info = None self.info = service.info() self.feinfo = service.frontendInfo() if self.feinfo and not self.feinfo.getAll(True): self.feinfo = None serviceref = play_service self.transponder_info = serviceref and eServiceCenter.getInstance().info(serviceref).getInfoObject(serviceref, iServiceInformation.sTransponderData) if self.feinfo or self.transponder_info: self["actions2"] = ActionMap(["ColorActions"], { "yellow": self.ShowServiceInformation, "blue": self.ShowTransponderInformation }, -1) self["key_yellow"] = self["yellow"] = Label(_("Service & PIDs")) self["key_blue"] = self["blue"] = Label(_("Tuner settings values")) else: self.skinName="ServiceInfoSimple" if config.usage.show_menupath.value == 'large': self.menu_path += screentitle title = self.menu_path self["menu_path_compressed"] = StaticText("") self.menu_path += ' / ' elif config.usage.show_menupath.value == 'small': title = screentitle condtext = "" if self.menu_path and not self.menu_path.endswith(' / '): condtext = self.menu_path + " >" elif self.menu_path: condtext = self.menu_path[:-3] + " >" self["menu_path_compressed"] = StaticText(condtext) self.menu_path += screentitle + ' / ' else: title = screentitle self["menu_path_compressed"] = StaticText("") Screen.setTitle(self, title) tlist = [ ] self.onShown.append(self.ShowServiceInformation)
def playEntry(self): if len(self.playlist.getServiceRefList()): needsInfoUpdate = False currref = self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()] if self.session.nav.getCurrentlyPlayingServiceReference( ) is None or currref != self.session.nav.getCurrentlyPlayingServiceReference( ) or self.playlist.isStopped(): self.session.nav.playService(self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()]) info = eServiceCenter.getInstance().info(currref) description = info and info.getInfoString( currref, iServiceInformation.sDescription) or "" self["title"].setText(description) # display just playing musik on LCD idx = self.playlist.getCurrentIndex() currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.ext = os.path.splitext(text)[1].lower() text = ">" + text # FIXME: the information if the service contains video (and we should hide our window) should com from the service instead if self.ext not in AUDIO_EXTENSIONS and not self.isAudioCD: self.hideAndInfoBar() else: needsInfoUpdate = True self.summaries.setText(text, 1) # get the next two entries idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text, 3) else: self.summaries.setText(" ", 3) idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text, 4) else: self.summaries.setText(" ", 4) else: idx = self.playlist.getCurrentIndex() currref = self.playlist.getServiceRefList()[idx] text = currref.getPath() ext = os.path.splitext(text)[1].lower() if self.ext not in AUDIO_EXTENSIONS and not self.isAudioCD: self.hideAndInfoBar() else: needsInfoUpdate = True self.unPauseService() if needsInfoUpdate: path = self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()].getPath() self["coverArt"].updateCoverArt(path) else: self["coverArt"].showDefaultCover() self.readTitleInformation()
def zap(self): def serviceInBouquet(bouquet, serviceHandler, ref): servicelist = serviceHandler.list(bouquet) if servicelist is not None: serviceIterator = servicelist.getNext() while serviceIterator.valid(): if ref == serviceIterator: # Servicerefs from the EPG don't (can't) have the # channel number set ref.setChannelNum(serviceIterator.getChannelNum()) return True serviceIterator = servicelist.getNext() return False ChannelSelectionInstance = ChannelSelection.instance foundService = False if ChannelSelectionInstance: self.service_types = ChannelSelectionInstance.service_types serviceHandler = eServiceCenter.getInstance() bqrootstr = ChannelSelectionInstance.bouquet_rootstr if config.usage.multibouquet.value: rootbouquet = eServiceReference(bqrootstr) currentBouquet = ChannelSelectionInstance.getRoot() for searchCurrent in (True, False): bouquet = eServiceReference(bqrootstr) bouquetlist = serviceHandler.list(bouquet) if bouquetlist is not None: bouquet = bouquetlist.getNext() while bouquet.valid(): if bouquet.flags & ( eServiceReference.isDirectory | eServiceReference.isInvisible ) == eServiceReference.isDirectory and ( currentBouquet is None or (currentBouquet == bouquet) == searchCurrent): ChannelSelectionInstance.clearPath() ChannelSelectionInstance.setRoot(bouquet) foundService = serviceInBouquet( bouquet, serviceHandler, self.currentService.ref) if foundService: break bouquet = bouquetlist.getNext() if foundService: break else: rootbouquet = eServiceReference(bqrootstr) bouquet = eServiceReference(bqrootstr) if bouquet.valid() and bouquet.flags & ( eServiceReference.isDirectory | eServiceReference. isInvisible) == eServiceReference.isDirectory: foundService = serviceInBouquet(bouquet, serviceHandler, self.currentService.ref) if foundService: ChannelSelectionInstance.enterPath(rootbouquet) ChannelSelectionInstance.enterPath(bouquet) ChannelSelectionInstance.saveRoot() ChannelSelectionInstance.saveChannel(self.currentService.ref) ChannelSelectionInstance.addToHistory(self.currentService.ref) NavigationInstance.instance.playService(self.currentService.ref) self.close()
def __init__(self, nextRecordTimerAfterEventActionAuto=False): if NavigationInstance.instance is not None: raise NavigationInstance.instance NavigationInstance.instance = self self.ServiceHandler = eServiceCenter.getInstance() import Navigation as Nav Nav.navcore = self self.pnav = pNavigation() self.pnav.m_event.get().append(self.dispatchEvent) self.pnav.m_record_event.get().append(self.dispatchRecordEvent) self.event = [] self.record_event = [] self.currentlyPlayingServiceReference = None self.currentlyPlayingServiceOrGroup = None self.currentlyPlayingService = None self.RecordTimer = None for p in plugins.getPlugins(PluginDescriptor.WHERE_RECORDTIMER): self.RecordTimer = p() if self.RecordTimer: break if not self.RecordTimer: self.RecordTimer = RecordTimer.RecordTimer() self.nextRecordTimerAfterEventActionAuto = nextRecordTimerAfterEventActionAuto self.__wasTimerWakeup = False self.__wasRecTimerWakeup = False self.syncCount = 0 self.__isRestartUI = config.misc.RestartUI.value startup_to_standby = config.usage.startup_to_standby.value wakeup_time_type = config.misc.prev_wakeup_time_type.value wasTimerWakeup = getFPWasTimerWakeup() if not wasTimerWakeup: #work-around for boxes where driver not sent was_timer_wakeup signal to e2 print "[NAVIGATION] getNextRecordingTime= %s" % self.RecordTimer.getNextRecordingTime( ) print "[NAVIGATION] current Time=%s" % time() print "[NAVIGATION] timediff=%s" % abs( self.RecordTimer.getNextRecordingTime() - time()) if time( ) <= 31536000: # check for NTP-time sync, if no sync, wait for transponder time self.timesynctimer = eTimer() self.timesynctimer.callback.append(self.TimeSynctimer) self.timesynctimer.start(5000, True) print "[NAVIGATION] wait for time sync" elif abs( self.RecordTimer.getNextRecordingTime() - time() ) <= 360: # if there is a recording sheduled in the next 5 mins, set the wasTimerWakeup flag wasTimerWakeup = True f = open("/tmp/was_timer_wakeup_workaround.txt", "w") file = f.write(str(wasTimerWakeup)) f.close() print "[NAVIGATION] wasTimerWakeup = %s" % wasTimerWakeup if wasTimerWakeup: self.__wasTimerWakeup = True if time() <= 31536000: self.timesynctimer = eTimer() self.timesynctimer.callback.append(self.TimeSynctimer) self.timesynctimer.start(5000, True) print "[NAVIGATION] wait for time sync" elif nextRecordTimerAfterEventActionAuto and abs( self.RecordTimer.getNextRecordingTime() - time()) <= 360: self.__wasRecTimerWakeup = True print 'RECTIMER: wakeup to standby detected.' f = open("/tmp/was_rectimer_wakeup", "w") f.write('1') f.close() # as we woke the box to record, place the box in standby. self.standbytimer = eTimer() self.standbytimer.callback.append(self.gotostandby) self.standbytimer.start(15000, True) if config.usage.remote_fallback_import_restart.value: ImportChannels() if config.misc.RestartUI.value: config.misc.RestartUI.value = False config.misc.RestartUI.save() configfile.save() else: if config.usage.remote_fallback_import.value and not config.usage.remote_fallback_import_restart.value: ImportChannels() if startup_to_standby == "yes" or self.__wasTimerWakeup and config.misc.prev_wakeup_time.value and ( (wakeup_time_type == 0 or wakeup_time_type == 1) or (wakeup_time_type == 3 and startup_to_standby == "except")): if not Screens.Standby.inTryQuitMainloop: Notifications.AddNotification(Screens.Standby.Standby) if config.misc.prev_wakeup_time.value: config.misc.prev_wakeup_time.value = 0 config.misc.prev_wakeup_time.save() configfile.save()
def updateStatus(self): print "[TVCharts] Status Update ..." self.DBStatusTimer.stop() if not config.plugins.tvcharts.enabled.value or Screens.Standby.inStandby: return # Get Channelname sref = self.session.nav.getCurrentlyPlayingServiceReference() if sref is not None: ref = eServiceReference(sref.toString()) ref.setName("") serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(ref) channel_name = info and info.getName(ref).replace( '\xc2\x86', '').replace('\xc2\x87', '').decode( "utf-8", "ignore").encode("utf-8") or "" self.serviceref = ref.toString() else: channel_name = "" self.serviceref = "" # Get Event Info service = self.session.nav.getCurrentService() info = service and service.info() event = info and info.getEvent(0) event_name = event and event.getEventName() or "" event_description = "" event_begin = 0 if event is not None: curEvent = parseEvent(event) event_begin = int( curEvent[0]) + (config.recording.margin_before.getValue() * 60) event_description = event.getExtendedDescription() # Get Box Info self.BoxID = iNetwork.getAdapterAttribute("eth0", "mac") self.DeviceName = HardwareInfo().get_device_name() try: from enigma import getEnigmaVersionString from boxbranding import getImageVersion, getImageBuild self.EnigmaVersion = getEnigmaVersionString() self.ImageVersion = getImageVersion() + '.' + getImageBuild() except: self.EnigmaVersion = about.getEnigmaVersionString() self.ImageVersion = about.getVersionString() # Get TimerList self.timerlist = "" if config.plugins.tvcharts.submittimers.value and self.LastTimerlistUpdate <= ( time() - 1800): self.LastTimerlistUpdate = time() try: for timer in self.recordtimer.timer_list: if timer.disabled == 0 and timer.justplay == 0: self.timerlist += "%s|%s|%s|%s|%s|%s|%s\n" % ( timer.eit, str( int(timer.begin) + (config.recording.margin_before.getValue() * 60)), str( int(timer.end) - (config.recording.margin_after.getValue() * 60)), str(timer.service_ref), timer.name, timer.service_ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '').decode( "utf-8", "ignore").encode("utf-8"), timer.repeated) except Exception: print "[TVCharts] Error loading timers!" # Get Pluginlist if config.plugins.tvcharts.submitplugins.value and self.pluginlist == "": try: os_system( "opkg list_installed | grep enigma2-plugin- > /tmp/plugins.txt" ) for plugin in open('/tmp/plugins.txt', 'r'): self.pluginlist += plugin[0:plugin.find(' - ')] + "\n" os_system("rm -f /tmp/plugins.txt") except Exception: print "[TVCharts] Error loading plugins!" # Status Update getPage( url='http://www.dreambox-plugins.de/feeds/TVCharts/status.php', agent="Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)", timeout=60, method='POST', headers={ 'Content-Type': 'application/x-www-form-urlencoded' }, postdata=urlencode({ 'boxid': self.BoxID, 'devicename': self.DeviceName, 'imageversion': self.ImageVersion, 'enigmaversion': self.EnigmaVersion, 'lastchannel': channel_name, 'lastevent': event_name, 'eventdescr': event_description, 'lastbegin': event_begin, 'lastserviceref': self.serviceref, 'timerlist': self.timerlist, 'pluginlist': self.pluginlist })).addErrback(self.updateError) # Restart Timer self.DBStatusTimer.start(900000, True)
def changeDir(self, directory, select=None): self.list = [] if self.current_directory is None: if directory and self.showMountpoints: self.current_mountpoint = self.getMountpointLink(directory) else: self.current_mountpoint = None self.current_directory = directory directories = [] files = [] if directory is None and self.showMountpoints: for p in harddiskmanager.getMountedPartitions(): path = os_path.join(p.mountpoint, '') if path not in self.inhibitMounts and not self.inParentDirs( path, self.inhibitDirs): self.list.append( MultiFileSelectEntryComponent(name=p.description, absolute=path, isDir=True)) files = [] directories = [] elif directory is None: files = [] directories = [] elif self.useServiceRef: root = eServiceReference('2:0:1:0:0:0:0:0:0:0:' + directory) if self.additional_extensions: root.setName(self.additional_extensions) serviceHandler = eServiceCenter.getInstance() list = serviceHandler.list(root) while 1: s = list.getNext() if not s.valid(): del list break if s.flags & s.mustDescent: directories.append(s.getPath()) else: files.append(s) directories.sort() files.sort() elif fileExists(directory): try: files = listdir(directory) except: files = [] files.sort() tmpfiles = files[:] for x in tmpfiles: if os_path.isdir(directory + x): directories.append(directory + x + '/') files.remove(x) if directory is not None and self.showDirectories and not self.isTop: if directory == self.current_mountpoint and self.showMountpoints: self.list.append( MultiFileSelectEntryComponent( name='<' + _('List of Storage Devices') + '>', absolute=None, isDir=True)) elif directory != '/' and not (self.inhibitMounts and self.getMountpoint(directory) in self.inhibitMounts): self.list.append( MultiFileSelectEntryComponent( name='<' + _('Parent Directory') + '>', absolute='/'.join(directory.split('/')[:-2]) + '/', isDir=True)) if self.showDirectories: for x in directories: if not (self.inhibitMounts and self.getMountpoint(x) in self.inhibitMounts) and not self.inParentDirs( x, self.inhibitDirs): name = x.split('/')[-2] alreadySelected = False testname = x[:-1] if os_path.islink(testname): my_isLink = True else: my_isLink = False for entry in self.selectedFiles: if entry == x: alreadySelected = True if alreadySelected: self.list.append( MultiFileSelectEntryComponent(name=name, absolute=x, isDir=True, isLink=my_isLink, selected=True)) else: self.list.append( MultiFileSelectEntryComponent(name=name, absolute=x, isDir=True, isLink=my_isLink, selected=False)) if self.showFiles: for x in files: if self.useServiceRef: path = x.getPath() name = path.split('/')[-1] else: path = directory + x name = x if self.matchingPattern is None or re_compile( self.matchingPattern).search(path): alreadySelected = False for entry in self.selectedFiles: if os_path.basename(entry) == x: alreadySelected = True if alreadySelected: self.list.append( MultiFileSelectEntryComponent(name=name, absolute=x, isDir=False, selected=True)) else: self.list.append( MultiFileSelectEntryComponent(name=name, absolute=x, isDir=False, selected=False)) self.l.setList(self.list) if select is not None: i = 0 self.moveToIndex(0) for x in self.list: p = x[0][0] if isinstance(p, eServiceReference): p = p.getPath() if p == select: self.moveToIndex(i) i += 1
def getInfo(self): return self.service and eServiceCenter.getInstance().info(self.service)
def getServiceNumber(self, ref): def searchHelper(serviceHandler, num, bouquet): servicelist = serviceHandler.list(bouquet) if servicelist is not None: while True: s = servicelist.getNext() if not s.valid(): break if not s.flags & (eServiceReference.isMarker | eServiceReference.isDirectory): num += 1 if s == ref: return (s, num) return (None, num) if isinstance(ref, eServiceReference): isRadioService = ref.getData(0) in (2, 10) lastpath = isRadioService and config.radio.lastroot.value or config.tv.lastroot.value if lastpath.find('FROM BOUQUET') == -1: if 'FROM PROVIDERS' in lastpath: return ('P', 'Provider') if 'FROM SATELLITES' in lastpath: return ('S', 'Satellites') if ') ORDER BY name' in lastpath: return ('A', 'All Services') return (0, 'N/A') try: acount = config.plugins.NumberZapExt.enable.value and config.plugins.NumberZapExt.acount.value except: acount = False rootstr = '' for x in lastpath.split(';'): if x != '': rootstr = x serviceHandler = eServiceCenter.getInstance() if acount is True or not config.usage.multibouquet.value: bouquet = eServiceReference(rootstr) service, number = searchHelper(serviceHandler, 0, bouquet) else: if isRadioService: bqrootstr = '1:7:2:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.radio" ORDER BY bouquet' else: bqrootstr = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet' number = 0 cur = eServiceReference(rootstr) bouquet = eServiceReference(bqrootstr) bouquetlist = serviceHandler.list(bouquet) if bouquetlist is not None: while True: bouquet = bouquetlist.getNext() if not bouquet.valid(): break if bouquet.flags & eServiceReference.isDirectory: service, number = searchHelper(serviceHandler, number, bouquet) if service is not None and cur == bouquet: break if service is not None: info = serviceHandler.info(bouquet) name = info and info.getName(bouquet) or '' return (number, name) return (0, '')
def load(self, root, filter_tags): # this lists our root service, then building a # nice list self.list = [ ] serviceHandler = eServiceCenter.getInstance() numberOfDirs = 0 reflist = serviceHandler.list(root) if reflist is None: print "listing of movies failed" return realtags = set() tags = {} rootPath = os.path.normpath(root.getPath()) parent = None # Don't navigate above the "root" if len(rootPath) > 1 and (os.path.realpath(rootPath) != config.movielist.root.value): parent = os.path.split(os.path.normpath(rootPath))[0] currentfolder = os.path.normpath(rootPath) + '/' if parent and (parent not in defaultInhibitDirs) and not currentfolder.endswith(config.usage.default_path.value): # enigma wants an extra '/' appended if not parent.endswith('/'): parent += '/' ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + parent) ref.flags = eServiceReference.flagDirectory self.list.append((ref, None, 0, -1)) numberOfDirs += 1 while 1: serviceref = reflist.getNext() if not serviceref.valid(): break if config.ParentalControl.servicepinactive.value and config.ParentalControl.storeservicepin.value != "never": from Components.ParentalControl import parentalControl if not parentalControl.sessionPinCached and parentalControl.isProtected(serviceref): continue info = serviceHandler.info(serviceref) if info is None: info = justStubInfo begin = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if serviceref.flags & eServiceReference.mustDescent: dirname = info.getName(serviceref) if not dirname.endswith('.AppleDouble/') and not dirname.endswith('.AppleDesktop/') and not dirname.endswith('.AppleDB/') and not dirname.endswith('Network Trash Folder/') and not dirname.endswith('Temporary Items/'): self.list.append((serviceref, info, begin, -1)) numberOfDirs += 1 continue # convert space-seperated list of tags into a set this_tags = info.getInfoString(serviceref, iServiceInformation.sTags).split(' ') name = info.getName(serviceref) # OSX put a lot of stupid files ._* everywhere... we need to skip them if name[:2] == "._": continue if this_tags == ['']: # No tags? Auto tag! this_tags = name.replace(',',' ').replace('.',' ').replace('_',' ').replace(':',' ').split() else: realtags.update(this_tags) for tag in this_tags: if len(tag) >= 4: if tags.has_key(tag): tags[tag].append(name) else: tags[tag] = [name] # filter_tags is either None (which means no filter at all), or # a set. In this case, all elements of filter_tags must be present, # otherwise the entry will be dropped. if filter_tags is not None: this_tags_fullname = [" ".join(this_tags)] this_tags_fullname = set(this_tags_fullname) this_tags = set(this_tags) if not this_tags.issuperset(filter_tags) and not this_tags_fullname.issuperset(filter_tags): # print "Skipping", name, "tags=", this_tags, " filter=", filter_tags continue self.list.append((serviceref, info, begin, -1)) self.firstFileEntry = numberOfDirs self.parentDirectory = 0 self.list.sort(key=self.buildBeginTimeSortKey) if self.sort_type == MovieList.SORT_ALPHANUMERIC: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey) + sorted(self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_REVERSE: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey, reverse = True) + sorted(self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey, reverse = True) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_FLAT: self.list.sort(key=self.buildAlphaNumericFlatSortKey) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_FLAT_REVERSE: self.list.sort(key=self.buildAlphaNumericFlatSortKey, reverse = True) elif self.sort_type == MovieList.SORT_RECORDED: self.list = sorted(self.list[:numberOfDirs], key=self.buildBeginTimeSortKey) + sorted(self.list[numberOfDirs:], key=self.buildBeginTimeSortKey) elif self.sort_type == MovieList.SORT_RECORDED_REVERSE: self.list = sorted(self.list[:numberOfDirs], key=self.buildBeginTimeSortKey, reverse = True) + sorted(self.list[numberOfDirs:], key=self.buildBeginTimeSortKey, reverse = True) elif self.sort_type == MovieList.SHUFFLE: dirlist = self.list[:numberOfDirs] shufflelist = self.list[numberOfDirs:] random.shuffle(shufflelist) self.list = dirlist + shufflelist for x in self.list: if x[1]: tmppath = x[1].getName(x[0])[:-1] if x[1].getName(x[0]).endswith('/') else x[1].getName(x[0]) if tmppath.endswith('.Trash'): self.list.insert(0, self.list.pop(self.list.index(x))) break if self.root and numberOfDirs > 0: rootPath = os.path.normpath(self.root.getPath()) if not rootPath.endswith('/'): rootPath += '/' if rootPath != parent: # with new sort types directories may be in between files, so scan whole # list for parentDirectory index. Usually it is the first one anyway for index, item in enumerate(self.list): if item[0].flags & eServiceReference.mustDescent: itempath = os.path.normpath(item[0].getPath()) if not itempath.endswith('/'): itempath += '/' if itempath == rootPath: self.parentDirectory = index break self.root = root # finally, store a list of all tags which were found. these can be presented # to the user to filter the list # ML: Only use the tags that occur more than once in the list OR that were # really in the tag set of some file. # reverse the dictionary to see which unique movie each tag now references rtags = {} for tag, movies in tags.items(): if (len(movies) > 1) or (tag in realtags): movies = tuple(movies) # a tuple can be hashed, but a list not item = rtags.get(movies, []) if not item: rtags[movies] = item item.append(tag) self.tags = {} for movies, tags in rtags.items(): movie = movies[0] # format the tag lists so that they are in 'original' order tags.sort(key = movie.find) first = movie.find(tags[0]) last = movie.find(tags[-1]) + len(tags[-1]) match = movie start = 0 end = len(movie) # Check if the set has a complete sentence in common, and how far for m in movies[1:]: if m[start:end] != match: if not m.startswith(movie[:last]): start = first if not m.endswith(movie[first:]): end = last match = movie[start:end] if m[start:end] != match: match = '' break if match: self.tags[match] = set(tags) continue else: match = ' '.join(tags) if len(match) > 2: #Omit small words self.tags[match] = set(tags)
def getStatusInfo(self): # Get Current Volume and Mute Status vcontrol = eDVBVolumecontrol.getInstance() statusinfo = { 'volume': vcontrol.getVolume(), 'muted': vcontrol.isMuted(), 'transcoding': getTranscodingSupport(), 'currservice_filename': "", 'currservice_id': -1, 'state': { 'standby': False, 'recording': False } } # Get currently running Service event = None serviceref = self.session.nav.getCurrentlyPlayingServiceReference() serviceref_string = None currservice_station = None if serviceref is not None: serviceHandler = eServiceCenter.getInstance() serviceHandlerInfo = serviceHandler.info(serviceref) service = self.session.nav.getCurrentService() serviceinfo = service and service.info() event = serviceinfo and serviceinfo.getEvent(0) serviceref_string = serviceref.toString() currservice_station = mangle_epg_text( serviceHandlerInfo.getName(serviceref)) else: event = None serviceHandlerInfo = None if event is not None: # (begin, end, name, description, eit) curEvent = parseEvent(event) margin_before = config.recording.margin_before.value margin_after = config.recording.margin_after.value begin_timestamp = int(curEvent[0]) + (margin_before * 60) end_timestamp = int(curEvent[1]) - (margin_after * 60) statusinfo['currservice_name'] = mangle_epg_text(curEvent[2]) statusinfo['currservice_serviceref'] = serviceref_string statusinfo['currservice_begin'] = time.strftime( "%H:%M", (time.localtime(begin_timestamp))) statusinfo['currservice_begin_timestamp'] = begin_timestamp statusinfo['currservice_end'] = time.strftime( "%H:%M", (time.localtime(end_timestamp))) statusinfo['currservice_end_timestamp'] = end_timestamp statusinfo['currservice_description'] = curEvent[3] statusinfo['currservice_station'] = currservice_station if statusinfo['currservice_serviceref'].startswith('1:0:0'): fn = '/' + '/'.join(serviceref_string.split("/")[1:]) statusinfo['currservice_filename'] = fn statusinfo['currservice_fulldescription'] = mangle_epg_text( event.getExtendedDescription()) statusinfo['currservice_id'] = curEvent[4] else: statusinfo['currservice_name'] = "N/A" statusinfo['currservice_begin'] = "" statusinfo['currservice_end'] = "" statusinfo['currservice_description'] = "" statusinfo['currservice_fulldescription'] = "N/A" if serviceref: statusinfo['currservice_serviceref'] = serviceref_string if serviceHandlerInfo: statusinfo['currservice_station'] = currservice_station elif serviceref_string.find("http") != -1: statusinfo['currservice_station'] = serviceref_string.replace( '%3a', ':')[serviceref_string.find("http"):] else: statusinfo['currservice_station'] = "N/A" # Get Standby State from Screens.Standby import inStandby statusinfo['state']['standby'] = inStandby is not None if statusinfo['state']['standby'] is False: statusinfo['inStandby'] = "false" else: statusinfo['inStandby'] = "true" # Get recording state recs = NavigationInstance.instance.getRecordings() statusinfo['state']['recording'] = len(recs) > 0 if recs: statusinfo['Recording_list'] = "\n" for timer in NavigationInstance.instance.RecordTimer.timer_list: if timer.state == TimerEntry.StateRunning: if not timer.justplay: s_name = timer.service_ref.getServiceName() label = mangle_epg_text(s_name) + ": " + timer.name + "\n" statusinfo['Recording_list'] += label if statusinfo['state']['recording']: statusinfo['isRecording'] = "true" else: statusinfo['isRecording'] = "false" return statusinfo