Пример #1
0
    def changed(self, rjvsyr):
        global mzrynz
        global otzqir
        if self.instance:
            koprvn = ePicLoad()
            koprvn.setPara((int(self.lxktpt[0]),
             int(self.lxktpt[1]),
             1,
             1,
             0,
             1,
             '#00000000'))
            nlqmqs = None
            try:
                qystrq = self.source.service
                if rjvsyr[0] != self.CHANGED_CLEAR:
                    nlqmqs = findCoolPicon(qystrq.toString())
            except:
                qystrq = self.source.text
                if rjvsyr[0] != self.CHANGED_CLEAR:
                    nlqmqs = findCoolPicon(qystrq)

            if not nlqmqs:
                kklrrq = ServiceReference(qystrq).getServiceName()
                try:
                    kklrrq = kklrrq.replace('\xc2\x87', '').replace('\xc2\x86', '').decode('utf-8').encode('latin1')
                except:
                    pass

                nlqmqs = findCoolPicon(kklrrq)
            if not nlqmqs:
                nlqmqs = '/usr/lib/enigma2/python/Plugins/Extensions/CoolTVGuide/Cool3D/dummy.png'
                koprvn.setPara((1, 1, 1, 1, 0, 1, '#00000000'))
                if otzqir:
                    nlqmqs = ''
                    mzrynz = ''
                    koprvn = findCoolPicon(kklrrq)
                    klyrok = koprvn.startDecode
                    rjyixi = koprvn.setPara
                    rjyixi((int(self.lxktpt[0]),
                     int(self.lxktpt[1]),
                     1,
                     1,
                     0,
                     1,
                     '#00000000'))
                elif mzrynz == '':
                    uunuoo = zrlpzx.rfind(':')
                    if uunuoo != -1:
                        otzqir = True
                        zrlpzx = zrlpzx[:uunuoo].rstrip(':').replace(':', '_')
                        for srrllp in self.vzxowj:
                            nlqmqs = srrllp + zrlpzx + '.png'
                            if fileExists(nlqmqs):
                                self.Setpixmap(nlqmqs)

            if not otzqir:
                koprvn.startDecode(nlqmqs, 0, 0, False)
                nlqmqs = koprvn.getData()
                self.instance.setPixmap(nlqmqs)
    def intermediateWrite(self, timers, conflicting, similar, skipped):
        returnlist = []
        extend = returnlist.extend

        for (name, begin, end, serviceref, autotimername, message) in timers:
            ref = ServiceReference(str(serviceref))
            extend(
                (
                    "<e2simulatedtimer>\n" "   <e2servicereference>",
                    stringToXML(serviceref),
                    "</e2servicereference>\n",
                    "   <e2servicename>",
                    stringToXML(ref.getServiceName().replace("\xc2\x86", "").replace("\xc2\x87", "")),
                    "</e2servicename>\n",
                    "   <e2name>",
                    stringToXML(name),
                    "</e2name>\n",
                    "   <e2timebegin>",
                    str(begin),
                    "</e2timebegin>\n",
                    "   <e2timeend>",
                    str(end),
                    "</e2timeend>\n",
                    "   <e2autotimername>",
                    stringToXML(autotimername),
                    "</e2autotimername>\n" "</e2simulatedtimer>\n",
                )
            )

        if self._stillAlive:
            reactor.callFromThread(lambda: self._req.write("".join(returnlist)))
Пример #3
0
def getPiconName(serviceName):
	#remove the path and name fields, and replace ':' by '_'
	sname = '_'.join(GetWithAlternative(serviceName).split(':', 10)[:10])
	pngname = findPicon(sname)
	if not pngname:
		fields = sname.split('_', 3)
		if len(fields) > 2:
			if fields[0] != '1':
				#fallback to 1 for other reftypes
				fields[0] = '1'
				pngname = findPicon('_'.join(fields))
			if not pngname and fields[2] != '1':
				#fallback to 1 for services with different service types
				fields[2] = '1'
				pngname = findPicon('_'.join(fields))
	if not pngname: # picon by channel name
		try:
			name = ServiceReference(serviceName).getServiceName()
			#print "[Picon] unicodedata.normalize: ", name
			name = unicodedata.normalize('NFKD', unicode(name, 'utf_8', errors='ignore')).encode('ASCII', 'ignore')
			name = re.sub('[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower())
			#print "[Picon] picon by channel name: ", name
			if name:
				pngname = findPicon(name)
				if not pngname and len(name) > 2 and name.endswith('hd'):
					pngname = findPicon(name[:-2])
		except:
			pass
	return pngname
Пример #4
0
	def __evUpdatedInfo(self):
		if self.newService and config.plugins.threed.autothreed.value != "0" and self.session.nav.getCurrentlyPlayingServiceReference():
			self.newService = False
			ref = self.session.nav.getCurrentService() 
			serviceRef = self.session.nav.getCurrentlyPlayingServiceReference()
			spath = serviceRef.getPath()
			if spath:
				if spath[0] == '/':
					serviceHandler = eServiceCenter.getInstance()
					r = eServiceReference(ref.info().getInfoString(iServiceInformation.sServiceref))
					info = serviceHandler.info(r)
					if info:
						name = ServiceReference(info.getInfoString(r, iServiceInformation.sServiceref)).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')
					else:
						name = os_basename(spath) # filename
				else:
					name = serviceRef.getName() # partnerbox servicename
			else:
				name =  ServiceReference(ref.info().getInfoString(iServiceInformation.sServiceref)).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')
			if "3d" in name.lower():
				if config.plugins.threed.autothreed.value == "1":
					mode = THREE_D_SIDE_BY_SIDE
				else:
					mode = THREE_D_TOP_BOTTOM
			else:
				mode = THREE_D_OFF
			if self.lastmode != mode:
				switchmode(mode)
Пример #5
0
	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
Пример #6
0
			def sendServiceLine(service, counter, last=False):
				if service[0][:5] == '1:64:':
					# format for markers:  ":Name"
					line = "%d%s:%s" % (CODE_OK, '-' if not last else ' ', service[1])
				else:
					# <id> <full name>,<short name>;<provider>:<freq>:<parameters>:<source>:<srate>:<vpid>:<apid>:<tpid>:<conditional access>:<:sid>:<nid>:<tid>:<:rid>
					# e.g. 5  RTL Television,RTL:12188:h:S19.2E:27500:163:104:105:0:12003:1:1089:0
					sref = ServiceReference(service[0])
					info = sref.info()
					# XXX: how to get this?! o0
					feinfo = None #sref.ref.frontendInfo()
					fedata = feinfo.getAll(True) if feinfo else {}
					prov = getServiceInfoValue(info, sref, iServiceInformation.sProvider)
					frequency = fedata.get("frequency", 0)/1000
					param = -1
					source = '-1'
					srate = -1
					vpid = '-1'
					apid = '-1'
					tpid = -1
					ca = '-1'
					sid = -1
					nid = -1
					tid = -1
					rid = -1
					# TODO: support full format, these are only the important fields ;)
					line = "%d%s%d %s,%s;%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d" % (CODE_OK, '-' if not last else ' ', counter, service[1], service[2], prov, frequency, param, source, srate, vpid, apid, tpid, ca, sid, nid, tid, rid)
				self.sendLine(line)
Пример #7
0
def getPiconName(serviceName):
	sname = '_'.join(GetWithAlternative(serviceName).split(':', 10)[:10])
	pngname = findPicon(sname)
	if not pngname: # picon by channel name
		name = ServiceReference(serviceName).getServiceName()
		name = unicodedata.normalize('NFKD', unicode(name, 'utf_8', errors='ignore')).encode('ASCII', 'ignore')
		name = re.sub('[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower())
		if len(name) > 0:
			pngname = findPicon(name)
			if not pngname and len(name) > 2 and name.endswith('hd'):
				pngname = findPicon(name[:-2])
	if not pngname:
		fields = sname.split('_', 3)
		if len(fields) > 0 and fields[0] != '1':
			fields[0] = '1'
		pngname = findPicon('_'.join(fields))
		if len(fields) > 2:
			while not pngname:
				tmp = ''
				for i in range(256):
					tmp = hex(i)[2:].upper().zfill(2)
					fields[2] = tmp
					pngname = findPicon('_'.join(fields))
					if pngname:
						newpng = '/usr/share/enigma2/picon/' + name + '.png'
						try:
							os.symlink(pngname, newpng)
						except:
							pass
						break
				if tmp == "FF": break
	return pngname
Пример #8
0
	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!")
Пример #9
0
	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"
Пример #10
0
def getPiconName(serviceName):
	#remove the path and name fields, and replace ':' by '_'
	sname = '_'.join(GetWithAlternative(serviceName).split(':', 10)[:10])
	pngname = findPicon(sname)
	if not pngname:
		fields = sname.split('_', 3)
		if len(fields) > 2:
			if fields[0] != '1':
				#fallback to 1 for other reftypes
				fields[0] = '1'
				pngname = findPicon('_'.join(fields))
			if not pngname and fields[2] != '2':
				#fallback to 1 for tv services with nonstandard servicetypes
				fields[2] = '1'
				pngname = findPicon('_'.join(fields))
	if not pngname: # picon by channel name
		name = ServiceReference(serviceName).getServiceName()
		name = unicodedata.normalize('NFKD', unicode(name, 'utf_8', errors='ignore')).encode('ASCII', 'ignore')
		piconname = re.sub('[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower())
		if piconname:
			pngname = findPicon(piconname)
			if not pngname and len(piconname) > 2 and name.endswith('hd'):
				pngname = findPicon(piconname[:-2])
			if not pngname: # try picon by channel name without last word
				piconname = ' '.join(name.split(' ')[:-1])
				piconname = re.sub('[^a-z0-9]', '', piconname.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower())
				pngname = findPicon(piconname)
	if not pngname:
		tmp = resolveFilename(SCOPE_CURRENT_SKIN, "picon_default.png")
		if pathExists(tmp):
			pngname = tmp
		else:
			pngname = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/picon_default.png")
	return pngname
Пример #11
0
def getPicon(sname):
	# remove URL part
	if ("://" in sname) or ("%3a//" in sname) or ("%3A//" in sname):
		sname = unquote(sname)
		sname = ":".join(sname.split(":")[:10]) + "::" + sname.split(":")[-1]

	sname = GetWithAlternative(sname)
	if sname is not None:
		pos = sname.rfind(':')
	else:
		return "/images/default_picon.png"
	cname = None
	if pos != -1:
		cname = ServiceReference(sname[:pos].rstrip(':')).getServiceName()
		sname = sname[:pos].rstrip(':').replace(':','_') + ".png"
	filename = getPiconPath() + sname
	if fileExists(filename):
		return "/picon/" + sname
	fields = sname.split('_', 3)
	if len(fields) > 2 and fields[2] != '2':
		#fallback to 1 for tv services with nonstandard servicetypes
		fields[2] = '1'
		sname='_'.join(fields)
		filename = getPiconPath() + sname
		if fileExists(filename):
			return "/picon/" + sname
	if cname is not None: # picon by channel name
		cname = unicodedata.normalize('NFKD', unicode(cname, 'utf_8')).encode('ASCII', 'ignore')
		cname = re.sub('[^a-z0-9]', '', cname.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower())
		if len(cname) > 0:
			filename = getPiconPath() + cname + ".png"
		if fileExists(filename):
			return "/picon/" + cname + ".png"		
	return "/images/default_picon.png"
Пример #12
0
	def convertBouquets(self):
		self.readIndex = 0
		while True:
			if 'lamedb' not in self.workList[self.readIndex]:
				filename = DIR_TMP + self.workList[self.readIndex]
				hasRemoteTag = False
				if self.checkBouquetAllreadyInList(self.workList[self.readIndex], self.workList[self.readIndex]) is True:
					self.workList[self.readIndex] = self.workList[self.readIndex].replace('userbouquet.', 'userbouquet.remote_')
					hasRemoteTag = True

				fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w')
				try:
					lines = open(filename).readlines()
					was_html = False
					for line in lines:
						if was_html and '#DESCRIPTION' in line:
							was_html = False
							continue
						if '#NAME' in line and hasRemoteTag:
							hasRemoteTag = False
							line = line.replace('#NAME ', '#NAME remote_')
						was_html = False
						if 'http' in line:
							was_html = True
							continue
						elif '#SERVICE' in line:
							line = line.strip('\r\n')
							line = line.strip('\n')
							tmp = line.split('#SERVICE')
							if '::' in tmp[1]:
								desc = tmp[1].split("::")
								if (len(desc)) == 2:
									tmp2 = tmp[1].split('::')
									service_ref = ServiceReference(tmp2[0] + ':')
									tag = tmp2[0][1:]
							else:
								tag = tmp[1][1:-1]
								service_ref = ServiceReference(tag)
							if config.plugins.RemoteStreamConverter.transcoding.value:
								bitrate = config.plugins.RemoteStreamConverter.bitrate.value
								resolution = config.plugins.RemoteStreamConverter.resolution.value
								(width, height) = tuple(resolution.split('x'))
								framrate = config.plugins.RemoteStreamConverter.framerate.value
								aspectratio = config.plugins.RemoteStreamConverter.aspectratio.value
								interlaced = config.plugins.RemoteStreamConverter.interlaced.value
								args = "?bitrate=%s?width=%s?height=%s?aspectratio=%s?interlaced=%s:" % (bitrate, width, height, aspectratio, interlaced)
								
								out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + "%3A" + args + service_ref.getServiceName() + '\n' 
							else:
								out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName() + '\n'
						else:
							out = line
						fp.write(out)
				except:
					pass
				fp.close()
			self.readIndex += 1
			if self.readIndex == len(self.workList):
				break
		self.removeFiles(DIR_TMP, "userbouquet.")
	def renderBackground(self, req):
		autotimer = self.getAutoTimerInstance()

		ret = autotimer.parseEPG(simulateOnly=True)

		returnlist = ["<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<e2autotimersimulate api_version=\"", str(API_VERSION), "\">\n"]
		extend = returnlist.extend

		for (name, begin, end, serviceref, autotimername) in ret[3]:
			ref = ServiceReference(str(serviceref))
			extend((
				'<e2simulatedtimer>\n'
				'   <e2servicereference>', stringToXML(serviceref), '</e2servicereference>\n',
				'   <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n',
				'   <e2name>', stringToXML(name), '</e2name>\n',
				'   <e2timebegin>', str(begin), '</e2timebegin>\n',
				'   <e2timeend>', str(end), '</e2timeend>\n',
				'   <e2autotimername>', stringToXML(autotimername), '</e2autotimername>\n'
				'</e2simulatedtimer>\n'
			))
		returnlist.append('</e2autotimersimulate>')

		req.setResponseCode(http.OK)
		req.setHeader('Content-type', 'application/xhtml+xml')
		req.setHeader('charset', 'UTF-8')
		return ''.join(returnlist)
Пример #14
0
	def getText(self):
		service = self.source.service
		info = service and service.info()
		if info and service:
			if self.type == self.MOVIE_REFERENCE:
				movie_meta = ServiceReference(info.getInfoString(iServiceInformation.sServiceref))
				movie_meta = path.realpath(movie_meta.getPath()) + ".meta"
				try:
					f = open(movie_meta, "rb")
					rec_ref = f.readlines()
					f.close()
				except IOError:
					return ""
				if len(rec_ref):
					return rec_ref[0].rstrip('\n')
			elif self.type == self.MOVIE_DESC:
				movie_meta = ServiceReference(info.getInfoString(iServiceInformation.sServiceref))
				movie_meta = path.realpath(movie_meta.getPath()) + ".meta"
				try:
					f = open(movie_meta, "rb")
					rec_ref = f.readlines()
					f.close()
				except IOError:
					return ""
				if len(rec_ref):
					return rec_ref[2].rstrip('\n')
Пример #15
0
def getLcdPiconName(serviceName):
	#remove the path and name fields, and replace ':' by '_'
	fields = GetWithAlternative(serviceName).split(':', 10)[:10]
	if not fields or len(fields) < 10:
		return ""
	pngname = findLcdPicon('_'.join(fields))
	if not pngname and not fields[6].endswith("0000"):
		#remove "sub-network" from namespace
		fields[6] = fields[6][:-4] + "0000"
		pngname = findLcdPicon('_'.join(fields))
	if not pngname and fields[0] != '1':
		#fallback to 1 for IPTV streams
		fields[0] = '1'
		pngname = findLcdPicon('_'.join(fields))
	if not pngname and fields[2] != '2':
		#fallback to 1 for TV services with non-standard service types
		fields[2] = '1'
		pngname = findLcdPicon('_'.join(fields))
	if not pngname and fields[9] != '0':
		#fallback to 0 for iptv buffering
		fields[9] = '0'
		pngname = findLcdPicon('_'.join(fields))
	if not pngname: # picon by channel name
		name = ServiceReference(serviceName).getServiceName()
		name = unicodedata.normalize('NFKD', unicode(name, 'utf_8', errors='ignore')).encode('ASCII', 'ignore')
		name = re.sub('[^a-z0-9]', '', name.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower())
		if len(name) > 0:
			pngname = findLcdPicon(name)
			if not pngname and len(name) > 2 and name.endswith('hd'):
				pngname = findLcdPicon(name[:-2])
	return pngname
Пример #16
0
	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)
Пример #17
0
	def firstStart(self):
		myServicelist.servicelist.moveToIndex(0)
		myServicelist.zap()
		srvName = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName()
		srvName = srvName.replace('\xc2\x86', '').replace('\xc2\x87', '')
		self["wohin"].setText(srvName + _("   (AutoZap)"))
		delay = config.plugins.epgrefresh_extra.timeout_autozap.value
		self.AutoZap.start(int(delay * 1000))
Пример #18
0
	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
Пример #19
0
 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')
Пример #20
0
def getPicon(sname):
	
	pp = getPiconPath()
	if pp is not None:
		# remove URL part
		if ("://" in sname) or ("%3a//" in sname) or ("%3A//" in sname):
			sname = unquote(sname)
			sname = ":".join(sname.split(":")[:10]) + "::" + sname.split(":")[-1]
	
		sname = GetWithAlternative(sname)
		if sname is not None:
			pos = sname.rfind(':')
		else:
			return "/images/default_picon.png"
		cname = None
		if pos != -1:
			cname = ServiceReference(sname[:pos].rstrip(':')).getServiceName()
			sname = sname[:pos].rstrip(':').replace(':','_') + ".png"
		filename = pp + sname
		if fileExists(filename):
			return "/picon/" + sname
		fields = sname.split('_', 8)
		if len(fields) > 7 and not fields[6].endswith("0000"):
			#remove "sub-network" from namespace
			fields[6] = fields[6][:-4] + "0000"
			sname='_'.join(fields)
			filename = pp + sname
			if fileExists(filename):
				return "/picon/" + sname
		if len(fields) > 1 and fields[0] != '1':
			#fallback to 1 for other reftypes
			fields[0] = '1'
			sname='_'.join(fields)
			filename = pp + sname
			if fileExists(filename):
				return "/picon/" + sname
		if len(fields) > 3 and fields[2] != '1':
			#fallback to 1 for tv services with nonstandard servicetypes
			fields[2] = '1'
			sname='_'.join(fields)
			filename = pp + sname
			if fileExists(filename):
				return "/picon/" + sname
		if cname is not None: # picon by channel name
			cname1 = cname.replace('\xc2\x86','').replace('\xc2\x87', '').replace('/', '_').encode('utf-8', 'ignore')
			if fileExists(pp + cname1 + ".png"):
				return "/picon/" + cname1 + ".png"
			cname = unicodedata.normalize('NFKD', unicode(cname, 'utf_8', errors='ignore')).encode('ASCII', 'ignore')
			cname = re.sub('[^a-z0-9]', '', cname.replace('&', 'and').replace('+', 'plus').replace('*', 'star').lower())
			if len(cname) > 0:
				filename = pp + cname + ".png"
			if fileExists(filename):
				return "/picon/" + cname + ".png"
			if len(cname) > 2 and cname.endswith('hd') and fileExists(pp + cname[:-2] + ".png"):
				return "/picon/" + cname[:-2] + ".png"
	return "/images/default_picon.png"
Пример #21
0
	def zapForRefresh(self):
		myServicelist.moveDown()
		NewService = myServicelist.getCurrentSelection()
		if (NewService.flags & 7) == 7:
			myServicelist.enterPath(NewService)
		elif not (NewService.flags & eServiceReference.isMarker):
			myServicelist.zap()
			srvName = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName()
			srvName = srvName.replace('\xc2\x86', '').replace('\xc2\x87', '')
			self["wohin"].setText(srvName + _("   (AutoZap)"))
Пример #22
0
	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)
Пример #23
0
 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'))
Пример #24
0
def getChannel(ref):
	if isinstance(ref, eServiceReference):
		servicereference = ServiceReference(ref)
	elif isinstance(ref, ServiceReference):
		servicereference = ref
	else:
		servicereference = ServiceReference(str(ref))
	if servicereference:
		return servicereference.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')
	return ""
Пример #25
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
Пример #26
0
	def _buildOptionEntryServicePicon(self, service):
		if service.flags & eServiceReference.mustDescent:
			alist = ServiceReference(service).list()
			first_in_alternative = alist and alist.getNext()
			if first_in_alternative:
				service_str = first_in_alternative.toString()
			else:
				service_str = service.toString()
		else:
			service_str = service.toString()
		return self.piconLoader.getPicon(service_str)
Пример #27
0
	def convertBouquets(self):
		self.readIndex = 0
		while True:
			if 'lamedb' not in self.workList[self.readIndex]:
				filename = DIR_TMP + self.workList[self.readIndex]
				fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w')
				try:
					fp2 = open(filename)
					lines = fp2.readlines()
					fp2.close()
					was_html = False
					for line in lines:
						if was_html and '#DESCRIPTION' in line:
							was_html = False
							continue
						if '#NAME' in line:
							txt = _('remote of')
							line = '%s (%s %s) \n' % (line.rstrip('\n'), txt, self.getRemoteAdress())
						was_html = False
						if 'http' in line:
							was_html = True
							continue
						elif '#SERVICE' in line:
							if int(line.split()[1].split(':')[1]) & eServiceReference.mustDescent:
								line = self.getAlternativeLine(line)
								if line == None:
									continue
							line = line.strip('\r\n')
							line = line.strip('\n')
							tmp = line.split('#SERVICE')
							if '::' in tmp[1]:
								desc = tmp[1].split('::')
								if len(desc) == 2:
									tmp2 = tmp[1].split('::')
									service_ref = ServiceReference(tmp2[0] + ':')
									tag = tmp2[0][1:]
							else:
								tag = tmp[1][1:-1]
								service_ref = ServiceReference(tag)
							out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName() + '\n'
						else:
							out = line
						fp.write(out)

				except:
					pass

				fp.close()
			self.readIndex += 1
			if self.readIndex == len(self.workList):
				break

		self.removeFilesByPattern(DIR_TMP, '[.](tv|radio)$')
		return
Пример #28
0
	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)
				)
