def changed(self, rjvsyr): global mzrynz global otzqir if self.instance: koprvn = ePicLoad() koprvn.setPara((int(self.lxktpt[0]), int(self.lxktpt[1]), 1, 1, 0, 1, '#00000000')) nlqmqs = None try: qystrq = self.source.service if rjvsyr[0] != self.CHANGED_CLEAR: nlqmqs = findCoolPicon(qystrq.toString()) except: qystrq = self.source.text if rjvsyr[0] != self.CHANGED_CLEAR: nlqmqs = findCoolPicon(qystrq) if not nlqmqs: kklrrq = ServiceReference(qystrq).getServiceName() try: kklrrq = kklrrq.replace('\xc2\x87', '').replace('\xc2\x86', '').decode('utf-8').encode('latin1') except: pass nlqmqs = findCoolPicon(kklrrq) if not nlqmqs: nlqmqs = '/usr/lib/enigma2/python/Plugins/Extensions/CoolTVGuide/Cool3D/dummy.png' koprvn.setPara((1, 1, 1, 1, 0, 1, '#00000000')) if otzqir: nlqmqs = '' mzrynz = '' koprvn = findCoolPicon(kklrrq) klyrok = koprvn.startDecode rjyixi = koprvn.setPara rjyixi((int(self.lxktpt[0]), int(self.lxktpt[1]), 1, 1, 0, 1, '#00000000')) elif mzrynz == '': uunuoo = zrlpzx.rfind(':') if uunuoo != -1: otzqir = True zrlpzx = zrlpzx[:uunuoo].rstrip(':').replace(':', '_') for srrllp in self.vzxowj: nlqmqs = srrllp + zrlpzx + '.png' if fileExists(nlqmqs): self.Setpixmap(nlqmqs) if not otzqir: koprvn.startDecode(nlqmqs, 0, 0, False) nlqmqs = koprvn.getData() self.instance.setPixmap(nlqmqs)
def intermediateWrite(self, timers, conflicting, similar, skipped): returnlist = [] extend = returnlist.extend for (name, begin, end, serviceref, autotimername, message) in timers: ref = ServiceReference(str(serviceref)) extend( ( "<e2simulatedtimer>\n" " <e2servicereference>", stringToXML(serviceref), "</e2servicereference>\n", " <e2servicename>", stringToXML(ref.getServiceName().replace("\xc2\x86", "").replace("\xc2\x87", "")), "</e2servicename>\n", " <e2name>", stringToXML(name), "</e2name>\n", " <e2timebegin>", str(begin), "</e2timebegin>\n", " <e2timeend>", str(end), "</e2timeend>\n", " <e2autotimername>", stringToXML(autotimername), "</e2autotimername>\n" "</e2simulatedtimer>\n", ) ) if self._stillAlive: reactor.callFromThread(lambda: self._req.write("".join(returnlist)))
def getPiconName(serviceName): #remove the path and name fields, and replace ':' by '_' sname = '_'.join(GetWithAlternative(serviceName).split(':', 10)[:10]) pngname = findPicon(sname) if not pngname: fields = sname.split('_', 3) if len(fields) > 2: if fields[0] != '1': #fallback to 1 for other reftypes fields[0] = '1' pngname = findPicon('_'.join(fields)) if not pngname and fields[2] != '1': #fallback to 1 for services with different service types fields[2] = '1' pngname = findPicon('_'.join(fields)) if not pngname: # picon by channel name try: name = ServiceReference(serviceName).getServiceName() #print "[Picon] unicodedata.normalize: ", name name = unicodedata.normalize('NFKD', unicode(name, 'utf_8', errors='ignore')).encode('ASCII', 'ignore') name = re.sub('[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower()) #print "[Picon] picon by channel name: ", name if name: pngname = findPicon(name) if not pngname and len(name) > 2 and name.endswith('hd'): pngname = findPicon(name[:-2]) except: pass return pngname
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 buildConfiguration(self, webif = False): list = ['<?xml version="1.0" ?>\n<epgrefresh>\n\n'] if webif: TAGSERVICE='e2servicereference' TAGBOUQUET='e2servicereference' TAGNAME='e2servicename' else: TAGSERVICE='service' TAGBOUQUET='bouquet' TAGNAME='!--' for service in self.services[0]: ref = ServiceReference(service.sref) list.extend((' <', TAGNAME, '>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</', TAGNAME, '>\n')) list.extend((' <', TAGSERVICE)) if service.duration is not None: list.extend((' duration="', str(service.duration), '"')) list.extend(('>', stringToXML(service.sref), '</', TAGSERVICE, '>\n')) for bouquet in self.services[1]: ref = ServiceReference(bouquet.sref) list.extend((' <', TAGNAME, '>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</', TAGNAME, '>\n')) list.extend((' <', TAGBOUQUET)) if bouquet.duration is not None: list.extend((' duration="', str(bouquet.duration), '"')) list.extend(('>', stringToXML(bouquet.sref), '</', TAGBOUQUET, '>\n')) list.append('\n</epgrefresh>') return list
def sendServiceLine(service, counter, last=False): if service[0][:5] == '1:64:': # format for markers: ":Name" line = "%d%s:%s" % (CODE_OK, '-' if not last else ' ', service[1]) else: # <id> <full name>,<short name>;<provider>:<freq>:<parameters>:<source>:<srate>:<vpid>:<apid>:<tpid>:<conditional access>:<:sid>:<nid>:<tid>:<:rid> # e.g. 5 RTL Television,RTL:12188:h:S19.2E:27500:163:104:105:0:12003:1:1089:0 sref = ServiceReference(service[0]) info = sref.info() # XXX: how to get this?! o0 feinfo = None #sref.ref.frontendInfo() fedata = feinfo.getAll(True) if feinfo else {} prov = getServiceInfoValue(info, sref, iServiceInformation.sProvider) frequency = fedata.get("frequency", 0)/1000 param = -1 source = '-1' srate = -1 vpid = '-1' apid = '-1' tpid = -1 ca = '-1' sid = -1 nid = -1 tid = -1 rid = -1 # TODO: support full format, these are only the important fields ;) line = "%d%s%d %s,%s;%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d" % (CODE_OK, '-' if not last else ' ', counter, service[1], service[2], prov, frequency, param, source, srate, vpid, apid, tpid, ca, sid, nid, tid, rid) self.sendLine(line)
def getPiconName(serviceName): sname = '_'.join(GetWithAlternative(serviceName).split(':', 10)[:10]) pngname = findPicon(sname) if not pngname: # picon by channel name name = ServiceReference(serviceName).getServiceName() name = unicodedata.normalize('NFKD', unicode(name, 'utf_8', errors='ignore')).encode('ASCII', 'ignore') name = re.sub('[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower()) if len(name) > 0: pngname = findPicon(name) if not pngname and len(name) > 2 and name.endswith('hd'): pngname = findPicon(name[:-2]) if not pngname: fields = sname.split('_', 3) if len(fields) > 0 and fields[0] != '1': fields[0] = '1' pngname = findPicon('_'.join(fields)) if len(fields) > 2: while not pngname: tmp = '' for i in range(256): tmp = hex(i)[2:].upper().zfill(2) fields[2] = tmp pngname = findPicon('_'.join(fields)) if pngname: newpng = '/usr/share/enigma2/picon/' + name + '.png' try: os.symlink(pngname, newpng) except: pass break if tmp == "FF": break return pngname
def showPendingServices(self, session): if session is None: session = self.session else: if self.session is None: self.session = session if session is None: return False if not self.isRunning(): return False LISTMAX = 10 servcounter = 0 try: servtxt = "" for service in self.scanServices: if self.isServiceProtected(service): skipProtectedServices = config.plugins.epgrefresh.skipProtectedServices.value adapter = config.plugins.epgrefresh.adapter.value if (not self.forcedScan) or skipProtectedServices == "always" or (self.forcedScan and Screens.Standby.inStandby is None and skipProtectedServices == "bg_only" and (adapter == "pip" or adapter == "main")): continue if servcounter <= LISTMAX: ref = ServiceReference(service.sref) txt = ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') servtxt = servtxt + str(txt) + "\n" servcounter = servcounter + 1 first_text = _("Stop Running EPG-refresh?\n") if servcounter > LISTMAX: servtxt = servtxt + _("\n%d more services.") % (servcounter) session.openWithCallback(self.msgClosed, MessageBox, first_text + _("Following Services have to be scanned:") + "\n" + servtxt, MessageBox.TYPE_YESNO) except: print("[EPGRefresh] showPendingServices Error!")
def addAlternativeServices(self): cur_service = ServiceReference(self.getCurrentSelection()) root = self.getRoot() cur_root = root and ServiceReference(root) mutableBouquet = cur_root.list().startEdit() if mutableBouquet: name = cur_service.getServiceName() print "NAME", name if self.mode == MODE_TV: str = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(name)) else: str = '1:134:2:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(name)) new_ref = ServiceReference(str) if not mutableBouquet.addService(new_ref.ref, cur_service.ref): mutableBouquet.removeService(cur_service.ref) mutableBouquet.flushChanges() eDVBDB.getInstance().reloadBouquets() mutableAlternatives = new_ref.list().startEdit() if mutableAlternatives: mutableAlternatives.setListName(name) if mutableAlternatives.addService(cur_service.ref): print "add", cur_service.toString(), "to new alternatives failed" mutableAlternatives.flushChanges() self.servicelist.addService(new_ref.ref, True) self.servicelist.removeCurrent() self.servicelist.moveUp() else: print "get mutable list for new created alternatives failed" else: print "add", str, "to", cur_root.getServiceName(), "failed" else: print "bouquetlist is not editable"
def getPiconName(serviceName): #remove the path and name fields, and replace ':' by '_' sname = '_'.join(GetWithAlternative(serviceName).split(':', 10)[:10]) pngname = findPicon(sname) if not pngname: fields = sname.split('_', 3) if len(fields) > 2: if fields[0] != '1': #fallback to 1 for other reftypes fields[0] = '1' pngname = findPicon('_'.join(fields)) if not pngname and fields[2] != '2': #fallback to 1 for tv services with nonstandard servicetypes fields[2] = '1' pngname = findPicon('_'.join(fields)) if not pngname: # picon by channel name name = ServiceReference(serviceName).getServiceName() name = unicodedata.normalize('NFKD', unicode(name, 'utf_8', errors='ignore')).encode('ASCII', 'ignore') piconname = re.sub('[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower()) if piconname: pngname = findPicon(piconname) if not pngname and len(piconname) > 2 and name.endswith('hd'): pngname = findPicon(piconname[:-2]) if not pngname: # try picon by channel name without last word piconname = ' '.join(name.split(' ')[:-1]) piconname = re.sub('[^a-z0-9]', '', piconname.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower()) pngname = findPicon(piconname) if not pngname: tmp = resolveFilename(SCOPE_CURRENT_SKIN, "picon_default.png") if pathExists(tmp): pngname = tmp else: pngname = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/picon_default.png") return pngname
def getPicon(sname): # remove URL part if ("://" in sname) or ("%3a//" in sname) or ("%3A//" in sname): sname = unquote(sname) sname = ":".join(sname.split(":")[:10]) + "::" + sname.split(":")[-1] sname = GetWithAlternative(sname) if sname is not None: pos = sname.rfind(':') else: return "/images/default_picon.png" cname = None if pos != -1: cname = ServiceReference(sname[:pos].rstrip(':')).getServiceName() sname = sname[:pos].rstrip(':').replace(':','_') + ".png" filename = getPiconPath() + sname if fileExists(filename): return "/picon/" + sname fields = sname.split('_', 3) if len(fields) > 2 and fields[2] != '2': #fallback to 1 for tv services with nonstandard servicetypes fields[2] = '1' sname='_'.join(fields) filename = getPiconPath() + sname if fileExists(filename): return "/picon/" + sname if cname is not None: # picon by channel name cname = unicodedata.normalize('NFKD', unicode(cname, 'utf_8')).encode('ASCII', 'ignore') cname = re.sub('[^a-z0-9]', '', cname.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower()) if len(cname) > 0: filename = getPiconPath() + cname + ".png" if fileExists(filename): return "/picon/" + cname + ".png" return "/images/default_picon.png"
def convertBouquets(self): self.readIndex = 0 while True: if 'lamedb' not in self.workList[self.readIndex]: filename = DIR_TMP + self.workList[self.readIndex] hasRemoteTag = False if self.checkBouquetAllreadyInList(self.workList[self.readIndex], self.workList[self.readIndex]) is True: self.workList[self.readIndex] = self.workList[self.readIndex].replace('userbouquet.', 'userbouquet.remote_') hasRemoteTag = True fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w') try: lines = open(filename).readlines() was_html = False for line in lines: if was_html and '#DESCRIPTION' in line: was_html = False continue if '#NAME' in line and hasRemoteTag: hasRemoteTag = False line = line.replace('#NAME ', '#NAME remote_') was_html = False if 'http' in line: was_html = True continue elif '#SERVICE' in line: line = line.strip('\r\n') line = line.strip('\n') tmp = line.split('#SERVICE') if '::' in tmp[1]: desc = tmp[1].split("::") if (len(desc)) == 2: tmp2 = tmp[1].split('::') service_ref = ServiceReference(tmp2[0] + ':') tag = tmp2[0][1:] else: tag = tmp[1][1:-1] service_ref = ServiceReference(tag) if config.plugins.RemoteStreamConverter.transcoding.value: bitrate = config.plugins.RemoteStreamConverter.bitrate.value resolution = config.plugins.RemoteStreamConverter.resolution.value (width, height) = tuple(resolution.split('x')) framrate = config.plugins.RemoteStreamConverter.framerate.value aspectratio = config.plugins.RemoteStreamConverter.aspectratio.value interlaced = config.plugins.RemoteStreamConverter.interlaced.value args = "?bitrate=%s?width=%s?height=%s?aspectratio=%s?interlaced=%s:" % (bitrate, width, height, aspectratio, interlaced) out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + "%3A" + args + service_ref.getServiceName() + '\n' else: out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName() + '\n' else: out = line fp.write(out) except: pass fp.close() self.readIndex += 1 if self.readIndex == len(self.workList): break self.removeFiles(DIR_TMP, "userbouquet.")
def renderBackground(self, req): autotimer = self.getAutoTimerInstance() ret = autotimer.parseEPG(simulateOnly=True) returnlist = ["<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<e2autotimersimulate api_version=\"", str(API_VERSION), "\">\n"] extend = returnlist.extend for (name, begin, end, serviceref, autotimername) in ret[3]: ref = ServiceReference(str(serviceref)) extend(( '<e2simulatedtimer>\n' ' <e2servicereference>', stringToXML(serviceref), '</e2servicereference>\n', ' <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n', ' <e2name>', stringToXML(name), '</e2name>\n', ' <e2timebegin>', str(begin), '</e2timebegin>\n', ' <e2timeend>', str(end), '</e2timeend>\n', ' <e2autotimername>', stringToXML(autotimername), '</e2autotimername>\n' '</e2simulatedtimer>\n' )) returnlist.append('</e2autotimersimulate>') req.setResponseCode(http.OK) req.setHeader('Content-type', 'application/xhtml+xml') req.setHeader('charset', 'UTF-8') return ''.join(returnlist)
def getText(self): service = self.source.service info = service and service.info() if info and service: if self.type == self.MOVIE_REFERENCE: movie_meta = ServiceReference(info.getInfoString(iServiceInformation.sServiceref)) movie_meta = path.realpath(movie_meta.getPath()) + ".meta" try: f = open(movie_meta, "rb") rec_ref = f.readlines() f.close() except IOError: return "" if len(rec_ref): return rec_ref[0].rstrip('\n') elif self.type == self.MOVIE_DESC: movie_meta = ServiceReference(info.getInfoString(iServiceInformation.sServiceref)) movie_meta = path.realpath(movie_meta.getPath()) + ".meta" try: f = open(movie_meta, "rb") rec_ref = f.readlines() f.close() except IOError: return "" if len(rec_ref): return rec_ref[2].rstrip('\n')
def getLcdPiconName(serviceName): #remove the path and name fields, and replace ':' by '_' fields = GetWithAlternative(serviceName).split(':', 10)[:10] if not fields or len(fields) < 10: return "" pngname = findLcdPicon('_'.join(fields)) if not pngname and not fields[6].endswith("0000"): #remove "sub-network" from namespace fields[6] = fields[6][:-4] + "0000" pngname = findLcdPicon('_'.join(fields)) if not pngname and fields[0] != '1': #fallback to 1 for IPTV streams fields[0] = '1' pngname = findLcdPicon('_'.join(fields)) if not pngname and fields[2] != '2': #fallback to 1 for TV services with non-standard service types fields[2] = '1' pngname = findLcdPicon('_'.join(fields)) if not pngname and fields[9] != '0': #fallback to 0 for iptv buffering fields[9] = '0' pngname = findLcdPicon('_'.join(fields)) if not pngname: # picon by channel name name = ServiceReference(serviceName).getServiceName() name = unicodedata.normalize('NFKD', unicode(name, 'utf_8', errors='ignore')).encode('ASCII', 'ignore') name = re.sub('[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower()) if len(name) > 0: pngname = findLcdPicon(name) if not pngname and len(name) > 2 and name.endswith('hd'): pngname = findLcdPicon(name[:-2]) return pngname
def doSearchEPG(self, searchString = None, searchSave = True, searchDescription=False): self.currSearchSave = searchSave self.currSearchDescription = searchDescription if searchString: self.currSearch = searchString if searchSave: # Maintain history history = config.plugins.epgsearch.history.value if searchString not in history: history.insert(0, searchString) maxLen = config.plugins.epgsearch.history_length.value if len(history) > maxLen: del history[maxLen:] else: history.remove(searchString) history.insert(0, searchString) # Search EPG, default to empty list searchType = eEPGCache.PARTIAL_TITLE_SEARCH if config.plugins.epgsearch.search_type.value == "exakt_title": searchType = eEPGCache.EXAKT_TITLE_SEARCH epgcache = eEPGCache.getInstance() # XXX: the EPGList also keeps an instance of the cache but we better make sure that we get what we want :-) ret = epgcache.search(('RIBDT', 1000, searchType, searchString, eEPGCache.NO_CASE_CHECK)) or [] if searchDescription: ret += epgcache.search(('RIBDT', 1000, eEPGCache.PARTIAL_DESCRIPTION_SEARCH, searchString, eEPGCache.NO_CASE_CHECK)) or [] #condense by eventids condensed = {} for item in ret: condensed[item[1]] = item ret = condensed.values() ret.sort(key=itemgetter(2)) # sort by time #filter epg-matches for selected bouquet from settings if config.plugins.epgsearch.search_scope.value != "all" and len(ret): ret = self.filterEPGmatches(ret) #add short description to search result if config.plugins.epgsearch.show_shortdesc.value and len(ret): ret = self.addShortDescription(epgcache, ret) #get most searched service mostSearchService = "" if not config.plugins.epgsearch.show_picon.value and config.plugins.epgsearch.show_sname_in_title.value and len(ret): mostSearchService = self.getMostSearchService(ret) # Update List l = self["list"] #set mostsearchservice to screen-title title = _("EPG Search") l.mostSearchService = mostSearchService #save the value also to EPGList-Class if not config.plugins.epgsearch.show_picon.value and mostSearchService != "": serviceref = ServiceReference(mostSearchService) # for Servicename serviceName = serviceref.getServiceName() title += " - " + serviceName self.setTitle(title) l.recalcEntrySize() l.list = ret l.l.setList(ret)
def firstStart(self): myServicelist.servicelist.moveToIndex(0) myServicelist.zap() srvName = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName() srvName = srvName.replace('\xc2\x86', '').replace('\xc2\x87', '') self["wohin"].setText(srvName + _(" (AutoZap)")) delay = config.plugins.epgrefresh_extra.timeout_autozap.value self.AutoZap.start(int(delay * 1000))
def getSubservices(self): print "[SubServices].getSubservices called" list = [] if self.streamingScreens is None: currentServiceRef = self.session.nav.getCurrentlyPlayingServiceReference() if currentServiceRef is not None: list.append(( currentServiceRef.toString(), ServiceReference(currentServiceRef).getServiceName() )) currentService = self.session.nav.getCurrentService() subservices = currentService and currentService.subServices() if subservices and subservices.getNumberOfSubservices() != 0: n = subservices and subservices.getNumberOfSubservices() x = 0 while x < n: sub = subservices.getSubservice(x) list.append((sub.toString(), sub.getName())) x += 1 else: list = (("N/A", "N/A"),) print "SubServices is returning list ", list return list elif self.cmd is not None: print "[SubServices].getSubservices for Streaming Service" for screen in self.streamingScreens: if screen is not None: service = screen.getRecordService() sref = ServiceReference(screen.getRecordServiceRef()) if service is not None: print "[SubServices] serviceref: %s | cmd: %s" %(sref, self.cmd) if sref.__str__() == self.cmd: list.append((sref.__str__(), sref.getServiceName())) print "[SubServices] Matching recordSerivce found!" subservices = service and service.subServices() if subservices and subservices.getNumberOfSubservices() != 0: n = subservices and subservices.getNumberOfSubservices() x = 0 while x < n: sub = subservices.getSubservice(x) list.append((sub.toString(), sub.getName())) x += 1 return list else: print "[SubServices] no items: %s" %subservices else: print "[SubServices] Service is None!" if not list: return (("N/A", "N/A"),) return list
def set_video_player(self, video_player): self.video_player = video_player self.video = video_player.video self.session = video_player.session sref = ServiceReference(video_player.sref) self.sref_url = sref.getPath() self.sref_id = sref.getType() self.sref_name = sref.getServiceName() self._eplayer_mode = video_player.__class__.__name__ in ('EPlayer3VideoPlayer', 'EPlayer2VideoPlayer')
def getPicon(sname): pp = getPiconPath() if pp is not None: # remove URL part if ("://" in sname) or ("%3a//" in sname) or ("%3A//" in sname): sname = unquote(sname) sname = ":".join(sname.split(":")[:10]) + "::" + sname.split(":")[-1] sname = GetWithAlternative(sname) if sname is not None: pos = sname.rfind(':') else: return "/images/default_picon.png" cname = None if pos != -1: cname = ServiceReference(sname[:pos].rstrip(':')).getServiceName() sname = sname[:pos].rstrip(':').replace(':','_') + ".png" filename = pp + sname if fileExists(filename): return "/picon/" + sname fields = sname.split('_', 8) if len(fields) > 7 and not fields[6].endswith("0000"): #remove "sub-network" from namespace fields[6] = fields[6][:-4] + "0000" sname='_'.join(fields) filename = pp + sname if fileExists(filename): return "/picon/" + sname if len(fields) > 1 and fields[0] != '1': #fallback to 1 for other reftypes fields[0] = '1' sname='_'.join(fields) filename = pp + sname if fileExists(filename): return "/picon/" + sname if len(fields) > 3 and fields[2] != '1': #fallback to 1 for tv services with nonstandard servicetypes fields[2] = '1' sname='_'.join(fields) filename = pp + sname if fileExists(filename): return "/picon/" + sname if cname is not None: # picon by channel name cname1 = cname.replace('\xc2\x86','').replace('\xc2\x87', '').replace('/', '_').encode('utf-8', 'ignore') if fileExists(pp + cname1 + ".png"): return "/picon/" + cname1 + ".png" cname = unicodedata.normalize('NFKD', unicode(cname, 'utf_8', errors='ignore')).encode('ASCII', 'ignore') cname = re.sub('[^a-z0-9]', '', cname.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower()) if len(cname) > 0: filename = pp + cname + ".png" if fileExists(filename): return "/picon/" + cname + ".png" if len(cname) > 2 and cname.endswith('hd') and fileExists(pp + cname[:-2] + ".png"): return "/picon/" + cname[:-2] + ".png" return "/images/default_picon.png"
def zapForRefresh(self): myServicelist.moveDown() NewService = myServicelist.getCurrentSelection() if (NewService.flags & 7) == 7: myServicelist.enterPath(NewService) elif not (NewService.flags & eServiceReference.isMarker): myServicelist.zap() srvName = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName() srvName = srvName.replace('\xc2\x86', '').replace('\xc2\x87', '') self["wohin"].setText(srvName + _(" (AutoZap)"))
def finishedChannelSelection(self, *args): if len(args): ref=args[0] service_ref = ServiceReference(ref) service_name = service_ref.getServiceName() if find_in_list(self.servicelist, service_name, 0)==False: split_ref=service_ref.ref.toString().split(":") if split_ref[0] == "1":#== dvb service und nicht muell von None self.servicelist.append( (service_name , ConfigNothing(), 0, service_ref.ref.toString()) ) self["ServiceList"].l.setList(self.servicelist)
def set_video_player(self, video_player): self.video_player = video_player self.video = video_player.video self.session = video_player.session sref = ServiceReference(video_player.sref) self.sref_url = sref.getPath() self.sref_id = sref.getType() self.sref_name = sref.getServiceName() self._eplayer_gst10_mode = (video_player.__class__.__name__ in ('EPlayer3VideoPlayer', 'EPlayer2VideoPlayer') or (videoPlayerInfo.type == 'gstreamer' and videoPlayerInfo.version == '1.0'))
def getChannel(ref): if isinstance(ref, eServiceReference): servicereference = ServiceReference(ref) elif isinstance(ref, ServiceReference): servicereference = ref else: servicereference = ServiceReference(str(ref)) if servicereference: return servicereference.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') return ""
def buildEPGSearchEntry(self, service, eventId, beginTime, duration, EventName): rec1 = beginTime and self.timer.isInTimer(eventId, beginTime, duration, service) # Partnerbox if PartnerBoxIconsEnabled: rec2 = beginTime and isInRemoteTimer(self,beginTime, duration, service) else: rec2 = False r1 = self.weekday_rect r2 = self.datetime_rect r3 = self.descr_rect t = localtime(beginTime) serviceref = ServiceReference(service) # for Servicename serviceName = serviceref.getServiceName() + ": " #delete serviceName if set it in setup and it is most matched service if config.plugins.epgsearch.show_sname_in_title.value and service == self.mostSearchService: serviceName = "" res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, self.days[t[6]]), (eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 0, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4])) ] #add picon if set this option in setup picon = None if config.plugins.epgsearch.show_picon.value: picon = self.piconLoader.getPicon(service) left_pos = r3.left() if picon is not None: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, left_pos, 2, self._picon_width, r3.height()-3, picon)) left_pos = r3.left() + self._picon_width + self._itemMargin serviceName = "" #if load picon delete servicename if rec1 or rec2: if rec1: clock_pic = self.getClockPixmap(service, beginTime, duration, eventId) # maybe Partnerbox too if rec2: clock_pic_partnerbox = getRemoteClockPixmap(self,service, beginTime, duration, eventId) else: clock_pic = getRemoteClockPixmap(self,service, beginTime, duration, eventId) if rec1 and rec2: # Partnerbox and local res.extend(( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, left_pos, self._iconHPos, self._iconWidth, self._iconHeight, clock_pic), (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, left_pos + self._iconWidth + self._itemMargin, self._iconHPos, self._iconWidth, self._iconHeight, clock_pic_partnerbox), (eListboxPythonMultiContent.TYPE_TEXT, left_pos + self._iconWidth*2 + self._itemMargin*2, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName + EventName))) else: res.extend(( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, left_pos, self._iconHPos, self._iconWidth, self._iconHeight, clock_pic), (eListboxPythonMultiContent.TYPE_TEXT, left_pos + self._iconWidth + self._itemMargin, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName + EventName))) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, left_pos, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName + EventName)) return res
def _buildOptionEntryServicePicon(self, service): if service.flags & eServiceReference.mustDescent: alist = ServiceReference(service).list() first_in_alternative = alist and alist.getNext() if first_in_alternative: service_str = first_in_alternative.toString() else: service_str = service.toString() else: service_str = service.toString() return self.piconLoader.getPicon(service_str)
def convertBouquets(self): self.readIndex = 0 while True: if 'lamedb' not in self.workList[self.readIndex]: filename = DIR_TMP + self.workList[self.readIndex] fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w') try: fp2 = open(filename) lines = fp2.readlines() fp2.close() was_html = False for line in lines: if was_html and '#DESCRIPTION' in line: was_html = False continue if '#NAME' in line: txt = _('remote of') line = '%s (%s %s) \n' % (line.rstrip('\n'), txt, self.getRemoteAdress()) was_html = False if 'http' in line: was_html = True continue elif '#SERVICE' in line: if int(line.split()[1].split(':')[1]) & eServiceReference.mustDescent: line = self.getAlternativeLine(line) if line == None: continue line = line.strip('\r\n') line = line.strip('\n') tmp = line.split('#SERVICE') if '::' in tmp[1]: desc = tmp[1].split('::') if len(desc) == 2: tmp2 = tmp[1].split('::') service_ref = ServiceReference(tmp2[0] + ':') tag = tmp2[0][1:] else: tag = tmp[1][1:-1] service_ref = ServiceReference(tag) out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName() + '\n' else: out = line fp.write(out) except: pass fp.close() self.readIndex += 1 if self.readIndex == len(self.workList): break self.removeFilesByPattern(DIR_TMP, '[.](tv|radio)$') return
def nextService(self): # Debug print("[EPGRefresh] Maybe zap to next service") try: # Get next reference service = self.scanServices.pop(0) except IndexError: # Debug print("[EPGRefresh] Done refreshing EPG") # Clean up self.cleanUp() else: if self.myEpgCacheInstance is None and config.plugins.epgrefresh.usetimebased.value == False: # get eEPGCache instance if None and eEPGCache-signal based is used print("[EPGRefresh] - myEpgCacheInstance is None. Get it") self.myEpgCacheInstance = eEPGCache.getInstance() self.EpgCacheStateChanged_conn = self.myEpgCacheInstance.cacheState.connect(self._onCacheStateChanged) if self.isServiceProtected(service): if (not self.forcedScan) or config.plugins.epgrefresh.skipProtectedServices.value == "always": print("[EPGRefresh] Service is protected, skipping!") self.refresh() return # If the current adapter is unable to run in background and we are in fact in background now, # fall back to main picture if (not self.refreshAdapter.backgroundCapable and Screens.Standby.inStandby): print("[EPGRefresh] Adapter is not able to run in background or not available, falling back to MainPictureAdapter") self.maybeStopAdapter() self.refreshAdapter = MainPictureAdapter(self.session) self.refreshAdapter.prepare() if config.plugins.epgrefresh.usetimebased.value == False: # set timeout timer for eEPGCache-signal based refresh self.epgTimeoutTimer.start(5000, True) # Play next service # XXX: we might want to check the return value self.currentServiceRef = eServiceReference(service.sref) self.refreshAdapter.play(self.currentServiceRef) ref = ServiceReference(service.sref) channelname = ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') print("[EPGRefresh] - Service is: %s" %(str(channelname))) if config.plugins.epgrefresh.usetimebased.value: # Start Timer delay = service.duration or config.plugins.epgrefresh.interval_seconds.value epgrefreshtimer.add(EPGRefreshTimerEntry( time() + delay, self.refresh, nocheck = True) )
def getSelection(self, current): from ServiceReference import ServiceReference if current: if type(current) == tuple: current = current[0] sref = ServiceReference(current) self.last_selection = current url = sref.getPath() fn = sref.getServiceName() self.session.openWithCallback(self.loadFileList, SimplePlayer, [(fn, url)], showPlaylist=False, ltype=self.ltype, googleCoverSupp=config.mediaportal.simplelist_gcoversupp.value, embeddedCoverArt=True) else:
def finishedChannelSelection(self, *args): if len(args): ref = args[0] service_ref = ServiceReference(ref) service_name = service_ref.getServiceName() if find_in_list(self.servicelist, service_name, 0) == False: str_service = service_ref.ref.toString() split_ref = str_service.split(":") if split_ref[0] == "1" and not str_service.startswith("1:134:") and "%3a//" not in str_service: self.servicelist.append((service_name, ConfigNothing(), 0, str_service)) self["ServiceList"].l.setList(self.servicelist) self.setServiceListInfo()
def channelSelectionCallback(self, *args): if args and len(args) == 2: serviceref, bouquetref = args[:2] if self.parent: self.parent.selectBouquet(bouquetref, self) self.setService(ServiceReference(serviceref))
def changed(self, what): if self.instance: pngname = "" if what[0] != self.CHANGED_CLEAR: self.instance.show() sname = self.source.text pos = sname.rfind(':') if pos != -1: sname = sname[:pos].rstrip(':').replace(':', '_') sname = sname.split("_http")[0] pngname = self.nameCache.get(sname, "") if pngname == "": pngname = self.findPicon(sname) if pngname == "": fields = sname.split('_', 3) if len(fields) > 2 and fields[ 2] != '2': #fallback to 1 for tv services with nonstandard servicetypes fields[2] = '1' if fields[0] == '4097' or fields[ 0] == '5002': #fallback to 1 for IPTV streams fields[0] = '1' pngname = self.findPicon('_'.join(fields)) if not pngname: # picon by channel name name = ServiceReference( self.source.text).getServiceName() name = unicodedata.normalize( 'NFKD', unicode(name, 'utf_8', errors='ignore')).encode( 'ASCII', 'ignore') name = re.sub( '[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace( '*', 'star').lower()) if len(name) > 0: pngname = self.findPicon(name) if not pngname and len(name) > 2 and name.endswith( 'hd'): pngname = self.findPicon(name[:-2]) if pngname != "": self.nameCache[sname] = pngname if pngname == "": # no picon for service found pngname = self.nameCache.get("default", "") if pngname == "": # no default yet in cache.. pngname = self.findPicon("picon_default") if pngname == "": tmp = resolveFilename(SCOPE_CURRENT_SKIN, "picon_default.png") if fileExists(tmp): pngname = tmp else: pngname = resolveFilename( SCOPE_SKIN_IMAGE, "skin_default/picon_default.png") self.nameCache["default"] = pngname if self.pngname != pngname: self.instance.setScale(1) self.instance.setPixmapFromFile(pngname) self.pngname = pngname else: self.pngname = "" self.instance.hide()
def rootBouquet(self): servicelist = Screens.InfoBar.InfoBar.instance.servicelist epg_bouquet = servicelist and servicelist.getRoot() if ServiceReference(epg_bouquet).getServiceName(): return False return True
def convertBouquets(self): self.readIndex = 0 while True: if 'lamedb' not in self.workList[self.readIndex]: filename = DIR_TMP + self.workList[self.readIndex] hasRemoteTag = False if self.checkBouquetAllreadyInList( self.workList[self.readIndex], self.workList[self.readIndex]) is True: self.workList[self.readIndex] = self.workList[ self.readIndex].replace('userbouquet.', 'userbouquet.remote_') hasRemoteTag = True fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w') try: lines = open(filename).readlines() was_html = False for line in lines: if was_html and '#DESCRIPTION' in line: was_html = False continue if '#NAME' in line and hasRemoteTag: hasRemoteTag = False line = line.replace('#NAME ', '#NAME remote_') was_html = False if 'http' in line: was_html = True continue elif '#SERVICE' in line: line = line.strip('\r\n') line = line.strip('\n') tmp = line.split('#SERVICE') if '::' in tmp[1]: desc = tmp[1].split("::") if (len(desc)) == 2: tmp2 = tmp[1].split('::') service_ref = ServiceReference(tmp2[0] + ':') tag = tmp2[0][1:] else: tag = tmp[1][1:-1] service_ref = ServiceReference(tag) if config.plugins.RemoteStreamConverter.transcoding.value: bitrate = config.plugins.RemoteStreamConverter.bitrate.value resolution = config.plugins.RemoteStreamConverter.resolution.value (width, height) = tuple(resolution.split('x')) framrate = config.plugins.RemoteStreamConverter.framerate.value aspectratio = config.plugins.RemoteStreamConverter.aspectratio.value interlaced = config.plugins.RemoteStreamConverter.interlaced.value args = "?bitrate=%s?width=%s?height=%s?aspectratio=%s?interlaced=%s:" % ( bitrate, width, height, aspectratio, interlaced) out = '#SERVICE ' + tag + ':' + quote( 'http://' + self.getRemoteAdress() + ':8001/' + tag ) + "%3A" + args + service_ref.getServiceName( ) + '\n' else: out = '#SERVICE ' + tag + ':' + quote( 'http://' + self.getRemoteAdress() + ':8001/' + tag ) + ':' + service_ref.getServiceName() + '\n' else: out = line fp.write(out) except: pass fp.close() self.readIndex += 1 if self.readIndex == len(self.workList): break self.removeFiles(DIR_TMP, "userbouquet.")
def addServiceToAlternative(self, param): sBouquetRef = param["sBouquetRef"] if sBouquetRef is None: return (False, "No bouquet given!") sRef = None if "sRef" in param: if param["sRef"] is not None: sRef = param["sRef"] # service to add to the alternative if sRef is None: return (False, _("No service given!")) sCurrentRef = param["sCurrentRef"] # alternative service if sCurrentRef is None: return (False, _("No current service given!")) cur_ref = eServiceReference(sCurrentRef) # check if service is already an alternative if not (cur_ref.flags & eServiceReference.isGroup): # sCurrentRef is not an alternative service yet, so do this and add itself to new alternative liste mode = MODE_TV # init if "mode" in param: if param["mode"] is not None: mode = int(param["mode"]) mutableBouquetList = self.getMutableList(eServiceReference(sBouquetRef)) if mutableBouquetList: cur_service = ServiceReference(cur_ref) name = cur_service.getServiceName() if mode == MODE_TV: sref = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.tv\" ORDER BY bouquet' % (self.buildBouquetID(name, "alternatives.", mode)) else: sref = '1:134:2:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.radio\" ORDER BY bouquet' % (self.buildBouquetID(name, "alternatives.", mode)) new_ref = eServiceReference(sref) if not mutableBouquetList.addService(new_ref, cur_ref): mutableBouquetList.removeService(cur_ref) mutableBouquetList.flushChanges() eDVBDB.getInstance().reloadBouquets() mutableAlternatives = self.getMutableList(new_ref) if mutableAlternatives: mutableAlternatives.setListName(name) if mutableAlternatives.addService(cur_ref): print "add", cur_ref.toString(), "to new alternatives failed" mutableAlternatives.flushChanges() self.setRoot(sBouquetRef) sCurrentRef = sref # currentRef is now an alternative (bouquet) else: return (False, _("Get mutable list for new created alternative failed!")) else: return (False, _("Alternative %s created failed.") % name) else: return (False, _("Bouquetlist is not editable!")) # add service to alternative-bouquet new_param = {} new_param["sBouquetRef"] = sCurrentRef new_param["sRef"] = sRef returnValue = self.addServiceToBouquet(new_param) if returnValue[0]: cur_ref = eServiceReference(sCurrentRef) cur_service = ServiceReference(cur_ref) name = cur_service.getServiceName() service_ref = ServiceReference(sRef) service_name = service_ref.getServiceName() return (True, _("Added %s to alternative service %s.") % (service_name, name)) else: return returnValue
def buildListboxEntry(self, timer): if not timer.enabled: icon = self.iconDisabled else: icon = self.iconEnabled if timer.justplay: rectypeicon = self.iconZapped else: rectypeicon = self.iconRecording height = self.l.getItemSize().height() width = self.l.getItemSize().width() iconMargin = self.iconMargin statusIconHeight = self.statusIconHeight statusIconWidth = self.statusIconWidth typeIconHeight = self.typeIconHeight typeIconWidth = self.typeIconWidth rowHeight = self.rowHeight rowSplit1 = self.rowSplit1 rowSplit2 = self.rowSplit2 channels = [] bouquets = [] for t in timer.services: channels.append(ServiceReference(t).getServiceName()) for t in timer.bouquets: bouquets.append(ServiceReference(t).getServiceName()) if len(channels) > 0: channel = _("[S] ") channel += ", ".join(channels) elif len(bouquets) > 0: channel = _("[B] ") channel += ", ".join(bouquets) else: channel = _('All channels') res = [None] if icon: if skinparms: x, y, w, h = parameters.get( "AutotimerEnabledIcon", (iconMargin, 0, statusIconHeight, statusIconWidth)) else: x, y, w, h = (iconMargin, 0, statusIconHeight, statusIconWidth) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, x, y, w, h, icon)) if rectypeicon: if skinparms: x, y, w, h = parameters.get( "AutotimerRecordIcon", (iconMargin + statusIconWidth + iconMargin, 3, statusIconHeight, typeIconWidth)) else: x, y, w, h = (iconMargin + statusIconWidth + iconMargin, 3, statusIconHeight, typeIconWidth) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, x, y, w, h, rectypeicon)) if timer.hasTimespan(): nowt = time() now = localtime(nowt) begintime = int( mktime((now.tm_year, now.tm_mon, now.tm_mday, timer.timespan[0][0], timer.timespan[0][1], 0, now.tm_wday, now.tm_yday, now.tm_isdst))) endtime = int( mktime((now.tm_year, now.tm_mon, now.tm_mday, timer.timespan[1][0], timer.timespan[1][1], 0, now.tm_wday, now.tm_yday, now.tm_isdst))) timespan = ((" %s ... %s") % (FuzzyTime(begintime)[1], FuzzyTime(endtime)[1])) else: timespan = _(" Any time") res.append( (eListboxPythonMultiContent.TYPE_TEXT, float(width) / 10 * 4.5, 2, width - float(width) / 10 * 4.5, rowHeight, 1, RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, timespan)) if TextBoundary: timespanWidth = getTextBoundarySize(self.instance, self.EventNameFont, self.l.getItemSize(), timespan).width() else: timespanWidth = float(width) / 10 * 2 res.append( (eListboxPythonMultiContent.TYPE_TEXT, statusIconWidth + typeIconWidth + iconMargin * 3, 2, width - statusIconWidth - typeIconWidth - iconMargin * 3 - timespanWidth, rowHeight, 1, RT_HALIGN_LEFT | RT_VALIGN_BOTTOM, timer.name)) if timer.hasTimeframe(): begin = strftime("%a, %d %b", localtime(timer.getTimeframeBegin())) end = strftime("%a, %d %b", localtime(timer.getTimeframeEnd())) timeframe = (("%s ... %s") % (begin, end)) res.append( (eListboxPythonMultiContent.TYPE_TEXT, iconMargin, rowSplit1, float(width) / 10 * 4.5, rowHeight, 2, RT_HALIGN_LEFT | RT_VALIGN_TOP, timeframe)) if timer.include[3]: total = len(timer.include[3]) count = 0 days = [] while count + 1 <= total: day = timer.include[3][count] day = { '0': _("Mon"), '1': _("Tue"), '2': _("Wed"), '3': _("Thur"), '4': _("Fri"), '5': _("Sat"), '6': _("Sun"), "weekend": _("Weekend"), "weekday": _("Weekday") }[day] days.append(day) count += 1 days = ', '.join(days) else: days = _("Everyday") res.append( (eListboxPythonMultiContent.TYPE_TEXT, float(width) / 10 * 5.5, rowSplit1, width - float(width) / 10 * 5.5, rowHeight, 2, RT_HALIGN_RIGHT | RT_VALIGN_TOP, days)) res.append((eListboxPythonMultiContent.TYPE_TEXT, iconMargin, rowSplit2, width - (iconMargin * 2), rowHeight, 0, RT_HALIGN_LEFT | RT_VALIGN_TOP, channel)) try: devide = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "div-h.png")) except: devide = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 0, height - 2, width, 2, devide)) return res
def keyGo(self, result=None): if not self.timerentry_service_ref.isRecordable(): self.session.openWithCallback( self.selectChannelSelector, MessageBox, _("You didn't select a channel to record from."), MessageBox.TYPE_ERROR) else: self.timer.external = self.timerentry_fallback.value self.timer.name = self.timerentry_name.value self.timer.description = self.timerentry_description.value self.timer.justplay = self.timerentry_justplay.value == "zap" self.timer.always_zap = self.timerentry_justplay.value == "zap+record" self.timer.zap_wakeup = self.timerentry_zapwakeup.value self.timer.pipzap = self.timerentry_pipzap.value self.timer.rename_repeat = self.timerentry_renamerepeat.value self.timer.conflict_detection = self.timerentry_conflictdetection.value if self.timerentry_justplay.value == "zap": if not self.timerentry_showendtime.value: self.timerentry_endtime.value = self.timerentry_starttime.value self.timerentry_afterevent.value = "nothing" self.timer.resetRepeated() self.timer.afterEvent = { "nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY, "auto": AFTEREVENT.AUTO }[self.timerentry_afterevent.value] self.timer.descramble = { "normal": True, "descrambled+ecm": True, "scrambled+ecm": False, }[self.timerentry_recordingtype.value] self.timer.record_ecm = { "normal": False, "descrambled+ecm": True, "scrambled+ecm": True, }[self.timerentry_recordingtype.value] self.timer.service_ref = self.timerentry_service_ref self.timer.tags = self.timerentry_tags if self.timerentry_fallback.value: self.timer.dirname = self.timerentry_fallbackdirname.value else: if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath( ): self.timer.dirname = self.timerentry_dirname.value config.movielist.last_timer_videodir.value = self.timer.dirname config.movielist.last_timer_videodir.save() if self.timerentry_type.value == "once": self.timer.begin, self.timer.end = self.getBeginEnd() if self.timerentry_type.value == "repeated": if self.timerentry_repeated.value == "daily": for x in (0, 1, 2, 3, 4, 5, 6): self.timer.setRepeated(x) if self.timerentry_repeated.value == "weekly": self.timer.setRepeated(self.timerentry_weekday.index) if self.timerentry_repeated.value == "weekdays": for x in (0, 1, 2, 3, 4): self.timer.setRepeated(x) if self.timerentry_repeated.value == "user": for x in (0, 1, 2, 3, 4, 5, 6): if self.timerentry_day[x].value: self.timer.setRepeated(x) self.timer.repeatedbegindate = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value) if self.timer.repeated: self.timer.begin = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value) self.timer.end = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value) else: self.timer.begin = self.getTimestamp( time(), self.timerentry_starttime.value) self.timer.end = self.getTimestamp( time(), self.timerentry_endtime.value) # when a timer end is set before the start, add 1 day if self.timer.end < self.timer.begin: self.timer.end += 86400 if self.timer.eit is not None: event = eEPGCache.getInstance().lookupEventId( self.timer.service_ref.ref, self.timer.eit) if event: n = event.getNumOfLinkageServices() if n > 1: tlist = [] ref = self.session.nav.getCurrentlyPlayingServiceOrGroup( ) parent = self.timer.service_ref.ref selection = 0 for x in range(n): i = event.getLinkageService(parent, x) if i.toString() == ref.toString(): selection = x tlist.append((i.getName(), i)) self.session.openWithCallback( self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list=tlist, selection=selection) return elif n > 0: parent = self.timer.service_ref.ref self.timer.service_ref = ServiceReference( event.getLinkageService(parent, 0)) self.saveTimer() self.close((True, self.timer))
def finishedChannelSelection(self, *args): if args: self.timerentry_service_ref = ServiceReference(args[0]) self.timerentry_service.setCurrentText( self.timerentry_service_ref.getServiceName()) self["config"].invalidate(self.channelEntry)
class TimerEntry(Screen, ConfigListScreen): def __init__(self, session, timer, edit=False): Screen.__init__(self, session) self.timer = timer self.timer.service_ref_prev = self.timer.service_ref self.timer.begin_prev = self.timer.begin self.timer.end_prev = self.timer.end self.timer.external_prev = self.timer.external self.timer.dirname_prev = self.timer.dirname self.entryDate = None self.entryService = None self["key_green"] = self["oktext"] = Label(_("OK")) self["key_red"] = self["canceltext"] = Label(_("Cancel")) self["ok"] = Pixmap() self["cancel"] = Pixmap() self["key_yellow"] = Label(_("Timer type")) self["key_blue"] = Label() self["actions"] = NumberActionMap( [ "SetupActions", "GlobalActions", "PiPSetupActions", "ColorActions" ], { "ok": self.keySelect, "save": self.keyGo, "cancel": self.keyCancel, "volumeUp": self.incrementStart, "volumeDown": self.decrementStart, "size+": self.incrementEnd, "size-": self.decrementEnd, "yellow": self.changeTimerType, "blue": self.changeZapWakeupType }, -2) self.list = [] ConfigListScreen.__init__(self, self.list, session=session) self.setTitle(_("Timer entry")) FallbackTimerDirs(self, self.createConfig) def createConfig(self, currlocation=None, locations=[]): justplay = self.timer.justplay always_zap = self.timer.always_zap zap_wakeup = self.timer.zap_wakeup pipzap = self.timer.pipzap rename_repeat = self.timer.rename_repeat conflict_detection = self.timer.conflict_detection afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby", AFTEREVENT.AUTO: "auto" }[self.timer.afterEvent] if self.timer.record_ecm and self.timer.descramble: recordingtype = "descrambled+ecm" elif self.timer.record_ecm: recordingtype = "scrambled+ecm" elif self.timer.descramble: recordingtype = "normal" weekday_table = ("mon", "tue", "wed", "thu", "fri", "sat", "sun") day = list( [int(x) for x in reversed('{0:07b}'.format(self.timer.repeated))]) weekday = 0 if self.timer.repeated: # repeated type = "repeated" if (self.timer.repeated == 31): # Mon-Fri repeated = "weekdays" elif (self.timer.repeated == 127): # daily repeated = "daily" else: repeated = "user" if day.count(1) == 1: repeated = "weekly" weekday = day.index(1) else: # once type = "once" repeated = None weekday = int(strftime("%u", localtime(self.timer.begin))) - 1 day[weekday] = 1 self.timerentry_fallback = ConfigYesNo( default=self.timer.external_prev or config.usage.remote_fallback_external_timer.value and config.usage. remote_fallback.value and not nimmanager.somethingConnected()) self.timerentry_justplay = ConfigSelection( choices=[("zap", _("zap")), ("record", _("record")), ("zap+record", _("zap and record"))], default={ 0: "record", 1: "zap", 2: "zap+record" }[justplay + 2 * always_zap]) if SystemInfo["DeepstandbySupport"]: shutdownString = _("go to deep standby") choicelist = [("always", _("always")), ("from_standby", _("only from standby")), ("from_deep_standby", _("only from deep standby")), ("never", _("never"))] else: shutdownString = _("shut down") choicelist = [("always", _("always")), ("never", _("never"))] self.timerentry_zapwakeup = ConfigSelection(choices=choicelist, default=zap_wakeup) self.timerentry_afterevent = ConfigSelection(choices=[ ("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", shutdownString), ("auto", _("auto")) ], default=afterevent) self.timerentry_recordingtype = ConfigSelection(choices=[ ("normal", _("normal")), ("descrambled+ecm", _("descramble and record ecm")), ("scrambled+ecm", _("don't descramble, record ecm")) ], default=recordingtype) self.timerentry_type = ConfigSelection(choices=[("once", _("once")), ("repeated", _("repeated"))], default=type) self.timerentry_name = ConfigText(default=self.timer.name, visible_width=50, fixed_size=False) self.timerentry_description = ConfigText( default=self.timer.description, visible_width=50, fixed_size=False) self.timerentry_tags = self.timer.tags[:] self.timerentry_tagsset = ConfigSelection(choices=[ not self.timerentry_tags and "None" or " ".join(self.timerentry_tags) ]) self.timerentry_repeated = ConfigSelection( default=repeated, choices=[("weekly", _("weekly")), ("daily", _("daily")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))]) self.timerentry_renamerepeat = ConfigYesNo(default=rename_repeat) self.timerentry_pipzap = ConfigYesNo(default=pipzap) self.timerentry_conflictdetection = ConfigYesNo( default=conflict_detection) self.timerentry_date = ConfigDateTime(default=self.timer.begin, formatstring=_("%d.%B %Y"), increment=86400) self.timerentry_starttime = ConfigClock(default=self.timer.begin) self.timerentry_endtime = ConfigClock(default=self.timer.end) self.timerentry_showendtime = ConfigSelection( default=((self.timer.end - self.timer.begin) > 4), choices=[(True, _("yes")), (False, _("no"))]) default = not self.timer.external_prev and self.timer.dirname or defaultMoviePath( ) tmp = config.movielist.videodirs.value if default not in tmp: tmp.append(default) self.timerentry_dirname = ConfigSelection(default=default, choices=tmp) default = self.timer.external_prev and self.timer.dirname or currlocation if default not in locations: locations.append(default) self.timerentry_fallbackdirname = ConfigSelection(default=default, choices=locations) self.timerentry_repeatedbegindate = ConfigDateTime( default=self.timer.repeatedbegindate, formatstring=_("%d.%B %Y"), increment=86400) self.timerentry_weekday = ConfigSelection( default=weekday_table[weekday], choices=[("mon", _("Monday")), ("tue", _("Tuesday")), ("wed", _("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))]) self.timerentry_day = ConfigSubList() for x in (0, 1, 2, 3, 4, 5, 6): self.timerentry_day.append(ConfigYesNo(default=day[x])) # FIXME some service-chooser needed here servicename = "N/A" try: # no current service available? servicename = str(self.timer.service_ref.getServiceName()) except: pass self.timerentry_service_ref = self.timer.service_ref self.timerentry_service = ConfigSelection([servicename]) self.createSetup("config") def createSetup(self, widget): self.list = [] self.entryFallbackTimer = getConfigListEntry(_("Fallback Timer"), self.timerentry_fallback) if config.usage.remote_fallback_external_timer.value and config.usage.remote_fallback.value and not hasattr( self, "timerentry_remote"): self.list.append(self.entryFallbackTimer) self.entryName = getConfigListEntry(_("Name"), self.timerentry_name) self.list.append(self.entryName) self.entryDescription = getConfigListEntry(_("Description"), self.timerentry_description) self.list.append(self.entryDescription) self.timerJustplayEntry = getConfigListEntry(_("Timer type"), self.timerentry_justplay) self.list.append(self.timerJustplayEntry) self.timerTypeEntry = getConfigListEntry(_("Repeat type"), self.timerentry_type) self.list.append(self.timerTypeEntry) if self.timerentry_type.value == "once": self.frequencyEntry = None else: # repeated self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated) self.list.append(self.frequencyEntry) self.repeatedbegindateEntry = getConfigListEntry( _("Starting on"), self.timerentry_repeatedbegindate) self.list.append(self.repeatedbegindateEntry) if self.timerentry_repeated.value == "daily": pass if self.timerentry_repeated.value == "weekdays": pass if self.timerentry_repeated.value == "weekly": self.list.append( getConfigListEntry(_("Weekday"), self.timerentry_weekday)) if self.timerentry_repeated.value == "user": self.list.append( getConfigListEntry(_("Monday"), self.timerentry_day[0])) self.list.append( getConfigListEntry(_("Tuesday"), self.timerentry_day[1])) self.list.append( getConfigListEntry(_("Wednesday"), self.timerentry_day[2])) self.list.append( getConfigListEntry(_("Thursday"), self.timerentry_day[3])) self.list.append( getConfigListEntry(_("Friday"), self.timerentry_day[4])) self.list.append( getConfigListEntry(_("Saturday"), self.timerentry_day[5])) self.list.append( getConfigListEntry(_("Sunday"), self.timerentry_day[6])) if self.timerentry_justplay.value != "zap": self.list.append( getConfigListEntry( _("Rename name and description for new events"), self.timerentry_renamerepeat)) self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date) if self.timerentry_type.value == "once": self.list.append(self.entryDate) self.entryStartTime = getConfigListEntry(_("Start time"), self.timerentry_starttime) self.list.append(self.entryStartTime) self.entryShowEndTime = getConfigListEntry(_("Set end time"), self.timerentry_showendtime) self.entryZapWakeup = getConfigListEntry( _("Wakeup receiver for start timer"), self.timerentry_zapwakeup) if self.timerentry_justplay.value == "zap": self.list.append(self.entryZapWakeup) if SystemInfo["PIPAvailable"]: self.list.append( getConfigListEntry(_("Use as PiP if possible"), self.timerentry_pipzap)) self.list.append(self.entryShowEndTime) self["key_blue"].setText(_("Wakeup type")) else: self["key_blue"].setText("") self.entryEndTime = getConfigListEntry(_("End time"), self.timerentry_endtime) if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value: self.list.append(self.entryEndTime) self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service) self.list.append(self.channelEntry) self.dirname = getConfigListEntry( _("Location"), self.timerentry_fallbackdirname ) if self.timerentry_fallback.value and self.timerentry_fallbackdirname.value else getConfigListEntry( _("Location"), self.timerentry_dirname) if config.usage.setup_level.index >= 2 and ( self.timerentry_fallback.value and self.timerentry_fallbackdirname.value or self.timerentry_dirname.value): # expert+ self.list.append(self.dirname) self.conflictDetectionEntry = getConfigListEntry( _("Enable timer conflict detection"), self.timerentry_conflictdetection) if not self.timerentry_fallback.value: self.list.append(self.conflictDetectionEntry) self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset) if self.timerentry_justplay.value != "zap" and not self.timerentry_fallback.value: if getPreferredTagEditor(): self.list.append(self.tagsSet) self.list.append( getConfigListEntry(_("After event"), self.timerentry_afterevent)) self.list.append( getConfigListEntry(_("Recording type"), self.timerentry_recordingtype)) self[widget].list = self.list self[widget].l.setList(self.list) def newConfig(self): print "[TimerEdit] newConfig", self["config"].getCurrent() if self["config"].getCurrent() in (self.timerTypeEntry, self.timerJustplayEntry, self.frequencyEntry, self.entryShowEndTime, self.entryFallbackTimer): self.createSetup("config") def keyLeft(self): cur = self["config"].getCurrent() if cur in (self.channelEntry, self.tagsSet): self.keySelect() elif cur in (self.entryName, self.entryDescription): self.renameEntry() else: ConfigListScreen.keyLeft(self) self.newConfig() def keyRight(self): cur = self["config"].getCurrent() if cur in (self.channelEntry, self.tagsSet): self.keySelect() elif cur in (self.entryName, self.entryDescription): self.renameEntry() else: ConfigListScreen.keyRight(self) self.newConfig() def renameEntry(self): cur = self["config"].getCurrent() if cur == self.entryName: title_text = _("Please enter new name:") old_text = self.timerentry_name.value else: title_text = _("Please enter new description:") old_text = self.timerentry_description.value self.session.openWithCallback(self.renameEntryCallback, VirtualKeyBoard, title=title_text, text=old_text) def renameEntryCallback(self, answer): if answer: cur = self["config"].getCurrent() if cur == self.entryName: self.timerentry_name.value = answer self["config"].invalidate(self.entryName) else: self.timerentry_description.value = answer self["config"].invalidate(self.entryDescription) def handleKeyFileCallback(self, answer): if self["config"].getCurrent() in (self.channelEntry, self.tagsSet): self.keySelect() else: ConfigListScreen.handleKeyFileCallback(self, answer) self.newConfig() def openMovieLocationBox(self, answer=""): self.session.openWithCallback( self.pathSelected, MovieLocationBox, _("Select target folder"), self.timerentry_dirname.value, filename=answer, minFree=100 # We require at least 100MB free space ) def keySelect(self): cur = self["config"].getCurrent() if cur == self.channelEntry: self.session.openWithCallback( self.finishedChannelSelection, ChannelSelection.SimpleChannelSelection, _("Select channel to record from"), currentBouquet=True) elif config.usage.setup_level.index >= 2 and cur == self.dirname: menu = [(_("Open select location"), "empty")] if self.timerentry_type.value == "repeated" and self.timerentry_name.value: menu.append( (_("Open select location as timer name"), "timername")) if len(menu) == 1: self.openMovieLocationBox() elif len(menu) == 2: text = _("Select action") def selectAction(choice): if choice: if choice[1] == "timername": self.openMovieLocationBox( self.timerentry_name.value) elif choice[1] == "empty": self.openMovieLocationBox() self.session.openWithCallback(selectAction, ChoiceBox, title=text, list=menu) elif getPreferredTagEditor() and cur == self.tagsSet: self.session.openWithCallback(self.tagEditFinished, getPreferredTagEditor(), self.timerentry_tags) else: self.keyGo() def finishedChannelSelection(self, *args): if args: self.timerentry_service_ref = ServiceReference(args[0]) self.timerentry_service.setCurrentText( self.timerentry_service_ref.getServiceName()) self["config"].invalidate(self.channelEntry) def getTimestamp(self, date, mytime): d = localtime(date) dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1]) return int(mktime(dt.timetuple())) def getBeginEnd(self): date = self.timerentry_date.value endtime = self.timerentry_endtime.value starttime = self.timerentry_starttime.value begin = self.getTimestamp(date, starttime) end = self.getTimestamp(date, endtime) # if the endtime is less than the starttime, add 1 day. if end < begin: end += 86400 return begin, end def selectChannelSelector(self, *args): self.session.openWithCallback(self.finishedChannelSelectionCorrection, ChannelSelection.SimpleChannelSelection, _("Select channel to record from")) def finishedChannelSelectionCorrection(self, *args): if args: self.finishedChannelSelection(*args) self.keyGo() def RemoteSubserviceSelected(self, service): if service: # ouch, this hurts a little service_ref = timerentry_service_ref self.timerentry_service_ref = ServiceReference(service[1]) eit = self.timer.eit self.timer.eit = None self.keyGo() self.timerentry_service_ref = service_ref self.timer.eit = eit def keyGo(self, result=None): if not self.timerentry_service_ref.isRecordable(): self.session.openWithCallback( self.selectChannelSelector, MessageBox, _("You didn't select a channel to record from."), MessageBox.TYPE_ERROR) else: self.timer.external = self.timerentry_fallback.value self.timer.name = self.timerentry_name.value self.timer.description = self.timerentry_description.value self.timer.justplay = self.timerentry_justplay.value == "zap" self.timer.always_zap = self.timerentry_justplay.value == "zap+record" self.timer.zap_wakeup = self.timerentry_zapwakeup.value self.timer.pipzap = self.timerentry_pipzap.value self.timer.rename_repeat = self.timerentry_renamerepeat.value self.timer.conflict_detection = self.timerentry_conflictdetection.value if self.timerentry_justplay.value == "zap": if not self.timerentry_showendtime.value: self.timerentry_endtime.value = self.timerentry_starttime.value self.timerentry_afterevent.value = "nothing" self.timer.resetRepeated() self.timer.afterEvent = { "nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY, "auto": AFTEREVENT.AUTO }[self.timerentry_afterevent.value] self.timer.descramble = { "normal": True, "descrambled+ecm": True, "scrambled+ecm": False, }[self.timerentry_recordingtype.value] self.timer.record_ecm = { "normal": False, "descrambled+ecm": True, "scrambled+ecm": True, }[self.timerentry_recordingtype.value] self.timer.service_ref = self.timerentry_service_ref self.timer.tags = self.timerentry_tags if self.timerentry_fallback.value: self.timer.dirname = self.timerentry_fallbackdirname.value else: if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath( ): self.timer.dirname = self.timerentry_dirname.value config.movielist.last_timer_videodir.value = self.timer.dirname config.movielist.last_timer_videodir.save() if self.timerentry_type.value == "once": self.timer.begin, self.timer.end = self.getBeginEnd() if self.timerentry_type.value == "repeated": if self.timerentry_repeated.value == "daily": for x in (0, 1, 2, 3, 4, 5, 6): self.timer.setRepeated(x) if self.timerentry_repeated.value == "weekly": self.timer.setRepeated(self.timerentry_weekday.index) if self.timerentry_repeated.value == "weekdays": for x in (0, 1, 2, 3, 4): self.timer.setRepeated(x) if self.timerentry_repeated.value == "user": for x in (0, 1, 2, 3, 4, 5, 6): if self.timerentry_day[x].value: self.timer.setRepeated(x) self.timer.repeatedbegindate = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value) if self.timer.repeated: self.timer.begin = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value) self.timer.end = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value) else: self.timer.begin = self.getTimestamp( time(), self.timerentry_starttime.value) self.timer.end = self.getTimestamp( time(), self.timerentry_endtime.value) # when a timer end is set before the start, add 1 day if self.timer.end < self.timer.begin: self.timer.end += 86400 if self.timer.eit is not None: event = eEPGCache.getInstance().lookupEventId( self.timer.service_ref.ref, self.timer.eit) if event: n = event.getNumOfLinkageServices() if n > 1: tlist = [] ref = self.session.nav.getCurrentlyPlayingServiceOrGroup( ) parent = self.timer.service_ref.ref selection = 0 for x in range(n): i = event.getLinkageService(parent, x) if i.toString() == ref.toString(): selection = x tlist.append((i.getName(), i)) self.session.openWithCallback( self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list=tlist, selection=selection) return elif n > 0: parent = self.timer.service_ref.ref self.timer.service_ref = ServiceReference( event.getLinkageService(parent, 0)) self.saveTimer() self.close((True, self.timer)) def changeTimerType(self): self.timerentry_justplay.selectNext() self.timerJustplayEntry = getConfigListEntry(_("Timer type"), self.timerentry_justplay) self["config"].invalidate(self.timerJustplayEntry) self.createSetup("config") def changeZapWakeupType(self): if self.timerentry_justplay.value == "zap": self.timerentry_zapwakeup.selectNext() self["config"].invalidate(self.entryZapWakeup) def incrementStart(self): self.timerentry_starttime.increment() self["config"].invalidate(self.entryStartTime) if self.timerentry_type.value == "once" and self.timerentry_starttime.value == [ 0, 0 ]: self.timerentry_date.value += 86400 self["config"].invalidate(self.entryDate) def decrementStart(self): self.timerentry_starttime.decrement() self["config"].invalidate(self.entryStartTime) if self.timerentry_type.value == "once" and self.timerentry_starttime.value == [ 23, 59 ]: self.timerentry_date.value -= 86400 self["config"].invalidate(self.entryDate) def incrementEnd(self): if self.entryEndTime is not None: self.timerentry_endtime.increment() self["config"].invalidate(self.entryEndTime) def decrementEnd(self): if self.entryEndTime is not None: self.timerentry_endtime.decrement() self["config"].invalidate(self.entryEndTime) def subserviceSelected(self, service): if not service is None: self.timer.service_ref = ServiceReference(service[1]) self.saveTimer() self.close((True, self.timer)) def saveTimer(self): self.session.nav.RecordTimer.saveTimer() def keyCancel(self, answer=True, message=""): if answer: self.close((False, )) else: print "[TimerEntry] keyCancel something went wrong with fallback timer", message def pathSelected(self, res): if res is not None: if config.movielist.videodirs.value != self.timerentry_dirname.choices: self.timerentry_dirname.setChoices( config.movielist.videodirs.value, default=res) self.timerentry_dirname.value = res def tagEditFinished(self, ret): if ret is not None: self.timerentry_tags = ret self.timerentry_tagsset.setChoices( [not ret and "None" or " ".join(ret)]) self["config"].invalidate(self.tagsSet)
def information(self): if self.type == TYPE_SERVICE_INFO: if self.session.nav.getCurrentlyPlayingServiceOrGroup(): name = ServiceReference( self.session.nav.getCurrentlyPlayingServiceReference( )).getServiceName() refstr = self.session.nav.getCurrentlyPlayingServiceReference( ).toString() else: name = _("N/A") refstr = _("N/A") aspect = "-" videocodec = "-" resolution = "-" if self.info: videocodec = ( "MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM", "-")[self.info and self.info.getInfo(iServiceInformation.sVideoType)] width = self.info.getInfo(iServiceInformation.sVideoWidth) height = self.info.getInfo(iServiceInformation.sVideoHeight) if width > 0 and height > 0: resolution = "%dx%d" % (width, height) resolution += ("i", "p", "")[self.info.getInfo( iServiceInformation.sProgressive)] resolution += str( (self.info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000) aspect = self.getServiceInfoValue( iServiceInformation.sAspect) if aspect in (1, 2, 5, 6, 9, 0xA, 0xD, 0xE): aspect = "4:3" else: aspect = "16:9" Labels = ((_("Name"), name, TYPE_TEXT), (_("Provider"), self.getServiceInfoValue(iServiceInformation.sProvider), TYPE_TEXT), (_("Videoformat"), aspect, TYPE_TEXT), (_("Videosize"), resolution, TYPE_TEXT), (_("Videocodec"), videocodec, TYPE_TEXT), (_("Namespace"), self.getServiceInfoValue( iServiceInformation.sNamespace), TYPE_VALUE_HEX, 8), (_("Service reference"), refstr, TYPE_TEXT)) self.fillList(Labels) else: if self.transponder_info: tp_info = ConvertToHumanReadable(self.transponder_info) conv = { "tuner_type": _("Transponder type"), "system": _("System"), "modulation": _("Modulation"), "orbital_position": _("Orbital position"), "frequency": _("Frequency"), "symbol_rate": _("Symbol rate"), "bandwidth": _("Bandwidth"), "polarization": _("Polarization"), "inversion": _("Inversion"), "pilot": _("Pilot"), "rolloff": _("Roll-off"), "fec_inner": _("FEC"), "code_rate_lp": _("Coderate LP"), "code_rate_hp": _("Coderate HP"), "constellation": _("Constellation"), "transmission_mode": _("Transmission mode"), "guard_interval": _("Guard interval"), "hierarchy_information": _("Hierarchy information") } Labels = [(conv[i], tp_info[i], i == "orbital_position" and TYPE_VALUE_ORBIT_DEC or TYPE_VALUE_DEC) for i in tp_info.keys() if i in conv] self.fillList(Labels)
class TimerEntry(Screen, ConfigListScreen): def __init__(self, session, timer): Screen.__init__(self, session) self.setup_title = _("Timer entry") self.timer = timer self.entryDate = None self.entryService = None self["HelpWindow"] = Pixmap() self["HelpWindow"].hide() self["VKeyIcon"] = Boolean(False) self["locationdescription"] = Label("") self["locationfreespace"] = Label("") self["description"] = Label("") self["oktext"] = Label(_("OK")) self["canceltext"] = Label(_("Cancel")) self["ok"] = Pixmap() self["cancel"] = Pixmap() self.createConfig() self["actions"] = NumberActionMap(["SetupActions", "GlobalActions", "PiPSetupActions", "ColorActions"], { "ok": self.keySelect, "save": self.keyGo, "cancel": self.keyCancel, "volumeUp": self.incrementStart, "volumeDown": self.decrementStart, "size+": self.incrementEnd, "size-": self.decrementEnd, }, -2) self["VirtualKB"] = ActionMap(["VirtualKeyboardActions"], { "showVirtualKeyboard": self.KeyText, }, -2) self["VirtualKB"].setEnabled(False) self.onChangedEntry = [] self.list = [] ConfigListScreen.__init__(self, self.list, session=session) self.createSetup("config") self.onLayoutFinish.append(self.layoutFinished) if not self.selectionChanged in self["config"].onSelectionChanged: self["config"].onSelectionChanged.append(self.selectionChanged) self.selectionChanged() def createConfig(self): justplay = self.timer.justplay always_zap = self.timer.always_zap rename_repeat = self.timer.rename_repeat afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby", AFTEREVENT.AUTO: "auto" }[self.timer.afterEvent] if self.timer.record_ecm and self.timer.descramble: recordingtype = "descrambled+ecm" elif self.timer.record_ecm: recordingtype = "scrambled+ecm" elif self.timer.descramble: recordingtype = "normal" weekday_table = ("mon", "tue", "wed", "thu", "fri", "sat", "sun") # calculate default values days = [] weekday = 0 for x in (0, 1, 2, 3, 4, 5, 6): days.append(False) if self.timer.repeated: # repeated type = "repeated" if self.timer.repeated == 31: # Mon-Fri repeated = "weekdays" elif self.timer.repeated == 127: # daily repeated = "daily" else: flags = self.timer.repeated repeated = "user" count = 0 for x in (0, 1, 2, 3, 4, 5, 6): if flags == 1: # weekly # print "Set to weekday " + str(x) weekday = x if flags & 1 == 1: # set user defined flags days[x] = True count += 1 else: days[x] = False flags >>= 1 if count == 1: repeated = "weekly" else: # once type = "once" repeated = None weekday = int(strftime("%u", localtime(self.timer.begin))) - 1 days[weekday] = True self.timerentry_justplay = ConfigSelection(default={ 0: "record", 1: "zap", 2: "zap+record" }[justplay + 2 * always_zap], choices=[ ("zap", _("Zap")), ("record", _("Record")), ("zap+record", _("Zap and record")) ]) self.timertyp = self.timerentry_justplay.value if BoxInfo.getItem("DeepstandbySupport"): shutdownString = _("Go to deep standby") else: shutdownString = _("Shut down") self.timerentry_afterevent = ConfigSelection(choices=[("nothing", _("Do nothing")), ("standby", _("Go to standby")), ("deepstandby", shutdownString), ("auto", _("auto"))], default=afterevent) self.timerentry_recordingtype = ConfigSelection(choices=[("normal", _("normal")), ("descrambled+ecm", _("Descramble and record ecm")), ("scrambled+ecm", _("Don't descramble, record ecm"))], default=recordingtype) self.timerentry_type = ConfigSelection(choices=[("once", _("once")), ("repeated", _("repeated"))], default=type) # FIME Do we need these 2 lines? if six.PY3: self.timerentry_name = ConfigText(default=self.timer.name.replace('\x86', '').replace('\x87', ''), visible_width=50, fixed_size=False) self.timerentry_description_replaced = self.timer.description.replace('\x8a', ' ') else: self.timerentry_name = ConfigText(default=self.timer.name.replace('\xc2\x86', '').replace('\xc2\x87', '').encode("utf-8"), visible_width=50, fixed_size=False) self.timerentry_description_replaced = self.timer.description.replace('\xc2\x8a', ' ').encode("utf-8") self.timerentry_description = ConfigText(default=self.timerentry_description_replaced, visible_width=50, fixed_size=False) self.timerentry_tags = self.timer.tags[:] # if no tags found, make name of event default tag set. if not self.timerentry_tags: tagname = self.timer.name.strip() if tagname: tagname = tagname[0].upper() + tagname[1:].replace(" ", "_") self.timerentry_tags.append(tagname) self.timerentry_tagsset = ConfigSelection(choices=[not self.timerentry_tags and "None" or " ".join(self.timerentry_tags)]) self.timerentry_repeated = ConfigSelection(default=repeated, choices=[("weekly", _("weekly")), ("daily", _("daily")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))]) self.timerentry_renamerepeat = ConfigYesNo(default=rename_repeat) self.timerentry_date = ConfigDateTime(default=self.timer.begin, formatstring=config.usage.date.full.value, increment=86400) self.timerentry_starttime = ConfigClock(default=self.timer.begin) self.timerentry_endtime = ConfigClock(default=self.timer.end) self.timerentry_showendtime = ConfigSelection(default=(self.timer.end > self.timer.begin + 3 and self.timer.justplay), choices=[(True, _("Yes")), (False, _("No"))]) default = self.timer.dirname or defaultMoviePath() tmp = config.movielist.videodirs.value if default not in tmp: tmp.append(default) self.timerentry_dirname = ConfigSelection(default=default, choices=tmp) self.timerentry_repeatedbegindate = ConfigDateTime(default=self.timer.repeatedbegindate, formatstring=config.usage.date.full.value, increment=86400) self.timerentry_weekday = ConfigSelection(default=weekday_table[weekday], choices=[("mon", _("Monday")), ("tue", _("Tuesday")), ("wed", _("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))]) self.timerentry_day = ConfigSubList() for x in (0, 1, 2, 3, 4, 5, 6): self.timerentry_day.append(ConfigYesNo(default=days[x])) # FIXME some service-chooser needed here servicename = "N/A" try: # no current service available? servicename = str(self.timer.service_ref.getServiceName()) except: pass self.timerentry_service_ref = self.timer.service_ref self.timerentry_service = ConfigSelection([servicename]) def createSetup(self, widget): if not self.timer in self.session.nav.RecordTimer.timer_list: newtime = None if self.timerentry_justplay.value == 'zap' and self.timertyp != 'zap': newtime = self.getTimestamp(self.timerentry_date.value, self.timerentry_starttime.value) + config.recording.margin_before.value * 60 newbegin = localtime(newtime) elif self.timerentry_justplay.value != 'zap' and self.timertyp == 'zap': newtime = self.getTimestamp(self.timerentry_date.value, self.timerentry_starttime.value) - config.recording.margin_before.value * 60 newbegin = localtime(newtime) if newtime: self.timerentry_date.value = newtime self.timerentry_starttime.value = [newbegin.tm_hour, newbegin.tm_min] self.timertyp = self.timerentry_justplay.value self.list = [] self.timerJustplayEntry = getConfigListEntry(_("Timer type"), self.timerentry_justplay, _("Chose between record and ZAP.")) self.list.append(self.timerJustplayEntry) description = free = "" try: if self.timerentry_justplay.value != "zap": stat = statvfs(self.timerentry_dirname.value) a = float(stat.f_blocks) * stat.f_bsize / 1024 / 1024 / 1024 b = float(stat.f_bavail) * stat.f_bsize / 1024 / 1024 / 1024 c = 100.0 * b / a free = ("%0.f GB (%0.f %s) " + _("free diskspace")) % (b, c, "%") description = _("Current location") except: pass self["locationdescription"].setText(description) self["locationfreespace"].setText(free) self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname, _("Where should the recording be saved?")) if self.timerentry_justplay.value != "zap": if config.usage.setup_level.index >= 2: # expert+ self.list.append(self.dirname) self.entryName = getConfigListEntry(_("Name"), self.timerentry_name, _("Set the name the recording will get.")) self.list.append(self.entryName) self.entryDescription = getConfigListEntry(_("Description"), self.timerentry_description, _("Set the description of the recording.")) self.list.append(self.entryDescription) self.timerTypeEntry = getConfigListEntry(_("Repeat type"), self.timerentry_type, _("A repeating timer or just once?")) self.list.append(self.timerTypeEntry) if self.timerentry_type.value == "once": self.frequencyEntry = None else: # repeated self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated, _("Choose between Daily, Weekly, Weekdays or user defined.")) self.list.append(self.frequencyEntry) self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate, _("Set the date the timer must start.")) self.list.append(self.repeatedbegindateEntry) if self.timerentry_repeated.value == "daily": pass if self.timerentry_repeated.value == "weekdays": pass if self.timerentry_repeated.value == "weekly": self.list.append(getConfigListEntry(_("Weekday"), self.timerentry_weekday)) if self.timerentry_repeated.value == "user": self.list.append(getConfigListEntry(_("Monday"), self.timerentry_day[0])) self.list.append(getConfigListEntry(_("Tuesday"), self.timerentry_day[1])) self.list.append(getConfigListEntry(_("Wednesday"), self.timerentry_day[2])) self.list.append(getConfigListEntry(_("Thursday"), self.timerentry_day[3])) self.list.append(getConfigListEntry(_("Friday"), self.timerentry_day[4])) self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5])) self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6])) if self.timerentry_justplay.value != "zap": self.list.append(getConfigListEntry(_("Rename name and description for new events"), self.timerentry_renamerepeat)) self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date, _("Set the date the timer must start.")) if self.timerentry_type.value == "once": self.list.append(self.entryDate) self.entryStartTime = getConfigListEntry(_("Start time"), self.timerentry_starttime, _("Set the time the timer must start.")) self.list.append(self.entryStartTime) self.entryShowEndTime = getConfigListEntry(_("Set end time"), self.timerentry_showendtime, _("Set the time the timer must stop.")) if self.timerentry_justplay.value == "zap": self.list.append(self.entryShowEndTime) self.entryEndTime = getConfigListEntry(_("End time"), self.timerentry_endtime, _("Set the time the timer must stop.")) if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value: self.list.append(self.entryEndTime) self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service, _("Set the channel for this timer.")) self.list.append(self.channelEntry) if self.timerentry_showendtime.value and self.timerentry_justplay.value == "zap": self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent, _("What action is required on completion of the timer? 'Auto' lets the box return to the state it had when the timer started. 'Do nothing', 'Go to standby' and 'Go to deep standby' do exactly that."))) self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset, _("Choose a tag for easy finding a recording.")) if self.timerentry_justplay.value != "zap": self.list.append(self.tagsSet) self.list.append(getConfigListEntry(_("After Recording"), self.timerentry_afterevent, _("What action is required on completion of the timer? 'Auto' lets the box return to the state it had when the timer started. 'Do nothing', 'Go to standby' and 'Go to deep standby' do exactly that."))) self.list.append(getConfigListEntry(_("Recording type"), self.timerentry_recordingtype, _("Descramble & record ECM' gives the option to descramble afterwards if descrambling on recording failed. 'Don't descramble, record ECM' save a scramble recording that can be descrambled on playback. 'Normal' means descramble the recording and don't record ECM."))) self[widget].list = self.list self[widget].l.setList(self.list) def selectionChanged(self): if self["config"].getCurrent(): if len(self["config"].getCurrent()) > 2 and self["config"].getCurrent()[2]: self["description"].setText(self["config"].getCurrent()[2]) if isinstance(self["config"].getCurrent()[1], ConfigText): if "VKeyIcon" in self: self["VirtualKB"].setEnabled(True) self["VKeyIcon"].boolean = True if "HelpWindow" in self: if self["config"].getCurrent()[1].help_window and self["config"].getCurrent()[1].help_window.instance is not None: helpwindowpos = self["HelpWindow"].getPosition() from enigma import ePoint self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0], helpwindowpos[1])) else: if "VKeyIcon" in self: self["VirtualKB"].setEnabled(False) self["VKeyIcon"].boolean = False else: if "VKeyIcon" in self: self["VirtualKB"].setEnabled(False) self["VKeyIcon"].boolean = False def layoutFinished(self): self.setTitle(_(self.setup_title)) def createSummary(self): return SetupSummary # for summary: def changedEntry(self): for x in self.onChangedEntry: x() def getCurrentEntry(self): return self["config"].getCurrent() and self["config"].getCurrent()[0] or "" def getCurrentValue(self): return self["config"].getCurrent() and str(self["config"].getCurrent()[1].getText()) or "" def newConfig(self): if self["config"].getCurrent() in (self.timerTypeEntry, self.timerJustplayEntry, self.frequencyEntry, self.entryShowEndTime, self.dirname): self.createSetup("config") def KeyText(self): if self['config'].getCurrent()[0] in (_('Name'), _("Description")): self.session.openWithCallback(self.renameEntryCallback, VirtualKeyBoard, title=self["config"].getCurrent()[2], text=self["config"].getCurrent()[1].value, visible_width=50, currPos=0) def keyLeft(self): cur = self["config"].getCurrent() if cur in (self.channelEntry, self.tagsSet): self.keySelect() #elif cur in (self.entryName, self.entryDescription): # self.renameEntry() else: ConfigListScreen.keyLeft(self) self.newConfig() def keyRight(self): cur = self["config"].getCurrent() if cur in (self.channelEntry, self.tagsSet): self.keySelect() #elif cur in (self.entryName, self.entryDescription): # self.renameEntry() else: ConfigListScreen.keyRight(self) self.newConfig() def renameEntry(self): cur = self["config"].getCurrent() if cur == self.entryName: title_text = _("Please enter new name:") old_text = self.timerentry_name.value else: title_text = _("Please enter new description:") old_text = self.timerentry_description.value self.session.openWithCallback(self.renameEntryCallback, VirtualKeyBoard, title=title_text, text=old_text) def renameEntryCallback(self, answer): if answer: if self["config"].getCurrent() == self.entryName: self.timerentry_name.value = answer self["config"].invalidate(self.entryName) else: self.timerentry_description.value = answer self["config"].invalidate(self.entryDescription) def handleKeyFileCallback(self, answer): if self["config"].getCurrent() in (self.channelEntry, self.tagsSet): self.keySelect() else: ConfigListScreen.handleKeyFileCallback(self, answer) self.newConfig() def keySelect(self): cur = self["config"].getCurrent() if cur == self.channelEntry: self.session.openWithCallback( self.finishedChannelSelection, Screens.ChannelSelection.SimpleChannelSelection, _("Select channel to record from"), currentBouquet=True ) elif config.usage.setup_level.index >= 2 and cur == self.dirname: self.session.openWithCallback( self.pathSelected, MovieLocationBox, _("Select target folder"), self.timerentry_dirname.value, minFree=100 # We require at least 100MB free space ) elif cur == self.tagsSet: self.session.openWithCallback( self.tagEditFinished, TagEditor, tags=self.timerentry_tags ) else: self.keyGo() def finishedChannelSelection(self, *args): if args: self.timerentry_service_ref = ServiceReference(args[0]) self.timerentry_service.setCurrentText(self.timerentry_service_ref.getServiceName()) self["config"].invalidate(self.channelEntry) def getTimestamp(self, date, mytime): d = localtime(date) dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1]) return int(mktime(dt.timetuple())) def getBeginEnd(self): date = self.timerentry_date.value endtime = self.timerentry_endtime.value starttime = self.timerentry_starttime.value begin = self.getTimestamp(date, starttime) end = self.getTimestamp(date, endtime) # if the endtime is less than the starttime, add 1 day. if end < begin: end += 86400 # if the timer type is a Zap and no end is set, set duration to 1 second so time is shown in EPG's. if self.timerentry_justplay.value == "zap": if not self.timerentry_showendtime.value: end = begin + 1 return begin, end def selectChannelSelector(self, *args): self.session.openWithCallback( self.finishedChannelSelectionCorrection, Screens.ChannelSelection.SimpleChannelSelection, _("Select channel to record from") ) def finishedChannelSelectionCorrection(self, *args): if args: self.finishedChannelSelection(*args) self.keyGo() def keyGo(self, result=None): if not self.timerentry_service_ref.isRecordable(): self.session.openWithCallback(self.selectChannelSelector, MessageBox, _("You didn't select a channel to record from."), MessageBox.TYPE_ERROR) return self.timer.name = self.timerentry_name.value self.timer.description = self.timerentry_description.value if self.timerentry_description_replaced != self.timerentry_description.value else self.timer.description self.timer.justplay = self.timerentry_justplay.value == "zap" self.timer.always_zap = self.timerentry_justplay.value == "zap+record" self.timer.rename_repeat = self.timerentry_renamerepeat.value if self.timerentry_justplay.value == "zap": if not self.timerentry_showendtime.value: self.timerentry_endtime.value = self.timerentry_starttime.value self.timerentry_afterevent.value = "nothing" if self.timerentry_endtime.value == self.timerentry_starttime.value and self.timerentry_afterevent.value != "nothing": self.timerentry_afterevent.value = "nothing" self.session.open(MessageBox, _("Difference between timer begin and end must be equal or greater than %d minutes.\nEnd Action was disabled !") % 1, MessageBox.TYPE_INFO, timeout=30) self.timer.resetRepeated() self.timer.afterEvent = { "nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY, "auto": AFTEREVENT.AUTO }[self.timerentry_afterevent.value] self.timer.descramble = { "normal": True, "descrambled+ecm": True, "scrambled+ecm": False, }[self.timerentry_recordingtype.value] self.timer.record_ecm = { "normal": False, "descrambled+ecm": True, "scrambled+ecm": True, }[self.timerentry_recordingtype.value] self.timer.service_ref = self.timerentry_service_ref self.timer.tags = self.timerentry_tags if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath(): self.timer.dirname = self.timerentry_dirname.value config.movielist.last_timer_videodir.value = self.timer.dirname config.movielist.last_timer_videodir.save() if self.timerentry_type.value == "once": self.timer.begin, self.timer.end = self.getBeginEnd() if self.timerentry_type.value == "repeated": if self.timerentry_repeated.value == "daily": for x in (0, 1, 2, 3, 4, 5, 6): self.timer.setRepeated(x) if self.timerentry_repeated.value == "weekly": self.timer.setRepeated(self.timerentry_weekday.index) if self.timerentry_repeated.value == "weekdays": for x in (0, 1, 2, 3, 4): self.timer.setRepeated(x) if self.timerentry_repeated.value == "user": for x in (0, 1, 2, 3, 4, 5, 6): if self.timerentry_day[x].value: self.timer.setRepeated(x) self.timer.repeatedbegindate = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value) if self.timer.repeated: self.timer.begin = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value) self.timer.end = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value) else: self.timer.begin = self.getTimestamp(time(), self.timerentry_starttime.value) self.timer.end = self.getTimestamp(time(), self.timerentry_endtime.value) # when a timer end is set before the start, add 1 day if self.timer.end < self.timer.begin: self.timer.end += 86400 if self.timer.eit is not None: event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit) if event: n = event.getNumOfLinkageServices() if n > 1: tlist = [] ref = self.session.nav.getCurrentlyPlayingServiceOrGroup() parent = self.timer.service_ref.ref selection = 0 for x in list(range(n)): i = event.getLinkageService(parent, x) if i.toString() == ref.toString(): selection = x tlist.append((i.getName(), i)) self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list=tlist, selection=selection) return elif n > 0: parent = self.timer.service_ref.ref self.timer.service_ref = ServiceReference(event.getLinkageService(parent, 0)) self.saveTimer() self.close((True, self.timer)) def changeTimerType(self): self.timerentry_justplay.selectNext() self.timerJustplayEntry = getConfigListEntry(_("Timer type"), self.timerentry_justplay) self["config"].invalidate(self.timerJustplayEntry) def incrementStart(self): self.timerentry_starttime.increment() self["config"].invalidate(self.entryStartTime) if self.timerentry_type.value == "once" and self.timerentry_starttime.value == [0, 0]: self.timerentry_date.value += 86400 self["config"].invalidate(self.entryDate) def decrementStart(self): self.timerentry_starttime.decrement() self["config"].invalidate(self.entryStartTime) if self.timerentry_type.value == "once" and self.timerentry_starttime.value == [23, 59]: self.timerentry_date.value -= 86400 self["config"].invalidate(self.entryDate) def incrementEnd(self): if self.entryEndTime is not None: self.timerentry_endtime.increment() self["config"].invalidate(self.entryEndTime) def decrementEnd(self): if self.entryEndTime is not None: self.timerentry_endtime.decrement() self["config"].invalidate(self.entryEndTime) def subserviceSelected(self, service): if not service is None: self.timer.service_ref = ServiceReference(service[1]) self.saveTimer() self.close((True, self.timer)) def saveTimer(self): self.session.nav.RecordTimer.saveTimer() def keyCancel(self): self.close((False,)) def pathSelected(self, res): if res is not None: if config.movielist.videodirs.value != self.timerentry_dirname.choices: self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res) self.timerentry_dirname.value = res self.newConfig() def tagEditFinished(self, ret): if ret is not None: self.timerentry_tags = ret self.timerentry_tagsset.setChoices([not ret and "None" or " ".join(ret)]) self["config"].invalidate(self.tagsSet)
def buildEPGSearchEntry(self, service, eventId, beginTime, duration, EventName): lsw = self.l.getItemSize().width() if self.listSizeWidth != lsw: # recalc size if scrollbar is shown self.recalcEntrySize() r1 = self.weekday_rect r2 = self.datetime_rect r3 = self.orbpos_rect r4 = self.descr_rect if eventId < 0: res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_TEXT, r1.x, r1.y, r4.x + r4.w - r1.x, r1.h, 0, RT_HALIGN_CENTER | RT_VALIGN_CENTER, EventName) ] return res # Pics in right-to-left order pics = [] # Partnerbox if PartnerBoxIconsEnabled: rec2 = beginTime and (isInRemoteTimer(self, beginTime, duration, service)) if rec2: clock_pic_partnerbox = getRemoteClockPixmap( self, service, beginTime, duration, eventId) if clock_pic_partnerbox: pics.append(self.clocks[clock_pic_partnerbox]) clock_pic = self.getPixmapForEntry(service, eventId, beginTime, duration) if clock_pic: pics.append(self.clocks[clock_pic]) if getattr(self, "wasEntryAutoTimer", False) and hasattr( self, "autotimericon"): pics.append(self.autotimericon) # Timer icons for timers set by IceTV (icetv.com.au) if getattr(self, "wasEntryIceTV", False) and hasattr( self, "icetvicon"): pics.append(self.icetvicon) t = localtime(beginTime) serviceref = ServiceReference( service) # for Servicename and orbital position width = r4.x + r4.w if hasattr(self, "showend"): et = localtime(beginTime + duration) if hasattr(config.usage, "time"): split = int(r2.w * 0.55) res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_TEXT, r1.x, r1.y, r1.w, r1.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, strftime(config.usage.date.dayshort.value, t)), (eListboxPythonMultiContent.TYPE_TEXT, r2.x, r2.y, split, r2.h, 0, RT_HALIGN_RIGHT | RT_VALIGN_CENTER, strftime(config.usage.time.short.value + " -", t)), (eListboxPythonMultiContent.TYPE_TEXT, r2.x + split, r2.y, r2.w - split, r2.h, 0, RT_HALIGN_RIGHT | RT_VALIGN_CENTER, strftime(config.usage.time.short.value, et)) ] else: res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_TEXT, r1.x, r1.y, r1.w, r1.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, strftime("%a %d %b", t)), (eListboxPythonMultiContent.TYPE_TEXT, r2.x, r2.y, r2.w, r2.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, "%s ~ %s" % (strftime("%H:%M", t), strftime("%H:%M", et))) ] else: if hasattr(config.usage, "time"): datetime = "%s, %s" % (strftime( config.usage.date.short.value, t), strftime(config.usage.time.short.value, t)) else: datetime = strftime(_("%e/%m, %H:%M"), t) res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_TEXT, r1.x, r1.y, r1.w, r1.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, strftime("%a", t)), (eListboxPythonMultiContent.TYPE_TEXT, r2.x, r2.y, r2.w, r2.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, datetime) ] if r3.w: res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y, r3.w, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, self.getOrbitalPos(serviceref))) picwidth = 0 for pic in pics: if picwidth: picwidth += (self.picx + self.gap) else: picwidth = self.picx + self.posx res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, width - picwidth, (r4.h / 2 - self.posy), self.picx, self.picy, pic)) if picwidth: picwidth += (self.gap * 2) res.append( (eListboxPythonMultiContent.TYPE_TEXT, r4.x, r4.y, r4.w - picwidth, r4.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName)) return res
def buildMovieListEntry(self, serviceref, info, begin, len): if serviceref.flags & eServiceReference.mustDescent: return None width = self.l.getItemSize().width() if len <= 0: #recalc len when not already done cur_idx = self.l.getCurrentSelectionIndex() x = self.list[cur_idx] if config.usage.load_length_of_movies_in_moviellist.value: len = x[1].getLength(x[0]) #recalc the movie length... else: len = 0 #dont recalc movielist to speedup loading the list self.list[cur_idx] = (x[0], x[1], x[2], len) #update entry in list... so next time we don't need to recalc if len > 0: len = "%d:%02d" % (len / 60, len % 60) else: len = "" res = [ None ] txt = info.getName(serviceref) service = ServiceReference(info.getInfoString(serviceref, iServiceInformation.sServiceref)) description = info.getInfoString(serviceref, iServiceInformation.sDescription) tags = info.getInfoString(serviceref, iServiceInformation.sTags) begin_string = "" if begin > 0: t = FuzzyTime(begin) begin_string = t[0] + ", " + t[1] ih = self.itemHeight if self.list_type == MovieList.LISTTYPE_ORIGINAL: fc, sc = self.columnsOriginal[0], self.columnsOriginal[1] ih1 = (ih * 2) / 5 # 75 -> 30 ih2 = (ih * 2) / 3 # 75 -> 50 res.append(MultiContentEntryText(pos=(0, 0), size=(width-fc-2, ih1), font = 0, flags = RT_HALIGN_LEFT, text=txt)) if self.tags: res.append(MultiContentEntryText(pos=(width-fc, 0), size=(fc, ih1), font = 2, flags = RT_HALIGN_RIGHT, text = tags)) if service is not None: res.append(MultiContentEntryText(pos=(sc, ih2), size=(sc, ih2-ih1), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName())) else: if service is not None: res.append(MultiContentEntryText(pos=(width-fc, 0), size=(fc, ih1), font = 2, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) res.append(MultiContentEntryText(pos=(0, ih1), size=(width, ih2-ih1), font=1, flags=RT_HALIGN_LEFT, text=description)) res.append(MultiContentEntryText(pos=(0, ih2), size=(sc, ih2-ih1), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) res.append(MultiContentEntryText(pos=(width-sc, ih2), size=(sc-2, ih2-ih1), font=1, flags=RT_HALIGN_RIGHT, text=len)) elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION: ih1 = ((ih * 8) + 14) / 15 # 37 -> 20, round up fc, sc, lc = self.columnsCompactDescription[0], self.columnsCompactDescription[1], self.columnsCompactDescription[2] res.append(MultiContentEntryText(pos=(0, 0), size=(width-fc, ih1), font = 0, flags = RT_HALIGN_LEFT, text = txt)) res.append(MultiContentEntryText(pos=(0, ih1), size=(width-sc-lc, ih-ih1), font=1, flags=RT_HALIGN_LEFT, text=description)) res.append(MultiContentEntryText(pos=(width-fc, 6), size=(fc, ih1), font=1, flags=RT_HALIGN_RIGHT, text=begin_string)) if service is not None: res.append(MultiContentEntryText(pos=(width-sc-lc, ih1), size=(sc, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) res.append(MultiContentEntryText(pos=(width-lc, ih1), size=(lc, ih1), font=1, flags=RT_HALIGN_RIGHT, text=len)) elif self.list_type == MovieList.LISTTYPE_COMPACT: ih1 = ((ih * 8) + 14) / 15 # 37 -> 20, round up lc, col = self.compactColumn[0], self.compactColumn[1] res.append(MultiContentEntryText(pos=(0, 0), size=(width-lc-2, ih1), font = 0, flags = RT_HALIGN_LEFT, text = txt)) if self.tags: res.append(MultiContentEntryText(pos=(width-col, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = tags)) if service is not None: res.append(MultiContentEntryText(pos=(col, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName())) else: if service is not None: res.append(MultiContentEntryText(pos=(width-col, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) res.append(MultiContentEntryText(pos=(0, ih1), size=(col, ih-ih1), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) res.append(MultiContentEntryText(pos=(width-lc, 0), size=(lc, ih1), font=0, flags=RT_HALIGN_RIGHT, text=len)) else: assert(self.list_type == MovieList.LISTTYPE_MINIMAL) if self.descr_state == MovieList.SHOW_DESCRIPTION: dateSize = ih * 145 / 20 # 20 -> 145 res.append(MultiContentEntryText(pos=(0, 0), size=(width-dateSize, ih), font = 0, flags = RT_HALIGN_LEFT, text = txt)) res.append(MultiContentEntryText(pos=(width-dateSize, 4), size=(dateSize, ih), font=1, flags=RT_HALIGN_RIGHT, text=begin_string)) else: lenSize = ih * 75 / 20 # 20 -> 75 res.append(MultiContentEntryText(pos=(0, 0), size=(width-lenSize-2, ih), font = 0, flags = RT_HALIGN_LEFT, text = txt)) res.append(MultiContentEntryText(pos=(width-lenSize, 0), size=(lenSize, ih), font=0, flags=RT_HALIGN_RIGHT, text=len)) return res
def isServicePlayable(self, ref, callback, session=None): self.session = session if self.isProtected(ref): if self.sessionPinCached: return True self.callback = callback service = ref.toCompareString() 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 __init__(self, session, service, zapFunc=None, eventid=None, bouquetChangeCB=None, serviceChangeCB=None, parent=None): Screen.__init__(self, session) self.bouquetChangeCB = bouquetChangeCB self.serviceChangeCB = serviceChangeCB self.ask_time = -1 #now self["key_red"] = StaticText("") self.closeRecursive = False self.saved_title = None self["Service"] = ServiceEvent() self["Event"] = Event() self.session = session self.Console = Console() if isinstance(service, str) and eventid is not None: self.type = EPG_TYPE_SIMILAR self.setTitle(_("Similar EPG")) self["key_yellow"] = StaticText() self["key_blue"] = StaticText() self["key_red"] = StaticText() self.currentService = service self.eventid = eventid self.zapFunc = None elif isinstance(service, eServiceReference) or isinstance( service, str): self.setTitle(_("Single EPG")) self.type = EPG_TYPE_SINGLE self["key_yellow"] = StaticText() self["key_blue"] = StaticText(_("Select Channel")) self.currentService = ServiceReference(service) self.zapFunc = zapFunc self.sort_type = 0 self.setSortDescription() else: self.setTitle(_("Multi EPG")) self.skinName = "EPGSelectionMulti" self.type = EPG_TYPE_MULTI if self.bouquetChangeCB == StaticText: self["key_yellow"] = StaticText( pgettext("button label, 'previous screen'", "Prev")) self["key_blue"] = StaticText( pgettext("button label, 'next screen'", "Next")) else: self["key_yellow"] = Button( pgettext("button label, 'previous screen'", "Prev")) self["key_blue"] = Button( pgettext("button label, 'next screen'", "Next")) self["now_button"] = Pixmap() self["next_button"] = Pixmap() self["more_button"] = Pixmap() self["now_button_sel"] = Pixmap() self["next_button_sel"] = Pixmap() self["more_button_sel"] = Pixmap() self["now_text"] = Label() self["next_text"] = Label() self["more_text"] = Label() self["date"] = Label() self.services = service self.zapFunc = zapFunc self.parent = parent if self.bouquetChangeCB == StaticText: self["key_green"] = StaticText(_("Add timer")) else: self["key_green"] = Button(_("Add timer")) self.key_green_choice = self.ADD_TIMER self.key_red_choice = self.EMPTY self["list"] = EPGList(type=self.type, selChangedCB=self.onSelectionChanged, timer=session.nav.RecordTimer) self["actions"] = ActionMap( ["EPGSelectActions", "OkCancelActions"], { "cancel": self.closeScreen, "ok": self.eventSelected, "timerAdd": self.timerAdd, "yellow": self.yellowButtonPressed, "blue": self.blueButtonPressed, "info": self.infoKeyPressed, "menu": self.furtherOptions, "nextBouquet": self.nextBouquet, # just used in multi epg yet "prevBouquet": self.prevBouquet, # just used in multi epg yet "nextService": self.nextService, # just used in single epg yet "prevService": self.prevService, # just used in single epg yet "preview": self.eventPreview, }) self['colouractions'] = HelpableActionMap( self, 'ColorActions', {"red": (self.GoToTmbd, _("Search event in TMBD"))}) self.isTMBD = fileExists( "/usr/lib/enigma2/python/Plugins/Extensions/TMBD/plugin.pyo") if self.isTMBD: self["key_red"] = Button(_("Search TMBD")) self.select = True if not self.isTMBD: self["key_red"] = Button(_("TMBD Not Installed")) self.select = False try: from Plugins.Extensions.YTTrailer.plugin import baseEPGSelection__init__ description = _("Search yt-trailer for event") except ImportError as ie: pass else: if baseEPGSelection__init__ is not None: self["trailerActions"] = ActionMap( ["InfobarActions", "InfobarTeletextActions"], { "showTv": self.showTrailer, "showRadio": self.showTrailerList, "startTeletext": self.showConfig }) self["actions"].csel = self if parent and hasattr(parent, "fallbackTimer"): self.fallbackTimer = parent.fallbackTimer self.onLayoutFinish.append(self.onCreate) else: self.fallbackTimer = FallbackTimerList(self, self.onCreate)
def subserviceSelected(self, service): if not service is None: self.timer.service_ref = ServiceReference(service[1]) self.saveTimer() self.close((True, self.timer))
def __init__(self, session, service, zapFunc=None, eventid=None, bouquetChangeCB=None, serviceChangeCB=None, parent=None): Screen.__init__(self, session) self.bouquetChangeCB = bouquetChangeCB self.serviceChangeCB = serviceChangeCB self.ask_time = -1 #now self["key_red"] = Button("") self.closeRecursive = False self.saved_title = None self["Service"] = ServiceEvent() self["Event"] = Event() self.session = session if isinstance(service, str) and eventid != None: self.type = EPG_TYPE_SIMILAR self.setTitle(_("Similar EPG")) self["key_yellow"] = Button() self["key_blue"] = Button() self["key_red"] = Button() self.currentService = service self.eventid = eventid self.zapFunc = None elif isinstance(service, eServiceReference) or isinstance( service, str): self.setTitle(_("Single EPG")) self.type = EPG_TYPE_SINGLE self["key_yellow"] = Button() self["key_blue"] = Button(_("Select Channel")) self.currentService = ServiceReference(service) self.zapFunc = zapFunc self.sort_type = 0 self.setSortDescription() else: self.setTitle(_("Multi EPG")) self.skinName = "EPGSelectionMulti" self.type = EPG_TYPE_MULTI self["key_yellow"] = Button( pgettext("button label, 'previous screen'", "Prev")) self["key_blue"] = Button( pgettext("button label, 'next screen'", "Next")) self["now_button"] = Pixmap() self["next_button"] = Pixmap() self["more_button"] = Pixmap() self["now_button_sel"] = Pixmap() self["next_button_sel"] = Pixmap() self["more_button_sel"] = Pixmap() self["now_text"] = Label() self["next_text"] = Label() self["more_text"] = Label() self["date"] = Label() self.services = service self.zapFunc = zapFunc self.parent = parent self["key_green"] = Button(_("Add timer")) self.key_green_choice = self.ADD_TIMER self.key_red_choice = self.EMPTY self["list"] = EPGList(type=self.type, selChangedCB=self.onSelectionChanged, timer=session.nav.RecordTimer) self["actions"] = ActionMap( ["EPGSelectActions", "OkCancelActions"], { "cancel": self.closeScreen, "ok": self.eventSelected, "timerAdd": self.timerAdd, "yellow": self.yellowButtonPressed, "blue": self.blueButtonPressed, "info": self.infoKeyPressed, "red": self.zapTo, "menu": self.furtherOptions, "nextBouquet": self.nextBouquet, # just used in multi epg yet "prevBouquet": self.prevBouquet, # just used in multi epg yet "nextService": self.nextService, # just used in single epg yet "prevService": self.prevService, # just used in single epg yet "preview": self.eventPreview, }) self["actions"].csel = self self.onLayoutFinish.append(self.onCreate)
def updateBP(self): name = 'N/A' provider = 'N/A' aspect = 'N/A' videosize = 'N/A' myserviceinfo = '' myservice = self.session.nav.getCurrentService() if myservice is not None: myserviceinfo = myservice.info() if self.session.nav.getCurrentlyPlayingServiceReference(): name = ServiceReference( self.session.nav.getCurrentlyPlayingServiceReference( )).getServiceName() provider = self.getServiceInfoValue(iServiceInformation.sProvider, myserviceinfo) aspect = self.getServiceInfoValue(iServiceInformation.sAspect, myserviceinfo) if aspect in (1, 2, 5, 6, 9, 10, 13, 14): aspect = '4:3' else: aspect = '16:9' if myserviceinfo: width = myserviceinfo and myserviceinfo.getInfo( iServiceInformation.sVideoWidth) or -1 height = myserviceinfo and myserviceinfo.getInfo( iServiceInformation.sVideoHeight) or -1 if width != -1 and height != -1: videosize = '%dx%d' % (width, height) self['Ilab1'].setText(_('Name: ') + name) self['Ilab2'].setText(_('Provider: ') + provider) self['Ilab3'].setText(_('Aspect Ratio: ') + aspect) self['Ilab4'].setText(_('Videosize: ') + videosize) self.currentcam = '/usr/camscript/Ncam_Ci.sh' self.defaultcam = '/usr/camscript/Ncam_Ci.sh' f = open('/etc/BhCamConf', 'r') for line in f.readlines(): parts = line.strip().split('|') if parts[0] == 'delcurrent': self.currentcam = parts[1] elif parts[0] == 'deldefault': self.defaultcam = parts[1] f.close() defCamname = 'Common Interface' curCamname = 'Common Interface' for c in self.camnames.keys(): if self.camnames[c] == self.defaultcam: defCamname = c if self.camnames[c] == self.currentcam: curCamname = c pos = 0 for x in self.emlist: if x == defCamname: self['list'].moveToIndex(pos) break pos += 1 mytext = '' if fileExists('/tmp/ecm.info'): f = open('/tmp/ecm.info', 'r') for line in f.readlines(): line = line.replace('\n', '') line = line.strip() if len(line) > 3: mytext = mytext + line + '\n' f.close() if len(mytext) < 5: mytext = '\n\n ' + _('Ecm Info not available.') self['activecam'].setText(curCamname) self['Ecmtext'].setText(mytext) return
def addTimer(session, serviceref, begin, end, name, description, disabled, justplay, afterevent, dirname, tags, repeated, vpsinfo=None, logentries=None, eit=0, always_zap=-1): rt = session.nav.RecordTimer if not dirname: dirname = preferredTimerPath() try: timer = RecordTimerEntry( ServiceReference(serviceref), begin, end, name, description, eit, disabled, justplay, afterevent, dirname=dirname, tags=tags) timer.repeated = repeated if logentries: timer.log_entries = logentries conflicts = rt.record(timer) if conflicts: errors = [] conflictinfo = [] for conflict in conflicts: errors.append(conflict.name) conflictinfo.append({ "serviceref": str(conflict.service_ref), "servicename": conflict.service_ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), "name": conflict.name, "begin": conflict.begin, "end": conflict.end, "realbegin": strftime("%d.%m.%Y %H:%M", (localtime(float(conflict.begin)))), "realend": strftime("%d.%m.%Y %H:%M", (localtime(float(conflict.end)))) }) return { "result": False, "message": _("Conflicting Timer(s) detected! %s") % " / ".join(errors), "conflicts": conflictinfo } # VPS if vpsinfo is not None: timer.vpsplugin_enabled = vpsinfo["vpsplugin_enabled"] timer.vpsplugin_overwrite = vpsinfo["vpsplugin_overwrite"] timer.vpsplugin_time = vpsinfo["vpsplugin_time"] if always_zap != -1: if hasattr(timer, "always_zap"): timer.always_zap = always_zap == 1 except Exception, e: print e return { "result": False, "message": _("Could not add timer '%s'!") % name }
class RecordTimerEntry(timer.TimerEntry, object): ######### the following static methods and members are only in use when the box is in (soft) standby receiveRecordEvents = False @staticmethod def shutdown(): quitMainloop(1) @staticmethod def staticGotRecordEvent(recservice, event): if event == iRecordableService.evEnd: print "RecordTimer.staticGotRecordEvent(iRecordableService.evEnd)" recordings = NavigationInstance.instance.getRecordings() if not recordings: # no more recordings exist rec_time = NavigationInstance.instance.RecordTimer.getNextRecordingTime( ) if rec_time > 0 and (rec_time - time()) < 360: print "another recording starts in", rec_time - time( ), "seconds... do not shutdown yet" else: print "no starting records in the next 360 seconds... immediate shutdown" RecordTimerEntry.shutdown() # immediate shutdown elif event == iRecordableService.evStart: print "RecordTimer.staticGotRecordEvent(iRecordableService.evStart)" @staticmethod def stopTryQuitMainloop(): print "RecordTimer.stopTryQuitMainloop" NavigationInstance.instance.record_event.remove( RecordTimerEntry.staticGotRecordEvent) RecordTimerEntry.receiveRecordEvents = False @staticmethod def TryQuitMainloop(default_yes=True): if not RecordTimerEntry.receiveRecordEvents: print "RecordTimer.TryQuitMainloop" NavigationInstance.instance.record_event.append( RecordTimerEntry.staticGotRecordEvent) RecordTimerEntry.receiveRecordEvents = True # send fake event.. to check if another recordings are running or # other timers start in a few seconds RecordTimerEntry.staticGotRecordEvent(None, iRecordableService.evEnd) # send normal notification for the case the user leave the standby now.. Notifications.AddNotification( Screens.Standby.TryQuitMainloop, 1, onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop, default_yes=default_yes) ################################################################# def __init__(self, serviceref, begin, end, name, description, eit, disabled=False, justplay=False, afterEvent=AFTEREVENT.AUTO, checkOldTimers=False, dirname=None, tags=None): timer.TimerEntry.__init__(self, int(begin), int(end)) if checkOldTimers == True: if self.begin < time() - 1209600: self.begin = int(time()) if self.end < self.begin: self.end = self.begin assert isinstance(serviceref, ServiceReference) if serviceref.isRecordable(): self.service_ref = serviceref else: self.service_ref = ServiceReference(None) self.eit = eit self.dontSave = False self.name = name self.description = description self.disabled = disabled self.timer = None self.__record_service = None self.start_prepare = 0 self.justplay = justplay self.afterEvent = afterEvent self.dirname = dirname self.dirnameHadToFallback = False self.autoincrease = False self.autoincreasetime = 3600 * 24 # 1 day self.tags = tags or [] self.log_entries = [] self.resetState() def log(self, code, msg): self.log_entries.append((int(time()), code, msg)) print "[TIMER]", msg def calculateFilename(self): service_name = self.service_ref.getServiceName() begin_date = strftime("%Y%m%d %H%M", localtime(self.begin)) begin_shortdate = strftime("%Y%m%d", localtime(self.begin)) print "begin_date: ", begin_date print "service_name: ", service_name print "name:", self.name print "description: ", self.description filename = begin_date + " - " + service_name if self.name: if config.usage.setup_level.index >= 2: # expert+ if config.recording.filename_composition.value == "short": filename = begin_shortdate + " - " + self.name elif config.recording.filename_composition.value == "long": filename += " - " + self.name + " - " + self.description else: filename += " - " + self.name # standard else: filename += " - " + self.name if config.recording.ascii_filenames.value: filename = ASCIItranslit.legacyEncode(filename) if not self.dirname or not Directories.fileExists(self.dirname, 'w'): if self.dirname: self.dirnameHadToFallback = True dirname = defaultMoviePath() else: dirname = self.dirname self.Filename = Directories.getRecordingFilename(filename, dirname) self.log(0, "Filename calculated as: '%s'" % self.Filename) #begin_date + " - " + service_name + description) def tryPrepare(self): if self.justplay: return True else: self.calculateFilename() rec_ref = self.service_ref and self.service_ref.ref if rec_ref and rec_ref.flags & eServiceReference.isGroup: rec_ref = getBestPlayableServiceReference( rec_ref, eServiceReference()) if not rec_ref: self.log( 1, "'get best playable service for group... record' failed" ) return False self.record_service = rec_ref and NavigationInstance.instance.recordService( rec_ref) if not self.record_service: self.log(1, "'record service' failed") return False if self.repeated: epgcache = eEPGCache.getInstance() queryTime = self.begin + (self.end - self.begin) / 2 evt = epgcache.lookupEventTime(rec_ref, queryTime) if evt: self.description = evt.getShortDescription() if self.description == "": description = evt.getExtendedDescription() event_id = evt.getEventId() else: event_id = -1 else: event_id = self.eit if event_id is None: event_id = -1 prep_res = self.record_service.prepare( self.Filename + ".ts", self.begin, self.end, event_id, self.name.replace("\n", ""), self.description.replace("\n", ""), ' '.join(self.tags)) if prep_res: if prep_res == -255: self.log(4, "failed to write meta information") else: self.log(2, "'prepare' failed: error %d" % prep_res) # we must calc nur start time before stopRecordService call because in Screens/Standby.py TryQuitMainloop tries to get # the next start time in evEnd event handler... self.do_backoff() self.start_prepare = time() + self.backoff NavigationInstance.instance.stopRecordService( self.record_service) self.record_service = None return False return True def do_backoff(self): if self.backoff == 0: self.backoff = 5 else: self.backoff *= 2 if self.backoff > 100: self.backoff = 100 self.log(10, "backoff: retry in %d seconds" % self.backoff) def activate(self): next_state = self.state + 1 self.log(5, "activating state %d" % next_state) if next_state == self.StatePrepared: if self.tryPrepare(): self.log(6, "prepare ok, waiting for begin") # create file to "reserve" the filename # because another recording at the same time on another service can try to record the same event # i.e. cable / sat.. then the second recording needs an own extension... when we create the file # here than calculateFilename is happy if not self.justplay: open(self.Filename + ".ts", "w").close() # Give the Trashcan a chance to clean up try: Trashcan.instance.cleanIfIdle() except Exception, e: print "[TIMER] Failed to call Trashcan.instance.cleanIfIdle()" print "[TIMER] Error:", e # fine. it worked, resources are allocated. self.next_activation = self.begin self.backoff = 0 return True self.log(7, "prepare failed") if self.first_try_prepare: self.first_try_prepare = False cur_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference( ) if cur_ref and not cur_ref.getPath(): if not config.recording.asktozap.value: self.log(8, "asking user to zap away") Notifications.AddNotificationWithCallback( self.failureCB, MessageBox, _("A timer failed to record!\nDisable TV and try again?\n" ), timeout=20) else: # zap without asking self.log(9, "zap without asking") Notifications.AddNotification( MessageBox, _("In order to record a timer, the TV was switched to the recording service!\n" ), type=MessageBox.TYPE_INFO, timeout=20) self.failureCB(True) elif cur_ref: self.log( 8, "currently running service is not a live service.. so stop it makes no sense" ) else: self.log( 8, "currently no service running... so we dont need to stop it" ) return False elif next_state == self.StateRunning: # if this timer has been cancelled, just go to "end" state. if self.cancelled: return True if self.justplay: if Screens.Standby.inStandby: self.log(11, "wakeup and zap") #set service to zap after standby Screens.Standby.inStandby.prev_running_service = self.service_ref.ref #wakeup standby Screens.Standby.inStandby.Power() else: self.log(11, "zapping") NavigationInstance.instance.playService( self.service_ref.ref) return True else: self.log(11, "start recording") record_res = self.record_service.start() if record_res: self.log(13, "start record returned %d" % record_res) self.do_backoff() # retry self.begin = time() + self.backoff return False return True
def ShowServiceInformation(self): if self.type == TYPE_SERVICE_INFO: self["Title"].text = _("Service info - service & PIDs") if self.feinfo or self.transponder_info: self["key_blue"].text = self["blue"].text = _( "Tuner setting values") if self.session.nav.getCurrentlyPlayingServiceOrGroup(): name = ServiceReference( self.session.nav.getCurrentlyPlayingServiceReference( )).getServiceName() refstr = self.session.nav.getCurrentlyPlayingServiceReference( ).toString() reftype = self.session.nav.getCurrentlyPlayingServiceReference( ).type else: name = _("N/A") refstr = _("N/A") reftype = 0 aspect = "-" videocodec = "-" resolution = "-" if self.info: videocodec = ("MPEG2", "AVC", "MPEG1", "MPEG4-VC", "VC1", "VC1-SM", "HEVC", "N/A")[self.info.getInfo( iServiceInformation.sVideoType)] width = self.info.getInfo(iServiceInformation.sVideoWidth) height = self.info.getInfo(iServiceInformation.sVideoHeight) if width > 0 and height > 0: resolution = videocodec + " - " resolution += "%dx%d - " % (width, height) resolution += str( (self.info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000) resolution += (" i", " p", "")[self.info.getInfo( iServiceInformation.sProgressive)] aspect = self.getServiceInfoValue( iServiceInformation.sAspect) aspect = aspect in (1, 2, 5, 6, 9, 0xA, 0xD, 0xE) and "4:3" or "16:9" resolution += " - [" + aspect + "]" if "%3a//" in refstr and reftype not in (1, 257, 4098, 4114): fillList = [ (_("Service name"), name, TYPE_TEXT), (_("Videocodec, size & format"), resolution, TYPE_TEXT), (_("Service reference"), ":".join(refstr.split(":")[:9]), TYPE_TEXT), (_("URL"), refstr.split(":")[10].replace("%3a", ":"), TYPE_TEXT) ] else: if ":/" in refstr: fillList = [(_("Service name"), name, TYPE_TEXT), (_("Videocodec, size & format"), resolution, TYPE_TEXT), (_("Service reference"), ":".join(refstr.split(":")[:9]), TYPE_TEXT), (_("Filename"), refstr.split(":")[10], TYPE_TEXT)] else: fillList = [ (_("Service name"), name, TYPE_TEXT), (_("Provider"), self.getServiceInfoValue( iServiceInformation.sProvider), TYPE_TEXT), (_("Videocodec, size & format"), resolution, TYPE_TEXT) ] if "%3a//" in refstr: fillList = fillList + [ (_("Service reference"), ":".join( refstr.split(":")[:9]), TYPE_TEXT), (_("URL"), refstr.split(":")[10].replace( "%3a", ":"), TYPE_TEXT) ] else: fillList = fillList + [ (_("Service reference"), refstr, TYPE_TEXT) ] fillList = fillList + [ (_("Namespace"), self.getServiceInfoValue( iServiceInformation.sNamespace), TYPE_VALUE_HEX, 8), (_("Service ID"), self.getServiceInfoValue( iServiceInformation.sSID), TYPE_VALUE_HEX_DEC, 4), (_("Video PID"), self.getServiceInfoValue(iServiceInformation.sVideoPID), TYPE_VALUE_HEX_DEC, 4), (_("Audio PID"), self.getServiceInfoValue(iServiceInformation.sAudioPID), TYPE_VALUE_HEX_DEC, 4), (_("PCR PID"), self.getServiceInfoValue( iServiceInformation.sPCRPID), TYPE_VALUE_HEX_DEC, 4), (_("PMT PID"), self.getServiceInfoValue( iServiceInformation.sPMTPID), TYPE_VALUE_HEX_DEC, 4), (_("TXT PID"), self.getServiceInfoValue( iServiceInformation.sTXTPID), TYPE_VALUE_HEX_DEC, 4), (_("TSID"), self.getServiceInfoValue( iServiceInformation.sTSID), TYPE_VALUE_HEX_DEC, 4), (_("ONID"), self.getServiceInfoValue( iServiceInformation.sONID), TYPE_VALUE_HEX_DEC, 4) ] self.fillList(fillList) elif self.transponder_info: self.fillList(self.getFEData(self.transponder_info))
def getSubservices(self): print("[SubServices].getSubservices called") list = [] if self.streamingScreens is None: currentServiceRef = self.session.nav.getCurrentlyPlayingServiceReference( ) if currentServiceRef is not None: list.append( (currentServiceRef.toString(), ServiceReference(currentServiceRef).getServiceName())) currentService = self.session.nav.getCurrentService() subservices = currentService and currentService.subServices() if subservices and subservices.getNumberOfSubservices() != 0: n = subservices and subservices.getNumberOfSubservices() x = 0 while x < n: sub = subservices.getSubservice(x) list.append((sub.toString(), sub.getName())) x += 1 else: list = (("N/A", "N/A"), ) print("SubServices is returning list ", list) return list elif self.cmd is not None: print("[SubServices].getSubservices for Streaming Service") for screen in self.streamingScreens: if screen is not None: service = screen.getRecordService() sref = ServiceReference(screen.getRecordServiceRef()) if service is not None: print("[SubServices] serviceref: %s | cmd: %s" % (sref, self.cmd)) if sref.__str__() == self.cmd: list.append( (sref.__str__(), sref.getServiceName())) print( "[SubServices] Matching recordSerivce found!") subservices = service and service.subServices() if subservices and subservices.getNumberOfSubservices( ) != 0: n = subservices and subservices.getNumberOfSubservices( ) x = 0 while x < n: sub = subservices.getSubservice(x) list.append( (sub.toString(), sub.getName())) x += 1 return list else: print("[SubServices] no items: %s" % subservices) else: print("[SubServices] Service is None!") if not list: return (("N/A", "N/A"), ) return list
def information(self): if self.type == TYPE_SERVICE_INFO: if self.session.nav.getCurrentlyPlayingServiceOrGroup(): name = ServiceReference( self.session.nav.getCurrentlyPlayingServiceReference( )).getServiceName() refstr = self.session.nav.getCurrentlyPlayingServiceReference( ).toString() else: name = _("N/A") refstr = _("N/A") aspect = "-" videocodec = "-" videomode = "-" resolution = "-" if self.info: videocodec = ("MPEG2", "AVC", "MPEG1", "MPEG4-VC", "VC1", "VC1-SM", "HEVC", "-")[self.info.getInfo( iServiceInformation.sVideoType)] video_height = 0 video_width = 0 video_pol = " " video_rate = 0 if path.exists("/proc/stb/vmpeg/0/yres"): f = open("/proc/stb/vmpeg/0/yres", "r") try: video_height = int(f.read(), 16) except: pass f.close() if path.exists("/proc/stb/vmpeg/0/xres"): f = open("/proc/stb/vmpeg/0/xres", "r") try: video_width = int(f.read(), 16) except: pass f.close() if path.exists("/proc/stb/vmpeg/0/progressive"): f = open("/proc/stb/vmpeg/0/progressive", "r") try: video_pol = "p" if int(f.read(), 16) else "i" except: pass f.close() if path.exists("/proc/stb/vmpeg/0/framerate"): f = open("/proc/stb/vmpeg/0/framerate", "r") try: video_rate = int(f.read()) except: pass f.close() fps = str((video_rate + 500) / 1000) resolution = str(video_width) + "x" + str( video_height) + video_pol + fps aspect = self.getServiceInfoValue(iServiceInformation.sAspect) if aspect in (1, 2, 5, 6, 9, 0xA, 0xD, 0xE): aspect = "4:3" else: aspect = "16:9" f = open("/proc/stb/video/videomode") videomode = f.read()[:-1].replace('\n', '') f.close() Labels = ((_("Name"), name, TYPE_TEXT), (_("Provider"), self.getServiceInfoValue(iServiceInformation.sProvider), TYPE_TEXT), (_("Videoformat"), aspect, TYPE_TEXT), (_("Videomode"), videomode, TYPE_TEXT), (_("Videosize"), resolution, TYPE_TEXT), (_("Videocodec"), videocodec, TYPE_TEXT), (_("Namespace"), self.getServiceInfoValue( iServiceInformation.sNamespace), TYPE_VALUE_HEX, 8), (_("Service reference"), refstr, TYPE_TEXT)) self.fillList(Labels) else: if self.transponder_info: self.fillList(self.getFEData(self.transponder_info))
def recordNow(session, infinite): rt = session.nav.RecordTimer serviceref = session.nav.getCurrentlyPlayingServiceReference().toString() try: event = session.nav.getCurrentService().info().getEvent(0) except Exception: event = None if not event and not infinite: return { "result": False, "message": _("No event found! Not recording!") } if event: (begin, end, name, description, eit) = parseEvent(event) begin = time() msg = _("Instant record for current Event started") else: name = "instant record" description = "" eit = 0 if infinite: begin = time() end = begin + 3600 * 10 msg = _("Infinite Instant recording started") timer = RecordTimerEntry(ServiceReference(serviceref), begin, end, name, description, eit, False, False, 0, dirname=preferredInstantRecordPath()) timer.dontSave = True if rt.record(timer): return { "result": False, "message": _("Timer conflict detected! Not recording!") } nt = { "serviceref": str(timer.service_ref), "servicename": timer.service_ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), "eit": timer.eit, "name": timer.name, "begin": timer.begin, "end": timer.end, "duration": timer.end - timer.begin } return {"result": True, "message": msg, "newtimer": nt}
def addTimer(session, serviceref, begin, end, name, description, disabled, justplay, afterevent, dirname, tags, repeated, recordingtype, vpsinfo=None, logentries=None, eit=0, always_zap=-1, pipzap=-1, allow_duplicate=1, autoadjust=-1): rt = session.nav.RecordTimer if not dirname: dirname = preferredTimerPath() # IPTV Fix serviceref = serviceref.replace('%253a', '%3a') try: timer = RecordTimerEntry(ServiceReference(serviceref), begin, end, name, description, eit, disabled, justplay, afterevent, dirname=dirname, tags=tags) timer.repeated = repeated if logentries: timer.log_entries = logentries conflicts = rt.record(timer) if conflicts: errors = [] conflictinfo = [] for conflict in conflicts: errors.append(conflict.name) conflictinfo.append({ "serviceref": str(conflict.service_ref), "servicename": conflict.service_ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', ''), "name": conflict.name, "begin": conflict.begin, "end": conflict.end, "realbegin": strftime(_("%d.%m.%Y %H:%M"), (localtime(float(conflict.begin)))), "realend": strftime(_("%d.%m.%Y %H:%M"), (localtime(float(conflict.end)))) }) return { "result": False, "message": _("Conflicting Timer(s) detected! %s") % " / ".join(errors), "conflicts": conflictinfo } # VPS if vpsinfo is not None: timer.vpsplugin_enabled = vpsinfo["vpsplugin_enabled"] timer.vpsplugin_overwrite = vpsinfo["vpsplugin_overwrite"] timer.vpsplugin_time = vpsinfo["vpsplugin_time"] if always_zap != -1: if hasattr(timer, "always_zap"): timer.always_zap = always_zap == 1 if hasattr(timer, "zapbeforerecord"): timer.zapbeforerecord = always_zap == 1 if hasattr(timer, "autoadjust"): if autoadjust == -1: autoadjust = config.recording.adjust_time_to_event.value and 1 or 0 autoadjust = autoadjust if hasattr(timer, "allow_duplicate"): allow_duplicate = allow_duplicate if pipzap != -1: if hasattr(timer, "pipzap"): timer.pipzap = pipzap == 1 if recordingtype: timer.descramble = { "normal": True, "descrambled": True, "scrambled": False, }[recordingtype] timer.record_ecm = { "normal": False, "descrambled": True, "scrambled": True, }[recordingtype] except Exception as e: print(str(e)) return { "result": False, "message": _("Could not add timer '%s'!") % name } return {"result": True, "message": _("Timer '%s' added") % name}
def __evUpdatedInfo(self): if self.newService and self.session.nav.getCurrentlyPlayingServiceReference( ) and self.enabled: print "[AutomaticVolumeAdjustment] service changed" self.newService = False self.currentVolume = 0 # init if self.modus == "0": # Automatic volume adjust mode self.currentAC3DTS = self.isCurrentAudioAC3DTS() if self.pluginStarted: if self.currentAC3DTS: # ac3 dts? vol = self.volctrl.getVolume() currentvol = vol # remember current vol vol -= self.lastAdjustedValue # go back to origin value first ref = self.getPlayingServiceReference() ajvol = self.serviceList.get( ref.toString(), self.defaultValue) # get delta from config if ajvol < 0: # adjust vol down if vol + ajvol < 0: ajvol = (-1) * vol else: # adjust vol up if vol >= 100 - ajvol: # check if delta + vol < 100 ajvol = 100 - vol # correct delta value self.lastAdjustedValue = ajvol # save delta value if (vol + ajvol != currentvol): if ajvol == 0: ajvol = vol - currentvol # correction for debug -print only self.setVolume(vol + self.lastAdjustedValue) print "[AutomaticVolumeAdjustment] Change volume for service: %s (+%d) to %d" % ( ServiceReference(ref).getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', ''), ajvol, self.volctrl.getVolume()) self.currentVolume = self.volctrl.getVolume( ) # ac3||dts service , save current volume else: # mpeg or whatever audio if self.lastAdjustedValue != 0: # go back to origin value vol = self.volctrl.getVolume() ajvol = vol - self.lastAdjustedValue if ajvol > self.maxMPEGVolume: ajvol = self.maxMPEGVolume self.setVolume(ajvol) print "[AutomaticVolumeAdjustment] Change volume for service: %s (-%d) to %d" % ( ServiceReference( self.session.nav. getCurrentlyPlayingServiceReference()). getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', ''), vol - ajvol, self.volctrl.getVolume()) self.lastAdjustedValue = 0 # mpeg audio, no delta here return # get out of here, nothing to do anymore else: # modus = Remember channel volume if self.pluginStarted: ref = self.getPlayingServiceReference() if ref.valid(): # get value from dict lastvol = self.serviceList.get(ref.toString(), -1) if lastvol != -1 and lastvol != self.volctrl.getVolume( ): # set volume value self.setVolume(lastvol) print "[AutomaticVolumeAdjustment] Set last used volume value for service %s to %d" % ( ServiceReference(ref).getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', ''), self.volctrl.getVolume()) return # get out of here, nothing to do anymore if not self.pluginStarted: if self.modus == "0": # Automatic volume adjust mode # starting plugin, if service audio is ac3 or dts --> get delta from config...volume value is set by enigma2-system at start if self.currentAC3DTS: self.lastAdjustedValue = self.serviceList.get( self.session.nav. getCurrentlyPlayingServiceReference().toString(), self.defaultValue) self.currentVolume = self.volctrl.getVolume( ) # ac3||dts service , save current volume # only images >= 05.08.2010, must use try/except try: self.volumeControlInstance = VolumeControl.instance except: pass self.pluginStarted = True # plugin started...
def editTimer(session, serviceref, begin, end, name, description, disabled, justplay, afterEvent, dirname, tags, repeated, channelOld, beginOld, endOld, recordingtype, vpsinfo, always_zap, pipzap, allow_duplicate, autoadjust): channelOld_str = ':'.join(str(channelOld).split(':')[:11]) rt = session.nav.RecordTimer for timer in rt.timer_list + rt.processed_timers: needed_ref = ':'.join( timer.service_ref.ref.toString().split(':')[:11]) == channelOld_str if needed_ref and int(timer.begin) == beginOld and int( timer.end) == endOld: timer.service_ref = ServiceReference(serviceref) # TODO: start end time check timer.begin = int(float(begin)) timer.end = int(float(end)) timer.name = name timer.description = description # TODO : EIT # timer.eit = eit timer.disabled = disabled timer.justplay = justplay timer.afterEvent = afterEvent timer.dirname = dirname timer.tags = tags timer.repeated = repeated timer.processRepeated() if vpsinfo is not None: timer.vpsplugin_enabled = vpsinfo["vpsplugin_enabled"] timer.vpsplugin_overwrite = vpsinfo["vpsplugin_overwrite"] timer.vpsplugin_time = vpsinfo["vpsplugin_time"] if always_zap != -1: if hasattr(timer, "always_zap"): timer.always_zap = always_zap == 1 if hasattr(timer, "zapbeforerecord"): timer.zapbeforerecord = always_zap == 1 if pipzap != -1: if hasattr(timer, "pipzap"): timer.pipzap = pipzap == 1 if hasattr(timer, "allow_duplicate"): timer.allow_duplicate = allow_duplicate if hasattr(timer, "autoadjust"): if autoadjust == -1: autoadjust = config.recording.adjust_time_to_event.value and 1 or 0 timer.autoadjust = autoadjust if recordingtype: timer.descramble = { "normal": True, "descrambled": True, "scrambled": False, }[recordingtype] timer.record_ecm = { "normal": False, "descrambled": True, "scrambled": True, }[recordingtype] # TODO: multi tuner test sanity = TimerSanityCheck(rt.timer_list, timer) conflicts = None if not sanity.check(): conflicts = sanity.getSimulTimerList() if conflicts is not None: for conflict in conflicts: if conflict.setAutoincreaseEnd(timer): rt.timeChanged(conflict) if not sanity.check(): conflicts = sanity.getSimulTimerList() if conflicts is None: rt.timeChanged(timer) return { "result": True, "message": _("Timer '%s' changed") % name } else: errors = [] conflictinfo = [] for conflict in conflicts: errors.append(conflict.name) conflictinfo.append({ "serviceref": str(conflict.service_ref), "servicename": removeBad(conflict.service_ref.getServiceName()), "name": conflict.name, "begin": conflict.begin, "end": conflict.end, "realbegin": strftime(_("%d.%m.%Y %H:%M"), (localtime(float(conflict.begin)))), "realend": strftime(_("%d.%m.%Y %H:%M"), (localtime(float(conflict.end)))) }) return { "result": False, "message": _("Timer '%s' not saved while Conflict") % name, "conflicts": conflictinfo } return { "result": False, "message": _("Could not find timer '%s' with given start and end time!") % name }
def showEventInformation(self): from Screens.EventView import EventViewSimple from ServiceReference import ServiceReference evt = self[self.currList].getCurrentEvent() if evt: self.session.open(EventViewSimple, evt, ServiceReference(self.getCurrent()))
def buildConfig(defaultTimer, timers, webif=False): # Generate List in RAM list = [ '<?xml version="1.0" ?>\n<autotimer version="', CURRENT_CONFIG_VERSION, '">\n\n' ] append = list.append extend = list.extend # This gets deleted afterwards if we do not have set any defaults append(' <defaults') if webif: extend((' id="', str(defaultTimer.getId()), '"')) # Timespan if defaultTimer.hasTimespan(): extend((' from="', defaultTimer.getTimespanBegin(), '" to="', defaultTimer.getTimespanEnd(), '"')) # Duration if defaultTimer.hasDuration(): extend((' maxduration="', str(defaultTimer.getDuration()), '"')) # Destination if defaultTimer.hasDestination(): extend((' location="', stringToXML(defaultTimer.destination), '"')) # Offset if defaultTimer.hasOffset(): if defaultTimer.isOffsetEqual(): extend((' offset="', str(defaultTimer.getOffsetBegin()), '"')) else: extend((' offset="', str(defaultTimer.getOffsetBegin()), ',', str(defaultTimer.getOffsetEnd()), '"')) # Counter if defaultTimer.hasCounter(): extend((' counter="', str(defaultTimer.getCounter()), '"')) if defaultTimer.hasCounterFormatString(): extend((' counterFormat="', str(defaultTimer.getCounterFormatString()), '"')) # Duplicate Description if defaultTimer.getAvoidDuplicateDescription(): extend((' avoidDuplicateDescription="', str(defaultTimer.getAvoidDuplicateDescription()), '"')) # Only display justplay if true if defaultTimer.justplay: extend((' justplay="', str(defaultTimer.getJustplay()), '"')) # Only display encoding if != utf-8 if defaultTimer.encoding != 'UTF-8' or webif: extend((' encoding="', str(defaultTimer.encoding), '"')) # Only display searchType if exact if defaultTimer.searchType == "exact": extend((' searchType="', str(defaultTimer.searchType), '"')) # Only display searchCase if sensitive if defaultTimer.searchCase == "sensitive": extend((' searchCase="', str(defaultTimer.searchCase), '"')) # Close still opened defaults tag append('>\n') if webif: # Services + Bouquets for serviceref in defaultTimer.services + defaultTimer.bouquets: ref = ServiceReference(str(serviceref)) extend(( ' <e2service>\n', ' <e2servicereference>', str(serviceref), '</e2servicereference>\n', ' <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', '')), '</e2servicename>\n', ' </e2service>\n', )) else: # Services for serviceref in defaultTimer.services: ref = ServiceReference(str(serviceref)) extend(( ' <serviceref>', serviceref, '</serviceref>', ' <!-- ', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', '')), ' -->\n', )) # Bouquets for bouquet in defaultTimer.bouquets: ref = ServiceReference(str(bouquet)) extend(( ' <bouquet>', str(bouquet), '</bouquet>', ' <!-- ', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', '')), ' -->\n', )) # AfterEvent if defaultTimer.hasAfterEvent(): idx = { AFTEREVENT.NONE: "none", AFTEREVENT.STANDBY: "standby", AFTEREVENT.DEEPSTANDBY: "shutdown", AFTEREVENT.AUTO: "auto" } for afterevent in defaultTimer.afterevent: action, timespan = afterevent append(' <afterevent') if timespan[0] is not None: append(' from="%02d:%02d" to="%02d:%02d"' % (timespan[0][0], timespan[0][1], timespan[1][0], timespan[1][1])) extend(('>', idx[action], '</afterevent>\n')) # Excludes for title in defaultTimer.getExcludedTitle(): extend( (' <exclude where="title">', stringToXML(title), '</exclude>\n')) for short in defaultTimer.getExcludedShort(): extend((' <exclude where="shortdescription">', stringToXML(short), '</exclude>\n')) for desc in defaultTimer.getExcludedDescription(): extend((' <exclude where="description">', stringToXML(desc), '</exclude>\n')) for day in defaultTimer.getExcludedDays(): extend((' <exclude where="dayofweek">', stringToXML(day), '</exclude>\n')) # Includes for title in defaultTimer.getIncludedTitle(): extend( (' <include where="title">', stringToXML(title), '</include>\n')) for short in defaultTimer.getIncludedShort(): extend((' <include where="shortdescription">', stringToXML(short), '</include>\n')) for desc in defaultTimer.getIncludedDescription(): extend((' <include where="description">', stringToXML(desc), '</include>\n')) for day in defaultTimer.getIncludedDays(): extend((' <include where="dayofweek">', stringToXML(day), '</include>\n')) # Tags if webif and defaultTimer.tags: extend((' <e2tags>', stringToXML(' '.join(defaultTimer.tags)), '</e2tags>\n')) else: for tag in defaultTimer.tags: extend((' <tag>', stringToXML(tag), '</tag>\n')) # Keep the list clean if len(list) == 5: list.pop() # > list.pop() # <defaults else: append(' </defaults>\n\n') # Iterate timers for timer in timers: # Common attributes (match, enabled) extend( (' <timer name="', stringToXML(timer.name), '" match="', stringToXML(timer.match), '" enabled="', timer.getEnabled(), '"')) if webif: extend((' id="', str(timer.getId()), '"')) # Timespan if timer.hasTimespan(): extend((' from="', timer.getTimespanBegin(), '" to="', timer.getTimespanEnd(), '"')) # Timeframe if timer.hasTimeframe(): extend((' after="', str(timer.getTimeframeBegin()), '" before="', str(timer.getTimeframeEnd()), '"')) # Duration if timer.hasDuration(): extend((' maxduration="', str(timer.getDuration()), '"')) # Destination if timer.hasDestination(): extend((' location="', stringToXML(timer.destination), '"')) # Offset if timer.hasOffset(): if timer.isOffsetEqual(): extend((' offset="', str(timer.getOffsetBegin()), '"')) else: extend((' offset="', str(timer.getOffsetBegin()), ',', str(timer.getOffsetEnd()), '"')) # Counter if timer.hasCounter(): extend((' lastBegin="', str(timer.getLastBegin()), '" counter="', str(timer.getCounter()), '" left="', str(timer.getCounterLeft()), '"')) if timer.hasCounterFormatString(): extend( (' lastActivation="', str(timer.getCounterLimit()), '"')) extend((' counterFormat="', str(timer.getCounterFormatString()), '"')) # Duplicate Description if timer.getAvoidDuplicateDescription(): extend((' avoidDuplicateDescription="', str(timer.getAvoidDuplicateDescription()), '"')) # Only display justplay if true if timer.justplay: extend((' justplay="', str(timer.getJustplay()), '"')) # Only display encoding if != utf-8 if timer.encoding != 'UTF-8' or webif: extend((' encoding="', str(timer.encoding), '"')) # Only display searchType if exact if timer.searchType == "exact": extend((' searchType="', str(timer.searchType), '"')) # Only display searchCase if sensitive if timer.searchCase == "sensitive": extend((' searchCase="', str(timer.searchCase), '"')) # Only display overrideAlternatives if true if timer.overrideAlternatives: extend((' overrideAlternatives="', str(timer.getOverrideAlternatives()), '"')) # Only add vps related entries if true if timer.vps_enabled: append(' vps_enabled="yes"') if timer.vps_overwrite: append(' vps_overwrite="yes"') # Close still opened timer tag append('>\n') if webif: # Services + Bouquets for serviceref in timer.services + timer.bouquets: ref = ServiceReference(str(serviceref)) extend(( ' <e2service>\n', ' <e2servicereference>', str(serviceref), '</e2servicereference>\n', ' <e2servicename>', stringToXML(ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n', ' </e2service>\n', )) else: # Services for serviceref in timer.services: ref = ServiceReference(str(serviceref)) extend(( ' <serviceref>', serviceref, '</serviceref>', ' <!-- ', stringToXML(ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '')), ' -->\n', )) # Bouquets for bouquet in timer.bouquets: ref = ServiceReference(str(bouquet)) extend(( ' <bouquet>', str(bouquet), '</bouquet>', ' <!-- ', stringToXML(ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '')), ' -->\n', )) # AfterEvent if timer.hasAfterEvent(): idx = { AFTEREVENT.NONE: "none", AFTEREVENT.STANDBY: "standby", AFTEREVENT.DEEPSTANDBY: "shutdown", AFTEREVENT.AUTO: "auto" } for afterevent in timer.afterevent: action, timespan = afterevent append(' <afterevent') if timespan[0] is not None: append(' from="%02d:%02d" to="%02d:%02d"' % (timespan[0][0], timespan[0][1], timespan[1][0], timespan[1][1])) extend(('>', idx[action], '</afterevent>\n')) # Excludes for title in timer.getExcludedTitle(): extend((' <exclude where="title">', stringToXML(title), '</exclude>\n')) for short in timer.getExcludedShort(): extend((' <exclude where="shortdescription">', stringToXML(short), '</exclude>\n')) for desc in timer.getExcludedDescription(): extend((' <exclude where="description">', stringToXML(desc), '</exclude>\n')) for day in timer.getExcludedDays(): extend((' <exclude where="dayofweek">', stringToXML(day), '</exclude>\n')) # Includes for title in timer.getIncludedTitle(): extend((' <include where="title">', stringToXML(title), '</include>\n')) for short in timer.getIncludedShort(): extend((' <include where="shortdescription">', stringToXML(short), '</include>\n')) for desc in timer.getIncludedDescription(): extend((' <include where="description">', stringToXML(desc), '</include>\n')) for day in timer.getIncludedDays(): extend((' <include where="dayofweek">', stringToXML(day), '</include>\n')) # Tags if webif and timer.tags: extend((' <e2tags>', stringToXML(' '.join(timer.tags)), '</e2tags>\n')) else: for tag in timer.tags: extend((' <tag>', stringToXML(tag), '</tag>\n')) # End of Timer append(' </timer>\n\n') # End of Configuration append('</autotimer>\n') return list
class TimerEntry(Screen, ConfigListScreen): def __init__(self, session, timer): Screen.__init__(self, session) self.timer = timer self.entryDate = None self.entryService = None self["oktext"] = Label(_("OK")) self["canceltext"] = Label(_("Cancel")) self["ok"] = Pixmap() self["cancel"] = Pixmap() self.createConfig() self["actions"] = NumberActionMap( ["SetupActions", "GlobalActions", "PiPSetupActions"], { "ok": self.keySelect, "save": self.keyGo, "cancel": self.keyCancel, "volumeUp": self.incrementStart, "volumeDown": self.decrementStart, "size+": self.incrementEnd, "size-": self.decrementEnd }, -2) self.list = [] ConfigListScreen.__init__(self, self.list, session=session) self.createSetup("config") def createConfig(self): justplay = self.timer.justplay afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby", AFTEREVENT.AUTO: "auto" }[self.timer.afterEvent] weekday_table = ("mon", "tue", "wed", "thu", "fri", "sat", "sun") # calculate default values day = [] weekday = 0 for x in (0, 1, 2, 3, 4, 5, 6): day.append(0) if self.timer.repeated: # repeated type = "repeated" if (self.timer.repeated == 31): # Mon-Fri repeated = "weekdays" elif (self.timer.repeated == 127): # daily repeated = "daily" else: flags = self.timer.repeated repeated = "user" count = 0 for x in (0, 1, 2, 3, 4, 5, 6): if flags == 1: # weekly print "Set to weekday " + str(x) weekday = x if flags & 1 == 1: # set user defined flags day[x] = 1 count += 1 else: day[x] = 0 flags = flags >> 1 if count == 1: repeated = "weekly" else: # once type = "once" repeated = None weekday = (int(strftime("%w", localtime(self.timer.begin))) - 1) % 7 day[weekday] = 1 timer_choices = [("zap", _("zap"))] default = "zap" if SystemInfo["PVRSupport"]: timer_choices.append(("record", _("record"))) default = {0: "record", 1: "zap"}[justplay] self.timerentry_justplay = ConfigSelection(choices=timer_choices, default=default) if SystemInfo["DeepstandbySupport"]: shutdownString = _("go to deep standby") else: shutdownString = _("shut down") self.timerentry_afterevent = ConfigSelection(choices=[ ("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", shutdownString), ("auto", _("auto")) ], default=afterevent) self.timerentry_type = ConfigSelection(choices=[("once", _("once")), ("repeated", _("repeated"))], default=type) self.timerentry_name = ConfigText(default=self.timer.name, visible_width=50, fixed_size=False) self.timerentry_description = ConfigText( default=self.timer.description, visible_width=50, fixed_size=False) self.timerentry_tags = self.timer.tags[:] self.timerentry_tagsset = ConfigSelection(choices=[ not self.timerentry_tags and "None" or " ".join(self.timerentry_tags) ]) self.timerentry_repeated = ConfigSelection( default=repeated, choices=[("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))]) self.timerentry_date = ConfigDateTime(default=self.timer.begin, formatstring=_("%d.%B %Y"), increment=86400) self.timerentry_starttime = ConfigClock(default=self.timer.begin) self.timerentry_endtime = ConfigClock(default=self.timer.end) self.timerentry_showendtime = ConfigSelection( default=((self.timer.end - self.timer.begin) > 4), choices=[(True, _("yes")), (False, _("no"))]) default = self.timer.dirname or defaultMoviePath() tmp = config.movielist.videodirs.value if default not in tmp: tmp.append(default) self.timerentry_dirname = ConfigSelection(default=default, choices=tmp) self.timerentry_repeatedbegindate = ConfigDateTime( default=self.timer.repeatedbegindate, formatstring=_("%d.%B %Y"), increment=86400) self.timerentry_weekday = ConfigSelection( default=weekday_table[weekday], choices=[("mon", _("Monday")), ("tue", _("Tuesday")), ("wed", _("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))]) self.timerentry_day = ConfigSubList() for x in (0, 1, 2, 3, 4, 5, 6): self.timerentry_day.append(ConfigYesNo(default=day[x])) # FIXME some service-chooser needed here servicename = "N/A" try: # no current service available? servicename = str(self.timer.service_ref.getServiceName()) except: pass if not servicename: servicename = "N/A" self.timerentry_service_ref = self.timer.service_ref self.timerentry_service = ConfigSelection([servicename]) def createSetup(self, widget): self.list = [] self.list.append(getConfigListEntry(_("Name"), self.timerentry_name)) self.list.append( getConfigListEntry(_("Description"), self.timerentry_description)) self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), self.timerentry_justplay) self.list.append(self.timerJustplayEntry) self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), self.timerentry_type) self.list.append(self.timerTypeEntry) if self.timerentry_type.value == "once": self.frequencyEntry = None else: # repeated self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated) self.list.append(self.frequencyEntry) self.repeatedbegindateEntry = getConfigListEntry( _("Starting on"), self.timerentry_repeatedbegindate) self.list.append(self.repeatedbegindateEntry) if self.timerentry_repeated.value == "daily": pass if self.timerentry_repeated.value == "weekdays": pass if self.timerentry_repeated.value == "weekly": self.list.append( getConfigListEntry(_("Weekday"), self.timerentry_weekday)) if self.timerentry_repeated.value == "user": self.list.append( getConfigListEntry(_("Monday"), self.timerentry_day[0])) self.list.append( getConfigListEntry(_("Tuesday"), self.timerentry_day[1])) self.list.append( getConfigListEntry(_("Wednesday"), self.timerentry_day[2])) self.list.append( getConfigListEntry(_("Thursday"), self.timerentry_day[3])) self.list.append( getConfigListEntry(_("Friday"), self.timerentry_day[4])) self.list.append( getConfigListEntry(_("Saturday"), self.timerentry_day[5])) self.list.append( getConfigListEntry(_("Sunday"), self.timerentry_day[6])) self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date) if self.timerentry_type.value == "once": self.list.append(self.entryDate) self.entryStartTime = getConfigListEntry(_("StartTime"), self.timerentry_starttime) self.list.append(self.entryStartTime) self.entryShowEndTime = getConfigListEntry(_("Set End Time"), self.timerentry_showendtime) if self.timerentry_justplay.value == "zap": self.list.append(self.entryShowEndTime) self.entryEndTime = getConfigListEntry(_("EndTime"), self.timerentry_endtime) if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value: self.list.append(self.entryEndTime) self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service) self.list.append(self.channelEntry) self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname) self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset) if self.timerentry_justplay.value != "zap": if config.usage.setup_level.index >= 2: # expert+ self.list.append(self.dirname) if getPreferredTagEditor(): self.list.append(self.tagsSet) self.list.append( getConfigListEntry(_("After event"), self.timerentry_afterevent)) self[widget].list = self.list self[widget].l.setList(self.list) def newConfig(self): print "newConfig", self["config"].getCurrent() if self["config"].getCurrent() in (self.timerTypeEntry, self.timerJustplayEntry, self.frequencyEntry, self.entryShowEndTime): self.createSetup("config") def keyLeft(self): if self["config"].getCurrent() in (self.channelEntry, self.tagsSet): self.keySelect() else: ConfigListScreen.keyLeft(self) self.newConfig() def keyRight(self): if self["config"].getCurrent() in (self.channelEntry, self.tagsSet): self.keySelect() else: ConfigListScreen.keyRight(self) self.newConfig() def keySelect(self): cur = self["config"].getCurrent() if cur == self.channelEntry: self.session.openWithCallback( self.finishedChannelSelection, ChannelSelection.SimpleChannelSelection, _("Select channel to record from")) elif config.usage.setup_level.index >= 2 and cur == self.dirname: self.session.openWithCallback( self.pathSelected, MovieLocationBox, _("Choose target folder"), self.timerentry_dirname.value, minFree=100 # We require at least 100MB free space ) elif getPreferredTagEditor() and cur == self.tagsSet: self.session.openWithCallback(self.tagEditFinished, getPreferredTagEditor(), self.timerentry_tags) else: self.keyGo() def finishedChannelSelection(self, *args): if args: self.timerentry_service_ref = ServiceReference(args[0]) self.timerentry_service.setCurrentText( self.timerentry_service_ref.getServiceName()) self["config"].invalidate(self.channelEntry) def getTimestamp(self, date, mytime): d = localtime(date) dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1]) return int(mktime(dt.timetuple())) def getBeginEnd(self): date = self.timerentry_date.value endtime = self.timerentry_endtime.value starttime = self.timerentry_starttime.value begin = self.getTimestamp(date, starttime) end = self.getTimestamp(date, endtime) # if the endtime is less than the starttime, add 1 day. if end < begin: end += 86400 return begin, end def selectChannelSelector(self, *args): self.session.openWithCallback(self.finishedChannelSelectionCorrection, ChannelSelection.SimpleChannelSelection, _("Select channel to record from")) def finishedChannelSelectionCorrection(self, *args): if args: self.finishedChannelSelection(*args) self.keyGo() def keyGo(self, result=None): if not self.timerentry_service_ref.isRecordable(): self.session.openWithCallback( self.selectChannelSelector, MessageBox, _("You didn't select a channel to record from."), MessageBox.TYPE_ERROR) return self.timer.name = self.timerentry_name.value self.timer.description = self.timerentry_description.value self.timer.justplay = self.timerentry_justplay.value == "zap" if self.timerentry_justplay.value == "zap": if not self.timerentry_showendtime.value: self.timerentry_endtime.value = self.timerentry_starttime.value self.timer.resetRepeated() self.timer.afterEvent = { "nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY, "auto": AFTEREVENT.AUTO }[self.timerentry_afterevent.value] self.timer.service_ref = self.timerentry_service_ref self.timer.tags = self.timerentry_tags if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath( ): self.timer.dirname = self.timerentry_dirname.value config.movielist.last_timer_videodir.value = self.timer.dirname config.movielist.last_timer_videodir.save() if self.timerentry_type.value == "once": self.timer.begin, self.timer.end = self.getBeginEnd() if self.timerentry_type.value == "repeated": if self.timerentry_repeated.value == "daily": for x in (0, 1, 2, 3, 4, 5, 6): self.timer.setRepeated(x) if self.timerentry_repeated.value == "weekly": self.timer.setRepeated(self.timerentry_weekday.index) if self.timerentry_repeated.value == "weekdays": for x in (0, 1, 2, 3, 4): self.timer.setRepeated(x) if self.timerentry_repeated.value == "user": for x in (0, 1, 2, 3, 4, 5, 6): if self.timerentry_day[x].value: self.timer.setRepeated(x) self.timer.repeatedbegindate = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value) if self.timer.repeated: self.timer.begin = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value) self.timer.end = self.getTimestamp( self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value) else: self.timer.begin = self.getTimestamp( time.time(), self.timerentry_starttime.value) self.timer.end = self.getTimestamp( time.time(), self.timerentry_endtime.value) # when a timer end is set before the start, add 1 day if self.timer.end < self.timer.begin: self.timer.end += 86400 if self.timer.eit is not None: event = eEPGCache.getInstance().lookupEventId( self.timer.service_ref.ref, self.timer.eit) if event: n = event.getNumOfLinkageServices() if n > 1: tlist = [] ref = self.session.nav.getCurrentlyPlayingServiceReference( ) parent = self.timer.service_ref.ref selection = 0 for x in range(n): i = event.getLinkageService(parent, x) if i.toString() == ref.toString(): selection = x tlist.append((i.getName(), i)) self.session.openWithCallback( self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list=tlist, selection=selection) return elif n > 0: parent = self.timer.service_ref.ref self.timer.service_ref = ServiceReference( event.getLinkageService(parent, 0)) self.saveTimer() self.close((True, self.timer)) def incrementStart(self): self.timerentry_starttime.increment() self["config"].invalidate(self.entryStartTime) def decrementStart(self): self.timerentry_starttime.decrement() self["config"].invalidate(self.entryStartTime) def incrementEnd(self): if self.entryEndTime is not None: self.timerentry_endtime.increment() self["config"].invalidate(self.entryEndTime) def decrementEnd(self): if self.entryEndTime is not None: self.timerentry_endtime.decrement() self["config"].invalidate(self.entryEndTime) def subserviceSelected(self, service): if not service is None: self.timer.service_ref = ServiceReference(service[1]) self.saveTimer() self.close((True, self.timer)) def saveTimer(self): self.session.nav.RecordTimer.saveTimer() def keyCancel(self): self.close((False, )) def pathSelected(self, res): if res is not None: if config.movielist.videodirs.value != self.timerentry_dirname.choices: self.timerentry_dirname.setChoices( config.movielist.videodirs.value, default=res) self.timerentry_dirname.value = res def tagEditFinished(self, ret): if ret is not None: self.timerentry_tags = ret self.timerentry_tagsset.setChoices( [not ret and "None" or " ".join(ret)]) self["config"].invalidate(self.tagsSet)