def buildConfiguration(self, webif = False): list = ['<?xml version="1.0" ?>\n<epgrefresh version="', XML_VERSION, '">\n\n'] if webif: for serviceref in self.services[0].union(self.services[1]): ref = ServiceReference(str(serviceref)) list.extend(( ' <e2service>\n', ' <e2servicereference>', str(serviceref), '</e2servicereference>\n', ' <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n', ' </e2service>\n', )) else: for service in self.services[0]: ref = ServiceReference(service.sref) list.extend((' <!--', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '-->\n', ' <service')) if service.duration is not None: list.extend((' duration="', str(service.duration), '"')) list.extend(('>', stringToXML(service.sref), '</service>\n')) for bouquet in self.services[1]: ref = ServiceReference(bouquet.sref) list.extend((' <!--', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '-->\n', ' <bouquet')) if bouquet.duration is not None: list.extend((' duration="', str(bouquet.duration), '"')) list.extend(('>', stringToXML(bouquet.sref), '</bouquet>\n')) list.append('\n</epgrefresh>') return list
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 buildConfiguration(self, webif=False): list = ['<?xml version="1.0" ?>\n<epgrefresh version="', XML_VERSION, '">\n\n'] if webif: for serviceref in self.services[0].union(self.services[1]): ref = ServiceReference(str(serviceref)) list.extend( ( " <e2service>\n", " <e2servicereference>", str(serviceref), "</e2servicereference>\n", " <e2servicename>", stringToXML(ref.getServiceName().replace("\xc2\x86", "").replace("\xc2\x87", "")), "</e2servicename>\n", " </e2service>\n", ) ) else: for service in self.services[0]: ref = ServiceReference(service.sref) list.extend( ( " <!--", stringToXML(ref.getServiceName().replace("\xc2\x86", "").replace("\xc2\x87", "")), "-->\n", " <service", ) ) if service.duration is not None: list.extend((' duration="', str(service.duration), '"')) list.extend((">", stringToXML(service.sref), "</service>\n")) for bouquet in self.services[1]: ref = ServiceReference(bouquet.sref) list.extend( ( " <!--", stringToXML(ref.getServiceName().replace("\xc2\x86", "").replace("\xc2\x87", "")), "-->\n", " <bouquet", ) ) if bouquet.duration is not None: list.extend((' duration="', str(bouquet.duration), '"')) list.extend((">", stringToXML(bouquet.sref), "</bouquet>\n")) list.append("\n</epgrefresh>") return list
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 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 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 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 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 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 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 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 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 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 renderBackground(self, req ,timers, skipped): 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, 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', ' <e2state>OK</e2state>\n' ' <e2message>', stringToXML(message), '</e2message>\n' '</e2simulatedtimer>\n' )) if skipped: for (name, begin, end, serviceref, autotimername, message) in skipped: 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', ' <e2state>Skip</e2state>\n' ' <e2message>', stringToXML(message), '</e2message>\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 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 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 onCreate(self): serviceref = self.session.nav.getCurrentlyPlayingServiceOrGroup() title = None l = self['list'] l.recalcEntrySize() if self.type == EPG_TYPE_GRAPH or self.type == EPG_TYPE_INFOBARGRAPH: l.fillGraphEPG(self.services, self.ask_time) l.moveToService(serviceref) l.setCurrentlyPlaying(serviceref) if self.type == EPG_TYPE_GRAPH: l.setShowServiceMode(config.epgselection.graph_servicetitle_mode.getValue()) self.moveTimeLines() if config.epgselection.graph_channel1.getValue(): l.instance.moveSelectionTo(0) elif self.type == EPG_TYPE_INFOBARGRAPH: l.setShowServiceMode(config.epgselection.infobar_servicetitle_mode.getValue()) self.moveTimeLines() self.setTitle(self.bouquetname) self.listTimer.start(10) elif self.type == EPG_TYPE_MULTI: l.fillMultiEPG(self.services, self.ask_time) l.moveToService(serviceref) l.setCurrentlyPlaying(serviceref) self.setTitle(self.bouquetname) elif self.type == EPG_TYPE_SINGLE or self.type == EPG_TYPE_ENHANCED or self.type == EPG_TYPE_INFOBAR: if self.type == EPG_TYPE_SINGLE: service = self.currentService elif self.type == EPG_TYPE_ENHANCED or self.type == EPG_TYPE_INFOBAR: service = ServiceReference(self.servicelist.getCurrentSelection()) title = ServiceReference(self.servicelist.getRoot()).getServiceName() self['Service'].newService(service.ref) if title: title = title + ' - ' + service.getServiceName() else: title = service.getServiceName() self.setTitle(title) l.fillSingleEPG(service) l.sortSingleEPG(int(config.epgselection.sort.getValue())) else: l.fillSimilarList(self.currentService, self.eventid)
def getMovieList(self): self.movielist.reload(root=self.root, filter_tags=self.tagfilter) list = [] tag = self.cmd['tag'] tag = tag and tag.lower() for (serviceref, info, begin, unknown) in self.movielist.list: if serviceref.flags & eServiceReference.mustDescent: # Skip subdirectories (TODO: Browse?) continue rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if rtime > 0: t = FuzzyTime(rtime, inPast=True) begin_string = t[0] + ", " + t[1] else: begin_string = "undefined" if config.plugins.Webinterface.loadmovielength.value: len = info.getLength(serviceref) if len > 0: len = "%d:%02d" % (len / 60, len % 60) else: len = "?:??" else: len = "disabled" sourceERef = info.getInfoString(serviceref, iServiceInformation.sServiceref) sourceRef = ServiceReference(sourceERef) event = info.getEvent(serviceref) ext = event and event.getExtendedDescription() or "" filename = "/" + "/".join(serviceref.toString().split("/")[1:]) servicename = ServiceReference(serviceref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') if not tag or tag in info.getInfoString(serviceref, iServiceInformation.sTags).lower(): """ add movie only to list, if a given tag is applied to the movie """ list.append(( serviceref.toString(), servicename, info.getInfoString(serviceref, iServiceInformation.sDescription), rtime, begin_string, len, sourceRef.getServiceName(), info.getInfoString(serviceref, iServiceInformation.sTags), ext, filename, os_stat(filename)[6] )) return list
def getParentalControlList(): if not config.ParentalControl.configured.value: return {"result": True, "services": []} parentalControl.open() if config.ParentalControl.type.value == "whitelist": tservices = parentalControl.whitelist else: tservices = parentalControl.blacklist services = [] if tservices is not None: for service in tservices: tservice = ServiceReference(service) services.append({"servicereference": service, "servicename": tservice.getServiceName()}) return {"result": True, "type": config.ParentalControl.type.value, "services": services}
def getMovieList(self): self.movielist.reload(root=self.root, filter_tags=self.tagfilter) lst = [] append = lst.append loadLength = config.plugins.Webinterface.loadmovielength.value for (serviceref, info, begin, unknown) in self.movielist.list: if serviceref.flags & eServiceReference.mustDescent: # Skip subdirectories (TODO: Browse?) continue rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if rtime > 0: t = FuzzyTime(rtime, inPast=True) begin_string = t[0] + ", " + t[1] else: begin_string = _("undefined") if loadLength: Len = info.getLength(serviceref) if Len > 0: Len = "%d:%02d" % (Len / 60, Len % 60) else: Len = "?:??" else: Len = _("disabled") sourceERef = info.getInfoString(serviceref, iServiceInformation.sServiceref) sourceRef = ServiceReference(sourceERef) event = info.getEvent(serviceref) ext = event and event.getExtendedDescription() or "" filename = "/" + "/".join(serviceref.toString().split("/")[1:]) servicename = ServiceReference(serviceref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') append(( serviceref.toString(), servicename, info.getInfoString(serviceref, iServiceInformation.sDescription), rtime, begin_string, Len, sourceRef.getServiceName(), info.getInfoString(serviceref, iServiceInformation.sTags), ext, filename, os_stat(filename)[6] )) return lst
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': self.servicelist.append((service_name, ConfigNothing(), 0, service_ref.ref.toString())) self['ServiceList'].l.setList(self.servicelist) self.setServiceListInfo()
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', ' <e2state>OK</e2state>\n' ' <e2message>', stringToXML(message), '</e2message>\n' '</e2simulatedtimer>\n' )) if skipped: for (name, begin, end, serviceref, autotimername, message) in skipped: 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', ' <e2state>Skip</e2state>\n' ' <e2message>', stringToXML(message), '</e2message>\n' '</e2simulatedtimer>\n' )) if self._stillAlive: reactor.callFromThread(lambda: self._req.write(''.join(returnlist)))
def render(self, req): req.setResponseCode(http.OK) req.setHeader('Content-type', 'application/xhtml+xml') req.setHeader('charset', 'UTF-8') if 'sref' in req.args: services = OrderedSet() bouquets = OrderedSet() for sref in req.args.get('sref'): sref = unquote(sref) ref = eServiceReference(sref) if not ref.valid(): services = bouquets = None break elif (ref.flags & 7) == 7: epgservice = EPGRefreshService(sref, None) if epgservice not in bouquets: bouquets.add(epgservice) else: if not (ref.flags & eServiceReference.isGroup): # strip all after last : pos = sref.rfind(':') if pos != -1: if sref[pos-1] == ':': pos -= 1 sref = sref[:pos+1] epgservice = EPGRefreshService(sref, None) if epgservice not in services: services.add(epgservice) if services is not None and bouquets is not None: scanServices = epgrefresh.generateServicelist(services, bouquets) else: scanServices = [] else: scanServices = epgrefresh.generateServicelist(epgrefresh.services[0], epgrefresh.services[1]) returnlist = ["<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<e2servicelist>"] extend = returnlist.extend for serviceref in scanServices: ref = ServiceReference(str(serviceref)) returnlist.extend(( ' <e2service>\n', ' <e2servicereference>', stringToXML(str(serviceref)), '</e2servicereference>\n', ' <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n', ' </e2service>\n', )) returnlist.append('\n</e2servicelist>') return ''.join(returnlist)
def addProviderToBouquetlist(self, param): print "[WebComponents.BouquetEditor] addProviderToBouquet with param = ", param refstr = param["sProviderRef"] if refstr is None: return (False, "No provider given!") mode = MODE_TV # init if "mode" in param: if param["mode"] is not None: mode = int(param["mode"]) ref = eServiceReference(refstr) provider = ServiceReference(ref) providerName = provider.getServiceName() serviceHandler = eServiceCenter.getInstance() services = serviceHandler.list(provider.ref) return self.addBouquet(providerName, mode, services and services.getContent('R', True))
def getParentalControlList(): if not config.ParentalControl.configured.value: return {"result": True, "services": []} if config.ParentalControl.type.value == "whitelist": tservices = parentalControl.openListFromFile(LIST_WHITELIST) else: tservices = parentalControl.openListFromFile(LIST_BLACKLIST) services = [] for service in tservices: tservice = ServiceReference(service) services.append({"servicereference": service, "servicename": tservice.getServiceName()}) return {"result": True, "services": services}
def buildMovieListEntry(self, serviceref, info, begin, len): if serviceref.flags & eServiceReference.mustDescent: return None 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) servicename = "" if service is not None: servicename = service.getServiceName() begin_string = "" if begin > 0: t = FuzzyTime(begin) begin_string = t[0] + ", " + t[1] if self.list_type == MovieList.LISTTYPE_ORIGINAL: res.extend((txt, tags, servicename, description, begin_string, len)) elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION: res.extend((txt, description, begin_string, servicename, len)) elif self.list_type == MovieList.LISTTYPE_COMPACT: res.extend((txt, tags, servicename, begin_string, len)) else: assert(self.list_type == MovieList.LISTTYPE_MINIMAL) if self.descr_state == MovieList.SHOW_DESCRIPTION: res.extend((txt, begin_string)) else: res.extend((txt, len)) return res
def getMovieList(self): self.movielist.reload(root=self.root, filter_tags=self.tagfilter) lst = [] append = lst.append loadLength = config.plugins.Webinterface.loadmovielength.value for (serviceref, info, begin, unknown) in self.movielist.list: rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if rtime > 0: t = FuzzyTime(rtime) begin_string = t[0] + ", " + t[1] else: begin_string = _("undefined") if loadLength: Len = info.getLength(serviceref) if Len > 0: Len = "%d:%02d" % (Len / 60, Len % 60) else: Len = "?:??" else: Len = _("disabled") sourceERef = info.getInfoString(serviceref, iServiceInformation.sServiceref) sourceRef = ServiceReference(sourceERef) event = info.getEvent(serviceref) ext = event and event.getExtendedDescription() or "" filename = "/%s" %(serviceref.getPath(),) servicename = ServiceReference(serviceref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') append(( serviceref.toString(), servicename, info.getInfoString(serviceref, iServiceInformation.sDescription), rtime, begin_string, Len, sourceRef.getServiceName(), info.getInfoString(serviceref, iServiceInformation.sTags), ext, filename, info.getInfoObject(serviceref, iServiceInformation.sFileSize), )) return lst
def updateInfos(self): self.resetExitTimer() # update data current = ServiceReference(self.servicelist.getCurrentSelection()) self["NowChannel"].setText(current.getServiceName()) nowepg, nowtimedisplay = self.getEPGNowNext(current.ref,0) nextepg, nexttimedisplay = self.getEPGNowNext(current.ref,1) self["NowEPG"].setText(nowepg) self["NextEPG"].setText(nextepg) self["NowTime"].setText(nowtimedisplay) self["NextTime"].setText(nexttimedisplay) if not nowepg: # no epg found --> let's try it again, but only if PiP is activated if self.pipAvailable: self.CheckForEPG.start(3000, True) if self.pipAvailable: # play in videowindow self.playService(current.ref)
def buildEPGSearchEntry(self, service, eventId, beginTime, duration, EventName): self.wasEntryAutoTimer = None clock_pic = self.getPixmapForEntry(service, eventId, beginTime, duration) clock_pic_partnerbox = None # Partnerbox if PartnerBoxIconsEnabled: rec2 = beginTime and (isInRemoteTimer(self, beginTime, duration, service)) if rec2: clock_pic_partnerbox = getRemoteClockPixmap( self, service, beginTime, duration, eventId) else: rec2 = False r1 = self.weekday_rect r2 = self.datetime_rect r3 = self.descr_rect t = localtime(beginTime) serviceref = ServiceReference(service) # for Servicename 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, r1.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, strftime("%e/%m, %-H:%M", t)) ] if clock_pic or clock_pic_partnerbox: if clock_pic and clock_pic_partnerbox and self.wasEntryAutoTimer: res.extend( ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 65, (r3.h / 2 - 11), 21, 21, self.autotimericon), (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 43, (r3.h / 2 - 11), 21, 21, self.clocks[clock_pic]), (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21, self.clocks[clock_pic_partnerbox]), (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y, r3.w - 66, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName))) elif clock_pic and clock_pic_partnerbox: # Partnerbox and local res.extend( ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 43, (r3.h / 2 - 11), 21, 21, self.clocks[clock_pic]), (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21, self.clocks[clock_pic_partnerbox]), (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y, r3.w - 44, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName))) elif clock_pic_partnerbox: # Partnerbox and local res.extend( ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21, self.clocks[clock_pic_partnerbox]), (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y, r3.w - 21, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName))) elif self.wasEntryAutoTimer: res.extend( ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 43, (r3.h / 2 - 11), 21, 21, self.autotimericon), (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21, self.clocks[clock_pic]), (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y, r3.w - 44, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName))) else: res.extend( ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21, self.clocks[clock_pic]), (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y, r3.w - 21, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName))) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y, r3.w, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName)) return res
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 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 >>= 1 if count == 1: repeated = "weekly" else: # once type = "once" repeated = None weekday = int(strftime("%u", localtime(self.timer.begin))) - 1 day[weekday] = 1 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]) self.timertyp = self.timerentry_justplay.value 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_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.replace( '\xc2\x86', '').replace('\xc2\x87', '').encode("utf-8"), 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[:] # 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=_("%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 = False, choices = [(True, _("yes")), (False, _("no"))]) 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=_("%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]) 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) 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 complettion 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 ecaxtly that." ))) 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?")) self.tagsSet = getConfigListEntry( _("Tags"), self.timerentry_tagsset, _("Choose a tag for easy finding a recording.")) 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 Recording"), self.timerentry_afterevent, _("What action is required on complettion 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 ecaxtly 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 self.has_key("VKeyIcon"): self["VirtualKB"].setEnabled(True) self["VKeyIcon"].boolean = True if self.has_key("HelpWindow"): 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 self.has_key("VKeyIcon"): self["VirtualKB"].setEnabled(False) self["VKeyIcon"].boolean = False else: if self.has_key("VKeyIcon"): 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) 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, 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 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 # 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, 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" 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 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 __onStreamingEvent(self, event, stream): if StreamingWebScreen and stream: if event == StreamingWebScreen.EVENT_START: try: from Plugins.Extensions.WebInterface.WebScreens import streamingScreens except: streamingScreens = [] # Extract parameters tuner, tunertype = getTuner( stream.getRecordService() ) ref = stream.getRecordServiceRef() ip = stream.clientIP #TEST_MULTIPLESTREAMS id = str(stream.screenIndex) + str(ip) #id = str(ref) + str(ip) ##id = str(ref.toString()) + str(ip) # Delete references to avoid blocking tuners del stream port, host, client = "", "", "" # # Workaround to retrieve the client ip # # Change later and use the WebScreens getActiveStreamingClients if implemented # ipports = [ (win.ip, win.port) for win in self.entries.itervalues() ] # for conn in netstat(getstate='ESTABLISHED', getuid=False, getpid=False, readable=False): # # Check if it is a streaming connection # if conn[3] == '8001': # ip = conn[4] # port = conn[5] # # Check if ip and port is already known # if (ip, port) not in ipports: # break # else: # # No new connection found, leave it empty # ip, port, = "", "" #TODO Port is actually not given event = ref and self.epg and self.epg.lookupEventTime(ref, -1, 0) if event: name = event.getEventName() else: name = "" #TODO check file streaming service_ref = ServiceReference(ref) filename = "" #TODO file streaming - read meta eit try: host = ip and socket.gethostbyaddr( ip ) client = host and host[0].split('.')[0] except socket.herror, x: pass number = service_ref and getNumber(service_ref.ref) channel = service_ref and service_ref.getServiceName() win = self.session.instantiateDialog(TunerState, Stream, tuner, tunertype, name, number, channel, filename, client, ip, port) self.entries[id] = win if config.infobartunerstate.show_events.value: self.show(True) elif event == StreamingWebScreen.EVENT_END: # Remove Finished Stream #TEST_MULTIPLESTREAMS id = str(stream.screenIndex) + str(stream.clientIP) #id = str(stream.getRecordServiceRef()) + str(stream.clientIP) ##id = str(stream.getRecordServiceRef().toString()) + str(stream.clientIP) # Delete references to avoid blocking tuners del stream if id in self.entries: win = self.entries[id] begin = win.begin end = time() endless = False win.updateType( Finished ) win.updateTimes( begin, end, endless ) if config.infobartunerstate.show_events.value: self.show(True)
def tunerShow(self, forceshow=False): print("IBTS tunerShow") self.updateNextTimer() if self.entries: # There are active entries # Close info screen if self.info: self.info.hide() # Rebind InfoBar Events #self.bindInfoBar() # Only show the Tuner information dialog, # if no screen is displayed or the InfoBar is visible #TODO Info can also be showed if info.rectangle is outside currentdialog.rectangle # if self.session.current_dialog is None \ # or isinstance(self.session.current_dialog, InfoBar): #MAYBE Tuner Informationen werden zusammen mit der EMCMediaCenter InfoBar angezeigt #or isinstance(self.session.current_dialog, EMCMediaCenter): # Delete entries: # if entry reached timeout # if number of entries is reached numberfinished = 0 for id, win in sorted(self.entries.items(), key=lambda x: (x[1].end), reverse=True): if win.type == FINISHED: numberfinished += 1 if win.toberemoved == True \ or win.type == FINISHED and numberfinished > int(config.infobartunerstate.number_finished_records.value): # Delete Stopped Timers self.session.deleteDialog(win) del self.entries[id] # Update windows # Dynamic column resizing and repositioning widths = [] for id, win in self.entries.items(): if win.type == RECORD: #TODO Avolid blocking - avoid using getTimer to update the timer times use timer.time_changed if possible timer = getTimer(id) #print id, timer if timer: begin = timer.begin end = timer.end endless = timer.autoincrease if not win.tuner or not win.tunertype: win.tuner, win.tunertype = getTuner(timer.record_service) service_ref = None if not win.channel or not win.number: service_ref = timer.service_ref del timer if service_ref: win.number = win.number or service_ref and getNumber(service_ref.ref) win.channel = win.channel or service_ref and service_ref.getServiceName() win.channel = win.channel.replace('\xc2\x86', '').replace('\xc2\x87', '') win.updateTimes(begin, end, endless) win.update() else: # This can happen, if the time has been changed or if the timer does not exist anymore begin = win.begin end = win.end if end < begin or end > time(): end = time() endless = False win.updateType(FINISHED) win.updateTimes(begin, end, endless) win.update() #TEST del self.entries[id] self.updateRecordTimer() elif win.type == STREAM: if config.infobartunerstate.show_streams.value: #TODO Avolid blocking - avoid using getStream to update the current name stream = getStream(id) if stream: ref = stream.getRecordServiceRef() if not win.tuner or not win.tunertype: win.tuner, win.tunertype = getTuner(stream.getRecordService()) del stream event = ref and self.epg and self.epg.lookupEventTime(ref, -1, 0) if event: name = event.getEventName() else: name = "" begin = win.begin end = None endless = True service_ref = None if not win.number: service_ref = ServiceReference(ref) win.number = service_ref and getNumber(service_ref.ref) if not win.channel: service_ref = service_ref or ServiceReference(ref) win.channel = win.channel or service_ref and service_ref.getServiceName() win.updateName(name) win.updateTimes(begin, end, endless) win.update() else: win.toberemoved = True else: # Should never happen delete begin = win.begin end = time() endless = False win.updateType(FINISHED) win.updateTimes(begin, end, endless) win.update() else: # Type INFO / FINISHED win.update() # Calculate field width widths = map(lambda (w1, w2): max(w1, w2), zip_longest(widths, win.widths)) #if self.entries: # Get initial padding / offset position and apply user offset padding = self.padding + int(config.infobartunerstate.offset_padding.value) #print "IBTS px, self.padding, config.padding", px, self.padding, int(config.infobartunerstate.offset_padding.value) # Calculate field spacing spacing = self.spacing + int(config.infobartunerstate.offset_spacing.value) #print "IBTS spacing, self.spaceing, config.spacing", spacing, self.spacing, int(config.infobartunerstate.offset_spacing.value) #widths = [ width+spacing if width>0 else 0 for width in widths ] # Apply user offsets posx = self.positionx + int(config.infobartunerstate.offset_horizontal.value) #print "IBTS posx, self.positionx, config.offset_horizontal", posx, self.positionx, int(config.infobartunerstate.offset_horizontal.value) posy = self.positiony + int(config.infobartunerstate.offset_vertical.value) height = self.height #print "IBTS widths", widths # Handle maximum width overwidth = posx + sum(widths) + len([w for w in widths if w]) * spacing + padding - self.desktopwidth + int(config.infobartunerstate.offset_rightside.value) #print "IBTS overwidth", overwidth # Order windows #wins = sorted( self.entries.itervalues(), key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=False ) #TEST 1 #wins = sorted( self.entries.itervalues(), key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=config.infobartunerstate.list_goesup.value ) #TEST 2 #wins = [] #wins = sorted( [ w for w in self.entries.values() if w.type == INFO ], key=lambda x: (x.type, x.endless, x.begin), reverse=False ) #wins.extend( sorted( [ w for w in self.entries.values() if w.type == RECORD ], key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=False ) ) #wins.extend( sorted( [ w for w in self.entries.values() if w.type == FINISHED ], key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=False ) ) #wins.extend( sorted( [ w for w in self.entries.values() if w.type == STREAM ], key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=False ) ) #if config.infobartunerstate.list_goesup.value: # wins.reverse() #TEST 3 wins = sorted(self.entries.itervalues(), key=lambda x: (x.type, x.endless, x.begin), reverse=config.infobartunerstate.list_goesup.value) # Resize, move and show windows for win in wins: win.move(posx, posy) win.reorder(widths, overwidth) posy += height # Show windows win.show() elif forceshow: # No entries available try: if not self.info: self.info = self.session.instantiateDialog(TunerStateInfo, _("Nothing running")) self.info.show() print("IBTS self.info.type", self.info.type) except Exception as e: print("InfoBarTunerState show exception " + str(e))
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, descramble = True, record_ecm = False): 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.descramble = descramble self.record_ecm = record_ecm 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), self.descramble, self.record_ecm) 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 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
class TimerEntry(Screen, ConfigListScreen): def __init__(self, session, timer): Screen.__init__(self, session) self.timer = timer 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.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, "yellow": self.changeTimerType, "blue": self.changeZapWakeupType }, -2) self.list = [] ConfigListScreen.__init__(self, self.list, session=session) self.setTitle(_("Timer entry")) self.createSetup("config") def createConfig(self): 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 config.movielist.videodirs.load() 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_remote = ConfigYesNo( default=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 = 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 self.timerentry_service_ref = self.timer.service_ref self.timerentry_service = ConfigSelection([servicename]) def createSetup(self, widget): self.list = [] self.entryRemoteTimer = getConfigListEntry(_("Remote Timer"), self.timerentry_remote) if config.usage.remote_fallback_external_timer.value and config.usage.remote_fallback.value: self.list.append(self.entryRemoteTimer) 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.conflictDetectionEntry = getConfigListEntry( _("Enable timer conflict detection"), self.timerentry_conflictdetection) if not self.timerentry_remote.value: self.list.append(self.conflictDetectionEntry) 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.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.entryRemoteTimer): 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) elif self.timerentry_remote.value: service_ref = self.timerentry_service_ref if self.timer.eit is not None: event = eEPGCache.getInstance().lookupEventId( service_ref.ref, self.timer.eit) if event: n = event.getNumOfLinkageServices() if n > 1: tlist = [] ref = self.session.nav.getCurrentlyPlayingServiceReference( ) parent = 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.RemoteSubserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list=tlist, selection=selection) return elif n > 0: parent = service_ref.ref service_ref = ServiceReference( event.getLinkageService(parent, 0)) #resolve alternative alternative_ref = GetWithAlternative(str(service_ref)) service_ref = ':'.join(alternative_ref.split(':')[:11]) # XXX: this will - without any hassle - ignore the value of repeated begin, end = self.getBeginEnd() # when a timer end is set before the start, add 1 day if end < begin: end += 86400 rt_name = urllib.quote( self.timerentry_name.value.decode('utf8').encode( 'utf8', 'ignore')) rt_description = urllib.quote( self.timerentry_description.value.decode('utf8').encode( 'utf8', 'ignore')) rt_disabled = 0 # XXX: do we really want to hardcode this? why do we offer this option then? rt_repeated = 0 # XXX: same here rt_dirname = "/hdd/movie" if self.timerentry_justplay.value == "zap": rt_justplay = 1 else: rt_justplay = 0 rt_eit = 0 if self.timer.eit is not None: rt_eit = self.timer.eit rt_afterEvent = { "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY, "nothing": AFTEREVENT.NONE, "auto": AFTEREVENT.AUTO }.get(self.timerentry_afterevent.value, AFTEREVENT.AUTO) url = "%s/web/timeradd?sRef=%s&begin=%s&end=%s&name=%s&description=%s&disabled=%s&justplay=%s&afterevent=%s&repeated=%s&dirname=%s&eit=%s" % ( config.usage.remote_fallback.value.rsplit(":", 1)[0], service_ref, begin, end, rt_name, rt_description, rt_disabled, rt_justplay, rt_afterEvent, rt_repeated, rt_dirname, rt_eit) print "[RemoteTimer] debug remote", url from Screens.TimerEdit import getUrl getUrl(url).addCallback(self.remoteTimerOK).addErrback( self.remoteTimerNOK) else: 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.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 remoteTimerOK(self, *args): self.close((False, True)) def remoteTimerNOK(self, *args): print "[TimerEntry] Something when wrong with uploading 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): 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)
def buildMovieListEntry(self, serviceref, info, begin, len): if serviceref.flags & eServiceReference.mustDescent: return None width = self.l.getItemSize().width() iconSize = 0 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: ih1 = (ih * 2) / 5 # 75 -> 30 ih2 = (ih * 2) / 3 # 75 -> 50 res.append( MultiContentEntryText(pos=(0, 0), size=(width - 232, ih1), font=0, flags=RT_HALIGN_LEFT, text=txt)) if self.tags: res.append( MultiContentEntryText(pos=(width - 230, 0), size=(230, ih1), font=2, flags=RT_HALIGN_RIGHT, text=tags)) if service is not None: res.append( MultiContentEntryText(pos=(230, ih2), size=(230, ih2 - ih1), font=1, flags=RT_HALIGN_LEFT, text=service.getServiceName())) else: if service is not None: res.append( MultiContentEntryText(pos=(width - 220, 0), size=(220, 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)) if config.skin.xres.value == 1920: res.append( MultiContentEntryText(pos=(0, ih2), size=(220, ih - ih2), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) else: res.append( MultiContentEntryText(pos=(0, ih2), size=(200, ih - ih2), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) res.append( MultiContentEntryText(pos=(width - 200, ih2), size=(198, ih - ih2), 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 if len: lenSize = 58 * ih / 37 else: lenSize = 0 if config.skin.xres.value == 1920: res.append( MultiContentEntryText(pos=(0, 0), size=(width - 200, ih1), font=0, flags=RT_HALIGN_LEFT, text=txt)) else: res.append( MultiContentEntryText(pos=(0, 0), size=(width - 140, ih1), font=0, flags=RT_HALIGN_LEFT, text=txt)) res.append( MultiContentEntryText(pos=(0, ih1), size=(width - 184 - lenSize, ih - ih1), font=1, flags=RT_HALIGN_LEFT, text=description)) if config.skin.xres.value == 1920: res.append( MultiContentEntryText(pos=(width - 200, 6), size=(200, ih1), font=1, flags=RT_HALIGN_RIGHT, text=begin_string)) else: res.append( MultiContentEntryText(pos=(width - 140, 6), size=(140, ih1), font=1, flags=RT_HALIGN_RIGHT, text=begin_string)) if service is not None: if config.skin.xres.value == 1920: res.append( MultiContentEntryText(pos=(width - 240 - lenSize, ih1), size=(240, ih - ih1), font=1, flags=RT_HALIGN_RIGHT, text=service.getServiceName())) else: res.append( MultiContentEntryText(pos=(width - 164 - lenSize, ih1), size=(164, ih - ih1), font=1, flags=RT_HALIGN_RIGHT, text=service.getServiceName())) if lenSize: res.append( MultiContentEntryText(pos=(width - lenSize, ih1), size=(lenSize, ih - 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 if len: lenSize = 2 * ih else: lenSize = 0 res.append( MultiContentEntryText(pos=(0, 0), size=(width - lenSize - iconSize, ih1), font=0, flags=RT_HALIGN_LEFT, text=txt)) if self.tags: res.append( MultiContentEntryText(pos=(width - 200, ih1), size=(200, ih - ih1), font=1, flags=RT_HALIGN_RIGHT, text=tags)) if service is not None: res.append( MultiContentEntryText(pos=(200, ih1), size=(200, ih - ih1), font=1, flags=RT_HALIGN_LEFT, text=service.getServiceName())) else: if service is not None: res.append( MultiContentEntryText(pos=(width - 260, ih1), size=(260, ih - ih1), font=1, flags=RT_HALIGN_RIGHT, text=service.getServiceName())) res.append( MultiContentEntryText(pos=(0, ih1), size=(200, ih - ih1), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) if lenSize: res.append( MultiContentEntryText(pos=(width - lenSize, 0), size=(lenSize, ih1), font=0, flags=RT_HALIGN_RIGHT, text=len)) else: assert (self.list_type == MovieList.LISTTYPE_MINIMAL) if (self.descr_state == MovieList.SHOW_DESCRIPTION) or not len: dateSize = ih * 145 / 25 # 25 -> 145 res.append( MultiContentEntryText(pos=(0, 0), size=(width - iconSize - 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 * 3 # 25 -> 75 res.append( MultiContentEntryText(pos=(0, 0), size=(width - lenSize - iconSize, 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
class RecordTimerEntry(timer.TimerEntry, object): def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.AUTO, checkOldTimers = False, dirname = None, tags = None, descramble = 'notset', record_ecm = 'notset', isAutoTimer = False, always_zap = False): timer.TimerEntry.__init__(self, int(begin), int(end)) if checkOldTimers: if self.begin < time() - 1209600: self.begin = int(time()) if self.end < self.begin: self.end = self.begin assert isinstance(serviceref, ServiceReference) if serviceref and 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.always_zap = always_zap self.afterEvent = afterEvent self.dirname = dirname self.dirnameHadToFallback = False self.autoincrease = False self.autoincreasetime = 3600 * 24 # 1 day self.tags = tags or [] if descramble == 'notset' and record_ecm == 'notset': if config.recording.ecm_data.value == 'descrambled+ecm': self.descramble = True self.record_ecm = True elif config.recording.ecm_data.value == 'scrambled+ecm': self.descramble = False self.record_ecm = True elif config.recording.ecm_data.value == 'normal': self.descramble = True self.record_ecm = False else: self.descramble = descramble self.record_ecm = record_ecm self.isAutoTimer = isAutoTimer self.wasInStandby = False self.log_entries = [] self.resetState() def __repr__(self): if not self.disabled: return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s, isAutoTimer=%s)" % (self.name, ctime(self.begin), self.service_ref, self.justplay, self.isAutoTimer) else: return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s, isAutoTimer=%s, Disabled)" % (self.name, ctime(self.begin), self.service_ref, self.justplay, self.isAutoTimer) def log(self, code, msg): self.log_entries.append((int(time()), code, msg)) print "[TIMER]", msg def freespace(self): self.MountPath = None if not self.dirname: dirname = findSafeRecordPath(defaultMoviePath()) else: dirname = findSafeRecordPath(self.dirname) if dirname is None: dirname = findSafeRecordPath(defaultMoviePath()) self.dirnameHadToFallback = True if not dirname: return False self.MountPath = dirname mountwriteable = os.access(dirname, os.W_OK) if not mountwriteable: self.log(0, ("Mount '%s' is not writeable." % dirname)) return False s = os.statvfs(dirname) if (s.f_bavail * s.f_bsize) / 1000000 < 1024: self.log(0, "Not enough free space to record") return False else: self.log(0, "Found enough free space to record") return True def calculateFilename(self): service_name = self.service_ref.getServiceName() begin_date = strftime("%Y%m%d %H%M", 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.recording.filename_composition.value == "short": filename = strftime("%Y%m%d", localtime(self.begin)) + " - " + self.name elif config.recording.filename_composition.value == "long": filename += " - " + self.name + " - " + self.description else: filename += " - " + self.name # standard if config.recording.ascii_filenames.value: filename = ASCIItranslit.legacyEncode(filename) self.Filename = Directories.getRecordingFilename(filename, self.MountPath) self.log(0, "Filename calculated as: '%s'" % self.Filename) return self.Filename def tryPrepare(self): if self.justplay: return True else: if not self.calculateFilename(): self.do_backoff() self.start_prepare = time() + self.backoff return False 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 == "": self.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), bool(self.descramble), bool(self.record_ecm)) 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 not self.justplay and not self.freespace(): Notifications.AddPopup(text = _("Write error while recording. Disk full?\n%s") % self.name, type = MessageBox.TYPE_ERROR, timeout = 5, id = "DiskFullMessage") self.failed = True self.next_activation = time() self.end = time() + 5 self.backoff = 0 return True if self.always_zap: if Screens.Standby.inStandby: self.wasInStandby = True eActionMap.getInstance().bindAction('', -maxint - 1, self.keypress) #set service to zap after standby Screens.Standby.inStandby.prev_running_service = self.service_ref.ref Screens.Standby.inStandby.paused_service = None #wakeup standby Screens.Standby.inStandby.Power() self.log(5, "wakeup and zap to recording service") else: cur_zap_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference() if cur_zap_ref and not cur_zap_ref.getPath():# we do not zap away if it is no live service 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) self.log(5, "zap to recording service") 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: global wasRecTimerWakeup if os.path.exists("/tmp/was_rectimer_wakeup") and not wasRecTimerWakeup: wasRecTimerWakeup = int(open("/tmp/was_rectimer_wakeup", "r").read()) and True or False os.remove("/tmp/was_rectimer_wakeup") self.autostate = Screens.Standby.inStandby # if this timer has been cancelled, just go to "end" state. if self.cancelled: return True if self.failed: return True if self.justplay: if Screens.Standby.inStandby: self.wasInStandby = True eActionMap.getInstance().bindAction('', -maxint - 1, self.keypress) self.log(11, "wakeup and zap") #set service to zap after standby Screens.Standby.inStandby.prev_running_service = self.service_ref.ref Screens.Standby.inStandby.paused_service = None #wakeup standby Screens.Standby.inStandby.Power() else: self.log(11, "zapping") NavigationInstance.instance.isMovieplayerActive() from Screens.ChannelSelection import ChannelSelection ChannelSelectionInstance = ChannelSelection.instance self.service_types = service_types_tv if ChannelSelectionInstance: if config.usage.multibouquet.value: bqrootstr = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet' else: bqrootstr = '%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'% self.service_types rootstr = '' serviceHandler = eServiceCenter.getInstance() rootbouquet = eServiceReference(bqrootstr) bouquet = eServiceReference(bqrootstr) bouquetlist = serviceHandler.list(bouquet) if not bouquetlist is None: while True: bouquet = bouquetlist.getNext() if bouquet.flags & eServiceReference.isDirectory: ChannelSelectionInstance.clearPath() ChannelSelectionInstance.setRoot(bouquet) servicelist = serviceHandler.list(bouquet) if not servicelist is None: serviceIterator = servicelist.getNext() while serviceIterator.valid(): if self.service_ref.ref == serviceIterator: break serviceIterator = servicelist.getNext() if self.service_ref.ref == serviceIterator: break ChannelSelectionInstance.enterPath(rootbouquet) ChannelSelectionInstance.enterPath(bouquet) ChannelSelectionInstance.saveRoot() ChannelSelectionInstance.saveChannel(self.service_ref.ref) ChannelSelectionInstance.addToHistory(self.service_ref.ref) 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 getMovieSearchList(rargs=None, locations=None): movieliste = [] tag = None directory = None fields = None short = None extended = None searchstr = None if rargs: searchstr = getUrlArg2(rargs, "find") short = getUrlArg2(rargs, "short") extended = getUrlArg2(rargs, "extended") s = {'title': str(searchstr)} if short is not None: s['shortDesc'] = str(searchstr) if extended is not None: s['extDesc'] = str(searchstr) movielist = MovieList(None) vdir_list = [] for x in moviedb.searchContent(s, 'ref', query_type="OR", exactmatch=False): vdir_list.append(eServiceReference(x[0])) root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + "/") movielist.load(root, None) movielist.reload(root=None, vdir=5, vdir_list=vdir_list) for (serviceref, info, begin, unknown) in movielist.list: if serviceref.flags & eServiceReference.mustDescent: continue length_minutes = 0 txtdesc = "" filename = '/'.join(serviceref.toString().split("/")[1:]) filename = '/' + filename name, ext = os.path.splitext(filename) sourceRef = ServiceReference( info.getInfoString(serviceref, iServiceInformation.sServiceref)) rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) movie = { 'filename': filename, 'filename_stripped': filename.split("/")[-1], 'serviceref': serviceref.toString(), 'length': "?:??", 'lastseen': 0, 'filesize_readable': '', 'recordingtime': rtime, 'begintime': 'undefined', 'eventname': ServiceReference(serviceref).getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', ''), 'servicename': sourceRef.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), 'tags': info.getInfoString(serviceref, iServiceInformation.sTags), 'fullname': serviceref.toString(), } if rtime > 0: movie['begintime'] = FuzzyTime2(rtime) try: length_minutes = info.getLength(serviceref) except: # noqa: E722 pass if length_minutes: movie['length'] = "%d:%02d" % (length_minutes / 60, length_minutes % 60) # if fields is None or 'pos' in fields: # movie['lastseen'] = getPosition(filename + '.cuts', length_minutes) if fields is None or 'desc' in fields: txtfile = name + '.txt' if ext.lower() != '.ts' and os.path.isfile(txtfile): with open(txtfile, "rb") as handle: txtdesc = six.ensure_str(b''.join(handle.readlines())) event = info.getEvent(serviceref) extended_description = event and event.getExtendedDescription( ) or "" if extended_description == '' and txtdesc != '': extended_description = txtdesc movie['descriptionExtended'] = ConvertDesc(extended_description) desc = info.getInfoString(serviceref, iServiceInformation.sDescription) movie['description'] = ConvertDesc(desc) if fields is None or 'size' in fields: size = 0 sz = '' try: size = os.stat(filename).st_size if size > 1073741824: sz = "%.2f %s" % ((size / 1073741824.), _("GB")) elif size > 1048576: sz = "%.2f %s" % ((size / 1048576.), _("MB")) elif size > 1024: sz = "%.2f %s" % ((size / 1024.), _("kB")) except: # noqa: E722 pass movie['filesize'] = size movie['filesize_readable'] = sz movieliste.append(movie) return {"movies": movieliste, "locations": []}
def getMovieDetails(sRef=None): service = ServiceReference(sRef) if service is not None: serviceref = service.ref length_minutes = 0 txtdesc = "" fullpath = serviceref.getPath() filename = '/'.join(fullpath.split("/")[1:]) filename = '/' + filename name, ext = os.path.splitext(filename) serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(serviceref) sourceRef = ServiceReference( info.getInfoString(serviceref, iServiceInformation.sServiceref)) rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) movie = { 'filename': filename, 'filename_stripped': filename.split("/")[-1], 'serviceref': serviceref.toString(), 'length': "?:??", 'lastseen': 0, 'filesize_readable': '', 'recordingtime': rtime, 'begintime': 'undefined', 'eventname': service.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), 'servicename': sourceRef.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), 'tags': info.getInfoString(serviceref, iServiceInformation.sTags), 'fullname': serviceref.toString(), } if rtime > 0: movie['begintime'] = FuzzyTime2(rtime) try: length_minutes = info.getLength(serviceref) except: # noqa: E722 pass if length_minutes: movie['length'] = "%d:%02d" % (length_minutes / 60, length_minutes % 60) movie['lastseen'] = _moviePlayState(filename + '.cuts', serviceref, length_minutes) or 0 txtfile = name + '.txt' if ext.lower() != '.ts' and os.path.isfile(txtfile): with open(txtfile, "rb") as handle: txtdesc = six.ensure_str(b''.join(handle.readlines())) event = info.getEvent(serviceref) extended_description = event and event.getExtendedDescription() or "" if extended_description == '' and txtdesc != '': extended_description = txtdesc movie['descriptionExtended'] = ConvertDesc(extended_description) desc = info.getInfoString(serviceref, iServiceInformation.sDescription) movie['description'] = ConvertDesc(desc) size = 0 sz = '' try: size = os.stat(filename).st_size if size > 1073741824: sz = "%.2f %s" % ((size / 1073741824.), _("GB")) elif size > 1048576: sz = "%.2f %s" % ((size / 1048576.), _("MB")) elif size > 1024: sz = "%.2f %s" % ((size / 1024.), _("kB")) except: # noqa: E722 pass movie['filesize'] = size movie['filesize_readable'] = sz return {"result": True, "movie": movie} else: return { "result": False, }
def getMovieList(rargs=None, locations=None): movieliste = [] tag = None directory = None fields = None bookmarklist = [] if rargs: tag = getUrlArg2(rargs, "tag") directory = getUrlArg2(rargs, "dirname") fields = getUrlArg2(rargs, "fields") if directory is None: directory = defaultMoviePath() else: if not PY3: try: directory.decode('utf-8') except UnicodeDecodeError: try: directory = directory.decode("cp1252").encode("utf-8") except UnicodeDecodeError: directory = directory.decode("iso-8859-1").encode("utf-8") if not directory: directory = MOVIE_LIST_ROOT_FALLBACK if directory[-1] != "/": directory += "/" if not os.path.isdir(directory): return { "movies": [], "locations": [], "bookmarks": [], "directory": [], } root = eServiceReference(MOVIE_LIST_SREF_ROOT + directory) for item in sorted(os.listdir(directory)): abs_p = os.path.join(directory, item) if os.path.isdir(abs_p): bookmarklist.append(item) folders = [root] brecursive = False if rargs and b"recursive" in list(rargs.keys()): brecursive = True dirs = [] locations = [] if PY3: from glob import glob for subdirpath in glob(directory + "**/", recursive=True): locations.append(subdirpath) subdirpath = subdirpath[len(directory):] dirs.append(subdirpath) else: # FIXME SLOW!!! for subdirpath in [x[0] for x in os.walk(directory)]: locations.append(subdirpath) subdirpath = subdirpath[len(directory):] dirs.append(subdirpath) for f in sorted(dirs): if f != '': if f[-1] != "/": f += "/" ff = eServiceReference(MOVIE_LIST_SREF_ROOT + directory + f) folders.append(ff) else: # get all locations if locations is not None: folders = [] for f in locations: if f[-1] != "/": f += "/" ff = eServiceReference(MOVIE_LIST_SREF_ROOT + f) folders.append(ff) if config.OpenWebif.parentalenabled.value: dir_is_protected = checkParentalProtection(directory) else: dir_is_protected = False if not dir_is_protected: movielist = MovieList(None) for root in folders: if tag is not None: movielist.load(root=root, filter_tags=[tag]) else: movielist.load(root=root, filter_tags=None) for (serviceref, info, begin, unknown) in movielist.list: if serviceref.flags & eServiceReference.mustDescent: continue # BAD fix _serviceref = serviceref.toString().replace('%25', '%') length_minutes = 0 txtdesc = "" filename = '/'.join(_serviceref.split("/")[1:]) filename = '/' + filename name, ext = os.path.splitext(filename) sourceRef = ServiceReference( info.getInfoString(serviceref, iServiceInformation.sServiceref)) rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) movie = { 'filename': filename, 'filename_stripped': filename.split("/")[-1], 'serviceref': _serviceref, 'length': "?:??", 'lastseen': 0, 'filesize_readable': '', 'recordingtime': rtime, 'begintime': 'undefined', 'eventname': ServiceReference(serviceref).getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', ''), 'servicename': sourceRef.getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', ''), 'tags': info.getInfoString(serviceref, iServiceInformation.sTags), 'fullname': _serviceref, } if rtime > 0: movie['begintime'] = FuzzyTime2(rtime) try: length_minutes = info.getLength(serviceref) except: # noqa: E722 pass if length_minutes: movie['length'] = "%d:%02d" % (length_minutes / 60, length_minutes % 60) if fields is None or 'pos' in fields: movie['lastseen'] = _moviePlayState( filename + '.cuts', serviceref, length_minutes) or 0 if fields is None or 'desc' in fields: txtfile = name + '.txt' if ext.lower() != '.ts' and os.path.isfile(txtfile): with open(txtfile, "rb") as handle: txtdesc = six.ensure_str(b''.join( handle.readlines())) event = info.getEvent(serviceref) extended_description = event and event.getExtendedDescription( ) or "" if extended_description == '' and txtdesc != '': extended_description = txtdesc movie['descriptionExtended'] = ConvertDesc( extended_description) desc = info.getInfoString(serviceref, iServiceInformation.sDescription) movie['description'] = ConvertDesc(desc) if fields is None or 'size' in fields: size = 0 sz = '' try: size = os.stat(filename).st_size if size > 1073741824: sz = "%.2f %s" % ((size / 1073741824.), _("GB")) elif size > 1048576: sz = "%.2f %s" % ((size / 1048576.), _("MB")) elif size > 1024: sz = "%.2f %s" % ((size / 1024.), _("kB")) except: # noqa: E722 pass movie['filesize'] = size movie['filesize_readable'] = sz movieliste.append(movie) # del movielist if locations is None: return { "movies": movieliste, "bookmarks": bookmarklist, "directory": directory, "recursive": brecursive } if brecursive: return { "movies": movieliste, "locations": locations, "directory": directory, "bookmarks": bookmarklist, "recursive": brecursive } else: return { "movies": movieliste, "locations": locations, "recursive": brecursive }
class RecordTimerEntry(timer.TimerEntry, object): def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.AUTO, checkOldTimers = False, dirname = None, tags = None, descramble = 'notset', record_ecm = 'notset', rename_repeat = True, isAutoTimer = False, always_zap = False, MountPath = None): timer.TimerEntry.__init__(self, int(begin), int(end)) if checkOldTimers: if self.begin < time() - 1209600: self.begin = int(time()) if self.end < self.begin: self.end = self.begin assert isinstance(serviceref, ServiceReference) if serviceref and 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.always_zap = always_zap self.afterEvent = afterEvent self.dirname = dirname self.dirnameHadToFallback = False self.autoincrease = False self.autoincreasetime = 3600 * 24 # 1 day self.tags = tags or [] self.MountPath = None self.messageString = "" self.messageStringShow = False self.messageBoxAnswerPending = False self.justTriedFreeingTuner = False if descramble == 'notset' and record_ecm == 'notset': if config.recording.ecm_data.value == 'descrambled+ecm': self.descramble = True self.record_ecm = True elif config.recording.ecm_data.value == 'scrambled+ecm': self.descramble = False self.record_ecm = True elif config.recording.ecm_data.value == 'normal': self.descramble = True self.record_ecm = False else: self.descramble = descramble self.record_ecm = record_ecm self.needChangePriorityFrontend = config.usage.recording_frontend_priority.value != "-2" and config.usage.recording_frontend_priority.value != config.usage.frontend_priority.value self.change_frontend = False self.rename_repeat = rename_repeat self.isAutoTimer = isAutoTimer self.wasInStandby = False self.log_entries = [] self.resetState() def __repr__(self): if not self.disabled: return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s, isAutoTimer=%s)" % (self.name, ctime(self.begin), self.service_ref, self.justplay, self.isAutoTimer) else: return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s, isAutoTimer=%s, Disabled)" % (self.name, ctime(self.begin), self.service_ref, self.justplay, self.isAutoTimer) def log(self, code, msg): self.log_entries.append((int(time()), code, msg)) print "[TIMER]", msg def freespace(self): self.MountPath = None if not self.dirname: dirname = findSafeRecordPath(defaultMoviePath()) else: dirname = findSafeRecordPath(self.dirname) if dirname is None: dirname = findSafeRecordPath(defaultMoviePath()) self.dirnameHadToFallback = True if not dirname: return False self.MountPath = dirname mountwriteable = os.access(dirname, os.W_OK) if not mountwriteable: self.log(0, ("Mount '%s' is not writeable." % dirname)) return False s = os.statvfs(dirname) if (s.f_bavail * s.f_bsize) / 1000000 < 1024: self.log(0, "Not enough free space to record") return False else: self.log(0, "Found enough free space to record") return True def calculateFilename(self): service_name = self.service_ref.getServiceName() begin_date = strftime("%Y%m%d %H%M", 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.recording.filename_composition.value == "veryveryshort": filename = self.name elif config.recording.filename_composition.value == "veryshort": filename = self.name + " - " + begin_date elif config.recording.filename_composition.value == "short": filename = strftime("%Y%m%d", localtime(self.begin)) + " - " + self.name elif config.recording.filename_composition.value == "long": filename += " - " + self.name + " - " + self.description else: filename += " - " + self.name # standard if config.recording.ascii_filenames.value: filename = ASCIItranslit.legacyEncode(filename) self.Filename = Directories.getRecordingFilename(filename, self.MountPath) self.log(0, "Filename calculated as: '%s'" % self.Filename) return self.Filename def tryPrepare(self): if self.justplay: return True else: if not self.calculateFilename(): self.do_backoff() self.start_prepare = time() + self.backoff return False 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.setRecordingPreferredTuner() try: #not all images support recording type indicators self.record_service = rec_ref and NavigationInstance.instance.recordService(rec_ref,False,pNavigation.isRealRecording) except: self.record_service = rec_ref and NavigationInstance.instance.recordService(rec_ref) if not self.record_service: self.log(1, "'record service' failed") self.setRecordingPreferredTuner(setdefault=True) 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 == "": self.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), self.descramble, self.record_ecm) 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 new 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 self.setRecordingPreferredTuner(setdefault=True) 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): global wasRecTimerWakeup next_state = self.state + 1 self.log(5, "activating state %d" % next_state) # print "[TIMER] activate called",time(),next_state,self.first_try_prepare,' pending ',self.messageBoxAnswerPending,' justTried ',self.justTriedFreeingTuner,' show ',self.messageStringShow,self.messageString #TODO remove if next_state == self.StatePrepared: if self.messageBoxAnswerPending: self.start_prepare = time() + 1 # call again in 1 second return False if self.justTriedFreeingTuner: self.start_prepare = time() + 5 # tryPrepare in 5 seconds self.justTriedFreeingTuner = False return False if not self.justplay and not self.freespace(): Notifications.AddPopup(text = _("Write error while recording. Disk full?\n%s") % self.name, type = MessageBox.TYPE_ERROR, timeout = 5, id = "DiskFullMessage") self.failed = True self.next_activation = time() self.end = time() + 5 self.backoff = 0 return True if self.always_zap: if Screens.Standby.inStandby: self.wasInStandby = True eActionMap.getInstance().bindAction('', -maxint - 1, self.keypress) #set service to zap after standby Screens.Standby.inStandby.prev_running_service = self.service_ref.ref Screens.Standby.inStandby.paused_service = None #wakeup standby Screens.Standby.inStandby.Power() self.log(5, "wakeup and zap to recording service") else: cur_zap_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference() if cur_zap_ref and not cur_zap_ref.getPath():# we do not zap away if it is no live service self.messageString += _("The TV was switched to the recording service!\n") self.messageStringShow = True self.setRecordingPreferredTuner() self.failureCB(True) self.log(5, "zap to recording service") if self.tryPrepare(): self.log(6, "prepare ok, waiting for begin") if self.messageStringShow: Notifications.AddNotification(MessageBox, _("In order to record a timer, a tuner was freed successfully:\n\n") + self.messageString, type=MessageBox.TYPE_INFO, timeout=20) # 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 then 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 == 0: # (0) try to make a tuner available by disabling PIP self.first_try_prepare += 1 from Screens.InfoBar import InfoBar from Screens.InfoBarGenerics import InfoBarPiP from Components.ServiceEventTracker import InfoBarCount InfoBarInstance = InfoBarCount == 1 and InfoBar.instance if InfoBarInstance and InfoBarPiP.pipShown(InfoBarInstance) == True: if config.recording.ask_to_abort_pip.value == "ask": self.log(8, "asking user to disable PIP") self.messageBoxAnswerPending = True Notifications.AddNotificationWithCallback(self.failureCB_pip, MessageBox, _("A timer failed to record!\nDisable PIP and try again?\n"), timeout=20) elif config.recording.ask_to_abort_pip.value in ("abort_no_msg", "abort_msg"): self.log(8, "disable PIP without asking") self.setRecordingPreferredTuner() self.failureCB_pip(True) return False else: self.log(8, "currently no PIP active... so we dont need to stop it") if self.first_try_prepare == 1: # (1) try to make a tuner available by aborting pseudo recordings self.first_try_prepare += 1 self.backoff = 0 if len(NavigationInstance.instance.getRecordings(False,pNavigation.isPseudoRecording)) > 0: if config.recording.ask_to_abort_pseudo_rec.value == "ask": self.log(8, "asking user to abort pseudo recordings") self.messageBoxAnswerPending = True Notifications.AddNotificationWithCallback(self.failureCB_pseudo_rec, MessageBox, _("A timer failed to record!\nAbort pseudo recordings (e.g. EPG refresh) and try again?\n"), timeout=20) elif config.recording.ask_to_abort_pseudo_rec.value in ("abort_no_msg", "abort_msg"): self.log(8, "abort pseudo recordings without asking") self.setRecordingPreferredTuner() self.failureCB_pseudo_rec(True) return False else: self.log(8, "currently no pseudo recordings active... so we dont need to stop it") if self.first_try_prepare == 2: # (2) try to make a tuner available by aborting streaming self.first_try_prepare += 1 self.backoff = 0 if len(NavigationInstance.instance.getRecordings(False,pNavigation.isStreaming)) > 0: if config.recording.ask_to_abort_streaming.value == "ask": self.log(8, "asking user to abort streaming") self.messageBoxAnswerPending = True Notifications.AddNotificationWithCallback(self.failureCB_streaming, MessageBox, _("A timer failed to record!\nAbort streaming and try again?\n"), timeout=20) elif config.recording.ask_to_abort_streaming.value in ("abort_no_msg", "abort_msg"): self.log(8, "abort streaming without asking") self.setRecordingPreferredTuner() self.failureCB_streaming(True) return False else: self.log(8, "currently no streaming active... so we dont need to stop it") if self.first_try_prepare == 3: # (3) try to make a tuner available by switching live TV to the recording service self.first_try_prepare += 1 self.backoff = 0 cur_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference() if cur_ref and not cur_ref.getPath(): if Screens.Standby.inStandby: self.setRecordingPreferredTuner() self.failureCB(True) elif not config.recording.asktozap.value: self.log(8, "asking user to zap away") self.messageBoxAnswerPending = True 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") self.setRecordingPreferredTuner() self.failureCB(True) return False elif cur_ref: self.log(8, "currently running service is not a live service.. so stopping it makes no sense") else: self.log(8, "currently no service running... so we dont need to stop it") if self.first_try_prepare == 4: # (4) freeing a tuner failed self.first_try_prepare += 1 self.log(8, "freeing a tuner failed") if self.messageString: Notifications.AddNotification(MessageBox, _("No tuner is available for recording a timer!\n\nThe following methods of freeing a tuner were tried without success:\n\n") + self.messageString, type=MessageBox.TYPE_INFO, timeout=20) else: Notifications.AddNotification(MessageBox, _("No tuner is available for recording a timer!\n"), type=MessageBox.TYPE_INFO, timeout=20) return False elif next_state == self.StateRunning: if os.path.exists("/tmp/was_rectimer_wakeup") and not wasRecTimerWakeup: wasRecTimerWakeup = int(open("/tmp/was_rectimer_wakeup", "r").read()) and True or False # if this timer has been cancelled, just go to "end" state. if self.cancelled: return True if self.failed: return True if self.justplay: if Screens.Standby.inStandby: self.wasInStandby = True eActionMap.getInstance().bindAction('', -maxint - 1, self.keypress) self.log(11, "wakeup and zap") #set service to zap after standby Screens.Standby.inStandby.prev_running_service = self.service_ref.ref Screens.Standby.inStandby.paused_service = None #wakeup standby Screens.Standby.inStandby.Power() else: self.log(11, "zapping") found = False notFound = False NavigationInstance.instance.isMovieplayerActive() from Screens.ChannelSelection import ChannelSelection ChannelSelectionInstance = ChannelSelection.instance if ChannelSelectionInstance: bqrootstr = getBqRootStr(self.service_ref.ref) rootstr = '' serviceHandler = eServiceCenter.getInstance() rootbouquet = eServiceReference(bqrootstr) bouquet = eServiceReference(bqrootstr) bouquetlist = serviceHandler.list(bouquet) # we need a way out of the loop, # if channel is not in bouquets bouquetcount = 0 bouquets = [] if not bouquetlist is None: while True: bouquet = bouquetlist.getNext() # can we make it easier? # or found a way to make another way for that if bouquets == []: bouquets.append(bouquet) else: for x in bouquets: if x != bouquet: bouquets.append(bouquet) else: bouquetcount += 1 if bouquetcount >= 5: notFound = True break if bouquet.flags & eServiceReference.isDirectory: ChannelSelectionInstance.clearPath() ChannelSelectionInstance.setRoot(bouquet) servicelist = serviceHandler.list(bouquet) if not servicelist is None: serviceIterator = servicelist.getNext() while serviceIterator.valid(): if self.service_ref.ref == serviceIterator: break serviceIterator = servicelist.getNext() if self.service_ref.ref == serviceIterator: break if found: ChannelSelectionInstance.enterPath(rootbouquet) ChannelSelectionInstance.enterPath(bouquet) ChannelSelectionInstance.saveRoot() ChannelSelectionInstance.saveChannel(self.service_ref.ref) if found: ChannelSelectionInstance.addToHistory(self.service_ref.ref) if notFound: # Can we get a result for that ? # see if you want to delete the running Timer self.switchToAll() else: NavigationInstance.instance.playService(self.service_ref.ref) return True else: self.log(11, "start recording") record_res = self.record_service.start() self.setRecordingPreferredTuner(setdefault=True) 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
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 self.selectionChanged not 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') day = [] weekday = 0 for x in (0, 1, 2, 3, 4, 5, 6): day.append(0) if self.timer.repeated: type = 'repeated' if self.timer.repeated == 31: repeated = 'weekdays' elif self.timer.repeated == 127: repeated = 'daily' else: flags = self.timer.repeated repeated = 'user' count = 0 for x in (0, 1, 2, 3, 4, 5, 6): if flags == 1: weekday = x if flags & 1 == 1: day[x] = 1 count += 1 else: day[x] = 0 flags >>= 1 if count == 1: repeated = 'weekly' else: type = 'once' repeated = None weekday = int(strftime('%u', localtime(self.timer.begin))) - 1 day[weekday] = 1 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]) self.timertyp = self.timerentry_justplay.value 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_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.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 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=_('%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 + 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=_('%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])) servicename = 'N/A' try: 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 self.timer not 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) 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: 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 complettion 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 ecaxtly that."))) 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?')) self.tagsSet = getConfigListEntry(_('Tags'), self.timerentry_tagsset, _('Choose a tag for easy finding a recording.')) if self.timerentry_justplay.value != 'zap': if config.usage.setup_level.index >= 2: self.list.append(self.dirname) if getPreferredTagEditor(): self.list.append(self.tagsSet) self.list.append(getConfigListEntry(_('After Recording'), self.timerentry_afterevent, _("What action is required on complettion 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 ecaxtly 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 self.has_key('VKeyIcon'): self['VirtualKB'].setEnabled(True) self['VKeyIcon'].boolean = True if self.has_key('HelpWindow'): 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])) elif self.has_key('VKeyIcon'): self['VirtualKB'].setEnabled(False) self['VKeyIcon'].boolean = False elif self.has_key('VKeyIcon'): self['VirtualKB'].setEnabled(False) self['VKeyIcon'].boolean = False def layoutFinished(self): self.setTitle(_(self.setup_title)) def createSummary(self): return SetupSummary 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() else: ConfigListScreen.keyLeft(self) self.newConfig() def keyRight(self): cur = self['config'].getCurrent() if cur in (self.channelEntry, self.tagsSet): self.keySelect() 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, 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) 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 end < begin: end += 86400 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, 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] if self.timer.justplay: self.timer.afterEvent = AFTEREVENT.NONE 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) 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 if 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 service is not 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 getStreamServiceName(ref): if isinstance(ref, eServiceReference): servicereference = ServiceReference(ref) if servicereference: return servicereference.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '') return ""
def tunerShow(self): if self.entries: # Close info screen if self.info: self.info.hide() self.session.deleteDialog(self.info) self.info = None # Rebind InfoBar Events #self.bindInfoBar() # Only show the Tuner information dialog, # if no screen is displayed or the InfoBar is visible #TODO Info can also be showed if info.rectangle is outside currentdialog.rectangle # if self.session.current_dialog is None \ # or isinstance(self.session.current_dialog, InfoBar): #MAYBE Tuner Informationen werden zusammen mit der EMCMediaCenter InfoBar angezeigt #or isinstance(self.session.current_dialog, EMCMediaCenter): # Delete entries: # if entry reached timeout # if number of entries is reached numberfinished = 0 for id, win in sorted(self.entries.items(), key=lambda x: (x[1].end), reverse=True): if win.type == Finished: numberfinished += 1 if win.toberemoved == True \ or win.type == Finished and numberfinished > int( config.infobartunerstate.number_finished_records.value ): # Delete Stopped Timers self.session.deleteDialog(win) del self.entries[id] # Update windows # Dynamic column resizing and repositioning widths = [] for id, win in self.entries.items(): if win.type == Record: #TODO Avolid blocking - avoid using getTimer to update the timer times use timer.time_changed if possible timer = getTimer(id) if timer: begin = timer.begin end = timer.end endless = timer.autoincrease if not win.tuner or not win.tunertype: win.tuner, win.tunertype = getTuner( timer.record_service) service_ref = None if not win.channel or not win.number: service_ref = timer.service_ref del timer if service_ref: win.number = win.number or service_ref and getNumber( service_ref.ref) win.channel = win.channel or service_ref and service_ref.getServiceName( ) win.updateTimes(begin, end, endless) win.update() else: # Should never happen delete begin = win.begin end = time() endless = False win.updateType(Finished) win.updateTimes(begin, end, endless) win.update() elif win.type == Stream: if config.infobartunerstate.show_streams.value: #TODO Avolid blocking - avoid using getStream to update the current name stream = getStream(id) if stream: ref = stream.getRecordServiceRef() if not win.tuner or not win.tunertype: win.tuner, win.tunertype = getTuner( stream.getRecordService()) del stream epg = eEPGCache.getInstance() event = epg and epg.lookupEventTime(ref, -1, 0) if event: name = event.getEventName() else: name = "" begin = win.begin end = None endless = True service_ref = None if not win.number: service_ref = ServiceReference(ref) win.number = service_ref and getNumber( service_ref.ref) if not win.channel: service_ref = service_ref or ServiceReference( ref) win.channel = win.channel or service_ref and service_ref.getServiceName( ) win.updateName(name) win.updateTimes(begin, end, endless) win.update() else: win.toberemoved == True else: # Should never happen delete begin = win.begin end = time() endless = False win.updateType(Finished) win.updateTimes(begin, end, endless) win.update() else: # Type Finished win.update() # Calculate field width widths = map(lambda (w1, w2): max(w1, w2), zip_longest(widths, win.widths)) # Calculate field spacing spacing = self.spacing + int( config.infobartunerstate.offset_spacing.value) widths = [width + spacing if width > 0 else 0 for width in widths] # Apply user offsets posx = self.positionx + int( config.infobartunerstate.offset_horizontal.value) posy = self.positiony + int( config.infobartunerstate.offset_vertical.value) height = self.height # Resize, move and show windows for win in sorted(self.entries.itervalues(), key=lambda x: (x.type, x.timeleft)): #for pos, win in enumerate( sorted( self.entries.itervalues(), key=lambda x: (x.type, x.timeleft) ) ): win.reorder(widths) win.move(posx, posy) posy += height # Show windows win.show()
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 res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]), (eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 0, RT_HALIGN_RIGHT, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4])) ] 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, r3.left(), r3.top(), 21, 21, clock_pic), (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + 25, r3.top(), 21, 21, clock_pic_partnerbox), (eListboxPythonMultiContent.TYPE_TEXT, r3.left() + 50, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, serviceref.getServiceName() + ": " + EventName))) else: res.extend(( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, clock_pic), (eListboxPythonMultiContent.TYPE_TEXT, r3.left() + 25, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, serviceref.getServiceName() + ": " + EventName))) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left(), r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, serviceref.getServiceName() + ": " + EventName)) return res
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 __init__(self, session): Screen.__init__(self, session) self.skin_path = resolveFilename(SCOPE_PLUGINS, "Extensions/RaedQuickSignal") dellog() if config.plugins.RaedQuickSignal.style.value == "AGC1": if config.plugins.RaedQuickSignal.piconpath.value == "PLUGIN": if config.plugins.RaedQuickSignal.enabledb.value == "Enable": if isHD(): self.skin = SKIN_AGC_Picon_SNRdB else: self.skin = SKIN_AGC_Picon_SNRdB_FHD else: if isHD(): self.skin = SKIN_AGC_Picon_NOSNRdB else: self.skin = SKIN_AGC_Picon_NOSNRdB_FHD elif config.plugins.RaedQuickSignal.piconpath.value == "MEDIA": if config.plugins.RaedQuickSignal.enabledb.value == "Enable": if isHD(): self.skin = SKIN_AGC_Picon_media_SNRdB else: self.skin = SKIN_AGC_Picon_media_SNRdB_FHD else: if isHD(): self.skin = SKIN_AGC_Picon_media_NOSNRdB else: self.skin = SKIN_AGC_Picon_media_NOSNRdB_FHD elif config.plugins.RaedQuickSignal.style.value == "AGC2": if config.plugins.RaedQuickSignal.enabledb.value == "Enable": if isHD(): self.skin = SKIN_AGC_Event_Des_SNRdB else: self.skin = SKIN_AGC_Event_Des_SNRdB_FHD else: if isHD(): self.skin = SKIN_AGC_Event_Des_NOSNRdB else: self.skin = SKIN_AGC_Event_Des_NOSNRdB_FHD elif config.plugins.RaedQuickSignal.style.value == "AGC3": if config.plugins.RaedQuickSignal.enabledb.value == "Enable": if isHD(): self.skin = SKIN_AGC_Weather_SNRdB else: self.skin = SKIN_AGC_Weather_SNRdB_FHD else: if isHD(): self.skin = SKIN_AGC_Weather_NOSNRdB else: self.skin = SKIN_AGC_Weather_NOSNRdB_FHD elif config.plugins.RaedQuickSignal.style.value == "Event1": if config.plugins.RaedQuickSignal.piconpath.value == "PLUGIN": if config.plugins.RaedQuickSignal.enabledb.value == "Enable": if isHD(): self.skin = SKIN_Event_Progress_Picon_SNRdB else: self.skin = SKIN_Event_Progress_Picon_SNRdB_FHD else: if isHD(): self.skin = SKIN_Event_Progress_Picon_NOSNRdB else: self.skin = SKIN_Event_Progress_Picon_NOSNRdB_FHD elif config.plugins.RaedQuickSignal.piconpath.value == "MEDIA": if config.plugins.RaedQuickSignal.enabledb.value == "Enable": if isHD(): self.skin = SKIN_Event_Progress_Picon_media_SNRdB else: self.skin = SKIN_Event_Progress_Picon_media_SNRdB_FHD else: if isHD(): self.skin = SKIN_Event_Progress_Picon_media_NOSNRdB else: self.skin = SKIN_Event_Progress_Picon_media_NOSNRdB_FHD elif config.plugins.RaedQuickSignal.style.value == "Event2": if config.plugins.RaedQuickSignal.enabledb.value == "Enable": if isHD(): self.skin = SKIN_Event_Progress_Event_Des_SNRdB else: self.skin = SKIN_Event_Progress_Event_Des_SNRdB_FHD else: if isHD(): self.skin = SKIN_Event_Progress_Event_Des_NOSNRdB else: self.skin = SKIN_Event_Progress_Event_Des_NOSNRdB_FHD elif config.plugins.RaedQuickSignal.style.value == "Event3": if config.plugins.RaedQuickSignal.enabledb.value == "Enable": if isHD(): self.skin = SKIN_Event_Progress_Weather_SNRdB else: self.skin = SKIN_Event_Progress_Weather_SNRdB_FHD else: if isHD(): self.skin = SKIN_Event_Progress_Weather_NOSNRdB else: self.skin = SKIN_Event_Progress_Weather_NOSNRdB_FHD elif config.plugins.RaedQuickSignal.style.value == "Full": if isHD(): self.skin = SKIN_Full_Screen else: self.skin = SKIN_Full_Screen_FHD self.session = session self.startupservice = config.servicelist.startupservice.value logdata('self.startupservice', self.startupservice) sref = self.session.nav.getCurrentService() from ServiceReference import ServiceReference p = ServiceReference(str(sref)) servicename = str(p.getServiceName()) serviceurl = p.getPath() logdata('serviceurl', serviceurl) logdata('servicename', servicename) logdata('playeble-sref', sref) config.servicelist.startupservice.value = serviceurl config.servicelist.startupservice.save() self.servicelist = self.session.instantiateDialog(ChannelSelection) self["setupActions"] = ActionMap( ["WizardActions", "SetupActions", "MenuActions"], { "cancel": self.exit, "menu": self.showsetup, "up": self.keyUp, "down": self.keyDown, "left": self.keyLeft, "right": self.keyRight, }) shown = True self.onLayoutFinish.append(self.layoutFinished)
def getMovieList(rargs=None, locations=None): movieliste = [] tag = None directory = None fields = None bookmarklist = [] if rargs and "tag" in rargs.keys(): tag = rargs["tag"][0] if rargs and "dirname" in rargs.keys(): directory = rargs["dirname"][0] if rargs and "fields" in rargs.keys(): fields = rargs["fields"][0] if directory is None: directory = MovieSelection.defaultMoviePath() else: try: directory.decode('utf-8') except UnicodeDecodeError: try: directory = directory.decode("cp1252").encode("utf-8") except UnicodeDecodeError: directory = directory.decode("iso-8859-1").encode("utf-8") if not directory: directory = MOVIE_LIST_ROOT_FALLBACK if directory[-1] != "/": directory += "/" if not os.path.isdir(directory): return { "movies": [], "locations": [], "bookmarks": [], "directory": [], } root = eServiceReference(MOVIE_LIST_SREF_ROOT + directory) for item in sorted(os.listdir(directory)): abs_p = os.path.join(directory, item) if os.path.isdir(abs_p): bookmarklist.append(item) folders = [root] if rargs and "recursive" in rargs.keys(): for f in bookmarklist: if f[-1] != "/": f += "/" ff = eServiceReference(MOVIE_LIST_SREF_ROOT + directory + f) folders.append(ff) # get all locations if locations is not None: folders = [] for f in locations: if f[-1] != "/": f += "/" ff = eServiceReference(MOVIE_LIST_SREF_ROOT + f) folders.append(ff) if config.OpenWebif.parentalenabled.value: dir_is_protected = checkParentalProtection(directory) else: dir_is_protected = False if not dir_is_protected: for root in folders: movielist = MovieList(None) movielist.load(root, None) if tag is not None: movielist.reload(root=root, filter_tags=[tag]) for (serviceref, info, begin, unknown) in movielist.list: if serviceref.flags & eServiceReference.mustDescent: continue length_minutes = 0 txtdesc = "" filename = '/'.join(serviceref.toString().split("/")[1:]) filename = '/' + filename name, ext = os.path.splitext(filename) sourceRef = ServiceReference( info.getInfoString(serviceref, iServiceInformation.sServiceref)) rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) movie = { 'filename': filename, 'filename_stripped': filename.split("/")[-1], 'serviceref': serviceref.toString(), 'length': "?:??", 'lastseen': 0, 'filesize_readable': '', 'recordingtime': rtime, 'begintime': 'undefined', 'eventname': ServiceReference(serviceref).getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', ''), 'servicename': sourceRef.getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', ''), 'tags': info.getInfoString(serviceref, iServiceInformation.sTags), 'fullname': serviceref.toString(), } if rtime > 0: fuzzy_rtime = FuzzyTime(rtime) movie['begintime'] = fuzzy_rtime[0] + ", " + fuzzy_rtime[1] try: length_minutes = info.getLength(serviceref) except: # noqa: E722 pass if length_minutes: movie['length'] = "%d:%02d" % (length_minutes / 60, length_minutes % 60) if fields is None or 'pos' in fields: movie['lastseen'] = getPosition( filename + '.cuts', length_minutes) if fields is None or 'desc' in fields: txtfile = name + '.txt' if ext.lower() != '.ts' and os.path.isfile(txtfile): with open(txtfile, "rb") as handle: txtdesc = ''.join(handle.readlines()) event = info.getEvent(serviceref) extended_description = event and event.getExtendedDescription( ) or "" if extended_description == '' and txtdesc != '': extended_description = txtdesc movie['descriptionExtended'] = unicode( extended_description, 'utf_8', errors='ignore').encode('utf_8', 'ignore') desc = info.getInfoString(serviceref, iServiceInformation.sDescription) movie['description'] = unicode(desc, 'utf_8', errors='ignore').encode( 'utf_8', 'ignore') if fields is None or 'size' in fields: size = 0 sz = '' try: size = os.stat(filename).st_size if size > 1073741824: sz = "%.2f %s" % ((size / 1073741824.), _("GB")) elif size > 1048576: sz = "%.2f %s" % ((size / 1048576.), _("MB")) elif size > 1024: sz = "%.2f %s" % ((size / 1024.), _("kB")) except: # noqa: E722 pass movie['filesize'] = size movie['filesize_readable'] = sz movieliste.append(movie) if locations is None: return { "movies": movieliste, "bookmarks": bookmarklist, "directory": directory } return {"movies": movieliste, "locations": locations}
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["key_yellow"] = Label(_("Timer type")) self["key_blue"] = Label() 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, "yellow": self.changeTimerType, "blue": self.changeZapWakeupType }, -2) self.list = [] ConfigListScreen.__init__(self, self.list, session=session) self.setTitle(_("Timer entry")) self.createSetup("config") def createConfig(self): justplay = self.timer.justplay always_zap = self.timer.always_zap zap_wakeup = self.timer.zap_wakeup 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 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("%u", localtime(self.timer.begin))) - 1 day[weekday] = 1 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_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 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(_("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) 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_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.list.append( getConfigListEntry(_("Recording type"), self.timerentry_recordingtype)) 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 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, 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 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" self.timer.always_zap = self.timerentry_justplay.value == "zap+record" self.timer.zap_wakeup = self.timerentry_zapwakeup.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.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.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 = 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 = 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 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 getStreamServiceName(ref): if isinstance(ref, eServiceReference): servicereference = ServiceReference(ref) if servicereference: return removeBad(servicereference.getServiceName()) return ""
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 buildEPGSearchEntry(self, service, eventId, beginTime, duration, EventName): rec1 = self.getClockTypesForEntry(service, eventId, beginTime, duration) # 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 dx = self.piconSize[0] + self.piconDistance nowTime = int(time()) remaining = "" if beginTime is not None: if nowTime < beginTime: remaining = _(" (%d min)") % (duration / 60) else: prefix = "+" total = ((beginTime+duration) - nowTime) / 60 if total <= 0: prefix = "" remaining = _(" (%s%d min)") % (prefix, total) t = localtime(beginTime) serviceref = ServiceReference(service) # for Servicename if config.plugins.epgsearch.picons.value: if getPiconsName: picon = getPiconName(service) else: picon = self.findPicon(service) if picon != "": self.picon.setPara((self.piconSize[0], self.piconSize[1], 1, 1, False, 1, '#000f0f0f')) self.picon.startDecode(picon, 0, 0, False) png = self.picon.getData() dy = int((self.height - self.piconSize[1])/2.) res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r1.left(), r1.top()+ dy, self.piconSize[0], self.piconSize[1], png), (eListboxPythonMultiContent.TYPE_TEXT, r1.left() + dx, r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]), (eListboxPythonMultiContent.TYPE_TEXT, r2.left() + dx, r2.top(), r2.width(), r1.height(), 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4])) ] else: res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_TEXT, r1.left() + dx, r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]), (eListboxPythonMultiContent.TYPE_TEXT, r2.left() + dx, r2.top(), r2.width(), r1.height(), 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4])) ] else: res = [ None, # no private data needed (eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]), (eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4])) ] if config.plugins.epgsearch.picons.value: if rec1 or rec2: if rec1: clock_types = rec1 # maybe Partnerbox too if rec2: if PartnerBoxZapRepIcons: clock_pic_partnerbox = getRemoteClockZapPixmap(self, service, beginTime, duration, eventId) else: clock_pic_partnerbox = getRemoteClockPixmap(self, service, beginTime, duration, eventId) else: if PartnerBoxZapRepIcons: clock_pic = getRemoteClockZapPixmap(self, service, beginTime, duration, eventId) else: clock_pic = getRemoteClockPixmap(self, service, beginTime, duration, eventId) if rec1 and rec2: # Partnerbox and local for i in range(len(clock_types)): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + i * self.space + dx, r3.top() + self.dy, self.iconSize, self.iconSize, self.clocks[clock_types[i]])) res.extend(( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + (i + 1) * self.space + dx, r3.top() + self.dy, self.iconSize, self.iconSize, clock_pic_partnerbox), (eListboxPythonMultiContent.TYPE_TEXT, r3.left() + (i + 1) * self.space + self.pboxDistance + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining))) else: if rec1: for i in range(len(clock_types)): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + i * self.space + dx, r3.top() + self.dy, self.iconSize, self.iconSize, self.clocks[clock_types[i]])) res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + (i + 1) * self.space + dx + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining)) else: res.extend(( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + dx, r3.top() + self.dy, self.iconSize, self.iconSize, clock_pic), (eListboxPythonMultiContent.TYPE_TEXT, r3.left() + self.pboxDistance + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining))) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + dx, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining)) else: if rec1 or rec2: if rec1: clock_types = rec1 # maybe Partnerbox too if rec2: if PartnerBoxZapRepIcons: clock_pic_partnerbox = getRemoteClockZapPixmap(self, service, beginTime, duration, eventId) else: clock_pic_partnerbox = getRemoteClockPixmap(self, service, beginTime, duration, eventId) else: if PartnerBoxZapRepIcons: clock_pic = getRemoteClockZapPixmap(self, service, beginTime, duration, eventId) else: clock_pic = getRemoteClockPixmap(self, service, beginTime, duration, eventId) if rec1 and rec2: # Partnerbox and local for i in range(len(clock_types)): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + i * self.space, r3.top() + self.dy, self.iconSize, self.iconSize, self.clocks[clock_types[i]])) res.extend(( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + (i + 1) * self.space, r3.top() + self.dy, self.iconSize, self.iconSize, clock_pic_partnerbox), (eListboxPythonMultiContent.TYPE_TEXT, r3.left() + (i + 1) * self.space + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining))) else: if rec1: for i in range(len(clock_types)): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + i * self.iconSize, r3.top() + self.dy, self.iconSize, self.iconSize, self.clocks[clock_types[i]])) res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + (i + 1) * self.space + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining)) else: res.extend(( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top() + self.dy, self.iconSize, self.iconSize, clock_pic), (eListboxPythonMultiContent.TYPE_TEXT, r3.left() + self.space + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining))) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left(), r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining)) return res
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 defaultEncoding = getDefaultEncoding() # 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()), '"')) if defaultTimer.getAvoidDuplicateDescription() > 0: if defaultTimer.searchForDuplicateDescription != 2: extend((' searchForDuplicateDescription="', str(defaultTimer.searchForDuplicateDescription), '"')) if defaultTimer.descShortEqualExt: append(' descShortEqualExt="yes"') if defaultTimer.descShortExtEmpty: append(' descShortExtEmpty="yes"') if defaultTimer.ratioThresholdDuplicate != 0.8: extend((' ratioThresholdDuplicate="', str(defaultTimer.ratioThresholdDuplicate), '"')) # Only display justplay if true if defaultTimer.justplay: extend((' justplay="', str(defaultTimer.getJustplay()), '"')) if not defaultTimer.setEndtime: append(' setEndtime="0"') # Only display encoding if != utf-8 if defaultTimer.encoding != defaultEncoding or webif: extend((' encoding="', str(defaultTimer.encoding), '"')) # SearchType if defaultTimer.searchType != "partial": extend((' searchType="', str(defaultTimer.searchType), '"')) # Only display searchCase if sensitive if defaultTimer.searchCase == "sensitive": extend((' searchCase="', str(defaultTimer.searchCase), '"')) # Only add vps related entries if true if defaultTimer.vps_enabled: append(' vps_enabled="yes"') if defaultTimer.vps_overwrite: append(' vps_overwrite="yes"') # Only add seriesplugin related entry if true if defaultTimer.series_labeling: append(' series_labeling="yes"') if defaultTimer.series_save_filter: append(' series_save_filter="yes"') # Only add conflict detection related entry if False if not defaultTimer.conflict_detection: append(' conflict_detection="no"') # Only add always zap related entry if true if defaultTimer.always_zap: append(' always_zap="1"') # Only add zap wakeup entry if justplay is true if defaultTimer.justplay: extend((' zap_wakeup="', str(defaultTimer.zap_wakeup), '"')) # 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>', stringToXML(str(serviceref)), '</e2servicereference>\n', ' <e2servicename>', stringToXML(ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '').replace('^', '')), '</e2servicename>\n', ' </e2service>\n', )) else: # Services for serviceref in defaultTimer.services: ref = ServiceReference(str(serviceref)) extend(( ' <serviceref>', serviceref, '</serviceref>\n', )) # Bouquets for bouquet in defaultTimer.bouquets: ref = ServiceReference(str(bouquet)) extend(( ' <bouquet>', stringToXML(str(bouquet)), '</bouquet>\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')) for tag in defaultTimer.tags: extend((' <e2tag>', stringToXML(tag), '</e2tag>\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()), '"')) if timer.searchForDuplicateDescription != 2: extend((' searchForDuplicateDescription="', str(timer.searchForDuplicateDescription), '"')) if timer.descShortEqualExt: append(' descShortEqualExt="yes"') if timer.descShortExtEmpty: append(' descShortExtEmpty="yes"') if timer.ratioThresholdDuplicate != 0.8: extend((' ratioThresholdDuplicate="', str(timer.ratioThresholdDuplicate), '"')) # Only display justplay if true if timer.justplay: extend((' justplay="', str(timer.getJustplay()), '"')) if not timer.setEndtime: append(' setEndtime="0"') # Only display encoding if != utf-8 if timer.encoding != defaultEncoding or webif: extend((' encoding="', str(timer.encoding), '"')) # SearchType if timer.searchType != "partial": 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"') # Only add seriesplugin related entry if true if timer.series_labeling: append(' series_labeling="yes"') if timer.series_save_filter: append(' series_save_filter="yes"') # Only add conflict detection related entry if False if not timer.conflict_detection: append(' conflict_detection="no"') # Only add always zap related entry if true if timer.always_zap: append(' always_zap="1"') # Only add zap wakeup entry if justplay is true if timer.justplay: extend((' zap_wakeup="', str(timer.zap_wakeup), '"')) # 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>', stringToXML(str(serviceref)), '</e2servicereference>\n', ' <e2servicename>', stringToXML(ref.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '').replace('^', '')), '</e2servicename>\n', ' </e2service>\n', )) else: # Services for serviceref in timer.services: ref = ServiceReference(str(serviceref)) extend(( ' <serviceref>', serviceref, '</serviceref>\n', )) # Bouquets for bouquet in timer.bouquets: ref = ServiceReference(str(bouquet)) extend(( ' <bouquet>', stringToXML(str(bouquet)), '</bouquet>\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')) for tag in timer.tags: extend((' <e2tag>', stringToXML(tag), '</e2tag>\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
def getMovieList(rargs=None, locations=None): movieliste = [] tag = None if rargs and "tag" in rargs.keys(): tag = rargs["tag"][0] directory = None if rargs and "dirname" in rargs.keys(): directory = rargs["dirname"][0] fields = None if rargs and "fields" in rargs.keys(): fields = rargs["fields"][0] else: fields = 'pos,size,desc' if directory is None: directory = MovieSelection.defaultMoviePath() else: directory = unquote(directory) try: directory.decode('utf-8') except UnicodeDecodeError: try: directory = directory.decode("cp1252").encode("utf-8") except UnicodeDecodeError: directory = directory.decode("iso-8859-1").encode("utf-8") if not directory: directory = "/media/" elif directory[-1] != "/": directory += "/" root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory) bookmarklist = [ x for x in listdir(directory) if (x[0] != '.' and (isdir(join(directory, x)) or ( islink(join(directory, x)) and exists(join(directory, x))))) ] bookmarklist.sort() folders = [] folders.append(root) if rargs and "recursive" in rargs.keys(): for f in bookmarklist: if f[-1] != "/": f += "/" ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory + f) folders.append(ff) # get all locations if locations is not None: folders = [] for f in locations: if f[-1] != "/": f += "/" ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + f) folders.append(ff) if config.OpenWebif.parentalenabled.value: dir_is_protected = checkParentalProtection(directory) else: dir_is_protected = False import os if not dir_is_protected: for root in folders: movielist = MovieList(None) movielist.load(root, None) if tag != None: movielist.reload(root=root, filter_tags=[tag]) #??? loadLength = True for (serviceref, info, begin, unknown) in movielist.list: if serviceref.flags & eServiceReference.mustDescent: continue rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if rtime > 0: t = FuzzyTime(rtime) begin_string = t[0] + ", " + t[1] else: begin_string = "undefined" try: Len = info.getLength(serviceref) except: Len = None filename = '/'.join(serviceref.toString().split("/")[1:]) filename = '/' + filename if 'pos' in fields: pos = getPosition(filename + '.cuts', Len) # get txt name, ext = os.path.splitext(filename) ext = ext.lower() txtdesc = "" if 'desc' in fields and ext != 'ts': txtfile = name + '.txt' if fileExists(txtfile): txtlines = open(txtfile).readlines() txtdesc = "" for line in txtlines: txtdesc += line if Len > 0: Len = "%d:%02d" % (Len / 60, Len % 60) else: Len = "?:??" sourceERef = info.getInfoString( serviceref, iServiceInformation.sServiceref) sourceRef = ServiceReference(sourceERef) if 'desc' in fields: event = info.getEvent(serviceref) ext = event and event.getExtendedDescription() or "" if ext == '' and txtdesc != '': ext = txtdesc if 'desc' in fields: desc = info.getInfoString(serviceref, iServiceInformation.sDescription) servicename = ServiceReference( serviceref).getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', '') movie = {} movie['filename'] = filename movie['filename_stripped'] = filename.split("/")[-1] movie['eventname'] = servicename if 'desc' in fields: movie['description'] = unicode(desc, 'utf_8', errors='ignore').encode( 'utf_8', 'ignore') movie['begintime'] = begin_string movie['serviceref'] = serviceref.toString() movie['length'] = Len movie['tags'] = info.getInfoString(serviceref, iServiceInformation.sTags) movie['filesize_readable'] = '' if 'size' in fields: filename = filename.replace("'", "\'").replace("%", "\%") size = 0 try: size = os_stat(filename).st_size sz = '' if size > 1073741824: sz = "%.2f %s" % ((size / 1073741824.), _("GB")) elif size > 1048576: sz = "%.2f %s" % ((size / 1048576.), _("MB")) elif size > 1024: sz = "%.2f %s" % ((size / 1024.), _("kB")) except: size = 0 movie['filesize'] = size movie['filesize_readable'] = sz movie['fullname'] = serviceref.toString() if 'desc' in fields: movie['descriptionExtended'] = unicode( ext, 'utf_8', errors='ignore').encode('utf_8', 'ignore') movie['servicename'] = sourceRef.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '') movie['recordingtime'] = rtime if 'pos' in fields: movie['lastseen'] = pos movieliste.append(movie) if locations == None: ml = { "movies": movieliste, "bookmarks": bookmarklist, "directory": directory } else: ml = {"movies": movieliste, "locations": locations} return ml
def buildMovieListEntry(self, serviceref, info, begin, data): width = self.l.getItemSize().width() iconSize = self.iconsWidth space = self.spaceIconeText r = self.spaceRight pathName = serviceref.getPath() res = [None] if serviceref.flags & eServiceReference.mustDescent: # Directory # Name is full path name valign_center = 0 if self.list_type == MovieList.LISTTYPE_MINIMAL: valign_center = RT_VALIGN_CENTER x = iconSize + space tn = self.treeDescription if info is None: # Special case: "parent" txt = ".." else: p = os.path.split(pathName) if not p[1]: # if path ends in '/', p is blank. p = os.path.split(p[0]) txt = p[1] if txt == ".Trash": res.append( MultiContentEntryPixmapAlphaTest( pos=(0, self.trashShift), size=(iconSize, self.iconTrash.size().height()), png=self.iconTrash)) res.append( MultiContentEntryText( pos=(x, 0), size=(width - x - tn - r, self.itemHeight), font=0, flags=RT_HALIGN_LEFT | valign_center, text=_("Deleted items"))) res.append( MultiContentEntryText(pos=(width - tn - r, 0), size=(tn, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT | valign_center, text=_("Trash can"))) return res res.append( MultiContentEntryPixmapAlphaTest(pos=(0, self.dirShift), size=(iconSize, iconSize), png=self.iconFolder)) res.append( MultiContentEntryText(pos=(x, 0), size=(width - x - tn - r, self.itemHeight), font=0, flags=RT_HALIGN_LEFT | valign_center, text=txt)) res.append( MultiContentEntryText(pos=(width - tn - r, 0), size=(tn, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT | valign_center, text=_("Directory"))) return res if (data == -1) or (data is None): data = MovieListData() cur_idx = self.l.getCurrentSelectionIndex() x = self.list[cur_idx] # x = ref,info,begin,... if config.usage.load_length_of_movies_in_moviellist.value: data.len = x[1].getLength(x[0]) #recalc the movie length... else: data.len = 0 #dont recalc movielist to speedup loading the list self.list[cur_idx] = ( x[0], x[1], x[2], data ) #update entry in list... so next time we don't need to recalc data.txt = info.getName(serviceref) if config.movielist.hide_extensions.value: fileName, fileExtension = os.path.splitext(data.txt) if fileExtension in KNOWN_EXTENSIONS: data.txt = fileName data.icon = None data.part = None if os.path.split(pathName)[1] in self.runningTimers: if self.playInBackground and serviceref == self.playInBackground: data.icon = self.iconMoviePlayRec else: data.icon = self.iconMovieRec elif self.playInBackground and serviceref == self.playInBackground: data.icon = self.iconMoviePlay else: switch = config.usage.show_icons_in_movielist.value data.part = moviePlayState(pathName + '.cuts', serviceref, data.len) if switch == 'i': if data.part is None: if config.usage.movielist_unseen.value: data.icon = self.iconUnwatched else: data.icon = self.iconPart[data.part // 25] elif switch == 'p' or switch == 's': if data.part is None: if config.usage.movielist_unseen.value: data.part = 0 data.partcol = 0x808080 else: data.partcol = 0xf0f0f0 service = ServiceReference( info.getInfoString(serviceref, iServiceInformation.sServiceref)) if service is None: data.serviceName = None else: data.serviceName = service.getServiceName() data.description = info.getInfoString( serviceref, iServiceInformation.sDescription) len = data.len if len > 0: len = "%d:%02d" % (len / 60, len % 60) else: len = "" if data.icon is not None: if self.list_type in (MovieList.LISTTYPE_COMPACT_DESCRIPTION, MovieList.LISTTYPE_COMPACT): pos = (0, self.partIconeShiftCompact) elif self.list_type == MovieList.LISTTYPE_ORIGINAL: pos = (0, self.partIconeShiftOriginal) else: pos = (0, self.partIconeShiftMinimal) res.append( MultiContentEntryPixmapAlphaTest( pos=pos, size=(iconSize, data.icon.size().height()), png=data.icon)) switch = config.usage.show_icons_in_movielist.value if switch in ('p', 's'): if switch == 'p': iconSize = self.pbarLargeWidth if data.part is not None: res.append( MultiContentEntryProgress(pos=(0, self.pbarShift), size=(iconSize, self.pbarHeight), percent=data.part, borderWidth=2, foreColor=data.partcol, foreColorSelected=None, backColor=None, backColorSelected=None)) elif switch == 'i': pass else: iconSize = 0 begin_string = "" if begin > 0: begin_string = ', '.join(FuzzyTime(begin, inPast=True)) 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=(iconSize + space, 0), size=(width - fc - r, ih1), font=0, flags=RT_HALIGN_LEFT, text=data.txt)) if self.tags: res.append( MultiContentEntryText(pos=(width - fc - r, 0), size=(fc, ih1), font=2, flags=RT_HALIGN_RIGHT, text=info.getInfoString( serviceref, iServiceInformation.sTags))) if data.serviceName: res.append( MultiContentEntryText(pos=(sc - r, ih2), size=(sc, ih2 - ih1), font=1, flags=RT_HALIGN_LEFT, text=data.serviceName)) else: if data.serviceName: res.append( MultiContentEntryText(pos=(width - fc - r, 0), size=(fc, ih1), font=2, flags=RT_HALIGN_RIGHT, text=data.serviceName)) res.append( MultiContentEntryText(pos=(0, ih1), size=(width - r, ih2 - ih1), font=1, flags=RT_HALIGN_LEFT, text=data.description)) res.append( MultiContentEntryText(pos=(0, ih2), size=(sc - r, ih - ih2), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) if len: res.append( MultiContentEntryText(pos=(width - sc - r, ih2), size=(sc, ih - ih2), 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 if len: lenSize = 58 * ih / 37 else: lenSize = 0 fc, sc, tc = self.columnsCompactDescription[ 0], self.columnsCompactDescription[ 1], self.columnsCompactDescription[2] res.append( MultiContentEntryText(pos=(iconSize + space, 0), size=(width - sc - r, ih1), font=0, flags=RT_HALIGN_LEFT, text=data.txt)) res.append( MultiContentEntryText(pos=(0, ih1), size=(width - tc - lenSize - r, ih - ih1), font=1, flags=RT_HALIGN_LEFT, text=data.description)) res.append( MultiContentEntryText(pos=(width - fc - r, 0), size=(fc, ih1), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=begin_string)) if data.serviceName: res.append( MultiContentEntryText(pos=(width - tc - lenSize - r, ih1), size=(tc, ih - ih1), font=1, flags=RT_HALIGN_RIGHT, text=data.serviceName)) if lenSize: res.append( MultiContentEntryText(pos=(width - lenSize - r, ih1), size=(lenSize, ih - ih1), font=1, flags=RT_HALIGN_RIGHT, text=len)) elif self.list_type == MovieList.LISTTYPE_COMPACT: col = self.compactColumn ih1 = ((ih * 8) + 14) / 15 # 37 -> 20, round up if len: lenSize = 2 * ih else: lenSize = 0 res.append( MultiContentEntryText(pos=(iconSize + space, 0), size=(width - lenSize - iconSize - space - r, ih1), font=0, flags=RT_HALIGN_LEFT, text=data.txt)) if self.tags: res.append( MultiContentEntryText(pos=(width - col - r, ih1), size=(col, ih - ih1), font=1, flags=RT_HALIGN_RIGHT, text=info.getInfoString( serviceref, iServiceInformation.sTags))) if data.serviceName: res.append( MultiContentEntryText(pos=(col, ih1), size=(col, ih - ih1), font=1, flags=RT_HALIGN_LEFT, text=data.serviceName)) else: if data.serviceName: res.append( MultiContentEntryText(pos=(width - col - r, ih1), size=(col, ih - ih1), font=1, flags=RT_HALIGN_RIGHT, text=data.serviceName)) res.append( MultiContentEntryText(pos=(0, ih1), size=(col, ih - ih1), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) if lenSize: res.append( MultiContentEntryText(pos=(width - lenSize - r, 0), size=(lenSize, ih1), font=0, flags=RT_HALIGN_RIGHT, text=len)) else: if (self.descr_state == MovieList.SHOW_DESCRIPTION) or not len: dateSize = ih * 145 / 25 # 25 -> 145 res.append( MultiContentEntryText( pos=(iconSize + space, 0), size=(width - iconSize - space - dateSize - r, ih), font=0, flags=RT_HALIGN_LEFT | RT_VALIGN_CENTER, text=data.txt)) res.append( MultiContentEntryText(pos=(width - dateSize - r, 2), size=(dateSize, ih), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=begin_string)) else: lenSize = ih * 3 # 25 -> 75 res.append( MultiContentEntryText(pos=(iconSize + space, 0), size=(width - lenSize - iconSize - space - r, ih), font=0, flags=RT_HALIGN_LEFT, text=data.txt)) res.append( MultiContentEntryText(pos=(width - lenSize - r, 0), size=(lenSize, ih), font=0, flags=RT_HALIGN_RIGHT, text=len)) return res
def getMovieList(directory=None, tag=None, rargs=None): movieliste = [] if directory == None: directory = config.usage.default_path.value if directory[-1] != "/": directory += "/" root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory) bookmarklist = [ x for x in walk(directory).next()[1] if (x[0] != '.' and not islink(directory + '/' + x)) ] bookmarklist.sort() folders = [] folders.append(root) if rargs and "recursive" in rargs.keys(): for f in bookmarklist: if f[-1] != "/": f += "/" ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory + f) folders.append(ff) #??? tagfilter = [] for root in folders: movielist = MovieList(None) movielist.load(root, None) if tag != None: movielist.reload(root=root, filter_tags=[tag]) #??? loadLength = True for (serviceref, info, begin, unknown) in movielist.list: if serviceref.flags & eServiceReference.mustDescent: continue rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if rtime > 0: t = FuzzyTime(rtime) begin_string = t[0] + ", " + t[1] else: begin_string = "undefined" try: Len = info.getLength(serviceref) except: Len = None if Len > 0: Len = "%d:%02d" % (Len / 60, Len % 60) else: Len = "?:??" sourceERef = info.getInfoString(serviceref, iServiceInformation.sServiceref) sourceRef = ServiceReference(sourceERef) event = info.getEvent(serviceref) ext = event and event.getExtendedDescription() or "" filename = '/'.join(serviceref.toString().split("/")[1:]) servicename = ServiceReference( serviceref).getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', '') movie = {} filename = '/' + filename movie['filename'] = filename movie['filename_stripped'] = filename.split("/")[-1] movie['eventname'] = servicename movie['description'] = info.getInfoString( serviceref, iServiceInformation.sDescription) movie['begintime'] = begin_string movie['serviceref'] = serviceref.toString() movie['length'] = Len movie['tags'] = info.getInfoString(serviceref, iServiceInformation.sTags) filename = filename.replace("'", "\'").replace("%", "\%") try: movie['filesize'] = os_stat(filename).st_size except: movie['filesize'] = 0 movie['fullname'] = serviceref.toString() movie['descriptionExtended'] = ext movie['servicename'] = sourceRef.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '') movie['recordingtime'] = rtime movieliste.append(movie) ml = { "movies": movieliste, "bookmarks": bookmarklist, "directory": directory } if rargs and "zip" in rargs.keys(): filename = rargs["zip"][0] import os if not os.path.exists(os.path.dirname(filename)): return {"result": False, "message": "zip file path not exist"} try: import json fd = open(filename, 'wb') #todo create zip using api #fd = gzip.GzipFile(filename=filename, mode='wb', compresslevel=9) fd.write(json.dumps(ml)) fd.close() try: os.remove('%s.gz' % filename) except OSError: pass os.system('gzip %s' % filename) except (IOError, os.error), why: return { "result": False, "message": "create movielist zip error:%s" % why } return {"result": True, "message": "create movielist zip success"}
class RecordTimerEntry(timer.TimerEntry, object): ######### the following static methods and members are only in use when the box is in (soft) standby wasInStandby = False wasInDeepStandby = False receiveRecordEvents = False @staticmethod def keypress(key=None, flag=1): if flag and (RecordTimerEntry.wasInStandby or RecordTimerEntry.wasInDeepStandby): RecordTimerEntry.wasInStandby = False RecordTimerEntry.wasInDeepStandby = False eActionMap.getInstance().unbindAction('', RecordTimerEntry.keypress) @staticmethod def setWasInDeepStandby(): RecordTimerEntry.wasInDeepStandby = True eActionMap.getInstance().bindAction('', -maxint - 1, RecordTimerEntry.keypress) @staticmethod def setWasInStandby(): if not RecordTimerEntry.wasInStandby: if not RecordTimerEntry.wasInDeepStandby: eActionMap.getInstance().bindAction('', -maxint - 1, RecordTimerEntry.keypress) RecordTimerEntry.wasInDeepStandby = False RecordTimerEntry.wasInStandby = True @staticmethod def shutdown(): quitMainloop(1) @staticmethod def staticGotRecordEvent(recservice, event): if event == iRecordableService.evEnd: print "RecordTimer.staticGotRecordEvent(iRecordableService.evEnd)" if not checkForRecordings(): print "No recordings busy of sceduled within 6 minutes so 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(): if not RecordTimerEntry.receiveRecordEvents and Screens.Standby.inStandby: 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) ################################################################# def __init__(self, serviceref, begin, end, name, description, eit, disabled=False, justplay=False, afterEvent=AFTEREVENT.AUTO, checkOldTimers=False, dirname=None, tags=None, descramble=True, record_ecm=False, always_zap=False, zap_wakeup="always", rename_repeat=True): 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 and 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.always_zap = always_zap self.zap_wakeup = zap_wakeup self.afterEvent = afterEvent self.dirname = dirname self.dirnameHadToFallback = False self.autoincrease = False self.autoincreasetime = 3600 * 24 # 1 day self.tags = tags or [] self.descramble = descramble self.record_ecm = record_ecm self.rename_repeat = rename_repeat self.needChangePriorityFrontend = config.usage.recording_frontend_priority.value != "-2" and config.usage.recording_frontend_priority.value != config.usage.frontend_priority.value self.change_frontend = False self.log_entries = [] self.resetState() def __repr__(self): return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s)" % ( self.name, ctime(self.begin), self.service_ref, self.justplay) def log(self, code, msg): self.log_entries.append((int(time()), code, msg)) print "[TIMER]", msg def calculateFilename(self, name=None): service_name = self.service_ref.getServiceName() begin_date = strftime("%Y%m%d %H%M", localtime(self.begin)) name = name or self.name filename = begin_date + " - " + service_name if name: if config.recording.filename_composition.value == "short": filename = strftime("%Y%m%d", localtime( self.begin)) + " - " + name elif config.recording.filename_composition.value == "long": filename += " - " + name + " - " + self.description else: filename += " - " + name # standard if config.recording.ascii_filenames.value: filename = ASCIItranslit.legacyEncode(filename) if not self.dirname: dirname = findSafeRecordPath(defaultMoviePath()) else: dirname = findSafeRecordPath(self.dirname) if dirname is None: dirname = findSafeRecordPath(defaultMoviePath()) self.dirnameHadToFallback = True if not dirname: return None self.Filename = Directories.getRecordingFilename(filename, dirname) self.log(0, "Filename calculated as: '%s'" % self.Filename) return self.Filename def tryPrepare(self): if self.justplay: return True else: if not self.calculateFilename(): self.do_backoff() self.start_prepare = time() + self.backoff return False 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.setRecordingPreferredTuner() self.record_service = rec_ref and NavigationInstance.instance.recordService( rec_ref) if not self.record_service: self.log(1, "'record service' failed") self.setRecordingPreferredTuner(setdefault=True) return False name = self.name description = self.description if self.repeated: epgcache = eEPGCache.getInstance() queryTime = self.begin + (self.end - self.begin) / 2 evt = epgcache.lookupEventTime(rec_ref, queryTime) if evt: if self.rename_repeat: event_description = evt.getShortDescription() if not event_description: event_description = evt.getExtendedDescription() if event_description and event_description != description: description = event_description event_name = evt.getEventName() if event_name and event_name != name: name = event_name if not self.calculateFilename(event_name): self.do_backoff() self.start_prepare = time() + self.backoff return False 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, name.replace("\n", ""), description.replace("\n", ""), ' '.join(self.tags), bool(self.descramble), bool(self.record_ecm)) 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 self.setRecordingPreferredTuner(setdefault=True) 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 == 1: if self.always_zap: if Screens.Standby.inStandby: self.log(5, "wakeup and zap to recording service") RecordTimerEntry.setWasInStandby() #set service to zap after standby Screens.Standby.inStandby.prev_running_service = self.service_ref.ref Screens.Standby.inStandby.paused_service = None #wakeup standby Screens.Standby.inStandby.Power() else: if RecordTimerEntry.wasInDeepStandby: RecordTimerEntry.setWasInStandby() cur_zap_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference( ) if cur_zap_ref and not cur_zap_ref.getPath( ): # we do not zap away if it is no live service 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.setRecordingPreferredTuner() self.failureCB(True) self.log(5, "zap to recording service") 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(self.Filename) 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 Screens.Standby.inStandby: self.setRecordingPreferredTuner() self.failureCB(True) elif 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, default=True) 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.setRecordingPreferredTuner() 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: if RecordTimerEntry.wasInDeepStandby and self.zap_wakeup in ( "always", "from_deep_standby" ) or self.zap_wakeup in ("always", "from_standby"): self.log(11, "wakeup and zap") RecordTimerEntry.setWasInStandby() #set service to zap after standby Screens.Standby.inStandby.prev_running_service = self.service_ref.ref Screens.Standby.inStandby.paused_service = None #wakeup standby Screens.Standby.inStandby.Power() else: if RecordTimerEntry.wasInDeepStandby: RecordTimerEntry.setWasInStandby() self.log(11, "zapping") NavigationInstance.instance.playService( self.service_ref.ref) return True else: self.log(11, "start recording") if RecordTimerEntry.wasInDeepStandby: RecordTimerEntry.keypress() if Screens.Standby.inStandby: #In case some plugin did put the receiver already in standby config.misc.standbyCounter.value = 0 else: Notifications.AddNotification( Screens.Standby.Standby, StandbyCounterIncrease=False) record_res = self.record_service.start() self.setRecordingPreferredTuner(setdefault=True) if record_res: self.log(13, "start record returned %d" % record_res) self.do_backoff() # retry self.begin = time() + self.backoff return False # Tell the trashcan we started recording. The trashcan gets events, # but cannot tell what the associated path is. Trashcan.instance.markDirty(self.Filename) return True
def getMovieList(directory=None, tag=None, rargs=None, locations=None): movieliste = [] if directory is None: directory = MovieSelection.defaultMoviePath() if not directory: directory = "/media/" elif directory[-1] != "/": directory += "/" root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory) bookmarklist = [ x for x in listdir(directory) if (x[0] != '.' and (isdir(join(directory, x)) or ( islink(join(directory, x)) and exists(join(directory, x))))) ] bookmarklist.sort() folders = [] folders.append(root) if rargs and "recursive" in rargs.keys(): for f in bookmarklist: if f[-1] != "/": f += "/" ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory + f) folders.append(ff) # get all locations if locations is not None: folders = [] for f in locations: if f[-1] != "/": f += "/" ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + f) folders.append(ff) if config.ModernWebif.parentalenabled.value: dir_is_protected = checkParentalProtection(directory) else: dir_is_protected = False import os if not dir_is_protected: for root in folders: movielist = MovieList(None) movielist.load(root, None) if tag != None: movielist.reload(root=root, filter_tags=[tag]) #??? loadLength = True for (serviceref, info, begin, unknown) in movielist.list: if serviceref.flags & eServiceReference.mustDescent: continue rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if rtime > 0: t = FuzzyTime(rtime) begin_string = t[0] + ", " + t[1] else: begin_string = "undefined" try: Len = info.getLength(serviceref) except: Len = None filename = '/'.join(serviceref.toString().split("/")[1:]) filename = '/' + filename pos = getPosition(filename + '.cuts', Len) # get txt name, ext = os.path.splitext(filename) ext = ext.lower() txtdesc = "" if ext != 'ts': txtfile = name + '.txt' if fileExists(txtfile): txtlines = open(txtfile).readlines() txtdesc = "" for line in txtlines: txtdesc += line if Len > 0: Len = "%d:%02d" % (Len / 60, Len % 60) else: Len = "?:??" sourceERef = info.getInfoString( serviceref, iServiceInformation.sServiceref) sourceRef = ServiceReference(sourceERef) event = info.getEvent(serviceref) ext = event and event.getExtendedDescription() or "" if ext == '' and txtdesc != '': ext = txtdesc servicename = ServiceReference( serviceref).getServiceName().replace('\xc2\x86', '').replace( '\xc2\x87', '') movie = {} movie['filename'] = filename movie['filename_stripped'] = filename.split("/")[-1] movie['eventname'] = servicename movie['description'] = info.getInfoString( serviceref, iServiceInformation.sDescription) movie['begintime'] = begin_string movie['serviceref'] = serviceref.toString() movie['length'] = Len movie['tags'] = info.getInfoString(serviceref, iServiceInformation.sTags) filename = filename.replace("'", "\'").replace("%", "\%") try: movie['filesize'] = os_stat(filename).st_size except: movie['filesize'] = 0 movie['fullname'] = serviceref.toString() movie['descriptionExtended'] = ext movie['servicename'] = sourceRef.getServiceName().replace( '\xc2\x86', '').replace('\xc2\x87', '') movie['recordingtime'] = rtime movie['lastseen'] = pos movieliste.append(movie) if locations == None: ml = { "movies": movieliste, "bookmarks": bookmarklist, "directory": directory } else: ml = {"movies": movieliste, "locations": locations} return ml