Пример #29
0
	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:
Пример #30
0
	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()
Пример #31
0
 def channelSelectionCallback(self, *args):
     if args and len(args) == 2:
         serviceref, bouquetref = args[:2]
         if self.parent:
             self.parent.selectBouquet(bouquetref, self)
         self.setService(ServiceReference(serviceref))
Пример #32
0
 def changed(self, what):
     if self.instance:
         pngname = ""
         if what[0] != self.CHANGED_CLEAR:
             self.instance.show()
             sname = self.source.text
             pos = sname.rfind(':')
             if pos != -1:
                 sname = sname[:pos].rstrip(':').replace(':', '_')
                 sname = sname.split("_http")[0]
             pngname = self.nameCache.get(sname, "")
             if pngname == "":
                 pngname = self.findPicon(sname)
                 if pngname == "":
                     fields = sname.split('_', 3)
                     if len(fields) > 2 and fields[
                             2] != '2':  #fallback to 1 for tv services with nonstandard servicetypes
                         fields[2] = '1'
                     if fields[0] == '4097' or fields[
                             0] == '5002':  #fallback to 1 for IPTV streams
                         fields[0] = '1'
                     pngname = self.findPicon('_'.join(fields))
                 if not pngname:  # picon by channel name
                     name = ServiceReference(
                         self.source.text).getServiceName()
                     name = unicodedata.normalize(
                         'NFKD', unicode(name, 'utf_8',
                                         errors='ignore')).encode(
                                             'ASCII', 'ignore')
                     name = re.sub(
                         '[^a-z0-9]', '',
                         name.replace('&',
                                      'and').replace('+', 'plus').replace(
                                          '*', 'star').lower())
                     if len(name) > 0:
                         pngname = self.findPicon(name)
                         if not pngname and len(name) > 2 and name.endswith(
                                 'hd'):
                             pngname = self.findPicon(name[:-2])
                 if pngname != "":
                     self.nameCache[sname] = pngname
             if pngname == "":  # no picon for service found
                 pngname = self.nameCache.get("default", "")
                 if pngname == "":  # no default yet in cache..
                     pngname = self.findPicon("picon_default")
                     if pngname == "":
                         tmp = resolveFilename(SCOPE_CURRENT_SKIN,
                                               "picon_default.png")
                         if fileExists(tmp):
                             pngname = tmp
                         else:
                             pngname = resolveFilename(
                                 SCOPE_SKIN_IMAGE,
                                 "skin_default/picon_default.png")
                     self.nameCache["default"] = pngname
             if self.pngname != pngname:
                 self.instance.setScale(1)
                 self.instance.setPixmapFromFile(pngname)
                 self.pngname = pngname
         else:
             self.pngname = ""
             self.instance.hide()
 def rootBouquet(self):
     servicelist = Screens.InfoBar.InfoBar.instance.servicelist
     epg_bouquet = servicelist and servicelist.getRoot()
     if ServiceReference(epg_bouquet).getServiceName():
         return False
     return True
Пример #34
0
    def convertBouquets(self):
        self.readIndex = 0
        while True:
            if 'lamedb' not in self.workList[self.readIndex]:
                filename = DIR_TMP + self.workList[self.readIndex]
                hasRemoteTag = False
                if self.checkBouquetAllreadyInList(
                        self.workList[self.readIndex],
                        self.workList[self.readIndex]) is True:
                    self.workList[self.readIndex] = self.workList[
                        self.readIndex].replace('userbouquet.',
                                                'userbouquet.remote_')
                    hasRemoteTag = True

                fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w')
                try:
                    lines = open(filename).readlines()
                    was_html = False
                    for line in lines:
                        if was_html and '#DESCRIPTION' in line:
                            was_html = False
                            continue
                        if '#NAME' in line and hasRemoteTag:
                            hasRemoteTag = False
                            line = line.replace('#NAME ', '#NAME remote_')
                        was_html = False
                        if 'http' in line:
                            was_html = True
                            continue
                        elif '#SERVICE' in line:
                            line = line.strip('\r\n')
                            line = line.strip('\n')
                            tmp = line.split('#SERVICE')
                            if '::' in tmp[1]:
                                desc = tmp[1].split("::")
                                if (len(desc)) == 2:
                                    tmp2 = tmp[1].split('::')
                                    service_ref = ServiceReference(tmp2[0] +
                                                                   ':')
                                    tag = tmp2[0][1:]
                            else:
                                tag = tmp[1][1:-1]
                                service_ref = ServiceReference(tag)
                            if config.plugins.RemoteStreamConverter.transcoding.value:
                                bitrate = config.plugins.RemoteStreamConverter.bitrate.value
                                resolution = config.plugins.RemoteStreamConverter.resolution.value
                                (width, height) = tuple(resolution.split('x'))
                                framrate = config.plugins.RemoteStreamConverter.framerate.value
                                aspectratio = config.plugins.RemoteStreamConverter.aspectratio.value
                                interlaced = config.plugins.RemoteStreamConverter.interlaced.value
                                args = "?bitrate=%s?width=%s?height=%s?aspectratio=%s?interlaced=%s:" % (
                                    bitrate, width, height, aspectratio,
                                    interlaced)

                                out = '#SERVICE ' + tag + ':' + quote(
                                    'http://' + self.getRemoteAdress() +
                                    ':8001/' + tag
                                ) + "%3A" + args + service_ref.getServiceName(
                                ) + '\n'
                            else:
                                out = '#SERVICE ' + tag + ':' + quote(
                                    'http://' + self.getRemoteAdress() +
                                    ':8001/' + tag
                                ) + ':' + service_ref.getServiceName() + '\n'
                        else:
                            out = line
                        fp.write(out)
                except:
                    pass
                fp.close()
            self.readIndex += 1
            if self.readIndex == len(self.workList):
                break
        self.removeFiles(DIR_TMP, "userbouquet.")
	def addServiceToAlternative(self, param):
		sBouquetRef = param["sBouquetRef"]
		if sBouquetRef is None:
			return (False, "No bouquet given!")
		sRef = None
		if "sRef" in param:
			if param["sRef"] is not None:
				sRef = param["sRef"]  # service to add to the alternative
		if sRef is None:
			return (False, _("No service given!"))
		sCurrentRef = param["sCurrentRef"]  # alternative service
		if sCurrentRef is None:
			return (False, _("No current service given!"))
		cur_ref = eServiceReference(sCurrentRef)
		# check if  service is already an alternative
		if not (cur_ref.flags & eServiceReference.isGroup):
			# sCurrentRef is not an alternative service yet, so do this and add itself to new alternative liste
			mode = MODE_TV  # init
			if "mode" in param:
				if param["mode"] is not None:
					mode = int(param["mode"])
			mutableBouquetList = self.getMutableList(eServiceReference(sBouquetRef))
			if mutableBouquetList:
				cur_service = ServiceReference(cur_ref)
				name = cur_service.getServiceName()
				if mode == MODE_TV:
					sref = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.tv\" ORDER BY bouquet' % (self.buildBouquetID(name, "alternatives.", mode))
				else:
					sref = '1:134:2:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.radio\" ORDER BY bouquet' % (self.buildBouquetID(name, "alternatives.", mode))
				new_ref = eServiceReference(sref)
				if not mutableBouquetList.addService(new_ref, cur_ref):
					mutableBouquetList.removeService(cur_ref)
					mutableBouquetList.flushChanges()
					eDVBDB.getInstance().reloadBouquets()
					mutableAlternatives = self.getMutableList(new_ref)
					if mutableAlternatives:
						mutableAlternatives.setListName(name)
						if mutableAlternatives.addService(cur_ref):
									print "add", cur_ref.toString(), "to new alternatives failed"
						mutableAlternatives.flushChanges()
						self.setRoot(sBouquetRef)
						sCurrentRef = sref  # currentRef is now an alternative (bouquet)
					else:
						return (False, _("Get mutable list for new created alternative failed!"))
				else:
					return (False, _("Alternative %s created failed.") % name)
			else:
				return (False, _("Bouquetlist is not editable!"))
		# add service to alternative-bouquet
		new_param = {}
		new_param["sBouquetRef"] = sCurrentRef
		new_param["sRef"] = sRef
		returnValue = self.addServiceToBouquet(new_param)
		if returnValue[0]:
			cur_ref = eServiceReference(sCurrentRef)
			cur_service = ServiceReference(cur_ref)
			name = cur_service.getServiceName()
			service_ref = ServiceReference(sRef)
			service_name = service_ref.getServiceName()
			return (True, _("Added %s to alternative service %s.") % (service_name, name))
		else:
			return returnValue
Пример #36
0
    def buildListboxEntry(self, timer):
        if not timer.enabled:
            icon = self.iconDisabled
        else:
            icon = self.iconEnabled
        if timer.justplay:
            rectypeicon = self.iconZapped
        else:
            rectypeicon = self.iconRecording

        height = self.l.getItemSize().height()
        width = self.l.getItemSize().width()
        iconMargin = self.iconMargin
        statusIconHeight = self.statusIconHeight
        statusIconWidth = self.statusIconWidth
        typeIconHeight = self.typeIconHeight
        typeIconWidth = self.typeIconWidth
        rowHeight = self.rowHeight
        rowSplit1 = self.rowSplit1
        rowSplit2 = self.rowSplit2
        channels = []
        bouquets = []
        for t in timer.services:
            channels.append(ServiceReference(t).getServiceName())
        for t in timer.bouquets:
            bouquets.append(ServiceReference(t).getServiceName())
        if len(channels) > 0:
            channel = _("[S]  ")
            channel += ", ".join(channels)
        elif len(bouquets) > 0:
            channel = _("[B]  ")
            channel += ", ".join(bouquets)
        else:
            channel = _('All channels')

        res = [None]
        if icon:
            if skinparms:
                x, y, w, h = parameters.get(
                    "AutotimerEnabledIcon",
                    (iconMargin, 0, statusIconHeight, statusIconWidth))
            else:
                x, y, w, h = (iconMargin, 0, statusIconHeight, statusIconWidth)
            res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, x,
                        y, w, h, icon))
        if rectypeicon:
            if skinparms:
                x, y, w, h = parameters.get(
                    "AutotimerRecordIcon",
                    (iconMargin + statusIconWidth + iconMargin, 3,
                     statusIconHeight, typeIconWidth))
            else:
                x, y, w, h = (iconMargin + statusIconWidth + iconMargin, 3,
                              statusIconHeight, typeIconWidth)
            res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, x,
                        y, w, h, rectypeicon))

        if timer.hasTimespan():
            nowt = time()
            now = localtime(nowt)
            begintime = int(
                mktime((now.tm_year, now.tm_mon, now.tm_mday,
                        timer.timespan[0][0], timer.timespan[0][1], 0,
                        now.tm_wday, now.tm_yday, now.tm_isdst)))
            endtime = int(
                mktime((now.tm_year, now.tm_mon, now.tm_mday,
                        timer.timespan[1][0], timer.timespan[1][1], 0,
                        now.tm_wday, now.tm_yday, now.tm_isdst)))
            timespan = (("  %s ... %s") %
                        (FuzzyTime(begintime)[1], FuzzyTime(endtime)[1]))
        else:
            timespan = _("  Any time")
        res.append(
            (eListboxPythonMultiContent.TYPE_TEXT, float(width) / 10 * 4.5, 2,
             width - float(width) / 10 * 4.5, rowHeight, 1,
             RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, timespan))

        if TextBoundary:
            timespanWidth = getTextBoundarySize(self.instance,
                                                self.EventNameFont,
                                                self.l.getItemSize(),
                                                timespan).width()
        else:
            timespanWidth = float(width) / 10 * 2
        res.append(
            (eListboxPythonMultiContent.TYPE_TEXT,
             statusIconWidth + typeIconWidth + iconMargin * 3, 2, width -
             statusIconWidth - typeIconWidth - iconMargin * 3 - timespanWidth,
             rowHeight, 1, RT_HALIGN_LEFT | RT_VALIGN_BOTTOM, timer.name))

        if timer.hasTimeframe():
            begin = strftime("%a, %d %b", localtime(timer.getTimeframeBegin()))
            end = strftime("%a, %d %b", localtime(timer.getTimeframeEnd()))
            timeframe = (("%s ... %s") % (begin, end))
            res.append(
                (eListboxPythonMultiContent.TYPE_TEXT, iconMargin, rowSplit1,
                 float(width) / 10 * 4.5, rowHeight, 2,
                 RT_HALIGN_LEFT | RT_VALIGN_TOP, timeframe))

        if timer.include[3]:
            total = len(timer.include[3])
            count = 0
            days = []
            while count + 1 <= total:
                day = timer.include[3][count]
                day = {
                    '0': _("Mon"),
                    '1': _("Tue"),
                    '2': _("Wed"),
                    '3': _("Thur"),
                    '4': _("Fri"),
                    '5': _("Sat"),
                    '6': _("Sun"),
                    "weekend": _("Weekend"),
                    "weekday": _("Weekday")
                }[day]
                days.append(day)
                count += 1
            days = ', '.join(days)
        else:
            days = _("Everyday")
        res.append(
            (eListboxPythonMultiContent.TYPE_TEXT, float(width) / 10 * 5.5,
             rowSplit1, width - float(width) / 10 * 5.5, rowHeight, 2,
             RT_HALIGN_RIGHT | RT_VALIGN_TOP, days))
        res.append((eListboxPythonMultiContent.TYPE_TEXT, iconMargin,
                    rowSplit2, width - (iconMargin * 2), rowHeight, 0,
                    RT_HALIGN_LEFT | RT_VALIGN_TOP, channel))
        try:
            devide = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN,
                                                "div-h.png"))
        except:
            devide = LoadPixmap(
                resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 0,
                    height - 2, width, 2, devide))
        return res
Пример #37
0
    def keyGo(self, result=None):
        if not self.timerentry_service_ref.isRecordable():
            self.session.openWithCallback(
                self.selectChannelSelector, MessageBox,
                _("You didn't select a channel to record from."),
                MessageBox.TYPE_ERROR)
        else:
            self.timer.external = self.timerentry_fallback.value
            self.timer.name = self.timerentry_name.value
            self.timer.description = self.timerentry_description.value
            self.timer.justplay = self.timerentry_justplay.value == "zap"
            self.timer.always_zap = self.timerentry_justplay.value == "zap+record"
            self.timer.zap_wakeup = self.timerentry_zapwakeup.value
            self.timer.pipzap = self.timerentry_pipzap.value
            self.timer.rename_repeat = self.timerentry_renamerepeat.value
            self.timer.conflict_detection = self.timerentry_conflictdetection.value
            if self.timerentry_justplay.value == "zap":
                if not self.timerentry_showendtime.value:
                    self.timerentry_endtime.value = self.timerentry_starttime.value
                    self.timerentry_afterevent.value = "nothing"
            self.timer.resetRepeated()
            self.timer.afterEvent = {
                "nothing": AFTEREVENT.NONE,
                "deepstandby": AFTEREVENT.DEEPSTANDBY,
                "standby": AFTEREVENT.STANDBY,
                "auto": AFTEREVENT.AUTO
            }[self.timerentry_afterevent.value]
            self.timer.descramble = {
                "normal": True,
                "descrambled+ecm": True,
                "scrambled+ecm": False,
            }[self.timerentry_recordingtype.value]
            self.timer.record_ecm = {
                "normal": False,
                "descrambled+ecm": True,
                "scrambled+ecm": True,
            }[self.timerentry_recordingtype.value]
            self.timer.service_ref = self.timerentry_service_ref
            self.timer.tags = self.timerentry_tags

            if self.timerentry_fallback.value:
                self.timer.dirname = self.timerentry_fallbackdirname.value
            else:
                if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath(
                ):
                    self.timer.dirname = self.timerentry_dirname.value
                    config.movielist.last_timer_videodir.value = self.timer.dirname
                    config.movielist.last_timer_videodir.save()

            if self.timerentry_type.value == "once":
                self.timer.begin, self.timer.end = self.getBeginEnd()
            if self.timerentry_type.value == "repeated":
                if self.timerentry_repeated.value == "daily":
                    for x in (0, 1, 2, 3, 4, 5, 6):
                        self.timer.setRepeated(x)

                if self.timerentry_repeated.value == "weekly":
                    self.timer.setRepeated(self.timerentry_weekday.index)

                if self.timerentry_repeated.value == "weekdays":
                    for x in (0, 1, 2, 3, 4):
                        self.timer.setRepeated(x)

                if self.timerentry_repeated.value == "user":
                    for x in (0, 1, 2, 3, 4, 5, 6):
                        if self.timerentry_day[x].value:
                            self.timer.setRepeated(x)

                self.timer.repeatedbegindate = self.getTimestamp(
                    self.timerentry_repeatedbegindate.value,
                    self.timerentry_starttime.value)
                if self.timer.repeated:
                    self.timer.begin = self.getTimestamp(
                        self.timerentry_repeatedbegindate.value,
                        self.timerentry_starttime.value)
                    self.timer.end = self.getTimestamp(
                        self.timerentry_repeatedbegindate.value,
                        self.timerentry_endtime.value)
                else:
                    self.timer.begin = self.getTimestamp(
                        time(), self.timerentry_starttime.value)
                    self.timer.end = self.getTimestamp(
                        time(), self.timerentry_endtime.value)

                # when a timer end is set before the start, add 1 day
                if self.timer.end < self.timer.begin:
                    self.timer.end += 86400

            if self.timer.eit is not None:
                event = eEPGCache.getInstance().lookupEventId(
                    self.timer.service_ref.ref, self.timer.eit)
                if event:
                    n = event.getNumOfLinkageServices()
                    if n > 1:
                        tlist = []
                        ref = self.session.nav.getCurrentlyPlayingServiceOrGroup(
                        )
                        parent = self.timer.service_ref.ref
                        selection = 0
                        for x in range(n):
                            i = event.getLinkageService(parent, x)
                            if i.toString() == ref.toString():
                                selection = x
                            tlist.append((i.getName(), i))
                        self.session.openWithCallback(
                            self.subserviceSelected,
                            ChoiceBox,
                            title=_("Please select a subservice to record..."),
                            list=tlist,
                            selection=selection)
                        return
                    elif n > 0:
                        parent = self.timer.service_ref.ref
                        self.timer.service_ref = ServiceReference(
                            event.getLinkageService(parent, 0))
            self.saveTimer()
            self.close((True, self.timer))
Пример #38
0
 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)
Пример #39
0
class TimerEntry(Screen, ConfigListScreen):
    def __init__(self, session, timer, edit=False):
        Screen.__init__(self, session)
        self.timer = timer

        self.timer.service_ref_prev = self.timer.service_ref
        self.timer.begin_prev = self.timer.begin
        self.timer.end_prev = self.timer.end
        self.timer.external_prev = self.timer.external
        self.timer.dirname_prev = self.timer.dirname

        self.entryDate = None
        self.entryService = None

        self["key_green"] = self["oktext"] = Label(_("OK"))
        self["key_red"] = self["canceltext"] = Label(_("Cancel"))
        self["ok"] = Pixmap()
        self["cancel"] = Pixmap()
        self["key_yellow"] = Label(_("Timer type"))
        self["key_blue"] = Label()

        self["actions"] = NumberActionMap(
            [
                "SetupActions", "GlobalActions", "PiPSetupActions",
                "ColorActions"
            ], {
                "ok": self.keySelect,
                "save": self.keyGo,
                "cancel": self.keyCancel,
                "volumeUp": self.incrementStart,
                "volumeDown": self.decrementStart,
                "size+": self.incrementEnd,
                "size-": self.decrementEnd,
                "yellow": self.changeTimerType,
                "blue": self.changeZapWakeupType
            }, -2)

        self.list = []

        ConfigListScreen.__init__(self, self.list, session=session)
        self.setTitle(_("Timer entry"))
        FallbackTimerDirs(self, self.createConfig)

    def createConfig(self, currlocation=None, locations=[]):
        justplay = self.timer.justplay
        always_zap = self.timer.always_zap
        zap_wakeup = self.timer.zap_wakeup
        pipzap = self.timer.pipzap
        rename_repeat = self.timer.rename_repeat
        conflict_detection = self.timer.conflict_detection

        afterevent = {
            AFTEREVENT.NONE: "nothing",
            AFTEREVENT.DEEPSTANDBY: "deepstandby",
            AFTEREVENT.STANDBY: "standby",
            AFTEREVENT.AUTO: "auto"
        }[self.timer.afterEvent]

        if self.timer.record_ecm and self.timer.descramble:
            recordingtype = "descrambled+ecm"
        elif self.timer.record_ecm:
            recordingtype = "scrambled+ecm"
        elif self.timer.descramble:
            recordingtype = "normal"

        weekday_table = ("mon", "tue", "wed", "thu", "fri", "sat", "sun")

        day = list(
            [int(x) for x in reversed('{0:07b}'.format(self.timer.repeated))])
        weekday = 0
        if self.timer.repeated:  # repeated
            type = "repeated"
            if (self.timer.repeated == 31):  # Mon-Fri
                repeated = "weekdays"
            elif (self.timer.repeated == 127):  # daily
                repeated = "daily"
            else:
                repeated = "user"
                if day.count(1) == 1:
                    repeated = "weekly"
                    weekday = day.index(1)
        else:  # once
            type = "once"
            repeated = None
            weekday = int(strftime("%u", localtime(self.timer.begin))) - 1
            day[weekday] = 1
        self.timerentry_fallback = ConfigYesNo(
            default=self.timer.external_prev or
            config.usage.remote_fallback_external_timer.value and config.usage.
            remote_fallback.value and not nimmanager.somethingConnected())
        self.timerentry_justplay = ConfigSelection(
            choices=[("zap", _("zap")), ("record", _("record")),
                     ("zap+record", _("zap and record"))],
            default={
                0: "record",
                1: "zap",
                2: "zap+record"
            }[justplay + 2 * always_zap])
        if SystemInfo["DeepstandbySupport"]:
            shutdownString = _("go to deep standby")
            choicelist = [("always", _("always")),
                          ("from_standby", _("only from standby")),
                          ("from_deep_standby", _("only from deep standby")),
                          ("never", _("never"))]
        else:
            shutdownString = _("shut down")
            choicelist = [("always", _("always")), ("never", _("never"))]
        self.timerentry_zapwakeup = ConfigSelection(choices=choicelist,
                                                    default=zap_wakeup)
        self.timerentry_afterevent = ConfigSelection(choices=[
            ("nothing", _("do nothing")), ("standby", _("go to standby")),
            ("deepstandby", shutdownString), ("auto", _("auto"))
        ],
                                                     default=afterevent)
        self.timerentry_recordingtype = ConfigSelection(choices=[
            ("normal", _("normal")),
            ("descrambled+ecm", _("descramble and record ecm")),
            ("scrambled+ecm", _("don't descramble, record ecm"))
        ],
                                                        default=recordingtype)
        self.timerentry_type = ConfigSelection(choices=[("once", _("once")),
                                                        ("repeated",
                                                         _("repeated"))],
                                               default=type)
        self.timerentry_name = ConfigText(default=self.timer.name,
                                          visible_width=50,
                                          fixed_size=False)
        self.timerentry_description = ConfigText(
            default=self.timer.description, visible_width=50, fixed_size=False)
        self.timerentry_tags = self.timer.tags[:]
        self.timerentry_tagsset = ConfigSelection(choices=[
            not self.timerentry_tags and "None"
            or " ".join(self.timerentry_tags)
        ])

        self.timerentry_repeated = ConfigSelection(
            default=repeated,
            choices=[("weekly", _("weekly")), ("daily", _("daily")),
                     ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
        self.timerentry_renamerepeat = ConfigYesNo(default=rename_repeat)
        self.timerentry_pipzap = ConfigYesNo(default=pipzap)
        self.timerentry_conflictdetection = ConfigYesNo(
            default=conflict_detection)

        self.timerentry_date = ConfigDateTime(default=self.timer.begin,
                                              formatstring=_("%d.%B %Y"),
                                              increment=86400)
        self.timerentry_starttime = ConfigClock(default=self.timer.begin)
        self.timerentry_endtime = ConfigClock(default=self.timer.end)
        self.timerentry_showendtime = ConfigSelection(
            default=((self.timer.end - self.timer.begin) > 4),
            choices=[(True, _("yes")), (False, _("no"))])

        default = not self.timer.external_prev and self.timer.dirname or defaultMoviePath(
        )
        tmp = config.movielist.videodirs.value
        if default not in tmp:
            tmp.append(default)
        self.timerentry_dirname = ConfigSelection(default=default, choices=tmp)

        default = self.timer.external_prev and self.timer.dirname or currlocation
        if default not in locations:
            locations.append(default)
        self.timerentry_fallbackdirname = ConfigSelection(default=default,
                                                          choices=locations)

        self.timerentry_repeatedbegindate = ConfigDateTime(
            default=self.timer.repeatedbegindate,
            formatstring=_("%d.%B %Y"),
            increment=86400)

        self.timerentry_weekday = ConfigSelection(
            default=weekday_table[weekday],
            choices=[("mon", _("Monday")), ("tue", _("Tuesday")),
                     ("wed", _("Wednesday")), ("thu", _("Thursday")),
                     ("fri", _("Friday")), ("sat", _("Saturday")),
                     ("sun", _("Sunday"))])

        self.timerentry_day = ConfigSubList()
        for x in (0, 1, 2, 3, 4, 5, 6):
            self.timerentry_day.append(ConfigYesNo(default=day[x]))

        # FIXME some service-chooser needed here
        servicename = "N/A"
        try:  # no current service available?
            servicename = str(self.timer.service_ref.getServiceName())
        except:
            pass
        self.timerentry_service_ref = self.timer.service_ref
        self.timerentry_service = ConfigSelection([servicename])
        self.createSetup("config")

    def createSetup(self, widget):
        self.list = []
        self.entryFallbackTimer = getConfigListEntry(_("Fallback Timer"),
                                                     self.timerentry_fallback)
        if config.usage.remote_fallback_external_timer.value and config.usage.remote_fallback.value and not hasattr(
                self, "timerentry_remote"):
            self.list.append(self.entryFallbackTimer)
        self.entryName = getConfigListEntry(_("Name"), self.timerentry_name)
        self.list.append(self.entryName)
        self.entryDescription = getConfigListEntry(_("Description"),
                                                   self.timerentry_description)
        self.list.append(self.entryDescription)
        self.timerJustplayEntry = getConfigListEntry(_("Timer type"),
                                                     self.timerentry_justplay)
        self.list.append(self.timerJustplayEntry)
        self.timerTypeEntry = getConfigListEntry(_("Repeat type"),
                                                 self.timerentry_type)
        self.list.append(self.timerTypeEntry)

        if self.timerentry_type.value == "once":
            self.frequencyEntry = None
        else:  # repeated
            self.frequencyEntry = getConfigListEntry(_("Repeats"),
                                                     self.timerentry_repeated)
            self.list.append(self.frequencyEntry)
            self.repeatedbegindateEntry = getConfigListEntry(
                _("Starting on"), self.timerentry_repeatedbegindate)
            self.list.append(self.repeatedbegindateEntry)
            if self.timerentry_repeated.value == "daily":
                pass
            if self.timerentry_repeated.value == "weekdays":
                pass
            if self.timerentry_repeated.value == "weekly":
                self.list.append(
                    getConfigListEntry(_("Weekday"), self.timerentry_weekday))

            if self.timerentry_repeated.value == "user":
                self.list.append(
                    getConfigListEntry(_("Monday"), self.timerentry_day[0]))
                self.list.append(
                    getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
                self.list.append(
                    getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
                self.list.append(
                    getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
                self.list.append(
                    getConfigListEntry(_("Friday"), self.timerentry_day[4]))
                self.list.append(
                    getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
                self.list.append(
                    getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
            if self.timerentry_justplay.value != "zap":
                self.list.append(
                    getConfigListEntry(
                        _("Rename name and description for new events"),
                        self.timerentry_renamerepeat))

        self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date)
        if self.timerentry_type.value == "once":
            self.list.append(self.entryDate)

        self.entryStartTime = getConfigListEntry(_("Start time"),
                                                 self.timerentry_starttime)
        self.list.append(self.entryStartTime)

        self.entryShowEndTime = getConfigListEntry(_("Set end time"),
                                                   self.timerentry_showendtime)
        self.entryZapWakeup = getConfigListEntry(
            _("Wakeup receiver for start timer"), self.timerentry_zapwakeup)
        if self.timerentry_justplay.value == "zap":
            self.list.append(self.entryZapWakeup)
            if SystemInfo["PIPAvailable"]:
                self.list.append(
                    getConfigListEntry(_("Use as PiP if possible"),
                                       self.timerentry_pipzap))
            self.list.append(self.entryShowEndTime)
            self["key_blue"].setText(_("Wakeup type"))
        else:
            self["key_blue"].setText("")
        self.entryEndTime = getConfigListEntry(_("End time"),
                                               self.timerentry_endtime)
        if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value:
            self.list.append(self.entryEndTime)

        self.channelEntry = getConfigListEntry(_("Channel"),
                                               self.timerentry_service)
        self.list.append(self.channelEntry)

        self.dirname = getConfigListEntry(
            _("Location"), self.timerentry_fallbackdirname
        ) if self.timerentry_fallback.value and self.timerentry_fallbackdirname.value else getConfigListEntry(
            _("Location"), self.timerentry_dirname)
        if config.usage.setup_level.index >= 2 and (
                self.timerentry_fallback.value
                and self.timerentry_fallbackdirname.value
                or self.timerentry_dirname.value):  # expert+
            self.list.append(self.dirname)

        self.conflictDetectionEntry = getConfigListEntry(
            _("Enable timer conflict detection"),
            self.timerentry_conflictdetection)
        if not self.timerentry_fallback.value:
            self.list.append(self.conflictDetectionEntry)

        self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset)
        if self.timerentry_justplay.value != "zap" and not self.timerentry_fallback.value:
            if getPreferredTagEditor():
                self.list.append(self.tagsSet)
            self.list.append(
                getConfigListEntry(_("After event"),
                                   self.timerentry_afterevent))
            self.list.append(
                getConfigListEntry(_("Recording type"),
                                   self.timerentry_recordingtype))

        self[widget].list = self.list
        self[widget].l.setList(self.list)

    def newConfig(self):
        print "[TimerEdit] newConfig", self["config"].getCurrent()
        if self["config"].getCurrent() in (self.timerTypeEntry,
                                           self.timerJustplayEntry,
                                           self.frequencyEntry,
                                           self.entryShowEndTime,
                                           self.entryFallbackTimer):
            self.createSetup("config")

    def keyLeft(self):
        cur = self["config"].getCurrent()
        if cur in (self.channelEntry, self.tagsSet):
            self.keySelect()
        elif cur in (self.entryName, self.entryDescription):
            self.renameEntry()
        else:
            ConfigListScreen.keyLeft(self)
            self.newConfig()

    def keyRight(self):
        cur = self["config"].getCurrent()
        if cur in (self.channelEntry, self.tagsSet):
            self.keySelect()
        elif cur in (self.entryName, self.entryDescription):
            self.renameEntry()
        else:
            ConfigListScreen.keyRight(self)
            self.newConfig()

    def renameEntry(self):
        cur = self["config"].getCurrent()
        if cur == self.entryName:
            title_text = _("Please enter new name:")
            old_text = self.timerentry_name.value
        else:
            title_text = _("Please enter new description:")
            old_text = self.timerentry_description.value
        self.session.openWithCallback(self.renameEntryCallback,
                                      VirtualKeyBoard,
                                      title=title_text,
                                      text=old_text)

    def renameEntryCallback(self, answer):
        if answer:
            cur = self["config"].getCurrent()
            if cur == self.entryName:
                self.timerentry_name.value = answer
                self["config"].invalidate(self.entryName)
            else:
                self.timerentry_description.value = answer
                self["config"].invalidate(self.entryDescription)

    def handleKeyFileCallback(self, answer):
        if self["config"].getCurrent() in (self.channelEntry, self.tagsSet):
            self.keySelect()
        else:
            ConfigListScreen.handleKeyFileCallback(self, answer)
            self.newConfig()

    def openMovieLocationBox(self, answer=""):
        self.session.openWithCallback(
            self.pathSelected,
            MovieLocationBox,
            _("Select target folder"),
            self.timerentry_dirname.value,
            filename=answer,
            minFree=100  # We require at least 100MB free space
        )

    def keySelect(self):
        cur = self["config"].getCurrent()
        if cur == self.channelEntry:
            self.session.openWithCallback(
                self.finishedChannelSelection,
                ChannelSelection.SimpleChannelSelection,
                _("Select channel to record from"),
                currentBouquet=True)
        elif config.usage.setup_level.index >= 2 and cur == self.dirname:
            menu = [(_("Open select location"), "empty")]
            if self.timerentry_type.value == "repeated" and self.timerentry_name.value:
                menu.append(
                    (_("Open select location as timer name"), "timername"))
            if len(menu) == 1:
                self.openMovieLocationBox()
            elif len(menu) == 2:
                text = _("Select action")

                def selectAction(choice):
                    if choice:
                        if choice[1] == "timername":
                            self.openMovieLocationBox(
                                self.timerentry_name.value)
                        elif choice[1] == "empty":
                            self.openMovieLocationBox()

                self.session.openWithCallback(selectAction,
                                              ChoiceBox,
                                              title=text,
                                              list=menu)

        elif getPreferredTagEditor() and cur == self.tagsSet:
            self.session.openWithCallback(self.tagEditFinished,
                                          getPreferredTagEditor(),
                                          self.timerentry_tags)
        else:
            self.keyGo()

    def finishedChannelSelection(self, *args):
        if args:
            self.timerentry_service_ref = ServiceReference(args[0])
            self.timerentry_service.setCurrentText(
                self.timerentry_service_ref.getServiceName())
            self["config"].invalidate(self.channelEntry)

    def getTimestamp(self, date, mytime):
        d = localtime(date)
        dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
        return int(mktime(dt.timetuple()))

    def getBeginEnd(self):
        date = self.timerentry_date.value
        endtime = self.timerentry_endtime.value
        starttime = self.timerentry_starttime.value

        begin = self.getTimestamp(date, starttime)
        end = self.getTimestamp(date, endtime)

        # if the endtime is less than the starttime, add 1 day.
        if end < begin:
            end += 86400
        return begin, end

    def selectChannelSelector(self, *args):
        self.session.openWithCallback(self.finishedChannelSelectionCorrection,
                                      ChannelSelection.SimpleChannelSelection,
                                      _("Select channel to record from"))

    def finishedChannelSelectionCorrection(self, *args):
        if args:
            self.finishedChannelSelection(*args)
            self.keyGo()

    def RemoteSubserviceSelected(self, service):
        if service:
            # ouch, this hurts a little
            service_ref = timerentry_service_ref
            self.timerentry_service_ref = ServiceReference(service[1])
            eit = self.timer.eit
            self.timer.eit = None
            self.keyGo()
            self.timerentry_service_ref = service_ref
            self.timer.eit = eit

    def keyGo(self, result=None):
        if not self.timerentry_service_ref.isRecordable():
            self.session.openWithCallback(
                self.selectChannelSelector, MessageBox,
                _("You didn't select a channel to record from."),
                MessageBox.TYPE_ERROR)
        else:
            self.timer.external = self.timerentry_fallback.value
            self.timer.name = self.timerentry_name.value
            self.timer.description = self.timerentry_description.value
            self.timer.justplay = self.timerentry_justplay.value == "zap"
            self.timer.always_zap = self.timerentry_justplay.value == "zap+record"
            self.timer.zap_wakeup = self.timerentry_zapwakeup.value
            self.timer.pipzap = self.timerentry_pipzap.value
            self.timer.rename_repeat = self.timerentry_renamerepeat.value
            self.timer.conflict_detection = self.timerentry_conflictdetection.value
            if self.timerentry_justplay.value == "zap":
                if not self.timerentry_showendtime.value:
                    self.timerentry_endtime.value = self.timerentry_starttime.value
                    self.timerentry_afterevent.value = "nothing"
            self.timer.resetRepeated()
            self.timer.afterEvent = {
                "nothing": AFTEREVENT.NONE,
                "deepstandby": AFTEREVENT.DEEPSTANDBY,
                "standby": AFTEREVENT.STANDBY,
                "auto": AFTEREVENT.AUTO
            }[self.timerentry_afterevent.value]
            self.timer.descramble = {
                "normal": True,
                "descrambled+ecm": True,
                "scrambled+ecm": False,
            }[self.timerentry_recordingtype.value]
            self.timer.record_ecm = {
                "normal": False,
                "descrambled+ecm": True,
                "scrambled+ecm": True,
            }[self.timerentry_recordingtype.value]
            self.timer.service_ref = self.timerentry_service_ref
            self.timer.tags = self.timerentry_tags

            if self.timerentry_fallback.value:
                self.timer.dirname = self.timerentry_fallbackdirname.value
            else:
                if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath(
                ):
                    self.timer.dirname = self.timerentry_dirname.value
                    config.movielist.last_timer_videodir.value = self.timer.dirname
                    config.movielist.last_timer_videodir.save()

            if self.timerentry_type.value == "once":
                self.timer.begin, self.timer.end = self.getBeginEnd()
            if self.timerentry_type.value == "repeated":
                if self.timerentry_repeated.value == "daily":
                    for x in (0, 1, 2, 3, 4, 5, 6):
                        self.timer.setRepeated(x)

                if self.timerentry_repeated.value == "weekly":
                    self.timer.setRepeated(self.timerentry_weekday.index)

                if self.timerentry_repeated.value == "weekdays":
                    for x in (0, 1, 2, 3, 4):
                        self.timer.setRepeated(x)

                if self.timerentry_repeated.value == "user":
                    for x in (0, 1, 2, 3, 4, 5, 6):
                        if self.timerentry_day[x].value:
                            self.timer.setRepeated(x)

                self.timer.repeatedbegindate = self.getTimestamp(
                    self.timerentry_repeatedbegindate.value,
                    self.timerentry_starttime.value)
                if self.timer.repeated:
                    self.timer.begin = self.getTimestamp(
                        self.timerentry_repeatedbegindate.value,
                        self.timerentry_starttime.value)
                    self.timer.end = self.getTimestamp(
                        self.timerentry_repeatedbegindate.value,
                        self.timerentry_endtime.value)
                else:
                    self.timer.begin = self.getTimestamp(
                        time(), self.timerentry_starttime.value)
                    self.timer.end = self.getTimestamp(
                        time(), self.timerentry_endtime.value)

                # when a timer end is set before the start, add 1 day
                if self.timer.end < self.timer.begin:
                    self.timer.end += 86400

            if self.timer.eit is not None:
                event = eEPGCache.getInstance().lookupEventId(
                    self.timer.service_ref.ref, self.timer.eit)
                if event:
                    n = event.getNumOfLinkageServices()
                    if n > 1:
                        tlist = []
                        ref = self.session.nav.getCurrentlyPlayingServiceOrGroup(
                        )
                        parent = self.timer.service_ref.ref
                        selection = 0
                        for x in range(n):
                            i = event.getLinkageService(parent, x)
                            if i.toString() == ref.toString():
                                selection = x
                            tlist.append((i.getName(), i))
                        self.session.openWithCallback(
                            self.subserviceSelected,
                            ChoiceBox,
                            title=_("Please select a subservice to record..."),
                            list=tlist,
                            selection=selection)
                        return
                    elif n > 0:
                        parent = self.timer.service_ref.ref
                        self.timer.service_ref = ServiceReference(
                            event.getLinkageService(parent, 0))
            self.saveTimer()
            self.close((True, self.timer))

    def changeTimerType(self):
        self.timerentry_justplay.selectNext()
        self.timerJustplayEntry = getConfigListEntry(_("Timer type"),
                                                     self.timerentry_justplay)
        self["config"].invalidate(self.timerJustplayEntry)
        self.createSetup("config")

    def changeZapWakeupType(self):
        if self.timerentry_justplay.value == "zap":
            self.timerentry_zapwakeup.selectNext()
            self["config"].invalidate(self.entryZapWakeup)

    def incrementStart(self):
        self.timerentry_starttime.increment()
        self["config"].invalidate(self.entryStartTime)
        if self.timerentry_type.value == "once" and self.timerentry_starttime.value == [
                0, 0
        ]:
            self.timerentry_date.value += 86400
            self["config"].invalidate(self.entryDate)

    def decrementStart(self):
        self.timerentry_starttime.decrement()
        self["config"].invalidate(self.entryStartTime)
        if self.timerentry_type.value == "once" and self.timerentry_starttime.value == [
                23, 59
        ]:
            self.timerentry_date.value -= 86400
            self["config"].invalidate(self.entryDate)

    def incrementEnd(self):
        if self.entryEndTime is not None:
            self.timerentry_endtime.increment()
            self["config"].invalidate(self.entryEndTime)

    def decrementEnd(self):
        if self.entryEndTime is not None:
            self.timerentry_endtime.decrement()
            self["config"].invalidate(self.entryEndTime)

    def subserviceSelected(self, service):
        if not service is None:
            self.timer.service_ref = ServiceReference(service[1])
        self.saveTimer()
        self.close((True, self.timer))

    def saveTimer(self):
        self.session.nav.RecordTimer.saveTimer()

    def keyCancel(self, answer=True, message=""):
        if answer:
            self.close((False, ))
        else:
            print "[TimerEntry] keyCancel something went wrong with fallback timer", message

    def pathSelected(self, res):
        if res is not None:
            if config.movielist.videodirs.value != self.timerentry_dirname.choices:
                self.timerentry_dirname.setChoices(
                    config.movielist.videodirs.value, default=res)
            self.timerentry_dirname.value = res

    def tagEditFinished(self, ret):
        if ret is not None:
            self.timerentry_tags = ret
            self.timerentry_tagsset.setChoices(
                [not ret and "None" or " ".join(ret)])
            self["config"].invalidate(self.tagsSet)
Пример #40
0
    def information(self):
        if self.type == TYPE_SERVICE_INFO:
            if self.session.nav.getCurrentlyPlayingServiceOrGroup():
                name = ServiceReference(
                    self.session.nav.getCurrentlyPlayingServiceReference(
                    )).getServiceName()
                refstr = self.session.nav.getCurrentlyPlayingServiceReference(
                ).toString()
            else:
                name = _("N/A")
                refstr = _("N/A")
            aspect = "-"
            videocodec = "-"
            resolution = "-"
            if self.info:
                videocodec = (
                    "MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM",
                    "-")[self.info
                         and self.info.getInfo(iServiceInformation.sVideoType)]
                width = self.info.getInfo(iServiceInformation.sVideoWidth)
                height = self.info.getInfo(iServiceInformation.sVideoHeight)
                if width > 0 and height > 0:
                    resolution = "%dx%d" % (width, height)
                    resolution += ("i", "p", "")[self.info.getInfo(
                        iServiceInformation.sProgressive)]
                    resolution += str(
                        (self.info.getInfo(iServiceInformation.sFrameRate) +
                         500) / 1000)
                    aspect = self.getServiceInfoValue(
                        iServiceInformation.sAspect)
                    if aspect in (1, 2, 5, 6, 9, 0xA, 0xD, 0xE):
                        aspect = "4:3"
                    else:
                        aspect = "16:9"

            Labels = ((_("Name"), name, TYPE_TEXT),
                      (_("Provider"),
                       self.getServiceInfoValue(iServiceInformation.sProvider),
                       TYPE_TEXT), (_("Videoformat"), aspect, TYPE_TEXT),
                      (_("Videosize"), resolution,
                       TYPE_TEXT), (_("Videocodec"), videocodec, TYPE_TEXT),
                      (_("Namespace"),
                       self.getServiceInfoValue(
                           iServiceInformation.sNamespace), TYPE_VALUE_HEX,
                       8), (_("Service reference"), refstr, TYPE_TEXT))

            self.fillList(Labels)
        else:
            if self.transponder_info:
                tp_info = ConvertToHumanReadable(self.transponder_info)
                conv = {
                    "tuner_type": _("Transponder type"),
                    "system": _("System"),
                    "modulation": _("Modulation"),
                    "orbital_position": _("Orbital position"),
                    "frequency": _("Frequency"),
                    "symbol_rate": _("Symbol rate"),
                    "bandwidth": _("Bandwidth"),
                    "polarization": _("Polarization"),
                    "inversion": _("Inversion"),
                    "pilot": _("Pilot"),
                    "rolloff": _("Roll-off"),
                    "fec_inner": _("FEC"),
                    "code_rate_lp": _("Coderate LP"),
                    "code_rate_hp": _("Coderate HP"),
                    "constellation": _("Constellation"),
                    "transmission_mode": _("Transmission mode"),
                    "guard_interval": _("Guard interval"),
                    "hierarchy_information": _("Hierarchy information")
                }
                Labels = [(conv[i], tp_info[i],
                           i == "orbital_position" and TYPE_VALUE_ORBIT_DEC
                           or TYPE_VALUE_DEC) for i in tp_info.keys()
                          if i in conv]
                self.fillList(Labels)
Пример #41
0
class TimerEntry(Screen, ConfigListScreen):
	def __init__(self, session, timer):
		Screen.__init__(self, session)
		self.setup_title = _("Timer entry")
		self.timer = timer

		self.entryDate = None
		self.entryService = None

		self["HelpWindow"] = Pixmap()
		self["HelpWindow"].hide()
		self["VKeyIcon"] = Boolean(False)

		self["locationdescription"] = Label("")
		self["locationfreespace"] = Label("")
		self["description"] = Label("")
		self["oktext"] = Label(_("OK"))
		self["canceltext"] = Label(_("Cancel"))
		self["ok"] = Pixmap()
		self["cancel"] = Pixmap()

		self.createConfig()

		self["actions"] = NumberActionMap(["SetupActions", "GlobalActions", "PiPSetupActions", "ColorActions"],
		{
			"ok": self.keySelect,
			"save": self.keyGo,
			"cancel": self.keyCancel,
			"volumeUp": self.incrementStart,
			"volumeDown": self.decrementStart,
			"size+": self.incrementEnd,
			"size-": self.decrementEnd,
		}, -2)

		self["VirtualKB"] = ActionMap(["VirtualKeyboardActions"],
		{
			"showVirtualKeyboard": self.KeyText,
		}, -2)
		self["VirtualKB"].setEnabled(False)

		self.onChangedEntry = []
		self.list = []
		ConfigListScreen.__init__(self, self.list, session=session)
		self.createSetup("config")
		self.onLayoutFinish.append(self.layoutFinished)

		if not self.selectionChanged in self["config"].onSelectionChanged:
			self["config"].onSelectionChanged.append(self.selectionChanged)
		self.selectionChanged()

	def createConfig(self):
		justplay = self.timer.justplay
		always_zap = self.timer.always_zap
		rename_repeat = self.timer.rename_repeat

		afterevent = {
			AFTEREVENT.NONE: "nothing",
			AFTEREVENT.DEEPSTANDBY: "deepstandby",
			AFTEREVENT.STANDBY: "standby",
			AFTEREVENT.AUTO: "auto"
			}[self.timer.afterEvent]

		if self.timer.record_ecm and self.timer.descramble:
			recordingtype = "descrambled+ecm"
		elif self.timer.record_ecm:
			recordingtype = "scrambled+ecm"
		elif self.timer.descramble:
			recordingtype = "normal"

		weekday_table = ("mon", "tue", "wed", "thu", "fri", "sat", "sun")

		# calculate default values
		days = []
		weekday = 0
		for x in (0, 1, 2, 3, 4, 5, 6):
			days.append(False)
		if self.timer.repeated: # repeated
			type = "repeated"
			if self.timer.repeated == 31: # Mon-Fri
				repeated = "weekdays"
			elif self.timer.repeated == 127: # daily
				repeated = "daily"
			else:
				flags = self.timer.repeated
				repeated = "user"
				count = 0
				for x in (0, 1, 2, 3, 4, 5, 6):
					if flags == 1: # weekly
# 						print "Set to weekday " + str(x)
						weekday = x
					if flags & 1 == 1: # set user defined flags
						days[x] = True
						count += 1
					else:
						days[x] = False
					flags >>= 1
				if count == 1:
					repeated = "weekly"
		else: # once
			type = "once"
			repeated = None
			weekday = int(strftime("%u", localtime(self.timer.begin))) - 1
			days[weekday] = True

		self.timerentry_justplay = ConfigSelection(default={
			0: "record",
			1: "zap",
			2: "zap+record"
		}[justplay + 2 * always_zap], choices=[
			("zap", _("Zap")),
			("record", _("Record")),
			("zap+record", _("Zap and record"))
		])
		self.timertyp = self.timerentry_justplay.value

		if BoxInfo.getItem("DeepstandbySupport"):
			shutdownString = _("Go to deep standby")
		else:
			shutdownString = _("Shut down")
		self.timerentry_afterevent = ConfigSelection(choices=[("nothing", _("Do nothing")), ("standby", _("Go to standby")), ("deepstandby", shutdownString), ("auto", _("auto"))], default=afterevent)
		self.timerentry_recordingtype = ConfigSelection(choices=[("normal", _("normal")), ("descrambled+ecm", _("Descramble and record ecm")), ("scrambled+ecm", _("Don't descramble, record ecm"))], default=recordingtype)
		self.timerentry_type = ConfigSelection(choices=[("once", _("once")), ("repeated", _("repeated"))], default=type)
		# FIME Do we need these 2 lines?
		if six.PY3:
			self.timerentry_name = ConfigText(default=self.timer.name.replace('\x86', '').replace('\x87', ''), visible_width=50, fixed_size=False)
			self.timerentry_description_replaced = self.timer.description.replace('\x8a', ' ')
		else:
			self.timerentry_name = ConfigText(default=self.timer.name.replace('\xc2\x86', '').replace('\xc2\x87', '').encode("utf-8"), visible_width=50, fixed_size=False)
			self.timerentry_description_replaced = self.timer.description.replace('\xc2\x8a', ' ').encode("utf-8")
		self.timerentry_description = ConfigText(default=self.timerentry_description_replaced, visible_width=50, fixed_size=False)
		self.timerentry_tags = self.timer.tags[:]
		# if no tags found, make name of event default tag set.
		if not self.timerentry_tags:
			tagname = self.timer.name.strip()
			if tagname:
				tagname = tagname[0].upper() + tagname[1:].replace(" ", "_")
				self.timerentry_tags.append(tagname)

		self.timerentry_tagsset = ConfigSelection(choices=[not self.timerentry_tags and "None" or " ".join(self.timerentry_tags)])

		self.timerentry_repeated = ConfigSelection(default=repeated, choices=[("weekly", _("weekly")), ("daily", _("daily")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
		self.timerentry_renamerepeat = ConfigYesNo(default=rename_repeat)

		self.timerentry_date = ConfigDateTime(default=self.timer.begin, formatstring=config.usage.date.full.value, increment=86400)
		self.timerentry_starttime = ConfigClock(default=self.timer.begin)
		self.timerentry_endtime = ConfigClock(default=self.timer.end)
		self.timerentry_showendtime = ConfigSelection(default=(self.timer.end > self.timer.begin + 3 and self.timer.justplay), choices=[(True, _("Yes")), (False, _("No"))])

		default = self.timer.dirname or defaultMoviePath()
		tmp = config.movielist.videodirs.value
		if default not in tmp:
			tmp.append(default)
		self.timerentry_dirname = ConfigSelection(default=default, choices=tmp)

		self.timerentry_repeatedbegindate = ConfigDateTime(default=self.timer.repeatedbegindate, formatstring=config.usage.date.full.value, increment=86400)

		self.timerentry_weekday = ConfigSelection(default=weekday_table[weekday], choices=[("mon", _("Monday")), ("tue", _("Tuesday")), ("wed", _("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])

		self.timerentry_day = ConfigSubList()
		for x in (0, 1, 2, 3, 4, 5, 6):
			self.timerentry_day.append(ConfigYesNo(default=days[x]))

		# FIXME some service-chooser needed here
		servicename = "N/A"
		try: # no current service available?
			servicename = str(self.timer.service_ref.getServiceName())
		except:
			pass
		self.timerentry_service_ref = self.timer.service_ref
		self.timerentry_service = ConfigSelection([servicename])

	def createSetup(self, widget):
		if not self.timer in self.session.nav.RecordTimer.timer_list:
			newtime = None
			if self.timerentry_justplay.value == 'zap' and self.timertyp != 'zap':
				newtime = self.getTimestamp(self.timerentry_date.value, self.timerentry_starttime.value) + config.recording.margin_before.value * 60
				newbegin = localtime(newtime)
			elif self.timerentry_justplay.value != 'zap' and self.timertyp == 'zap':
				newtime = self.getTimestamp(self.timerentry_date.value, self.timerentry_starttime.value) - config.recording.margin_before.value * 60
				newbegin = localtime(newtime)
			if newtime:
				self.timerentry_date.value = newtime
				self.timerentry_starttime.value = [newbegin.tm_hour, newbegin.tm_min]
			self.timertyp = self.timerentry_justplay.value

		self.list = []
		self.timerJustplayEntry = getConfigListEntry(_("Timer type"), self.timerentry_justplay, _("Chose between record and ZAP."))
		self.list.append(self.timerJustplayEntry)

		description = free = ""
		try:
			if self.timerentry_justplay.value != "zap":
				stat = statvfs(self.timerentry_dirname.value)
				a = float(stat.f_blocks) * stat.f_bsize / 1024 / 1024 / 1024
				b = float(stat.f_bavail) * stat.f_bsize / 1024 / 1024 / 1024
				c = 100.0 * b / a
				free = ("%0.f GB (%0.f %s) " + _("free diskspace")) % (b, c, "%")
				description = _("Current location")
		except:
			pass
		self["locationdescription"].setText(description)
		self["locationfreespace"].setText(free)

		self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname, _("Where should the recording be saved?"))
		if self.timerentry_justplay.value != "zap":
			if config.usage.setup_level.index >= 2: # expert+
				self.list.append(self.dirname)

		self.entryName = getConfigListEntry(_("Name"), self.timerentry_name, _("Set the name the recording will get."))
		self.list.append(self.entryName)
		self.entryDescription = getConfigListEntry(_("Description"), self.timerentry_description, _("Set the description of the recording."))
		self.list.append(self.entryDescription)
		self.timerTypeEntry = getConfigListEntry(_("Repeat type"), self.timerentry_type, _("A repeating timer or just once?"))
		self.list.append(self.timerTypeEntry)

		if self.timerentry_type.value == "once":
			self.frequencyEntry = None
		else: # repeated
			self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated, _("Choose between Daily, Weekly, Weekdays or user defined."))
			self.list.append(self.frequencyEntry)
			self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate, _("Set the date the timer must start."))
			self.list.append(self.repeatedbegindateEntry)
			if self.timerentry_repeated.value == "daily":
				pass
			if self.timerentry_repeated.value == "weekdays":
				pass
			if self.timerentry_repeated.value == "weekly":
				self.list.append(getConfigListEntry(_("Weekday"), self.timerentry_weekday))

			if self.timerentry_repeated.value == "user":
				self.list.append(getConfigListEntry(_("Monday"), self.timerentry_day[0]))
				self.list.append(getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
				self.list.append(getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
				self.list.append(getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
				self.list.append(getConfigListEntry(_("Friday"), self.timerentry_day[4]))
				self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
				self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
			if self.timerentry_justplay.value != "zap":
				self.list.append(getConfigListEntry(_("Rename name and description for new events"), self.timerentry_renamerepeat))

		self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date, _("Set the date the timer must start."))
		if self.timerentry_type.value == "once":
			self.list.append(self.entryDate)

		self.entryStartTime = getConfigListEntry(_("Start time"), self.timerentry_starttime, _("Set the time the timer must start."))
		self.list.append(self.entryStartTime)

		self.entryShowEndTime = getConfigListEntry(_("Set end time"), self.timerentry_showendtime, _("Set the time the timer must stop."))
		if self.timerentry_justplay.value == "zap":
			self.list.append(self.entryShowEndTime)

		self.entryEndTime = getConfigListEntry(_("End time"), self.timerentry_endtime, _("Set the time the timer must stop."))
		if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value:
			self.list.append(self.entryEndTime)

		self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service, _("Set the channel for this timer."))
		self.list.append(self.channelEntry)

		if self.timerentry_showendtime.value and self.timerentry_justplay.value == "zap":
			self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent, _("What action is required on completion of the timer? 'Auto' lets the box return to the state it had when the timer started. 'Do nothing', 'Go to standby' and 'Go to deep standby' do exactly that.")))

		self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset, _("Choose a tag for easy finding a recording."))
		if self.timerentry_justplay.value != "zap":
			self.list.append(self.tagsSet)
			self.list.append(getConfigListEntry(_("After Recording"), self.timerentry_afterevent, _("What action is required on completion of the timer? 'Auto' lets the box return to the state it had when the timer started. 'Do nothing', 'Go to standby' and 'Go to deep standby' do exactly that.")))
			self.list.append(getConfigListEntry(_("Recording type"), self.timerentry_recordingtype, _("Descramble & record ECM' gives the option to descramble afterwards if descrambling on recording failed. 'Don't descramble, record ECM' save a scramble recording that can be descrambled on playback. 'Normal' means descramble the recording and don't record ECM.")))

		self[widget].list = self.list
		self[widget].l.setList(self.list)

	def selectionChanged(self):
		if self["config"].getCurrent():
			if len(self["config"].getCurrent()) > 2 and self["config"].getCurrent()[2]:
				self["description"].setText(self["config"].getCurrent()[2])
			if isinstance(self["config"].getCurrent()[1], ConfigText):
				if "VKeyIcon" in self:
					self["VirtualKB"].setEnabled(True)
					self["VKeyIcon"].boolean = True
				if "HelpWindow" in self:
					if self["config"].getCurrent()[1].help_window and self["config"].getCurrent()[1].help_window.instance is not None:
						helpwindowpos = self["HelpWindow"].getPosition()
						from enigma import ePoint
						self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0], helpwindowpos[1]))
					else:
						if "VKeyIcon" in self:
							self["VirtualKB"].setEnabled(False)
							self["VKeyIcon"].boolean = False
		else:
			if "VKeyIcon" in self:
				self["VirtualKB"].setEnabled(False)
				self["VKeyIcon"].boolean = False

	def layoutFinished(self):
		self.setTitle(_(self.setup_title))

	def createSummary(self):
		return SetupSummary

	# for summary:
	def changedEntry(self):
		for x in self.onChangedEntry:
			x()

	def getCurrentEntry(self):
		return self["config"].getCurrent() and self["config"].getCurrent()[0] or ""

	def getCurrentValue(self):
		return self["config"].getCurrent() and str(self["config"].getCurrent()[1].getText()) or ""

	def newConfig(self):
		if self["config"].getCurrent() in (self.timerTypeEntry, self.timerJustplayEntry, self.frequencyEntry, self.entryShowEndTime, self.dirname):
			self.createSetup("config")

	def KeyText(self):
		if self['config'].getCurrent()[0] in (_('Name'), _("Description")):
			self.session.openWithCallback(self.renameEntryCallback, VirtualKeyBoard, title=self["config"].getCurrent()[2], text=self["config"].getCurrent()[1].value, visible_width=50, currPos=0)

	def keyLeft(self):
		cur = self["config"].getCurrent()
		if cur in (self.channelEntry, self.tagsSet):
			self.keySelect()
		#elif cur in (self.entryName, self.entryDescription):
		#	self.renameEntry()
		else:
			ConfigListScreen.keyLeft(self)
			self.newConfig()

	def keyRight(self):
		cur = self["config"].getCurrent()
		if cur in (self.channelEntry, self.tagsSet):
			self.keySelect()
		#elif cur in (self.entryName, self.entryDescription):
		#	self.renameEntry()
		else:
			ConfigListScreen.keyRight(self)
			self.newConfig()

	def renameEntry(self):
		cur = self["config"].getCurrent()
		if cur == self.entryName:
			title_text = _("Please enter new name:")
			old_text = self.timerentry_name.value
		else:
			title_text = _("Please enter new description:")
			old_text = self.timerentry_description.value
		self.session.openWithCallback(self.renameEntryCallback, VirtualKeyBoard, title=title_text, text=old_text)

	def renameEntryCallback(self, answer):
		if answer:
			if self["config"].getCurrent() == self.entryName:
				self.timerentry_name.value = answer
				self["config"].invalidate(self.entryName)
			else:
				self.timerentry_description.value = answer
				self["config"].invalidate(self.entryDescription)

	def handleKeyFileCallback(self, answer):
		if self["config"].getCurrent() in (self.channelEntry, self.tagsSet):
			self.keySelect()
		else:
			ConfigListScreen.handleKeyFileCallback(self, answer)
			self.newConfig()

	def keySelect(self):
		cur = self["config"].getCurrent()
		if cur == self.channelEntry:
			self.session.openWithCallback(
				self.finishedChannelSelection,
				Screens.ChannelSelection.SimpleChannelSelection,
				_("Select channel to record from"),
				currentBouquet=True
			)
		elif config.usage.setup_level.index >= 2 and cur == self.dirname:
			self.session.openWithCallback(
				self.pathSelected,
				MovieLocationBox,
				_("Select target folder"),
				self.timerentry_dirname.value,
				minFree=100 # We require at least 100MB free space
			)
		elif cur == self.tagsSet:
			self.session.openWithCallback(
				self.tagEditFinished,
				TagEditor,
				tags=self.timerentry_tags
			)
		else:
			self.keyGo()

	def finishedChannelSelection(self, *args):
		if args:
			self.timerentry_service_ref = ServiceReference(args[0])
			self.timerentry_service.setCurrentText(self.timerentry_service_ref.getServiceName())
			self["config"].invalidate(self.channelEntry)

	def getTimestamp(self, date, mytime):
		d = localtime(date)
		dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
		return int(mktime(dt.timetuple()))

	def getBeginEnd(self):
		date = self.timerentry_date.value
		endtime = self.timerentry_endtime.value
		starttime = self.timerentry_starttime.value

		begin = self.getTimestamp(date, starttime)
		end = self.getTimestamp(date, endtime)

		# if the endtime is less than the starttime, add 1 day.
		if end < begin:
			end += 86400

		# if the timer type is a Zap and no end is set, set duration to 1 second so time is shown in EPG's.
		if self.timerentry_justplay.value == "zap":
			if not self.timerentry_showendtime.value:
				end = begin + 1

		return begin, end

	def selectChannelSelector(self, *args):
		self.session.openWithCallback(
				self.finishedChannelSelectionCorrection,
				Screens.ChannelSelection.SimpleChannelSelection,
				_("Select channel to record from")
			)

	def finishedChannelSelectionCorrection(self, *args):
		if args:
			self.finishedChannelSelection(*args)
			self.keyGo()

	def keyGo(self, result=None):
		if not self.timerentry_service_ref.isRecordable():
			self.session.openWithCallback(self.selectChannelSelector, MessageBox, _("You didn't select a channel to record from."), MessageBox.TYPE_ERROR)
			return
		self.timer.name = self.timerentry_name.value
		self.timer.description = self.timerentry_description.value if self.timerentry_description_replaced != self.timerentry_description.value else self.timer.description
		self.timer.justplay = self.timerentry_justplay.value == "zap"
		self.timer.always_zap = self.timerentry_justplay.value == "zap+record"
		self.timer.rename_repeat = self.timerentry_renamerepeat.value
		if self.timerentry_justplay.value == "zap":
			if not self.timerentry_showendtime.value:
				self.timerentry_endtime.value = self.timerentry_starttime.value
				self.timerentry_afterevent.value = "nothing"

		if self.timerentry_endtime.value == self.timerentry_starttime.value and self.timerentry_afterevent.value != "nothing":
			self.timerentry_afterevent.value = "nothing"
			self.session.open(MessageBox, _("Difference between timer begin and end must be equal or greater than %d minutes.\nEnd Action was disabled !") % 1, MessageBox.TYPE_INFO, timeout=30)

		self.timer.resetRepeated()
		self.timer.afterEvent = {
			"nothing": AFTEREVENT.NONE,
			"deepstandby": AFTEREVENT.DEEPSTANDBY,
			"standby": AFTEREVENT.STANDBY,
			"auto": AFTEREVENT.AUTO
			}[self.timerentry_afterevent.value]
		self.timer.descramble = {
			"normal": True,
			"descrambled+ecm": True,
			"scrambled+ecm": False,
			}[self.timerentry_recordingtype.value]
		self.timer.record_ecm = {
			"normal": False,
			"descrambled+ecm": True,
			"scrambled+ecm": True,
			}[self.timerentry_recordingtype.value]
		self.timer.service_ref = self.timerentry_service_ref
		self.timer.tags = self.timerentry_tags

		if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
			self.timer.dirname = self.timerentry_dirname.value
			config.movielist.last_timer_videodir.value = self.timer.dirname
			config.movielist.last_timer_videodir.save()

		if self.timerentry_type.value == "once":
			self.timer.begin, self.timer.end = self.getBeginEnd()
		if self.timerentry_type.value == "repeated":
			if self.timerentry_repeated.value == "daily":
				for x in (0, 1, 2, 3, 4, 5, 6):
					self.timer.setRepeated(x)

			if self.timerentry_repeated.value == "weekly":
				self.timer.setRepeated(self.timerentry_weekday.index)

			if self.timerentry_repeated.value == "weekdays":
				for x in (0, 1, 2, 3, 4):
					self.timer.setRepeated(x)

			if self.timerentry_repeated.value == "user":
				for x in (0, 1, 2, 3, 4, 5, 6):
					if self.timerentry_day[x].value:
						self.timer.setRepeated(x)

			self.timer.repeatedbegindate = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
			if self.timer.repeated:
				self.timer.begin = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
				self.timer.end = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value)
			else:
				self.timer.begin = self.getTimestamp(time(), self.timerentry_starttime.value)
				self.timer.end = self.getTimestamp(time(), self.timerentry_endtime.value)

			# when a timer end is set before the start, add 1 day
			if self.timer.end < self.timer.begin:
				self.timer.end += 86400

		if self.timer.eit is not None:
			event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
			if event:
				n = event.getNumOfLinkageServices()
				if n > 1:
					tlist = []
					ref = self.session.nav.getCurrentlyPlayingServiceOrGroup()
					parent = self.timer.service_ref.ref
					selection = 0
					for x in list(range(n)):
						i = event.getLinkageService(parent, x)
						if i.toString() == ref.toString():
							selection = x
						tlist.append((i.getName(), i))
					self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list=tlist, selection=selection)
					return
				elif n > 0:
					parent = self.timer.service_ref.ref
					self.timer.service_ref = ServiceReference(event.getLinkageService(parent, 0))
		self.saveTimer()
		self.close((True, self.timer))

	def changeTimerType(self):
		self.timerentry_justplay.selectNext()
		self.timerJustplayEntry = getConfigListEntry(_("Timer type"), self.timerentry_justplay)
		self["config"].invalidate(self.timerJustplayEntry)

	def incrementStart(self):
		self.timerentry_starttime.increment()
		self["config"].invalidate(self.entryStartTime)
		if self.timerentry_type.value == "once" and self.timerentry_starttime.value == [0, 0]:
			self.timerentry_date.value += 86400
			self["config"].invalidate(self.entryDate)

	def decrementStart(self):
		self.timerentry_starttime.decrement()
		self["config"].invalidate(self.entryStartTime)
		if self.timerentry_type.value == "once" and self.timerentry_starttime.value == [23, 59]:
			self.timerentry_date.value -= 86400
			self["config"].invalidate(self.entryDate)

	def incrementEnd(self):
		if self.entryEndTime is not None:
			self.timerentry_endtime.increment()
			self["config"].invalidate(self.entryEndTime)

	def decrementEnd(self):
		if self.entryEndTime is not None:
			self.timerentry_endtime.decrement()
			self["config"].invalidate(self.entryEndTime)

	def subserviceSelected(self, service):
		if not service is None:
			self.timer.service_ref = ServiceReference(service[1])
		self.saveTimer()
		self.close((True, self.timer))

	def saveTimer(self):
		self.session.nav.RecordTimer.saveTimer()

	def keyCancel(self):
		self.close((False,))

	def pathSelected(self, res):
		if res is not None:
			if config.movielist.videodirs.value != self.timerentry_dirname.choices:
				self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
			self.timerentry_dirname.value = res
			self.newConfig()

	def tagEditFinished(self, ret):
		if ret is not None:
			self.timerentry_tags = ret
			self.timerentry_tagsset.setChoices([not ret and "None" or " ".join(ret)])
			self["config"].invalidate(self.tagsSet)
Пример #42
0
    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
Пример #43
0
	def buildMovieListEntry(self, serviceref, info, begin, len):
		if serviceref.flags & eServiceReference.mustDescent:
			return None

		width = self.l.getItemSize().width()

		if len <= 0: #recalc len when not already done
			cur_idx = self.l.getCurrentSelectionIndex()
			x = self.list[cur_idx]
			if config.usage.load_length_of_movies_in_moviellist.value:
				len = x[1].getLength(x[0]) #recalc the movie length...
			else:
				len = 0 #dont recalc movielist to speedup loading the list
			self.list[cur_idx] = (x[0], x[1], x[2], len) #update entry in list... so next time we don't need to recalc
		
		if len > 0:
			len = "%d:%02d" % (len / 60, len % 60)
		else:
			len = ""
		
		res = [ None ]
		
		txt = info.getName(serviceref)
		service = ServiceReference(info.getInfoString(serviceref, iServiceInformation.sServiceref))
		description = info.getInfoString(serviceref, iServiceInformation.sDescription)
		tags = info.getInfoString(serviceref, iServiceInformation.sTags)

		begin_string = ""
		if begin > 0:
			t = FuzzyTime(begin)
			begin_string = t[0] + ", " + t[1]
		ih = self.itemHeight
		if self.list_type == MovieList.LISTTYPE_ORIGINAL:
			fc, sc = self.columnsOriginal[0], self.columnsOriginal[1]
			ih1 = (ih * 2) / 5 # 75 -> 30
			ih2 = (ih * 2) / 3 # 75 -> 50
			res.append(MultiContentEntryText(pos=(0, 0), size=(width-fc-2, ih1), font = 0, flags = RT_HALIGN_LEFT, text=txt))
			if self.tags:
				res.append(MultiContentEntryText(pos=(width-fc, 0), size=(fc, ih1), font = 2, flags = RT_HALIGN_RIGHT, text = tags))
				if service is not None:
					res.append(MultiContentEntryText(pos=(sc, ih2), size=(sc, ih2-ih1), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName()))
			else:
				if service is not None:
					res.append(MultiContentEntryText(pos=(width-fc, 0), size=(fc, ih1), font = 2, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
			res.append(MultiContentEntryText(pos=(0, ih1), size=(width, ih2-ih1), font=1, flags=RT_HALIGN_LEFT, text=description))
			res.append(MultiContentEntryText(pos=(0, ih2), size=(sc, ih2-ih1), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
			res.append(MultiContentEntryText(pos=(width-sc, ih2), size=(sc-2, ih2-ih1), font=1, flags=RT_HALIGN_RIGHT, text=len))
		elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION:
			ih1 = ((ih * 8) + 14) / 15 # 37 -> 20, round up
			fc, sc, lc = self.columnsCompactDescription[0], self.columnsCompactDescription[1], self.columnsCompactDescription[2]
			res.append(MultiContentEntryText(pos=(0, 0), size=(width-fc, ih1), font = 0, flags = RT_HALIGN_LEFT, text = txt))
			res.append(MultiContentEntryText(pos=(0, ih1), size=(width-sc-lc, ih-ih1), font=1, flags=RT_HALIGN_LEFT, text=description))
			res.append(MultiContentEntryText(pos=(width-fc, 6), size=(fc, ih1), font=1, flags=RT_HALIGN_RIGHT, text=begin_string))
			if service is not None:
				res.append(MultiContentEntryText(pos=(width-sc-lc, ih1), size=(sc, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
			res.append(MultiContentEntryText(pos=(width-lc, ih1), size=(lc, ih1), font=1, flags=RT_HALIGN_RIGHT, text=len))
		elif self.list_type == MovieList.LISTTYPE_COMPACT:
			ih1 = ((ih * 8) + 14) / 15 # 37 -> 20, round up
			lc, col = self.compactColumn[0], self.compactColumn[1]
			res.append(MultiContentEntryText(pos=(0, 0), size=(width-lc-2, ih1), font = 0, flags = RT_HALIGN_LEFT, text = txt))
			if self.tags:
				res.append(MultiContentEntryText(pos=(width-col, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = tags))
				if service is not None:
					res.append(MultiContentEntryText(pos=(col, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName()))
			else:
				if service is not None:
					res.append(MultiContentEntryText(pos=(width-col, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
			res.append(MultiContentEntryText(pos=(0, ih1), size=(col, ih-ih1), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
			res.append(MultiContentEntryText(pos=(width-lc, 0), size=(lc, ih1), font=0, flags=RT_HALIGN_RIGHT, text=len))
		else:
			assert(self.list_type == MovieList.LISTTYPE_MINIMAL)
			if self.descr_state == MovieList.SHOW_DESCRIPTION:
				dateSize = ih * 145 / 20   # 20 -> 145
				res.append(MultiContentEntryText(pos=(0, 0), size=(width-dateSize, ih), font = 0, flags = RT_HALIGN_LEFT, text = txt))
				res.append(MultiContentEntryText(pos=(width-dateSize, 4), size=(dateSize, ih), font=1, flags=RT_HALIGN_RIGHT, text=begin_string))
			else:
				lenSize = ih * 75 / 20 # 20 -> 75
				res.append(MultiContentEntryText(pos=(0, 0), size=(width-lenSize-2, ih), font = 0, flags = RT_HALIGN_LEFT, text = txt))
				res.append(MultiContentEntryText(pos=(width-lenSize, 0), size=(lenSize, ih), font=0, flags=RT_HALIGN_RIGHT, text=len))
		
		return res
Пример #44
0
	def isServicePlayable(self, ref, callback, session=None):
		self.session = session
		if self.isProtected(ref):
			if self.sessionPinCached:
				return True
			self.callback = callback
			service = ref.toCompareString()
			title = 'FROM BOUQUET "userbouquet.' in service and _("this bouquet is protected by a parental control pin") or _("this service is protected by a parental control pin")
			if session:
				Notifications.RemovePopup("Parental control")
				if self.PinDlg:
					self.PinDlg.close()
				self.PinDlg = session.openWithCallback(boundFunction(self.servicePinEntered, ref), PinInput, triesEntry=config.ParentalControl.retries.servicepin, pinList=self.getPinList(), service=ServiceReference(ref).getServiceName(), title=title, windowTitle=_("Parental control"), simple=False)
			else:
				Notifications.AddNotificationParentalControl(boundFunction(self.servicePinEntered, ref), PinInput, triesEntry=config.ParentalControl.retries.servicepin, pinList=self.getPinList(), service=ServiceReference(ref).getServiceName(), title=title, windowTitle=_("Parental control"))
			return False
		else:
			return True
Пример #45
0
    def __init__(self,
                 session,
                 service,
                 zapFunc=None,
                 eventid=None,
                 bouquetChangeCB=None,
                 serviceChangeCB=None,
                 parent=None):
        Screen.__init__(self, session)
        self.bouquetChangeCB = bouquetChangeCB
        self.serviceChangeCB = serviceChangeCB
        self.ask_time = -1  #now
        self["key_red"] = StaticText("")
        self.closeRecursive = False
        self.saved_title = None
        self["Service"] = ServiceEvent()
        self["Event"] = Event()
        self.session = session
        self.Console = Console()
        if isinstance(service, str) and eventid is not None:
            self.type = EPG_TYPE_SIMILAR
            self.setTitle(_("Similar EPG"))
            self["key_yellow"] = StaticText()
            self["key_blue"] = StaticText()
            self["key_red"] = StaticText()
            self.currentService = service
            self.eventid = eventid
            self.zapFunc = None
        elif isinstance(service, eServiceReference) or isinstance(
                service, str):
            self.setTitle(_("Single EPG"))
            self.type = EPG_TYPE_SINGLE
            self["key_yellow"] = StaticText()
            self["key_blue"] = StaticText(_("Select Channel"))
            self.currentService = ServiceReference(service)
            self.zapFunc = zapFunc
            self.sort_type = 0
            self.setSortDescription()
        else:
            self.setTitle(_("Multi EPG"))
            self.skinName = "EPGSelectionMulti"
            self.type = EPG_TYPE_MULTI
            if self.bouquetChangeCB == StaticText:
                self["key_yellow"] = StaticText(
                    pgettext("button label, 'previous screen'", "Prev"))
                self["key_blue"] = StaticText(
                    pgettext("button label, 'next screen'", "Next"))
            else:
                self["key_yellow"] = Button(
                    pgettext("button label, 'previous screen'", "Prev"))
                self["key_blue"] = Button(
                    pgettext("button label, 'next screen'", "Next"))
            self["now_button"] = Pixmap()
            self["next_button"] = Pixmap()
            self["more_button"] = Pixmap()
            self["now_button_sel"] = Pixmap()
            self["next_button_sel"] = Pixmap()
            self["more_button_sel"] = Pixmap()
            self["now_text"] = Label()
            self["next_text"] = Label()
            self["more_text"] = Label()
            self["date"] = Label()
            self.services = service
            self.zapFunc = zapFunc
        self.parent = parent
        if self.bouquetChangeCB == StaticText:
            self["key_green"] = StaticText(_("Add timer"))
        else:
            self["key_green"] = Button(_("Add timer"))
        self.key_green_choice = self.ADD_TIMER
        self.key_red_choice = self.EMPTY
        self["list"] = EPGList(type=self.type,
                               selChangedCB=self.onSelectionChanged,
                               timer=session.nav.RecordTimer)

        self["actions"] = ActionMap(
            ["EPGSelectActions", "OkCancelActions"],
            {
                "cancel": self.closeScreen,
                "ok": self.eventSelected,
                "timerAdd": self.timerAdd,
                "yellow": self.yellowButtonPressed,
                "blue": self.blueButtonPressed,
                "info": self.infoKeyPressed,
                "menu": self.furtherOptions,
                "nextBouquet": self.nextBouquet,  # just used in multi epg yet
                "prevBouquet": self.prevBouquet,  # just used in multi epg yet
                "nextService": self.nextService,  # just used in single epg yet
                "prevService": self.prevService,  # just used in single epg yet
                "preview": self.eventPreview,
            })

        self['colouractions'] = HelpableActionMap(
            self, 'ColorActions',
            {"red": (self.GoToTmbd, _("Search event in TMBD"))})

        self.isTMBD = fileExists(
            "/usr/lib/enigma2/python/Plugins/Extensions/TMBD/plugin.pyo")
        if self.isTMBD:
            self["key_red"] = Button(_("Search TMBD"))
            self.select = True
        if not self.isTMBD:
            self["key_red"] = Button(_("TMBD Not Installed"))
            self.select = False
        try:
            from Plugins.Extensions.YTTrailer.plugin import baseEPGSelection__init__
            description = _("Search yt-trailer for event")
        except ImportError as ie:
            pass
        else:
            if baseEPGSelection__init__ is not None:
                self["trailerActions"] = ActionMap(
                    ["InfobarActions", "InfobarTeletextActions"], {
                        "showTv": self.showTrailer,
                        "showRadio": self.showTrailerList,
                        "startTeletext": self.showConfig
                    })
        self["actions"].csel = self
        if parent and hasattr(parent, "fallbackTimer"):
            self.fallbackTimer = parent.fallbackTimer
            self.onLayoutFinish.append(self.onCreate)
        else:
            self.fallbackTimer = FallbackTimerList(self, self.onCreate)
Пример #46
0
 def subserviceSelected(self, service):
     if not service is None:
         self.timer.service_ref = ServiceReference(service[1])
     self.saveTimer()
     self.close((True, self.timer))
Пример #47
0
    def __init__(self,
                 session,
                 service,
                 zapFunc=None,
                 eventid=None,
                 bouquetChangeCB=None,
                 serviceChangeCB=None,
                 parent=None):
        Screen.__init__(self, session)
        self.bouquetChangeCB = bouquetChangeCB
        self.serviceChangeCB = serviceChangeCB
        self.ask_time = -1  #now
        self["key_red"] = Button("")
        self.closeRecursive = False
        self.saved_title = None
        self["Service"] = ServiceEvent()
        self["Event"] = Event()
        self.session = session
        if isinstance(service, str) and eventid != None:
            self.type = EPG_TYPE_SIMILAR
            self.setTitle(_("Similar EPG"))
            self["key_yellow"] = Button()
            self["key_blue"] = Button()
            self["key_red"] = Button()
            self.currentService = service
            self.eventid = eventid
            self.zapFunc = None
        elif isinstance(service, eServiceReference) or isinstance(
                service, str):
            self.setTitle(_("Single EPG"))
            self.type = EPG_TYPE_SINGLE
            self["key_yellow"] = Button()
            self["key_blue"] = Button(_("Select Channel"))
            self.currentService = ServiceReference(service)
            self.zapFunc = zapFunc
            self.sort_type = 0
            self.setSortDescription()
        else:
            self.setTitle(_("Multi EPG"))
            self.skinName = "EPGSelectionMulti"
            self.type = EPG_TYPE_MULTI
            self["key_yellow"] = Button(
                pgettext("button label, 'previous screen'", "Prev"))
            self["key_blue"] = Button(
                pgettext("button label, 'next screen'", "Next"))
            self["now_button"] = Pixmap()
            self["next_button"] = Pixmap()
            self["more_button"] = Pixmap()
            self["now_button_sel"] = Pixmap()
            self["next_button_sel"] = Pixmap()
            self["more_button_sel"] = Pixmap()
            self["now_text"] = Label()
            self["next_text"] = Label()
            self["more_text"] = Label()
            self["date"] = Label()
            self.services = service
            self.zapFunc = zapFunc
        self.parent = parent
        self["key_green"] = Button(_("Add timer"))
        self.key_green_choice = self.ADD_TIMER
        self.key_red_choice = self.EMPTY
        self["list"] = EPGList(type=self.type,
                               selChangedCB=self.onSelectionChanged,
                               timer=session.nav.RecordTimer)

        self["actions"] = ActionMap(
            ["EPGSelectActions", "OkCancelActions"],
            {
                "cancel": self.closeScreen,
                "ok": self.eventSelected,
                "timerAdd": self.timerAdd,
                "yellow": self.yellowButtonPressed,
                "blue": self.blueButtonPressed,
                "info": self.infoKeyPressed,
                "red": self.zapTo,
                "menu": self.furtherOptions,
                "nextBouquet": self.nextBouquet,  # just used in multi epg yet
                "prevBouquet": self.prevBouquet,  # just used in multi epg yet
                "nextService": self.nextService,  # just used in single epg yet
                "prevService": self.prevService,  # just used in single epg yet
                "preview": self.eventPreview,
            })
        self["actions"].csel = self
        self.onLayoutFinish.append(self.onCreate)
Пример #48
0
    def updateBP(self):
        name = 'N/A'
        provider = 'N/A'
        aspect = 'N/A'
        videosize = 'N/A'
        myserviceinfo = ''
        myservice = self.session.nav.getCurrentService()
        if myservice is not None:
            myserviceinfo = myservice.info()
            if self.session.nav.getCurrentlyPlayingServiceReference():
                name = ServiceReference(
                    self.session.nav.getCurrentlyPlayingServiceReference(
                    )).getServiceName()
            provider = self.getServiceInfoValue(iServiceInformation.sProvider,
                                                myserviceinfo)
            aspect = self.getServiceInfoValue(iServiceInformation.sAspect,
                                              myserviceinfo)
            if aspect in (1, 2, 5, 6, 9, 10, 13, 14):
                aspect = '4:3'
            else:
                aspect = '16:9'
            if myserviceinfo:
                width = myserviceinfo and myserviceinfo.getInfo(
                    iServiceInformation.sVideoWidth) or -1
                height = myserviceinfo and myserviceinfo.getInfo(
                    iServiceInformation.sVideoHeight) or -1
                if width != -1 and height != -1:
                    videosize = '%dx%d' % (width, height)
        self['Ilab1'].setText(_('Name: ') + name)
        self['Ilab2'].setText(_('Provider: ') + provider)
        self['Ilab3'].setText(_('Aspect Ratio: ') + aspect)
        self['Ilab4'].setText(_('Videosize: ') + videosize)
        self.currentcam = '/usr/camscript/Ncam_Ci.sh'
        self.defaultcam = '/usr/camscript/Ncam_Ci.sh'
        f = open('/etc/BhCamConf', 'r')
        for line in f.readlines():
            parts = line.strip().split('|')
            if parts[0] == 'delcurrent':
                self.currentcam = parts[1]
            elif parts[0] == 'deldefault':
                self.defaultcam = parts[1]

        f.close()
        defCamname = 'Common Interface'
        curCamname = 'Common Interface'
        for c in self.camnames.keys():
            if self.camnames[c] == self.defaultcam:
                defCamname = c
            if self.camnames[c] == self.currentcam:
                curCamname = c

        pos = 0
        for x in self.emlist:
            if x == defCamname:
                self['list'].moveToIndex(pos)
                break
            pos += 1

        mytext = ''
        if fileExists('/tmp/ecm.info'):
            f = open('/tmp/ecm.info', 'r')
            for line in f.readlines():
                line = line.replace('\n', '')
                line = line.strip()
                if len(line) > 3:
                    mytext = mytext + line + '\n'

            f.close()
        if len(mytext) < 5:
            mytext = '\n\n    ' + _('Ecm Info not available.')
        self['activecam'].setText(curCamname)
        self['Ecmtext'].setText(mytext)
        return
Пример #49
0
def addTimer(session, serviceref, begin, end, name, description, disabled, justplay, afterevent, dirname, tags, repeated, vpsinfo=None, logentries=None, eit=0, always_zap=-1):
	rt = session.nav.RecordTimer

	if not dirname:
		dirname = preferredTimerPath()

	try:
		timer = RecordTimerEntry(
			ServiceReference(serviceref),
			begin,
			end,
			name,
			description,
			eit,
			disabled,
			justplay,
			afterevent,
			dirname=dirname,
			tags=tags)

		timer.repeated = repeated

		if logentries:
			timer.log_entries = logentries

		conflicts = rt.record(timer)
		if conflicts:
			errors = []
			conflictinfo = []
			for conflict in conflicts:
				errors.append(conflict.name)
				conflictinfo.append({
					"serviceref": str(conflict.service_ref),
					"servicename": conflict.service_ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''),
					"name": conflict.name,
					"begin": conflict.begin,
					"end": conflict.end,
					"realbegin": strftime("%d.%m.%Y %H:%M", (localtime(float(conflict.begin)))),
					"realend": strftime("%d.%m.%Y %H:%M", (localtime(float(conflict.end))))
				})

			return {
				"result": False,
				"message": _("Conflicting Timer(s) detected! %s") % " / ".join(errors),
				"conflicts": conflictinfo
			}
		# VPS
		if vpsinfo is not None:
			timer.vpsplugin_enabled = vpsinfo["vpsplugin_enabled"]
			timer.vpsplugin_overwrite = vpsinfo["vpsplugin_overwrite"]
			timer.vpsplugin_time = vpsinfo["vpsplugin_time"]

		if always_zap != -1:
			if hasattr(timer, "always_zap"):
				timer.always_zap = always_zap == 1

	except Exception, e:
		print e
		return {
			"result": False,
			"message": _("Could not add timer '%s'!") % name
		}
Пример #50
0
class RecordTimerEntry(timer.TimerEntry, object):
    ######### the following static methods and members are only in use when the box is in (soft) standby
    receiveRecordEvents = False

    @staticmethod
    def shutdown():
        quitMainloop(1)

    @staticmethod
    def staticGotRecordEvent(recservice, event):
        if event == iRecordableService.evEnd:
            print "RecordTimer.staticGotRecordEvent(iRecordableService.evEnd)"
            recordings = NavigationInstance.instance.getRecordings()
            if not recordings:  # no more recordings exist
                rec_time = NavigationInstance.instance.RecordTimer.getNextRecordingTime(
                )
                if rec_time > 0 and (rec_time - time()) < 360:
                    print "another recording starts in", rec_time - time(
                    ), "seconds... do not shutdown yet"
                else:
                    print "no starting records in the next 360 seconds... immediate shutdown"
                    RecordTimerEntry.shutdown()  # immediate shutdown
        elif event == iRecordableService.evStart:
            print "RecordTimer.staticGotRecordEvent(iRecordableService.evStart)"

    @staticmethod
    def stopTryQuitMainloop():
        print "RecordTimer.stopTryQuitMainloop"
        NavigationInstance.instance.record_event.remove(
            RecordTimerEntry.staticGotRecordEvent)
        RecordTimerEntry.receiveRecordEvents = False

    @staticmethod
    def TryQuitMainloop(default_yes=True):
        if not RecordTimerEntry.receiveRecordEvents:
            print "RecordTimer.TryQuitMainloop"
            NavigationInstance.instance.record_event.append(
                RecordTimerEntry.staticGotRecordEvent)
            RecordTimerEntry.receiveRecordEvents = True
            # send fake event.. to check if another recordings are running or
            # other timers start in a few seconds
            RecordTimerEntry.staticGotRecordEvent(None,
                                                  iRecordableService.evEnd)
            # send normal notification for the case the user leave the standby now..
            Notifications.AddNotification(
                Screens.Standby.TryQuitMainloop,
                1,
                onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop,
                default_yes=default_yes)


#################################################################

    def __init__(self,
                 serviceref,
                 begin,
                 end,
                 name,
                 description,
                 eit,
                 disabled=False,
                 justplay=False,
                 afterEvent=AFTEREVENT.AUTO,
                 checkOldTimers=False,
                 dirname=None,
                 tags=None):
        timer.TimerEntry.__init__(self, int(begin), int(end))

        if checkOldTimers == True:
            if self.begin < time() - 1209600:
                self.begin = int(time())

        if self.end < self.begin:
            self.end = self.begin

        assert isinstance(serviceref, ServiceReference)

        if serviceref.isRecordable():
            self.service_ref = serviceref
        else:
            self.service_ref = ServiceReference(None)
        self.eit = eit
        self.dontSave = False
        self.name = name
        self.description = description
        self.disabled = disabled
        self.timer = None
        self.__record_service = None
        self.start_prepare = 0
        self.justplay = justplay
        self.afterEvent = afterEvent
        self.dirname = dirname
        self.dirnameHadToFallback = False
        self.autoincrease = False
        self.autoincreasetime = 3600 * 24  # 1 day
        self.tags = tags or []

        self.log_entries = []
        self.resetState()

    def log(self, code, msg):
        self.log_entries.append((int(time()), code, msg))
        print "[TIMER]", msg

    def calculateFilename(self):
        service_name = self.service_ref.getServiceName()
        begin_date = strftime("%Y%m%d %H%M", localtime(self.begin))
        begin_shortdate = strftime("%Y%m%d", localtime(self.begin))

        print "begin_date: ", begin_date
        print "service_name: ", service_name
        print "name:", self.name
        print "description: ", self.description

        filename = begin_date + " - " + service_name
        if self.name:
            if config.usage.setup_level.index >= 2:  # expert+
                if config.recording.filename_composition.value == "short":
                    filename = begin_shortdate + " - " + self.name
                elif config.recording.filename_composition.value == "long":
                    filename += " - " + self.name + " - " + self.description
                else:
                    filename += " - " + self.name  # standard
            else:
                filename += " - " + self.name

        if config.recording.ascii_filenames.value:
            filename = ASCIItranslit.legacyEncode(filename)

        if not self.dirname or not Directories.fileExists(self.dirname, 'w'):
            if self.dirname:
                self.dirnameHadToFallback = True
            dirname = defaultMoviePath()
        else:
            dirname = self.dirname
        self.Filename = Directories.getRecordingFilename(filename, dirname)
        self.log(0, "Filename calculated as: '%s'" % self.Filename)
        #begin_date + " - " + service_name + description)

    def tryPrepare(self):
        if self.justplay:
            return True
        else:
            self.calculateFilename()
            rec_ref = self.service_ref and self.service_ref.ref
            if rec_ref and rec_ref.flags & eServiceReference.isGroup:
                rec_ref = getBestPlayableServiceReference(
                    rec_ref, eServiceReference())
                if not rec_ref:
                    self.log(
                        1,
                        "'get best playable service for group... record' failed"
                    )
                    return False

            self.record_service = rec_ref and NavigationInstance.instance.recordService(
                rec_ref)

            if not self.record_service:
                self.log(1, "'record service' failed")
                return False

            if self.repeated:
                epgcache = eEPGCache.getInstance()
                queryTime = self.begin + (self.end - self.begin) / 2
                evt = epgcache.lookupEventTime(rec_ref, queryTime)
                if evt:
                    self.description = evt.getShortDescription()
                    if self.description == "":
                        description = evt.getExtendedDescription()
                    event_id = evt.getEventId()
                else:
                    event_id = -1
            else:
                event_id = self.eit
                if event_id is None:
                    event_id = -1

            prep_res = self.record_service.prepare(
                self.Filename + ".ts", self.begin, self.end, event_id,
                self.name.replace("\n", ""),
                self.description.replace("\n", ""), ' '.join(self.tags))
            if prep_res:
                if prep_res == -255:
                    self.log(4, "failed to write meta information")
                else:
                    self.log(2, "'prepare' failed: error %d" % prep_res)

                # we must calc nur start time before stopRecordService call because in Screens/Standby.py TryQuitMainloop tries to get
                # the next start time in evEnd event handler...
                self.do_backoff()
                self.start_prepare = time() + self.backoff

                NavigationInstance.instance.stopRecordService(
                    self.record_service)
                self.record_service = None
                return False
            return True

    def do_backoff(self):
        if self.backoff == 0:
            self.backoff = 5
        else:
            self.backoff *= 2
            if self.backoff > 100:
                self.backoff = 100
        self.log(10, "backoff: retry in %d seconds" % self.backoff)

    def activate(self):
        next_state = self.state + 1
        self.log(5, "activating state %d" % next_state)

        if next_state == self.StatePrepared:
            if self.tryPrepare():
                self.log(6, "prepare ok, waiting for begin")
                # create file to "reserve" the filename
                # because another recording at the same time on another service can try to record the same event
                # i.e. cable / sat.. then the second recording needs an own extension... when we create the file
                # here than calculateFilename is happy
                if not self.justplay:
                    open(self.Filename + ".ts", "w").close()
                    # Give the Trashcan a chance to clean up
                    try:
                        Trashcan.instance.cleanIfIdle()
                    except Exception, e:
                        print "[TIMER] Failed to call Trashcan.instance.cleanIfIdle()"
                        print "[TIMER] Error:", e
                # fine. it worked, resources are allocated.
                self.next_activation = self.begin
                self.backoff = 0
                return True

            self.log(7, "prepare failed")
            if self.first_try_prepare:
                self.first_try_prepare = False
                cur_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference(
                )
                if cur_ref and not cur_ref.getPath():
                    if not config.recording.asktozap.value:
                        self.log(8, "asking user to zap away")
                        Notifications.AddNotificationWithCallback(
                            self.failureCB,
                            MessageBox,
                            _("A timer failed to record!\nDisable TV and try again?\n"
                              ),
                            timeout=20)
                    else:  # zap without asking
                        self.log(9, "zap without asking")
                        Notifications.AddNotification(
                            MessageBox,
                            _("In order to record a timer, the TV was switched to the recording service!\n"
                              ),
                            type=MessageBox.TYPE_INFO,
                            timeout=20)
                        self.failureCB(True)
                elif cur_ref:
                    self.log(
                        8,
                        "currently running service is not a live service.. so stop it makes no sense"
                    )
                else:
                    self.log(
                        8,
                        "currently no service running... so we dont need to stop it"
                    )
            return False
        elif next_state == self.StateRunning:
            # if this timer has been cancelled, just go to "end" state.
            if self.cancelled:
                return True

            if self.justplay:
                if Screens.Standby.inStandby:
                    self.log(11, "wakeup and zap")
                    #set service to zap after standby
                    Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
                    #wakeup standby
                    Screens.Standby.inStandby.Power()
                else:
                    self.log(11, "zapping")
                    NavigationInstance.instance.playService(
                        self.service_ref.ref)
                return True
            else:
                self.log(11, "start recording")
                record_res = self.record_service.start()

                if record_res:
                    self.log(13, "start record returned %d" % record_res)
                    self.do_backoff()
                    # retry
                    self.begin = time() + self.backoff
                    return False

                return True
Пример #51
0
 def ShowServiceInformation(self):
     if self.type == TYPE_SERVICE_INFO:
         self["Title"].text = _("Service info - service & PIDs")
         if self.feinfo or self.transponder_info:
             self["key_blue"].text = self["blue"].text = _(
                 "Tuner setting values")
         if self.session.nav.getCurrentlyPlayingServiceOrGroup():
             name = ServiceReference(
                 self.session.nav.getCurrentlyPlayingServiceReference(
                 )).getServiceName()
             refstr = self.session.nav.getCurrentlyPlayingServiceReference(
             ).toString()
             reftype = self.session.nav.getCurrentlyPlayingServiceReference(
             ).type
         else:
             name = _("N/A")
             refstr = _("N/A")
             reftype = 0
         aspect = "-"
         videocodec = "-"
         resolution = "-"
         if self.info:
             videocodec = ("MPEG2", "AVC", "MPEG1", "MPEG4-VC", "VC1",
                           "VC1-SM", "HEVC", "N/A")[self.info.getInfo(
                               iServiceInformation.sVideoType)]
             width = self.info.getInfo(iServiceInformation.sVideoWidth)
             height = self.info.getInfo(iServiceInformation.sVideoHeight)
             if width > 0 and height > 0:
                 resolution = videocodec + " - "
                 resolution += "%dx%d - " % (width, height)
                 resolution += str(
                     (self.info.getInfo(iServiceInformation.sFrameRate) +
                      500) / 1000)
                 resolution += (" i", " p", "")[self.info.getInfo(
                     iServiceInformation.sProgressive)]
                 aspect = self.getServiceInfoValue(
                     iServiceInformation.sAspect)
                 aspect = aspect in (1, 2, 5, 6, 9, 0xA, 0xD,
                                     0xE) and "4:3" or "16:9"
                 resolution += " - [" + aspect + "]"
         if "%3a//" in refstr and reftype not in (1, 257, 4098, 4114):
             fillList = [
                 (_("Service name"), name, TYPE_TEXT),
                 (_("Videocodec, size & format"), resolution, TYPE_TEXT),
                 (_("Service reference"), ":".join(refstr.split(":")[:9]),
                  TYPE_TEXT),
                 (_("URL"), refstr.split(":")[10].replace("%3a",
                                                          ":"), TYPE_TEXT)
             ]
         else:
             if ":/" in refstr:
                 fillList = [(_("Service name"), name, TYPE_TEXT),
                             (_("Videocodec, size & format"), resolution,
                              TYPE_TEXT),
                             (_("Service reference"),
                              ":".join(refstr.split(":")[:9]), TYPE_TEXT),
                             (_("Filename"), refstr.split(":")[10],
                              TYPE_TEXT)]
             else:
                 fillList = [
                     (_("Service name"), name, TYPE_TEXT),
                     (_("Provider"),
                      self.getServiceInfoValue(
                          iServiceInformation.sProvider), TYPE_TEXT),
                     (_("Videocodec, size & format"), resolution, TYPE_TEXT)
                 ]
                 if "%3a//" in refstr:
                     fillList = fillList + [
                         (_("Service reference"), ":".join(
                             refstr.split(":")[:9]), TYPE_TEXT),
                         (_("URL"), refstr.split(":")[10].replace(
                             "%3a", ":"), TYPE_TEXT)
                     ]
                 else:
                     fillList = fillList + [
                         (_("Service reference"), refstr, TYPE_TEXT)
                     ]
             fillList = fillList + [
                 (_("Namespace"),
                  self.getServiceInfoValue(
                      iServiceInformation.sNamespace), TYPE_VALUE_HEX, 8),
                 (_("Service ID"),
                  self.getServiceInfoValue(
                      iServiceInformation.sSID), TYPE_VALUE_HEX_DEC, 4),
                 (_("Video PID"),
                  self.getServiceInfoValue(iServiceInformation.sVideoPID),
                  TYPE_VALUE_HEX_DEC, 4),
                 (_("Audio PID"),
                  self.getServiceInfoValue(iServiceInformation.sAudioPID),
                  TYPE_VALUE_HEX_DEC, 4),
                 (_("PCR PID"),
                  self.getServiceInfoValue(
                      iServiceInformation.sPCRPID), TYPE_VALUE_HEX_DEC, 4),
                 (_("PMT PID"),
                  self.getServiceInfoValue(
                      iServiceInformation.sPMTPID), TYPE_VALUE_HEX_DEC, 4),
                 (_("TXT PID"),
                  self.getServiceInfoValue(
                      iServiceInformation.sTXTPID), TYPE_VALUE_HEX_DEC, 4),
                 (_("TSID"),
                  self.getServiceInfoValue(
                      iServiceInformation.sTSID), TYPE_VALUE_HEX_DEC, 4),
                 (_("ONID"),
                  self.getServiceInfoValue(
                      iServiceInformation.sONID), TYPE_VALUE_HEX_DEC, 4)
             ]
         self.fillList(fillList)
     elif self.transponder_info:
         self.fillList(self.getFEData(self.transponder_info))
Пример #52
0
    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
Пример #53
0
    def information(self):
        if self.type == TYPE_SERVICE_INFO:
            if self.session.nav.getCurrentlyPlayingServiceOrGroup():
                name = ServiceReference(
                    self.session.nav.getCurrentlyPlayingServiceReference(
                    )).getServiceName()
                refstr = self.session.nav.getCurrentlyPlayingServiceReference(
                ).toString()
            else:
                name = _("N/A")
                refstr = _("N/A")
            aspect = "-"
            videocodec = "-"
            videomode = "-"
            resolution = "-"
            if self.info:
                videocodec = ("MPEG2", "AVC", "MPEG1", "MPEG4-VC", "VC1",
                              "VC1-SM", "HEVC", "-")[self.info.getInfo(
                                  iServiceInformation.sVideoType)]
                video_height = 0
                video_width = 0
                video_pol = " "
                video_rate = 0
                if path.exists("/proc/stb/vmpeg/0/yres"):
                    f = open("/proc/stb/vmpeg/0/yres", "r")
                    try:
                        video_height = int(f.read(), 16)
                    except:
                        pass
                    f.close()
                if path.exists("/proc/stb/vmpeg/0/xres"):
                    f = open("/proc/stb/vmpeg/0/xres", "r")
                    try:
                        video_width = int(f.read(), 16)
                    except:
                        pass
                    f.close()
                if path.exists("/proc/stb/vmpeg/0/progressive"):
                    f = open("/proc/stb/vmpeg/0/progressive", "r")
                    try:
                        video_pol = "p" if int(f.read(), 16) else "i"
                    except:
                        pass
                    f.close()
                if path.exists("/proc/stb/vmpeg/0/framerate"):
                    f = open("/proc/stb/vmpeg/0/framerate", "r")
                    try:
                        video_rate = int(f.read())
                    except:
                        pass
                    f.close()

                fps = str((video_rate + 500) / 1000)
                resolution = str(video_width) + "x" + str(
                    video_height) + video_pol + fps

                aspect = self.getServiceInfoValue(iServiceInformation.sAspect)
                if aspect in (1, 2, 5, 6, 9, 0xA, 0xD, 0xE):
                    aspect = "4:3"
                else:
                    aspect = "16:9"
                f = open("/proc/stb/video/videomode")
                videomode = f.read()[:-1].replace('\n', '')
                f.close()

            Labels = ((_("Name"), name, TYPE_TEXT),
                      (_("Provider"),
                       self.getServiceInfoValue(iServiceInformation.sProvider),
                       TYPE_TEXT), (_("Videoformat"), aspect, TYPE_TEXT),
                      (_("Videomode"), videomode,
                       TYPE_TEXT), (_("Videosize"), resolution, TYPE_TEXT),
                      (_("Videocodec"), videocodec, TYPE_TEXT),
                      (_("Namespace"),
                       self.getServiceInfoValue(
                           iServiceInformation.sNamespace), TYPE_VALUE_HEX,
                       8), (_("Service reference"), refstr, TYPE_TEXT))

            self.fillList(Labels)
        else:
            if self.transponder_info:
                self.fillList(self.getFEData(self.transponder_info))
Пример #54
0
def recordNow(session, infinite):
    rt = session.nav.RecordTimer
    serviceref = session.nav.getCurrentlyPlayingServiceReference().toString()

    try:
        event = session.nav.getCurrentService().info().getEvent(0)
    except Exception:
        event = None

    if not event and not infinite:
        return {
            "result": False,
            "message": _("No event found! Not recording!")
        }

    if event:
        (begin, end, name, description, eit) = parseEvent(event)
        begin = time()
        msg = _("Instant record for current Event started")
    else:
        name = "instant record"
        description = ""
        eit = 0

    if infinite:
        begin = time()
        end = begin + 3600 * 10
        msg = _("Infinite Instant recording started")

    timer = RecordTimerEntry(ServiceReference(serviceref),
                             begin,
                             end,
                             name,
                             description,
                             eit,
                             False,
                             False,
                             0,
                             dirname=preferredInstantRecordPath())
    timer.dontSave = True

    if rt.record(timer):
        return {
            "result": False,
            "message": _("Timer conflict detected! Not recording!")
        }
    nt = {
        "serviceref":
        str(timer.service_ref),
        "servicename":
        timer.service_ref.getServiceName().replace('\xc2\x86',
                                                   '').replace('\xc2\x87', ''),
        "eit":
        timer.eit,
        "name":
        timer.name,
        "begin":
        timer.begin,
        "end":
        timer.end,
        "duration":
        timer.end - timer.begin
    }

    return {"result": True, "message": msg, "newtimer": nt}
Пример #55
0
def addTimer(session,
             serviceref,
             begin,
             end,
             name,
             description,
             disabled,
             justplay,
             afterevent,
             dirname,
             tags,
             repeated,
             recordingtype,
             vpsinfo=None,
             logentries=None,
             eit=0,
             always_zap=-1,
             pipzap=-1,
             allow_duplicate=1,
             autoadjust=-1):
    rt = session.nav.RecordTimer

    if not dirname:
        dirname = preferredTimerPath()

    #  IPTV Fix
    serviceref = serviceref.replace('%253a', '%3a')

    try:
        timer = RecordTimerEntry(ServiceReference(serviceref),
                                 begin,
                                 end,
                                 name,
                                 description,
                                 eit,
                                 disabled,
                                 justplay,
                                 afterevent,
                                 dirname=dirname,
                                 tags=tags)

        timer.repeated = repeated

        if logentries:
            timer.log_entries = logentries

        conflicts = rt.record(timer)
        if conflicts:
            errors = []
            conflictinfo = []
            for conflict in conflicts:
                errors.append(conflict.name)
                conflictinfo.append({
                    "serviceref":
                    str(conflict.service_ref),
                    "servicename":
                    conflict.service_ref.getServiceName().replace(
                        '\xc2\x86', '').replace('\xc2\x87', ''),
                    "name":
                    conflict.name,
                    "begin":
                    conflict.begin,
                    "end":
                    conflict.end,
                    "realbegin":
                    strftime(_("%d.%m.%Y %H:%M"),
                             (localtime(float(conflict.begin)))),
                    "realend":
                    strftime(_("%d.%m.%Y %H:%M"),
                             (localtime(float(conflict.end))))
                })

            return {
                "result":
                False,
                "message":
                _("Conflicting Timer(s) detected! %s") % " / ".join(errors),
                "conflicts":
                conflictinfo
            }
        # VPS
        if vpsinfo is not None:
            timer.vpsplugin_enabled = vpsinfo["vpsplugin_enabled"]
            timer.vpsplugin_overwrite = vpsinfo["vpsplugin_overwrite"]
            timer.vpsplugin_time = vpsinfo["vpsplugin_time"]

        if always_zap != -1:
            if hasattr(timer, "always_zap"):
                timer.always_zap = always_zap == 1
            if hasattr(timer, "zapbeforerecord"):
                timer.zapbeforerecord = always_zap == 1

        if hasattr(timer, "autoadjust"):
            if autoadjust == -1:
                autoadjust = config.recording.adjust_time_to_event.value and 1 or 0
            autoadjust = autoadjust

        if hasattr(timer, "allow_duplicate"):
            allow_duplicate = allow_duplicate

        if pipzap != -1:
            if hasattr(timer, "pipzap"):
                timer.pipzap = pipzap == 1

        if recordingtype:
            timer.descramble = {
                "normal": True,
                "descrambled": True,
                "scrambled": False,
            }[recordingtype]
            timer.record_ecm = {
                "normal": False,
                "descrambled": True,
                "scrambled": True,
            }[recordingtype]

    except Exception as e:
        print(str(e))
        return {
            "result": False,
            "message": _("Could not add timer '%s'!") % name
        }

    return {"result": True, "message": _("Timer '%s' added") % name}
 def __evUpdatedInfo(self):
     if self.newService and self.session.nav.getCurrentlyPlayingServiceReference(
     ) and self.enabled:
         print "[AutomaticVolumeAdjustment] service changed"
         self.newService = False
         self.currentVolume = 0  # init
         if self.modus == "0":  # Automatic volume adjust mode
             self.currentAC3DTS = self.isCurrentAudioAC3DTS()
             if self.pluginStarted:
                 if self.currentAC3DTS:  # ac3 dts?
                     vol = self.volctrl.getVolume()
                     currentvol = vol  # remember current vol
                     vol -= self.lastAdjustedValue  # go back to origin value first
                     ref = self.getPlayingServiceReference()
                     ajvol = self.serviceList.get(
                         ref.toString(),
                         self.defaultValue)  # get delta from config
                     if ajvol < 0:  # adjust vol down
                         if vol + ajvol < 0:
                             ajvol = (-1) * vol
                     else:  # adjust vol up
                         if vol >= 100 - ajvol:  # check if delta + vol < 100
                             ajvol = 100 - vol  # correct delta value
                     self.lastAdjustedValue = ajvol  # save delta value
                     if (vol + ajvol != currentvol):
                         if ajvol == 0:
                             ajvol = vol - currentvol  # correction for debug -print only
                         self.setVolume(vol + self.lastAdjustedValue)
                         print "[AutomaticVolumeAdjustment] Change volume for service: %s (+%d) to %d" % (
                             ServiceReference(ref).getServiceName().replace(
                                 '\xc2\x86', '').replace('\xc2\x87', ''),
                             ajvol, self.volctrl.getVolume())
                     self.currentVolume = self.volctrl.getVolume(
                     )  # ac3||dts service , save current volume
                 else:
                     # mpeg or whatever audio
                     if self.lastAdjustedValue != 0:
                         # go back to origin value
                         vol = self.volctrl.getVolume()
                         ajvol = vol - self.lastAdjustedValue
                         if ajvol > self.maxMPEGVolume:
                             ajvol = self.maxMPEGVolume
                         self.setVolume(ajvol)
                         print "[AutomaticVolumeAdjustment] Change volume for service: %s (-%d) to %d" % (
                             ServiceReference(
                                 self.session.nav.
                                 getCurrentlyPlayingServiceReference()).
                             getServiceName().replace(
                                 '\xc2\x86', '').replace('\xc2\x87', ''),
                             vol - ajvol, self.volctrl.getVolume())
                         self.lastAdjustedValue = 0  # mpeg audio, no delta here
                 return  # get out of here, nothing to do anymore
         else:  # modus = Remember channel volume
             if self.pluginStarted:
                 ref = self.getPlayingServiceReference()
                 if ref.valid():
                     # get value from dict
                     lastvol = self.serviceList.get(ref.toString(), -1)
                     if lastvol != -1 and lastvol != self.volctrl.getVolume(
                     ):
                         # set volume value
                         self.setVolume(lastvol)
                         print "[AutomaticVolumeAdjustment] Set last used volume value for service %s to %d" % (
                             ServiceReference(ref).getServiceName().replace(
                                 '\xc2\x86', '').replace('\xc2\x87', ''),
                             self.volctrl.getVolume())
                 return  # get out of here, nothing to do anymore
         if not self.pluginStarted:
             if self.modus == "0":  # Automatic volume adjust mode
                 # starting plugin, if service audio is ac3 or dts --> get delta from config...volume value is set by enigma2-system at start
                 if self.currentAC3DTS:
                     self.lastAdjustedValue = self.serviceList.get(
                         self.session.nav.
                         getCurrentlyPlayingServiceReference().toString(),
                         self.defaultValue)
                     self.currentVolume = self.volctrl.getVolume(
                     )  # ac3||dts service , save current volume
             # only images >= 05.08.2010, must use try/except
             try:
                 self.volumeControlInstance = VolumeControl.instance
             except:
                 pass
             self.pluginStarted = True  # plugin started...
Пример #57
0
def editTimer(session, serviceref, begin, end, name, description, disabled,
              justplay, afterEvent, dirname, tags, repeated, channelOld,
              beginOld, endOld, recordingtype, vpsinfo, always_zap, pipzap,
              allow_duplicate, autoadjust):
    channelOld_str = ':'.join(str(channelOld).split(':')[:11])
    rt = session.nav.RecordTimer
    for timer in rt.timer_list + rt.processed_timers:
        needed_ref = ':'.join(
            timer.service_ref.ref.toString().split(':')[:11]) == channelOld_str
        if needed_ref and int(timer.begin) == beginOld and int(
                timer.end) == endOld:
            timer.service_ref = ServiceReference(serviceref)
            # TODO: start end time check
            timer.begin = int(float(begin))
            timer.end = int(float(end))
            timer.name = name
            timer.description = description
            # TODO : EIT
            # timer.eit = eit
            timer.disabled = disabled
            timer.justplay = justplay
            timer.afterEvent = afterEvent
            timer.dirname = dirname
            timer.tags = tags
            timer.repeated = repeated
            timer.processRepeated()
            if vpsinfo is not None:
                timer.vpsplugin_enabled = vpsinfo["vpsplugin_enabled"]
                timer.vpsplugin_overwrite = vpsinfo["vpsplugin_overwrite"]
                timer.vpsplugin_time = vpsinfo["vpsplugin_time"]

            if always_zap != -1:
                if hasattr(timer, "always_zap"):
                    timer.always_zap = always_zap == 1
                if hasattr(timer, "zapbeforerecord"):
                    timer.zapbeforerecord = always_zap == 1

            if pipzap != -1:
                if hasattr(timer, "pipzap"):
                    timer.pipzap = pipzap == 1

            if hasattr(timer, "allow_duplicate"):
                timer.allow_duplicate = allow_duplicate

            if hasattr(timer, "autoadjust"):
                if autoadjust == -1:
                    autoadjust = config.recording.adjust_time_to_event.value and 1 or 0
                timer.autoadjust = autoadjust

            if recordingtype:
                timer.descramble = {
                    "normal": True,
                    "descrambled": True,
                    "scrambled": False,
                }[recordingtype]
                timer.record_ecm = {
                    "normal": False,
                    "descrambled": True,
                    "scrambled": True,
                }[recordingtype]

            # TODO: multi tuner test
            sanity = TimerSanityCheck(rt.timer_list, timer)
            conflicts = None
            if not sanity.check():
                conflicts = sanity.getSimulTimerList()
                if conflicts is not None:
                    for conflict in conflicts:
                        if conflict.setAutoincreaseEnd(timer):
                            rt.timeChanged(conflict)
                            if not sanity.check():
                                conflicts = sanity.getSimulTimerList()
            if conflicts is None:
                rt.timeChanged(timer)
                return {
                    "result": True,
                    "message": _("Timer '%s' changed") % name
                }
            else:
                errors = []
                conflictinfo = []
                for conflict in conflicts:
                    errors.append(conflict.name)
                    conflictinfo.append({
                        "serviceref":
                        str(conflict.service_ref),
                        "servicename":
                        removeBad(conflict.service_ref.getServiceName()),
                        "name":
                        conflict.name,
                        "begin":
                        conflict.begin,
                        "end":
                        conflict.end,
                        "realbegin":
                        strftime(_("%d.%m.%Y %H:%M"),
                                 (localtime(float(conflict.begin)))),
                        "realend":
                        strftime(_("%d.%m.%Y %H:%M"),
                                 (localtime(float(conflict.end))))
                    })

                return {
                    "result": False,
                    "message": _("Timer '%s' not saved while Conflict") % name,
                    "conflicts": conflictinfo
                }

    return {
        "result":
        False,
        "message":
        _("Could not find timer '%s' with given start and end time!") % name
    }
Пример #58
0
	def showEventInformation(self):
		from Screens.EventView import EventViewSimple
		from ServiceReference import ServiceReference
		evt = self[self.currList].getCurrentEvent()
		if evt:
			self.session.open(EventViewSimple, evt, ServiceReference(self.getCurrent()))
def buildConfig(defaultTimer, timers, webif=False):
    # Generate List in RAM
    list = [
        '<?xml version="1.0" ?>\n<autotimer version="', CURRENT_CONFIG_VERSION,
        '">\n\n'
    ]
    append = list.append
    extend = list.extend

    # This gets deleted afterwards if we do not have set any defaults
    append(' <defaults')
    if webif:
        extend((' id="', str(defaultTimer.getId()), '"'))

    # Timespan
    if defaultTimer.hasTimespan():
        extend((' from="', defaultTimer.getTimespanBegin(), '" to="',
                defaultTimer.getTimespanEnd(), '"'))

    # Duration
    if defaultTimer.hasDuration():
        extend((' maxduration="', str(defaultTimer.getDuration()), '"'))

    # Destination
    if defaultTimer.hasDestination():
        extend((' location="', stringToXML(defaultTimer.destination), '"'))

    # Offset
    if defaultTimer.hasOffset():
        if defaultTimer.isOffsetEqual():
            extend((' offset="', str(defaultTimer.getOffsetBegin()), '"'))
        else:
            extend((' offset="', str(defaultTimer.getOffsetBegin()), ',',
                    str(defaultTimer.getOffsetEnd()), '"'))

    # Counter
    if defaultTimer.hasCounter():
        extend((' counter="', str(defaultTimer.getCounter()), '"'))
        if defaultTimer.hasCounterFormatString():
            extend((' counterFormat="',
                    str(defaultTimer.getCounterFormatString()), '"'))

    # Duplicate Description
    if defaultTimer.getAvoidDuplicateDescription():
        extend((' avoidDuplicateDescription="',
                str(defaultTimer.getAvoidDuplicateDescription()), '"'))

    # Only display justplay if true
    if defaultTimer.justplay:
        extend((' justplay="', str(defaultTimer.getJustplay()), '"'))

    # Only display encoding if != utf-8
    if defaultTimer.encoding != 'UTF-8' or webif:
        extend((' encoding="', str(defaultTimer.encoding), '"'))

    # Only display searchType if exact
    if defaultTimer.searchType == "exact":
        extend((' searchType="', str(defaultTimer.searchType), '"'))

    # Only display searchCase if sensitive
    if defaultTimer.searchCase == "sensitive":
        extend((' searchCase="', str(defaultTimer.searchCase), '"'))

    # Close still opened defaults tag
    append('>\n')

    if webif:
        # Services + Bouquets
        for serviceref in defaultTimer.services + defaultTimer.bouquets:
            ref = ServiceReference(str(serviceref))
            extend((
                '  <e2service>\n',
                '   <e2servicereference>',
                str(serviceref),
                '</e2servicereference>\n',
                '   <e2servicename>',
                stringToXML(ref.getServiceName().replace('\xc2\x86',
                                                         '').replace(
                                                             '\xc2\x87', '')),
                '</e2servicename>\n',
                '  </e2service>\n',
            ))
    else:
        # Services
        for serviceref in defaultTimer.services:
            ref = ServiceReference(str(serviceref))
            extend((
                '  <serviceref>',
                serviceref,
                '</serviceref>',
                ' <!-- ',
                stringToXML(ref.getServiceName().replace('\xc2\x86',
                                                         '').replace(
                                                             '\xc2\x87', '')),
                ' -->\n',
            ))

        # Bouquets
        for bouquet in defaultTimer.bouquets:
            ref = ServiceReference(str(bouquet))
            extend((
                '  <bouquet>',
                str(bouquet),
                '</bouquet>',
                ' <!-- ',
                stringToXML(ref.getServiceName().replace('\xc2\x86',
                                                         '').replace(
                                                             '\xc2\x87', '')),
                ' -->\n',
            ))

    # AfterEvent
    if defaultTimer.hasAfterEvent():
        idx = {
            AFTEREVENT.NONE: "none",
            AFTEREVENT.STANDBY: "standby",
            AFTEREVENT.DEEPSTANDBY: "shutdown",
            AFTEREVENT.AUTO: "auto"
        }
        for afterevent in defaultTimer.afterevent:
            action, timespan = afterevent
            append('  <afterevent')
            if timespan[0] is not None:
                append(' from="%02d:%02d" to="%02d:%02d"' %
                       (timespan[0][0], timespan[0][1], timespan[1][0],
                        timespan[1][1]))
            extend(('>', idx[action], '</afterevent>\n'))

    # Excludes
    for title in defaultTimer.getExcludedTitle():
        extend(
            ('  <exclude where="title">', stringToXML(title), '</exclude>\n'))
    for short in defaultTimer.getExcludedShort():
        extend(('  <exclude where="shortdescription">', stringToXML(short),
                '</exclude>\n'))
    for desc in defaultTimer.getExcludedDescription():
        extend(('  <exclude where="description">', stringToXML(desc),
                '</exclude>\n'))
    for day in defaultTimer.getExcludedDays():
        extend(('  <exclude where="dayofweek">', stringToXML(day),
                '</exclude>\n'))

    # Includes
    for title in defaultTimer.getIncludedTitle():
        extend(
            ('  <include where="title">', stringToXML(title), '</include>\n'))
    for short in defaultTimer.getIncludedShort():
        extend(('  <include where="shortdescription">', stringToXML(short),
                '</include>\n'))
    for desc in defaultTimer.getIncludedDescription():
        extend(('  <include where="description">', stringToXML(desc),
                '</include>\n'))
    for day in defaultTimer.getIncludedDays():
        extend(('  <include where="dayofweek">', stringToXML(day),
                '</include>\n'))

    # Tags
    if webif and defaultTimer.tags:
        extend(('  <e2tags>', stringToXML(' '.join(defaultTimer.tags)),
                '</e2tags>\n'))
    else:
        for tag in defaultTimer.tags:
            extend(('  <tag>', stringToXML(tag), '</tag>\n'))

    # Keep the list clean
    if len(list) == 5:
        list.pop()  # >
        list.pop()  # <defaults
    else:
        append(' </defaults>\n\n')

    # Iterate timers
    for timer in timers:
        # Common attributes (match, enabled)
        extend(
            (' <timer name="', stringToXML(timer.name), '" match="',
             stringToXML(timer.match), '" enabled="', timer.getEnabled(), '"'))
        if webif:
            extend((' id="', str(timer.getId()), '"'))

        # Timespan
        if timer.hasTimespan():
            extend((' from="', timer.getTimespanBegin(), '" to="',
                    timer.getTimespanEnd(), '"'))

        # Timeframe
        if timer.hasTimeframe():
            extend((' after="', str(timer.getTimeframeBegin()), '" before="',
                    str(timer.getTimeframeEnd()), '"'))

        # Duration
        if timer.hasDuration():
            extend((' maxduration="', str(timer.getDuration()), '"'))

        # Destination
        if timer.hasDestination():
            extend((' location="', stringToXML(timer.destination), '"'))

        # Offset
        if timer.hasOffset():
            if timer.isOffsetEqual():
                extend((' offset="', str(timer.getOffsetBegin()), '"'))
            else:
                extend((' offset="', str(timer.getOffsetBegin()), ',',
                        str(timer.getOffsetEnd()), '"'))

        # Counter
        if timer.hasCounter():
            extend((' lastBegin="', str(timer.getLastBegin()), '" counter="',
                    str(timer.getCounter()), '" left="',
                    str(timer.getCounterLeft()), '"'))
            if timer.hasCounterFormatString():
                extend(
                    (' lastActivation="', str(timer.getCounterLimit()), '"'))
                extend((' counterFormat="',
                        str(timer.getCounterFormatString()), '"'))

        # Duplicate Description
        if timer.getAvoidDuplicateDescription():
            extend((' avoidDuplicateDescription="',
                    str(timer.getAvoidDuplicateDescription()), '"'))

        # Only display justplay if true
        if timer.justplay:
            extend((' justplay="', str(timer.getJustplay()), '"'))

        # Only display encoding if != utf-8
        if timer.encoding != 'UTF-8' or webif:
            extend((' encoding="', str(timer.encoding), '"'))

        # Only display searchType if exact
        if timer.searchType == "exact":
            extend((' searchType="', str(timer.searchType), '"'))

        # Only display searchCase if sensitive
        if timer.searchCase == "sensitive":
            extend((' searchCase="', str(timer.searchCase), '"'))

        # Only display overrideAlternatives if true
        if timer.overrideAlternatives:
            extend((' overrideAlternatives="',
                    str(timer.getOverrideAlternatives()), '"'))

        # Only add vps related entries if true
        if timer.vps_enabled:
            append(' vps_enabled="yes"')
            if timer.vps_overwrite:
                append(' vps_overwrite="yes"')

        # Close still opened timer tag
        append('>\n')

        if webif:
            # Services + Bouquets
            for serviceref in timer.services + timer.bouquets:
                ref = ServiceReference(str(serviceref))
                extend((
                    '  <e2service>\n',
                    '   <e2servicereference>',
                    str(serviceref),
                    '</e2servicereference>\n',
                    '   <e2servicename>',
                    stringToXML(ref.getServiceName().replace(
                        '\xc2\x86', '').replace('\xc2\x87', '')),
                    '</e2servicename>\n',
                    '  </e2service>\n',
                ))
        else:
            # Services
            for serviceref in timer.services:
                ref = ServiceReference(str(serviceref))
                extend((
                    '  <serviceref>',
                    serviceref,
                    '</serviceref>',
                    ' <!-- ',
                    stringToXML(ref.getServiceName().replace(
                        '\xc2\x86', '').replace('\xc2\x87', '')),
                    ' -->\n',
                ))

            # Bouquets
            for bouquet in timer.bouquets:
                ref = ServiceReference(str(bouquet))
                extend((
                    '  <bouquet>',
                    str(bouquet),
                    '</bouquet>',
                    ' <!-- ',
                    stringToXML(ref.getServiceName().replace(
                        '\xc2\x86', '').replace('\xc2\x87', '')),
                    ' -->\n',
                ))

        # AfterEvent
        if timer.hasAfterEvent():
            idx = {
                AFTEREVENT.NONE: "none",
                AFTEREVENT.STANDBY: "standby",
                AFTEREVENT.DEEPSTANDBY: "shutdown",
                AFTEREVENT.AUTO: "auto"
            }
            for afterevent in timer.afterevent:
                action, timespan = afterevent
                append('  <afterevent')
                if timespan[0] is not None:
                    append(' from="%02d:%02d" to="%02d:%02d"' %
                           (timespan[0][0], timespan[0][1], timespan[1][0],
                            timespan[1][1]))
                extend(('>', idx[action], '</afterevent>\n'))

        # Excludes
        for title in timer.getExcludedTitle():
            extend(('  <exclude where="title">', stringToXML(title),
                    '</exclude>\n'))
        for short in timer.getExcludedShort():
            extend(('  <exclude where="shortdescription">', stringToXML(short),
                    '</exclude>\n'))
        for desc in timer.getExcludedDescription():
            extend(('  <exclude where="description">', stringToXML(desc),
                    '</exclude>\n'))
        for day in timer.getExcludedDays():
            extend(('  <exclude where="dayofweek">', stringToXML(day),
                    '</exclude>\n'))

        # Includes
        for title in timer.getIncludedTitle():
            extend(('  <include where="title">', stringToXML(title),
                    '</include>\n'))
        for short in timer.getIncludedShort():
            extend(('  <include where="shortdescription">', stringToXML(short),
                    '</include>\n'))
        for desc in timer.getIncludedDescription():
            extend(('  <include where="description">', stringToXML(desc),
                    '</include>\n'))
        for day in timer.getIncludedDays():
            extend(('  <include where="dayofweek">', stringToXML(day),
                    '</include>\n'))

        # Tags
        if webif and timer.tags:
            extend(('  <e2tags>', stringToXML(' '.join(timer.tags)),
                    '</e2tags>\n'))
        else:
            for tag in timer.tags:
                extend(('  <tag>', stringToXML(tag), '</tag>\n'))

        # End of Timer
        append(' </timer>\n\n')

    # End of Configuration
    append('</autotimer>\n')

    return list
Пример #60
0
class TimerEntry(Screen, ConfigListScreen):
    def __init__(self, session, timer):
        Screen.__init__(self, session)
        self.timer = timer

        self.entryDate = None
        self.entryService = None

        self["oktext"] = Label(_("OK"))
        self["canceltext"] = Label(_("Cancel"))
        self["ok"] = Pixmap()
        self["cancel"] = Pixmap()

        self.createConfig()

        self["actions"] = NumberActionMap(
            ["SetupActions", "GlobalActions", "PiPSetupActions"], {
                "ok": self.keySelect,
                "save": self.keyGo,
                "cancel": self.keyCancel,
                "volumeUp": self.incrementStart,
                "volumeDown": self.decrementStart,
                "size+": self.incrementEnd,
                "size-": self.decrementEnd
            }, -2)

        self.list = []
        ConfigListScreen.__init__(self, self.list, session=session)
        self.createSetup("config")

    def createConfig(self):
        justplay = self.timer.justplay

        afterevent = {
            AFTEREVENT.NONE: "nothing",
            AFTEREVENT.DEEPSTANDBY: "deepstandby",
            AFTEREVENT.STANDBY: "standby",
            AFTEREVENT.AUTO: "auto"
        }[self.timer.afterEvent]

        weekday_table = ("mon", "tue", "wed", "thu", "fri", "sat", "sun")

        # calculate default values
        day = []
        weekday = 0
        for x in (0, 1, 2, 3, 4, 5, 6):
            day.append(0)
        if self.timer.repeated:  # repeated
            type = "repeated"
            if (self.timer.repeated == 31):  # Mon-Fri
                repeated = "weekdays"
            elif (self.timer.repeated == 127):  # daily
                repeated = "daily"
            else:
                flags = self.timer.repeated
                repeated = "user"
                count = 0
                for x in (0, 1, 2, 3, 4, 5, 6):
                    if flags == 1:  # weekly
                        print "Set to weekday " + str(x)
                        weekday = x
                    if flags & 1 == 1:  # set user defined flags
                        day[x] = 1
                        count += 1
                    else:
                        day[x] = 0
                    flags = flags >> 1
                if count == 1:
                    repeated = "weekly"
        else:  # once
            type = "once"
            repeated = None
            weekday = (int(strftime("%w", localtime(self.timer.begin))) -
                       1) % 7
            day[weekday] = 1

        timer_choices = [("zap", _("zap"))]
        default = "zap"
        if SystemInfo["PVRSupport"]:
            timer_choices.append(("record", _("record")))
            default = {0: "record", 1: "zap"}[justplay]
        self.timerentry_justplay = ConfigSelection(choices=timer_choices,
                                                   default=default)
        if SystemInfo["DeepstandbySupport"]:
            shutdownString = _("go to deep standby")
        else:
            shutdownString = _("shut down")
        self.timerentry_afterevent = ConfigSelection(choices=[
            ("nothing", _("do nothing")), ("standby", _("go to standby")),
            ("deepstandby", shutdownString), ("auto", _("auto"))
        ],
                                                     default=afterevent)
        self.timerentry_type = ConfigSelection(choices=[("once", _("once")),
                                                        ("repeated",
                                                         _("repeated"))],
                                               default=type)
        self.timerentry_name = ConfigText(default=self.timer.name,
                                          visible_width=50,
                                          fixed_size=False)
        self.timerentry_description = ConfigText(
            default=self.timer.description, visible_width=50, fixed_size=False)
        self.timerentry_tags = self.timer.tags[:]
        self.timerentry_tagsset = ConfigSelection(choices=[
            not self.timerentry_tags and "None"
            or " ".join(self.timerentry_tags)
        ])

        self.timerentry_repeated = ConfigSelection(
            default=repeated,
            choices=[("daily", _("daily")), ("weekly", _("weekly")),
                     ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])

        self.timerentry_date = ConfigDateTime(default=self.timer.begin,
                                              formatstring=_("%d.%B %Y"),
                                              increment=86400)
        self.timerentry_starttime = ConfigClock(default=self.timer.begin)
        self.timerentry_endtime = ConfigClock(default=self.timer.end)
        self.timerentry_showendtime = ConfigSelection(
            default=((self.timer.end - self.timer.begin) > 4),
            choices=[(True, _("yes")), (False, _("no"))])

        default = self.timer.dirname or defaultMoviePath()
        tmp = config.movielist.videodirs.value
        if default not in tmp:
            tmp.append(default)
        self.timerentry_dirname = ConfigSelection(default=default, choices=tmp)

        self.timerentry_repeatedbegindate = ConfigDateTime(
            default=self.timer.repeatedbegindate,
            formatstring=_("%d.%B %Y"),
            increment=86400)

        self.timerentry_weekday = ConfigSelection(
            default=weekday_table[weekday],
            choices=[("mon", _("Monday")), ("tue", _("Tuesday")),
                     ("wed", _("Wednesday")), ("thu", _("Thursday")),
                     ("fri", _("Friday")), ("sat", _("Saturday")),
                     ("sun", _("Sunday"))])

        self.timerentry_day = ConfigSubList()
        for x in (0, 1, 2, 3, 4, 5, 6):
            self.timerentry_day.append(ConfigYesNo(default=day[x]))

        # FIXME some service-chooser needed here
        servicename = "N/A"
        try:  # no current service available?
            servicename = str(self.timer.service_ref.getServiceName())
        except:
            pass
        if not servicename:
            servicename = "N/A"
        self.timerentry_service_ref = self.timer.service_ref
        self.timerentry_service = ConfigSelection([servicename])

    def createSetup(self, widget):
        self.list = []
        self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
        self.list.append(
            getConfigListEntry(_("Description"), self.timerentry_description))
        self.timerJustplayEntry = getConfigListEntry(_("Timer Type"),
                                                     self.timerentry_justplay)
        self.list.append(self.timerJustplayEntry)
        self.timerTypeEntry = getConfigListEntry(_("Repeat Type"),
                                                 self.timerentry_type)
        self.list.append(self.timerTypeEntry)

        if self.timerentry_type.value == "once":
            self.frequencyEntry = None
        else:  # repeated
            self.frequencyEntry = getConfigListEntry(_("Repeats"),
                                                     self.timerentry_repeated)
            self.list.append(self.frequencyEntry)
            self.repeatedbegindateEntry = getConfigListEntry(
                _("Starting on"), self.timerentry_repeatedbegindate)
            self.list.append(self.repeatedbegindateEntry)
            if self.timerentry_repeated.value == "daily":
                pass
            if self.timerentry_repeated.value == "weekdays":
                pass
            if self.timerentry_repeated.value == "weekly":
                self.list.append(
                    getConfigListEntry(_("Weekday"), self.timerentry_weekday))

            if self.timerentry_repeated.value == "user":
                self.list.append(
                    getConfigListEntry(_("Monday"), self.timerentry_day[0]))
                self.list.append(
                    getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
                self.list.append(
                    getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
                self.list.append(
                    getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
                self.list.append(
                    getConfigListEntry(_("Friday"), self.timerentry_day[4]))
                self.list.append(
                    getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
                self.list.append(
                    getConfigListEntry(_("Sunday"), self.timerentry_day[6]))

        self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date)
        if self.timerentry_type.value == "once":
            self.list.append(self.entryDate)

        self.entryStartTime = getConfigListEntry(_("StartTime"),
                                                 self.timerentry_starttime)
        self.list.append(self.entryStartTime)

        self.entryShowEndTime = getConfigListEntry(_("Set End Time"),
                                                   self.timerentry_showendtime)
        if self.timerentry_justplay.value == "zap":
            self.list.append(self.entryShowEndTime)
        self.entryEndTime = getConfigListEntry(_("EndTime"),
                                               self.timerentry_endtime)
        if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value:
            self.list.append(self.entryEndTime)

        self.channelEntry = getConfigListEntry(_("Channel"),
                                               self.timerentry_service)
        self.list.append(self.channelEntry)

        self.dirname = getConfigListEntry(_("Location"),
                                          self.timerentry_dirname)
        self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset)
        if self.timerentry_justplay.value != "zap":
            if config.usage.setup_level.index >= 2:  # expert+
                self.list.append(self.dirname)
            if getPreferredTagEditor():
                self.list.append(self.tagsSet)
            self.list.append(
                getConfigListEntry(_("After event"),
                                   self.timerentry_afterevent))

        self[widget].list = self.list
        self[widget].l.setList(self.list)

    def newConfig(self):
        print "newConfig", self["config"].getCurrent()
        if self["config"].getCurrent() in (self.timerTypeEntry,
                                           self.timerJustplayEntry,
                                           self.frequencyEntry,
                                           self.entryShowEndTime):
            self.createSetup("config")

    def keyLeft(self):
        if self["config"].getCurrent() in (self.channelEntry, self.tagsSet):
            self.keySelect()
        else:
            ConfigListScreen.keyLeft(self)
            self.newConfig()

    def keyRight(self):
        if self["config"].getCurrent() in (self.channelEntry, self.tagsSet):
            self.keySelect()
        else:
            ConfigListScreen.keyRight(self)
            self.newConfig()

    def keySelect(self):
        cur = self["config"].getCurrent()
        if cur == self.channelEntry:
            self.session.openWithCallback(
                self.finishedChannelSelection,
                ChannelSelection.SimpleChannelSelection,
                _("Select channel to record from"))
        elif config.usage.setup_level.index >= 2 and cur == self.dirname:
            self.session.openWithCallback(
                self.pathSelected,
                MovieLocationBox,
                _("Choose target folder"),
                self.timerentry_dirname.value,
                minFree=100  # We require at least 100MB free space
            )
        elif getPreferredTagEditor() and cur == self.tagsSet:
            self.session.openWithCallback(self.tagEditFinished,
                                          getPreferredTagEditor(),
                                          self.timerentry_tags)
        else:
            self.keyGo()

    def finishedChannelSelection(self, *args):
        if args:
            self.timerentry_service_ref = ServiceReference(args[0])
            self.timerentry_service.setCurrentText(
                self.timerentry_service_ref.getServiceName())
            self["config"].invalidate(self.channelEntry)

    def getTimestamp(self, date, mytime):
        d = localtime(date)
        dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
        return int(mktime(dt.timetuple()))

    def getBeginEnd(self):
        date = self.timerentry_date.value
        endtime = self.timerentry_endtime.value
        starttime = self.timerentry_starttime.value

        begin = self.getTimestamp(date, starttime)
        end = self.getTimestamp(date, endtime)

        # if the endtime is less than the starttime, add 1 day.
        if end < begin:
            end += 86400
        return begin, end

    def selectChannelSelector(self, *args):
        self.session.openWithCallback(self.finishedChannelSelectionCorrection,
                                      ChannelSelection.SimpleChannelSelection,
                                      _("Select channel to record from"))

    def finishedChannelSelectionCorrection(self, *args):
        if args:
            self.finishedChannelSelection(*args)
            self.keyGo()

    def keyGo(self, result=None):
        if not self.timerentry_service_ref.isRecordable():
            self.session.openWithCallback(
                self.selectChannelSelector, MessageBox,
                _("You didn't select a channel to record from."),
                MessageBox.TYPE_ERROR)
            return
        self.timer.name = self.timerentry_name.value
        self.timer.description = self.timerentry_description.value
        self.timer.justplay = self.timerentry_justplay.value == "zap"
        if self.timerentry_justplay.value == "zap":
            if not self.timerentry_showendtime.value:
                self.timerentry_endtime.value = self.timerentry_starttime.value
        self.timer.resetRepeated()
        self.timer.afterEvent = {
            "nothing": AFTEREVENT.NONE,
            "deepstandby": AFTEREVENT.DEEPSTANDBY,
            "standby": AFTEREVENT.STANDBY,
            "auto": AFTEREVENT.AUTO
        }[self.timerentry_afterevent.value]
        self.timer.service_ref = self.timerentry_service_ref
        self.timer.tags = self.timerentry_tags

        if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath(
        ):
            self.timer.dirname = self.timerentry_dirname.value
            config.movielist.last_timer_videodir.value = self.timer.dirname
            config.movielist.last_timer_videodir.save()

        if self.timerentry_type.value == "once":
            self.timer.begin, self.timer.end = self.getBeginEnd()
        if self.timerentry_type.value == "repeated":
            if self.timerentry_repeated.value == "daily":
                for x in (0, 1, 2, 3, 4, 5, 6):
                    self.timer.setRepeated(x)

            if self.timerentry_repeated.value == "weekly":
                self.timer.setRepeated(self.timerentry_weekday.index)

            if self.timerentry_repeated.value == "weekdays":
                for x in (0, 1, 2, 3, 4):
                    self.timer.setRepeated(x)

            if self.timerentry_repeated.value == "user":
                for x in (0, 1, 2, 3, 4, 5, 6):
                    if self.timerentry_day[x].value:
                        self.timer.setRepeated(x)

            self.timer.repeatedbegindate = self.getTimestamp(
                self.timerentry_repeatedbegindate.value,
                self.timerentry_starttime.value)
            if self.timer.repeated:
                self.timer.begin = self.getTimestamp(
                    self.timerentry_repeatedbegindate.value,
                    self.timerentry_starttime.value)
                self.timer.end = self.getTimestamp(
                    self.timerentry_repeatedbegindate.value,
                    self.timerentry_endtime.value)
            else:
                self.timer.begin = self.getTimestamp(
                    time.time(), self.timerentry_starttime.value)
                self.timer.end = self.getTimestamp(
                    time.time(), self.timerentry_endtime.value)

            # when a timer end is set before the start, add 1 day
            if self.timer.end < self.timer.begin:
                self.timer.end += 86400

        if self.timer.eit is not None:
            event = eEPGCache.getInstance().lookupEventId(
                self.timer.service_ref.ref, self.timer.eit)
            if event:
                n = event.getNumOfLinkageServices()
                if n > 1:
                    tlist = []
                    ref = self.session.nav.getCurrentlyPlayingServiceReference(
                    )
                    parent = self.timer.service_ref.ref
                    selection = 0
                    for x in range(n):
                        i = event.getLinkageService(parent, x)
                        if i.toString() == ref.toString():
                            selection = x
                        tlist.append((i.getName(), i))
                    self.session.openWithCallback(
                        self.subserviceSelected,
                        ChoiceBox,
                        title=_("Please select a subservice to record..."),
                        list=tlist,
                        selection=selection)
                    return
                elif n > 0:
                    parent = self.timer.service_ref.ref
                    self.timer.service_ref = ServiceReference(
                        event.getLinkageService(parent, 0))
        self.saveTimer()
        self.close((True, self.timer))

    def incrementStart(self):
        self.timerentry_starttime.increment()
        self["config"].invalidate(self.entryStartTime)

    def decrementStart(self):
        self.timerentry_starttime.decrement()
        self["config"].invalidate(self.entryStartTime)

    def incrementEnd(self):
        if self.entryEndTime is not None:
            self.timerentry_endtime.increment()
            self["config"].invalidate(self.entryEndTime)

    def decrementEnd(self):
        if self.entryEndTime is not None:
            self.timerentry_endtime.decrement()
            self["config"].invalidate(self.entryEndTime)

    def subserviceSelected(self, service):
        if not service is None:
            self.timer.service_ref = ServiceReference(service[1])
        self.saveTimer()
        self.close((True, self.timer))

    def saveTimer(self):
        self.session.nav.RecordTimer.saveTimer()

    def keyCancel(self):
        self.close((False, ))

    def pathSelected(self, res):
        if res is not None:
            if config.movielist.videodirs.value != self.timerentry_dirname.choices:
                self.timerentry_dirname.setChoices(
                    config.movielist.videodirs.value, default=res)
            self.timerentry_dirname.value = res

    def tagEditFinished(self, ret):
        if ret is not None:
            self.timerentry_tags = ret
            self.timerentry_tagsset.setChoices(
                [not ret and "None" or " ".join(ret)])
            self["config"].invalidate(self.tagsSet)