def buildConfiguration(self, webif = False):
		list = ['<?xml version="1.0" ?>\n<epgrefresh version="', XML_VERSION, '">\n\n']
		if webif:
			for serviceref in self.services[0].union(self.services[1]):
				ref = ServiceReference(str(serviceref))
				list.extend((
					' <e2service>\n',
					'  <e2servicereference>', str(serviceref), '</e2servicereference>\n',
					'  <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n',
					' </e2service>\n',
				))
		else:
			for service in self.services[0]:
				ref = ServiceReference(service.sref)
				list.extend((' <!--', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '-->\n', ' <service'))
				if service.duration is not None:
					list.extend((' duration="', str(service.duration), '"'))
				list.extend(('>', stringToXML(service.sref), '</service>\n'))
			for bouquet in self.services[1]:
				ref = ServiceReference(bouquet.sref)
				list.extend((' <!--', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '-->\n', ' <bouquet'))
				if bouquet.duration is not None:
					list.extend((' duration="', str(bouquet.duration), '"'))
				list.extend(('>', stringToXML(bouquet.sref), '</bouquet>\n'))
		list.append('\n</epgrefresh>')
		return list
	def buildConfiguration(self, webif = False):
		list = ['<?xml version="1.0" ?>\n<epgrefresh>\n\n']

		if webif:
			TAGSERVICE='e2servicereference'
			TAGBOUQUET='e2servicereference'
			TAGNAME='e2servicename'
		else:
			TAGSERVICE='service'
			TAGBOUQUET='bouquet'
			TAGNAME='!--'

		for service in self.services[0]:
			ref = ServiceReference(service.sref)
			list.extend((' <', TAGNAME, '>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</', TAGNAME, '>\n'))
			list.extend((' <', TAGSERVICE))
			if service.duration is not None:
				list.extend((' duration="', str(service.duration), '"'))
			list.extend(('>', stringToXML(service.sref), '</', TAGSERVICE, '>\n'))
		for bouquet in self.services[1]:
			ref = ServiceReference(bouquet.sref)
			list.extend((' <', TAGNAME, '>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</', TAGNAME, '>\n'))
			list.extend((' <', TAGBOUQUET))
			if bouquet.duration is not None:
				list.extend((' duration="', str(bouquet.duration), '"'))
			list.extend(('>', stringToXML(bouquet.sref), '</', TAGBOUQUET, '>\n'))

		list.append('\n</epgrefresh>')

		return list
    def buildConfiguration(self, webif=False):
        list = ['<?xml version="1.0" ?>\n<epgrefresh version="', XML_VERSION, '">\n\n']

        if webif:
            for serviceref in self.services[0].union(self.services[1]):
                ref = ServiceReference(str(serviceref))
                list.extend(
                    (
                        " <e2service>\n",
                        "  <e2servicereference>",
                        str(serviceref),
                        "</e2servicereference>\n",
                        "  <e2servicename>",
                        stringToXML(ref.getServiceName().replace("\xc2\x86", "").replace("\xc2\x87", "")),
                        "</e2servicename>\n",
                        " </e2service>\n",
                    )
                )
        else:
            for service in self.services[0]:
                ref = ServiceReference(service.sref)
                list.extend(
                    (
                        " <!--",
                        stringToXML(ref.getServiceName().replace("\xc2\x86", "").replace("\xc2\x87", "")),
                        "-->\n",
                        " <service",
                    )
                )
                if service.duration is not None:
                    list.extend((' duration="', str(service.duration), '"'))
                list.extend((">", stringToXML(service.sref), "</service>\n"))
            for bouquet in self.services[1]:
                ref = ServiceReference(bouquet.sref)
                list.extend(
                    (
                        " <!--",
                        stringToXML(ref.getServiceName().replace("\xc2\x86", "").replace("\xc2\x87", "")),
                        "-->\n",
                        " <bouquet",
                    )
                )
                if bouquet.duration is not None:
                    list.extend((' duration="', str(bouquet.duration), '"'))
                list.extend((">", stringToXML(bouquet.sref), "</bouquet>\n"))

        list.append("\n</epgrefresh>")

        return list
    def intermediateWrite(self, timers, conflicting, similar, skipped):
        returnlist = []
        extend = returnlist.extend

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

        if self._stillAlive:
            reactor.callFromThread(lambda: self._req.write("".join(returnlist)))
	def renderBackground(self, req):
		autotimer = self.getAutoTimerInstance()

		ret = autotimer.parseEPG(simulateOnly=True)

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

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

		req.setResponseCode(http.OK)
		req.setHeader('Content-type', 'application/xhtml+xml')
		req.setHeader('charset', 'UTF-8')
		return ''.join(returnlist)
Exemple #6
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"
	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!")
Exemple #8
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)
	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
Exemple #10
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')
Exemple #11
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)
Exemple #12
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 ""
Exemple #13
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'))
Exemple #14
0
	def buildEPGSearchEntry(self, service, eventId, beginTime, duration, EventName):
		rec1 = beginTime and self.timer.isInTimer(eventId, beginTime, duration, service)
		# Partnerbox
		if PartnerBoxIconsEnabled:
			rec2 = beginTime and isInRemoteTimer(self,beginTime, duration, service)
		else:
			rec2 = False
		r1 = self.weekday_rect
		r2 = self.datetime_rect
		r3 = self.descr_rect
		t = localtime(beginTime)
		serviceref = ServiceReference(service) # for Servicename
		serviceName = serviceref.getServiceName() + ": "

		#delete serviceName if set it in setup and it is most matched service
		if config.plugins.epgsearch.show_sname_in_title.value and service == self.mostSearchService:
			serviceName = ""

		res = [
			None, # no private data needed
			(eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, self.days[t[6]]),
			(eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 0, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4]))
		]

		#add picon if set this option in setup
		picon = None
		if config.plugins.epgsearch.show_picon.value:
			picon = self.piconLoader.getPicon(service)
		left_pos = r3.left()
		if picon is not None:
			res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, left_pos, 2, self._picon_width, r3.height()-3, picon))
			left_pos = r3.left() + self._picon_width + self._itemMargin
			serviceName = "" #if load picon delete servicename

		if rec1 or rec2:
			if rec1:
				clock_pic = self.getClockPixmap(service, beginTime, duration, eventId)
				# maybe Partnerbox too
				if rec2:
					clock_pic_partnerbox = getRemoteClockPixmap(self,service, beginTime, duration, eventId)
			else:
				clock_pic = getRemoteClockPixmap(self,service, beginTime, duration, eventId)
			if rec1 and rec2:
				# Partnerbox and local
				res.extend((
					(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, left_pos, self._iconHPos, self._iconWidth, self._iconHeight, clock_pic),
					(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, left_pos + self._iconWidth + self._itemMargin, self._iconHPos, self._iconWidth, self._iconHeight, clock_pic_partnerbox),
					(eListboxPythonMultiContent.TYPE_TEXT, left_pos + self._iconWidth*2 + self._itemMargin*2, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName + EventName)))
			else:
				res.extend((
					(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, left_pos, self._iconHPos, self._iconWidth, self._iconHeight, clock_pic),
					(eListboxPythonMultiContent.TYPE_TEXT, left_pos + self._iconWidth + self._itemMargin, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName + EventName)))
		else:
			res.append((eListboxPythonMultiContent.TYPE_TEXT, left_pos, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName + EventName))
		return res
	def renderBackground(self, req ,timers, skipped):

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

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

		if skipped:
			for (name, begin, end, serviceref, autotimername, message) in skipped:
				ref = ServiceReference(str(serviceref))
				extend((
					'<e2simulatedtimer>\n'
					'   <e2servicereference>', stringToXML(serviceref), '</e2servicereference>\n',
					'   <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n',
					'   <e2name>', stringToXML(name), '</e2name>\n',
					'   <e2timebegin>', str(begin), '</e2timebegin>\n',
					'   <e2timeend>', str(end), '</e2timeend>\n',
					'   <e2autotimername>', stringToXML(autotimername), '</e2autotimername>\n',
					'   <e2state>Skip</e2state>\n'
					'   <e2message>', stringToXML(message), '</e2message>\n'
					'</e2simulatedtimer>\n'
				))
		
		returnlist.append('</e2autotimersimulate>')

		req.setResponseCode(http.OK)
		req.setHeader('Content-type', 'application/xhtml+xml')
		req.setHeader('charset', 'UTF-8')
		return ''.join(returnlist)
Exemple #16
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:
Exemple #17
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()
	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)
				)
Exemple #19
0
	def onCreate(self):
		serviceref = self.session.nav.getCurrentlyPlayingServiceOrGroup()
		title = None
		l = self['list']
		l.recalcEntrySize()
		if self.type == EPG_TYPE_GRAPH or self.type == EPG_TYPE_INFOBARGRAPH:
			l.fillGraphEPG(self.services, self.ask_time)
			l.moveToService(serviceref)
			l.setCurrentlyPlaying(serviceref)
			if self.type == EPG_TYPE_GRAPH:
				l.setShowServiceMode(config.epgselection.graph_servicetitle_mode.getValue())
				self.moveTimeLines()
				if config.epgselection.graph_channel1.getValue():
					l.instance.moveSelectionTo(0)
			elif self.type == EPG_TYPE_INFOBARGRAPH:
				l.setShowServiceMode(config.epgselection.infobar_servicetitle_mode.getValue())
				self.moveTimeLines()
			self.setTitle(self.bouquetname)
			self.listTimer.start(10)
		elif self.type == EPG_TYPE_MULTI:
			l.fillMultiEPG(self.services, self.ask_time)
			l.moveToService(serviceref)
			l.setCurrentlyPlaying(serviceref)
			self.setTitle(self.bouquetname)
		elif self.type == EPG_TYPE_SINGLE or self.type == EPG_TYPE_ENHANCED or self.type == EPG_TYPE_INFOBAR:
			if self.type == EPG_TYPE_SINGLE:
				service = self.currentService
			elif self.type == EPG_TYPE_ENHANCED or self.type == EPG_TYPE_INFOBAR:
				service = ServiceReference(self.servicelist.getCurrentSelection())
				title = ServiceReference(self.servicelist.getRoot()).getServiceName()
			self['Service'].newService(service.ref)
			if title:
				title = title + ' - ' + service.getServiceName()
			else: 
				title = service.getServiceName()
			self.setTitle(title)
			l.fillSingleEPG(service)
			l.sortSingleEPG(int(config.epgselection.sort.getValue()))
		else:
			l.fillSimilarList(self.currentService, self.eventid)
Exemple #20
0
	def getMovieList(self):
		self.movielist.reload(root=self.root, filter_tags=self.tagfilter)
		list = []

		tag = self.cmd['tag']
		tag = tag and tag.lower()
		for (serviceref, info, begin, unknown) in self.movielist.list:
			if serviceref.flags & eServiceReference.mustDescent:
				# Skip subdirectories (TODO: Browse?)
				continue
			rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate)

			if rtime > 0:
				t = FuzzyTime(rtime, inPast=True)
				begin_string = t[0] + ", " + t[1]
			else:
				begin_string = "undefined"

			if config.plugins.Webinterface.loadmovielength.value:
				len = info.getLength(serviceref)
				if len > 0:
					len = "%d:%02d" % (len / 60, len % 60)
				else:
					len = "?:??"
			else:
				len = "disabled"

			sourceERef = info.getInfoString(serviceref, iServiceInformation.sServiceref)
			sourceRef = ServiceReference(sourceERef)

			event = info.getEvent(serviceref)
			ext = event and event.getExtendedDescription() or ""

			filename = "/" + "/".join(serviceref.toString().split("/")[1:])
			servicename = ServiceReference(serviceref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')
			
			if not tag or tag in info.getInfoString(serviceref, iServiceInformation.sTags).lower():
				""" add movie only to list, if a given tag is applied to the movie """
				list.append((
					serviceref.toString(),
					servicename,
					info.getInfoString(serviceref, iServiceInformation.sDescription),
					rtime,
					begin_string,
					len,
					sourceRef.getServiceName(),
					info.getInfoString(serviceref, iServiceInformation.sTags),
					ext,
					filename,
					os_stat(filename)[6]
				))
		return list
def getParentalControlList():
    if not config.ParentalControl.configured.value:
        return {"result": True, "services": []}
    parentalControl.open()
    if config.ParentalControl.type.value == "whitelist":
        tservices = parentalControl.whitelist
    else:
        tservices = parentalControl.blacklist
    services = []
    if tservices is not None:
        for service in tservices:
            tservice = ServiceReference(service)
            services.append({"servicereference": service, "servicename": tservice.getServiceName()})
    return {"result": True, "type": config.ParentalControl.type.value, "services": services}
Exemple #22
0
	def getMovieList(self):
		self.movielist.reload(root=self.root, filter_tags=self.tagfilter)
		lst = []
		append = lst.append

		loadLength = config.plugins.Webinterface.loadmovielength.value
		for (serviceref, info, begin, unknown) in self.movielist.list:
			if serviceref.flags & eServiceReference.mustDescent:
				# Skip subdirectories (TODO: Browse?)
				continue
			rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate)

			if rtime > 0:
				t = FuzzyTime(rtime, inPast=True)
				begin_string = t[0] + ", " + t[1]
			else:
				begin_string = _("undefined")

			if loadLength:
				Len = info.getLength(serviceref)
				if Len > 0:
					Len = "%d:%02d" % (Len / 60, Len % 60)
				else:
					Len = "?:??"
			else:
				Len = _("disabled")

			sourceERef = info.getInfoString(serviceref, iServiceInformation.sServiceref)
			sourceRef = ServiceReference(sourceERef)

			event = info.getEvent(serviceref)
			ext = event and event.getExtendedDescription() or ""

			filename = "/" + "/".join(serviceref.toString().split("/")[1:])
			servicename = ServiceReference(serviceref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')

			append((
				serviceref.toString(),
				servicename,
				info.getInfoString(serviceref, iServiceInformation.sDescription),
				rtime,
				begin_string,
				Len,
				sourceRef.getServiceName(),
				info.getInfoString(serviceref, iServiceInformation.sTags),
				ext,
				filename,
				os_stat(filename)[6]
			))
		return lst
Exemple #23
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':
                 self.servicelist.append((service_name,
                  ConfigNothing(),
                  0,
                  service_ref.ref.toString()))
                 self['ServiceList'].l.setList(self.servicelist)
                 self.setServiceListInfo()
	def intermediateWrite(self, timers, conflicting, similar, skipped):
		returnlist = []
		extend = returnlist.extend

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

		if skipped:
			for (name, begin, end, serviceref, autotimername, message) in skipped:
				ref = ServiceReference(str(serviceref))
				extend((
					'<e2simulatedtimer>\n'
					'   <e2servicereference>', stringToXML(serviceref), '</e2servicereference>\n',
					'   <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n',
					'   <e2name>', stringToXML(name), '</e2name>\n',
					'   <e2timebegin>', str(begin), '</e2timebegin>\n',
					'   <e2timeend>', str(end), '</e2timeend>\n',
					'   <e2autotimername>', stringToXML(autotimername), '</e2autotimername>\n',
					'   <e2state>Skip</e2state>\n'
					'   <e2message>', stringToXML(message), '</e2message>\n'
					'</e2simulatedtimer>\n'
				))
		
		if self._stillAlive:
			reactor.callFromThread(lambda: self._req.write(''.join(returnlist)))
	def render(self, req):
		req.setResponseCode(http.OK)
		req.setHeader('Content-type', 'application/xhtml+xml')
		req.setHeader('charset', 'UTF-8')

		if 'sref' in req.args:
			services = OrderedSet()
			bouquets = OrderedSet()
			for sref in req.args.get('sref'):
				sref = unquote(sref)
				ref = eServiceReference(sref)
				if not ref.valid():
					services = bouquets = None
					break
				elif (ref.flags & 7) == 7:
					epgservice = EPGRefreshService(sref, None)
					if epgservice not in bouquets:
						bouquets.add(epgservice)
				else:
					if not (ref.flags & eServiceReference.isGroup):
						# strip all after last :
						pos = sref.rfind(':')
						if pos != -1:
							if sref[pos-1] == ':':
								pos -= 1
							sref = sref[:pos+1]

					epgservice = EPGRefreshService(sref, None)
					if epgservice not in services:
						services.add(epgservice)
			if services is not None and bouquets is not None:
				scanServices = epgrefresh.generateServicelist(services, bouquets)
			else:
				scanServices = []
		else:
			scanServices = epgrefresh.generateServicelist(epgrefresh.services[0], epgrefresh.services[1])

		returnlist = ["<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<e2servicelist>"]
		extend = returnlist.extend
		for serviceref in scanServices:
			ref = ServiceReference(str(serviceref))
			returnlist.extend((
				' <e2service>\n',
				'  <e2servicereference>', stringToXML(str(serviceref)), '</e2servicereference>\n',
				'  <e2servicename>', stringToXML(ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), '</e2servicename>\n',
				' </e2service>\n',
			))
		returnlist.append('\n</e2servicelist>')
		return ''.join(returnlist)
	def addProviderToBouquetlist(self, param):
		print "[WebComponents.BouquetEditor] addProviderToBouquet with param = ", param
		refstr = param["sProviderRef"]
		if refstr is None:
			return (False, "No provider given!")
		mode = MODE_TV # init
		if "mode" in param:
			if param["mode"] is not None:
				mode = int(param["mode"])
		ref = eServiceReference(refstr)
		provider = ServiceReference(ref)
		providerName = provider.getServiceName()
		serviceHandler = eServiceCenter.getInstance()
		services = serviceHandler.list(provider.ref)
		return self.addBouquet(providerName, mode, services and services.getContent('R', True))
def getParentalControlList():
    if not config.ParentalControl.configured.value:
        return {"result": True, "services": []}

    if config.ParentalControl.type.value == "whitelist":
        tservices = parentalControl.openListFromFile(LIST_WHITELIST)
    else:
        tservices = parentalControl.openListFromFile(LIST_BLACKLIST)

    services = []
    for service in tservices:
        tservice = ServiceReference(service)
        services.append({"servicereference": service, "servicename": tservice.getServiceName()})

    return {"result": True, "services": services}
Exemple #28
0
	def buildMovieListEntry(self, serviceref, info, begin, len):
		if serviceref.flags & eServiceReference.mustDescent:
			return None

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

		begin_string = ""
		if begin > 0:
			t = FuzzyTime(begin)
			begin_string = t[0] + ", " + t[1]
		
		if self.list_type == MovieList.LISTTYPE_ORIGINAL:
			res.extend((txt, tags, servicename, description, begin_string, len))
		elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION:
			res.extend((txt, description, begin_string, servicename, len))
		elif self.list_type == MovieList.LISTTYPE_COMPACT:
			res.extend((txt, tags, servicename, begin_string, len))
		else:
			assert(self.list_type == MovieList.LISTTYPE_MINIMAL)
			if self.descr_state == MovieList.SHOW_DESCRIPTION:
				res.extend((txt, begin_string))
			else:
				res.extend((txt, len))
		
		return res
Exemple #29
0
	def getMovieList(self):
		self.movielist.reload(root=self.root, filter_tags=self.tagfilter)
		lst = []
		append = lst.append

		loadLength = config.plugins.Webinterface.loadmovielength.value
		for (serviceref, info, begin, unknown) in self.movielist.list:
			rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate)

			if rtime > 0:
				t = FuzzyTime(rtime)
				begin_string = t[0] + ", " + t[1]
			else:
				begin_string = _("undefined")

			if loadLength:
				Len = info.getLength(serviceref)
				if Len > 0:
					Len = "%d:%02d" % (Len / 60, Len % 60)
				else:
					Len = "?:??"
			else:
				Len = _("disabled")

			sourceERef = info.getInfoString(serviceref, iServiceInformation.sServiceref)
			sourceRef = ServiceReference(sourceERef)

			event = info.getEvent(serviceref)
			ext = event and event.getExtendedDescription() or ""

			filename = "/%s" %(serviceref.getPath(),)
			servicename = ServiceReference(serviceref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')

			append((
				serviceref.toString(),
				servicename,
				info.getInfoString(serviceref, iServiceInformation.sDescription),
				rtime,
				begin_string,
				Len,
				sourceRef.getServiceName(),
				info.getInfoString(serviceref, iServiceInformation.sTags),
				ext,
				filename,
				info.getInfoObject(serviceref, iServiceInformation.sFileSize),
			))
		return lst
Exemple #30
0
	def updateInfos(self):
		self.resetExitTimer()
		# update data
		current = ServiceReference(self.servicelist.getCurrentSelection())
		self["NowChannel"].setText(current.getServiceName())
		nowepg, nowtimedisplay = self.getEPGNowNext(current.ref,0)
		nextepg, nexttimedisplay = self.getEPGNowNext(current.ref,1)
		self["NowEPG"].setText(nowepg)
		self["NextEPG"].setText(nextepg)
		self["NowTime"].setText(nowtimedisplay)
		self["NextTime"].setText(nexttimedisplay)
		if not nowepg:
			# no epg found --> let's try it again, but only if PiP is activated
			if self.pipAvailable:
				self.CheckForEPG.start(3000, True)
		if self.pipAvailable:
			# play in videowindow
			self.playService(current.ref)
Exemple #31
0
 def buildEPGSearchEntry(self, service, eventId, beginTime, duration,
                         EventName):
     self.wasEntryAutoTimer = None
     clock_pic = self.getPixmapForEntry(service, eventId, beginTime,
                                        duration)
     clock_pic_partnerbox = None
     # Partnerbox
     if PartnerBoxIconsEnabled:
         rec2 = beginTime and (isInRemoteTimer(self, beginTime, duration,
                                               service))
         if rec2:
             clock_pic_partnerbox = getRemoteClockPixmap(
                 self, service, beginTime, duration, eventId)
     else:
         rec2 = False
     r1 = self.weekday_rect
     r2 = self.datetime_rect
     r3 = self.descr_rect
     t = localtime(beginTime)
     serviceref = ServiceReference(service)  # for Servicename
     res = [
         None,  # no private data needed
         (eListboxPythonMultiContent.TYPE_TEXT, r1.x, r1.y, r1.w, r1.h, 0,
          RT_HALIGN_LEFT | RT_VALIGN_CENTER, _(strftime("%a", t))),
         (eListboxPythonMultiContent.TYPE_TEXT, r2.x, r2.y, r2.w, r1.h, 0,
          RT_HALIGN_LEFT | RT_VALIGN_CENTER, strftime("%e/%m, %-H:%M", t))
     ]
     if clock_pic or clock_pic_partnerbox:
         if clock_pic and clock_pic_partnerbox and self.wasEntryAutoTimer:
             res.extend(
                 ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 65, (r3.h / 2 - 11), 21, 21,
                   self.autotimericon),
                  (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 43, (r3.h / 2 - 11), 21, 21,
                   self.clocks[clock_pic]),
                  (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21,
                   self.clocks[clock_pic_partnerbox]),
                  (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y,
                   r3.w - 66, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER,
                   serviceref.getServiceName() + ": " + EventName)))
         elif clock_pic and clock_pic_partnerbox:
             # Partnerbox and local
             res.extend(
                 ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 43, (r3.h / 2 - 11), 21, 21,
                   self.clocks[clock_pic]),
                  (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21,
                   self.clocks[clock_pic_partnerbox]),
                  (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y,
                   r3.w - 44, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER,
                   serviceref.getServiceName() + ": " + EventName)))
         elif clock_pic_partnerbox:
             # Partnerbox and local
             res.extend(
                 ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21,
                   self.clocks[clock_pic_partnerbox]),
                  (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y,
                   r3.w - 21, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER,
                   serviceref.getServiceName() + ": " + EventName)))
         elif self.wasEntryAutoTimer:
             res.extend(
                 ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 43, (r3.h / 2 - 11), 21, 21,
                   self.autotimericon),
                  (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21,
                   self.clocks[clock_pic]),
                  (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y,
                   r3.w - 44, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER,
                   serviceref.getServiceName() + ": " + EventName)))
         else:
             res.extend(
                 ((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND,
                   r3.x + r3.w - 21, (r3.h / 2 - 11), 21, 21,
                   self.clocks[clock_pic]),
                  (eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y,
                   r3.w - 21, r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER,
                   serviceref.getServiceName() + ": " + EventName)))
     else:
         res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.x, r3.y, r3.w,
                     r3.h, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER,
                     serviceref.getServiceName() + ": " + EventName))
     return res
Exemple #32
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
        day = []
        weekday = 0
        for x in (0, 1, 2, 3, 4, 5, 6):
            day.append(0)
        if self.timer.repeated:  # repeated
            type = "repeated"
            if self.timer.repeated == 31:  # Mon-Fri
                repeated = "weekdays"
            elif self.timer.repeated == 127:  # daily
                repeated = "daily"
            else:
                flags = self.timer.repeated
                repeated = "user"
                count = 0
                for x in (0, 1, 2, 3, 4, 5, 6):
                    if flags == 1:  # weekly
                        # 						print "Set to weekday " + str(x)
                        weekday = x
                    if flags & 1 == 1:  # set user defined flags
                        day[x] = 1
                        count += 1
                    else:
                        day[x] = 0
                    flags >>= 1
                if count == 1:
                    repeated = "weekly"
        else:  # once
            type = "once"
            repeated = None
            weekday = int(strftime("%u", localtime(self.timer.begin))) - 1
            day[weekday] = 1

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

        if SystemInfo["DeepstandbySupport"]:
            shutdownString = _("go to deep standby")
        else:
            shutdownString = _("shut down")
        self.timerentry_afterevent = ConfigSelection(choices=[
            ("nothing", _("do nothing")), ("standby", _("go to standby")),
            ("deepstandby", shutdownString), ("auto", _("auto"))
        ],
                                                     default=afterevent)
        self.timerentry_recordingtype = ConfigSelection(choices=[
            ("normal", _("normal")),
            ("descrambled+ecm", _("descramble and record ecm")),
            ("scrambled+ecm", _("don't descramble, record ecm"))
        ],
                                                        default=recordingtype)
        self.timerentry_type = ConfigSelection(choices=[("once", _("once")),
                                                        ("repeated",
                                                         _("repeated"))],
                                               default=type)
        self.timerentry_name = ConfigText(default=self.timer.name.replace(
            '\xc2\x86', '').replace('\xc2\x87', '').encode("utf-8"),
                                          visible_width=50,
                                          fixed_size=False)
        self.timerentry_description = ConfigText(
            default=self.timer.description, visible_width=50, fixed_size=False)
        self.timerentry_tags = self.timer.tags[:]
        # if no tags found, make name of event default tag set.
        if not self.timerentry_tags:
            tagname = self.timer.name.strip()
            if tagname:
                tagname = tagname[0].upper() + tagname[1:].replace(" ", "_")
                self.timerentry_tags.append(tagname)

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

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

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

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

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

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

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

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

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

        self.list = []
        self.timerJustplayEntry = getConfigListEntry(
            _("Timer type"), self.timerentry_justplay,
            _("Chose between record and ZAP."))
        self.list.append(self.timerJustplayEntry)
        self.entryName = getConfigListEntry(
            _("Name"), self.timerentry_name,
            _("Set the name the recording will get."))
        self.list.append(self.entryName)
        self.entryDescription = getConfigListEntry(
            _("Description"), self.timerentry_description,
            _("Set the description of the recording."))
        self.list.append(self.entryDescription)
        self.timerTypeEntry = getConfigListEntry(
            _("Repeat type"), self.timerentry_type,
            _("A repeating timer or just once?"))
        self.list.append(self.timerTypeEntry)

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

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

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

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

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

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

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

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

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

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

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

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

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

    def createSummary(self):
        return SetupSummary

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return begin, end

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    def tagEditFinished(self, ret):
        if ret is not None:
            self.timerentry_tags = ret
            self.timerentry_tagsset.setChoices(
                [not ret and "None" or " ".join(ret)])
            self["config"].invalidate(self.tagsSet)
	def __onStreamingEvent(self, event, stream):
		if StreamingWebScreen and stream:
			
			if event == StreamingWebScreen.EVENT_START:
				
				try:
					from Plugins.Extensions.WebInterface.WebScreens import streamingScreens
				except:
					streamingScreens = []
				
				# Extract parameters
				tuner, tunertype = getTuner( stream.getRecordService() ) 
				ref = stream.getRecordServiceRef()
				ip = stream.clientIP
				#TEST_MULTIPLESTREAMS 
				id = str(stream.screenIndex) + str(ip)
				#id = str(ref) + str(ip)
				##id = str(ref.toString()) + str(ip)
				
				# Delete references to avoid blocking tuners
				del stream
				
				port, host, client = "", "", ""
				
#				# Workaround to retrieve the client ip
#				# Change later and use the WebScreens getActiveStreamingClients if implemented
#				ipports = [ (win.ip, win.port) for win in self.entries.itervalues() ]
#				for conn in netstat(getstate='ESTABLISHED', getuid=False, getpid=False, readable=False):
#					# Check if it is a streaming connection
#					if conn[3] == '8001':
#						ip = conn[4]
#						port = conn[5]
#						# Check if ip and port is already known
#						if (ip, port) not in ipports:
#							break
#				else:
#					# No new connection found, leave it empty
#					ip, port, = "", ""
				
				#TODO Port is actually not given
				
				event = ref and self.epg and self.epg.lookupEventTime(ref, -1, 0)
				if event: 
					name = event.getEventName()
				else:
					name = ""
					#TODO check file streaming
				
				service_ref = ServiceReference(ref)
				filename = "" #TODO file streaming - read meta eit
				
				try:
					host = ip and socket.gethostbyaddr( ip )
					client = host and host[0].split('.')[0]
				except socket.herror, x:
					pass
				
				number = service_ref and getNumber(service_ref.ref)
				channel = service_ref and service_ref.getServiceName()
				
				win = self.session.instantiateDialog(TunerState, Stream, tuner, tunertype, name, number, channel, filename, client, ip, port)
				self.entries[id] = win
				if config.infobartunerstate.show_events.value:
					self.show(True)
			
			elif event == StreamingWebScreen.EVENT_END:
				
				# Remove Finished Stream
				#TEST_MULTIPLESTREAMS 
				id = str(stream.screenIndex) + str(stream.clientIP)
				#id = str(stream.getRecordServiceRef()) + str(stream.clientIP)
				##id = str(stream.getRecordServiceRef().toString()) + str(stream.clientIP)
				
				# Delete references to avoid blocking tuners
				del stream
				
				if id in self.entries:
					win = self.entries[id]
					
					begin = win.begin
					end = time()
					endless = False
					
					win.updateType( Finished )
					win.updateTimes( begin, end, endless )
					
					if config.infobartunerstate.show_events.value:
						self.show(True)
Exemple #34
0
	def tunerShow(self, forceshow=False):
		print("IBTS tunerShow")

		self.updateNextTimer()

		if self.entries:
			# There are active entries

			# Close info screen
			if self.info:
				self.info.hide()

			# Rebind InfoBar Events
			#self.bindInfoBar()

			# Only show the Tuner information dialog,
			# if no screen is displayed or the InfoBar is visible
			#TODO Info can also be showed if info.rectangle is outside currentdialog.rectangle
	#		if self.session.current_dialog is None \
	#			or isinstance(self.session.current_dialog, InfoBar):
			#MAYBE Tuner Informationen werden zusammen mit der EMCMediaCenter InfoBar angezeigt
			#or isinstance(self.session.current_dialog, EMCMediaCenter):

			# Delete entries:
			#  if entry reached timeout
			#  if number of entries is reached
			numberfinished = 0
			for id, win in sorted(self.entries.items(), key=lambda x: (x[1].end), reverse=True):
				if win.type == FINISHED:
					numberfinished += 1
				if win.toberemoved == True \
					or win.type == FINISHED and numberfinished > int(config.infobartunerstate.number_finished_records.value):
					# Delete Stopped Timers
					self.session.deleteDialog(win)
					del self.entries[id]

			# Update windows
			# Dynamic column resizing and repositioning
			widths = []
			for id, win in self.entries.items():
				if win.type == RECORD:
					#TODO Avolid blocking - avoid using getTimer to update the timer times use timer.time_changed if possible
					timer = getTimer(id)
					#print id, timer
					if timer:
						begin = timer.begin
						end = timer.end
						endless = timer.autoincrease

						if not win.tuner or not win.tunertype:
							win.tuner, win.tunertype = getTuner(timer.record_service)
						service_ref = None
						if not win.channel or not win.number:
							service_ref = timer.service_ref

						del timer

						if service_ref:
							win.number = win.number or service_ref and getNumber(service_ref.ref)
							win.channel = win.channel or service_ref and service_ref.getServiceName()
							win.channel = win.channel.replace('\xc2\x86', '').replace('\xc2\x87', '')

						win.updateTimes(begin, end, endless)
						win.update()
					else:
						# This can happen, if the time has been changed or if the timer does not exist anymore
						begin = win.begin
						end = win.end
						if end < begin or end > time():
							end = time()
						endless = False
						win.updateType(FINISHED)
						win.updateTimes(begin, end, endless)
						win.update()
						#TEST
						del self.entries[id]
						self.updateRecordTimer()
				elif win.type == STREAM:
					if config.infobartunerstate.show_streams.value:
						#TODO Avolid blocking - avoid using getStream to update the current name
						stream = getStream(id)
						if stream:
							ref = stream.getRecordServiceRef()

							if not win.tuner or not win.tunertype:
								win.tuner, win.tunertype = getTuner(stream.getRecordService())

							del stream

							event = ref and self.epg and self.epg.lookupEventTime(ref, -1, 0)
							if event:
								name = event.getEventName()
							else:
								name = ""

							begin = win.begin
							end = None
							endless = True

							service_ref = None
							if not win.number:
								service_ref = ServiceReference(ref)
								win.number = service_ref and getNumber(service_ref.ref)
							if not win.channel:
								service_ref = service_ref or ServiceReference(ref)
								win.channel = win.channel or service_ref and service_ref.getServiceName()

							win.updateName(name)
							win.updateTimes(begin, end, endless)
							win.update()
						else:
							win.toberemoved = True
					else:
						# Should never happen delete
						begin = win.begin
						end = time()
						endless = False
						win.updateType(FINISHED)
						win.updateTimes(begin, end, endless)
						win.update()
				else:
					# Type INFO / FINISHED
					win.update()

				# Calculate field width
				widths = map(lambda (w1, w2): max(w1, w2), zip_longest(widths, win.widths))

		#if self.entries:
			# Get initial padding / offset position and apply user offset
			padding = self.padding + int(config.infobartunerstate.offset_padding.value)
			#print "IBTS px, self.padding, config.padding", px, self.padding, int(config.infobartunerstate.offset_padding.value)

			# Calculate field spacing
			spacing = self.spacing + int(config.infobartunerstate.offset_spacing.value)
			#print "IBTS spacing, self.spaceing, config.spacing", spacing, self.spacing, int(config.infobartunerstate.offset_spacing.value)
			#widths = [ width+spacing if width>0 else 0 for width in widths ]

			# Apply user offsets
			posx = self.positionx + int(config.infobartunerstate.offset_horizontal.value)
			#print "IBTS posx, self.positionx, config.offset_horizontal", posx, self.positionx, int(config.infobartunerstate.offset_horizontal.value)
			posy = self.positiony + int(config.infobartunerstate.offset_vertical.value)
			height = self.height
			#print "IBTS widths", widths

			# Handle maximum width
			overwidth = posx + sum(widths) + len([w for w in widths if w]) * spacing + padding - self.desktopwidth + int(config.infobartunerstate.offset_rightside.value)
			#print "IBTS overwidth", overwidth

			# Order windows
			#wins = sorted( self.entries.itervalues(), key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=False )

			#TEST 1
			#wins = sorted( self.entries.itervalues(), key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=config.infobartunerstate.list_goesup.value )

			#TEST 2
			#wins = []
			#wins =       sorted( [ w for w in self.entries.values() if w.type == INFO ],     key=lambda x: (x.type, x.endless, x.begin), reverse=False )
			#wins.extend( sorted( [ w for w in self.entries.values() if w.type == RECORD ],   key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=False ) )
			#wins.extend( sorted( [ w for w in self.entries.values() if w.type == FINISHED ], key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=False ) )
			#wins.extend( sorted( [ w for w in self.entries.values() if w.type == STREAM ],   key=lambda x: (x.type, x.endless, x.timeleft, x.begin), reverse=False ) )
			#if config.infobartunerstate.list_goesup.value:
			#	wins.reverse()

			#TEST 3
			wins = sorted(self.entries.itervalues(), key=lambda x: (x.type, x.endless, x.begin), reverse=config.infobartunerstate.list_goesup.value)

			# Resize, move and show windows
			for win in wins:
				win.move(posx, posy)
				win.reorder(widths, overwidth)
				posy += height
				# Show windows
				win.show()

		elif forceshow:
			# No entries available
			try:
				if not self.info:
					self.info = self.session.instantiateDialog(TunerStateInfo, _("Nothing running"))
				self.info.show()
				print("IBTS self.info.type", self.info.type)
			except Exception as e:
				print("InfoBarTunerState show exception " + str(e))
Exemple #35
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, descramble = True, record_ecm = False):
		timer.TimerEntry.__init__(self, int(begin), int(end))

		if checkOldTimers == True:
			if self.begin < time() - 1209600:
				self.begin = int(time())
		
		if self.end < self.begin:
			self.end = self.begin
		
		assert isinstance(serviceref, ServiceReference)
		
		if serviceref.isRecordable():
			self.service_ref = serviceref
		else:
			self.service_ref = ServiceReference(None)
		self.eit = eit
		self.dontSave = False
		self.name = name
		self.description = description
		self.disabled = disabled
		self.timer = None
		self.__record_service = None
		self.start_prepare = 0
		self.justplay = justplay
		self.afterEvent = afterEvent
		self.dirname = dirname
		self.dirnameHadToFallback = False
		self.autoincrease = False
		self.autoincreasetime = 3600 * 24 # 1 day
		self.tags = tags or []
		self.descramble = descramble
		self.record_ecm = record_ecm

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

	def calculateFilename(self):
		service_name = self.service_ref.getServiceName()
		begin_date = strftime("%Y%m%d %H%M", localtime(self.begin))
		begin_shortdate = strftime("%Y%m%d", localtime(self.begin))
		
		print "begin_date: ", begin_date
		print "service_name: ", service_name
		print "name:", self.name
		print "description: ", self.description
		
		filename = begin_date + " - " + service_name
		if self.name:
			if config.usage.setup_level.index >= 2: # expert+
				if config.recording.filename_composition.value == "short":
					filename = begin_shortdate + " - " + self.name
				elif config.recording.filename_composition.value == "long":
					filename += " - " + self.name + " - " + self.description
				else:
					filename += " - " + self.name # standard
			else:
				filename += " - " + self.name

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

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

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

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

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

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

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

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

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

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

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

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

			if self.justplay:
				if Screens.Standby.inStandby:
					self.log(11, "wakeup and zap")
					#set service to zap after standby
					Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
					#wakeup standby
					Screens.Standby.inStandby.Power()
				else:
					self.log(11, "zapping")
					NavigationInstance.instance.playService(self.service_ref.ref)
				return True
			else:
				self.log(11, "start recording")
				record_res = self.record_service.start()
				
				if record_res:
					self.log(13, "start record returned %d" % record_res)
					self.do_backoff()
					# retry
					self.begin = time() + self.backoff
					return False

				return True
Exemple #36
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
Exemple #37
0
class TimerEntry(Screen, ConfigListScreen):
    def __init__(self, session, timer):
        Screen.__init__(self, session)
        self.timer = timer

        self.entryDate = None
        self.entryService = None

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

        self.createConfig()

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

        self.list = []
        ConfigListScreen.__init__(self, self.list, session=session)
        self.setTitle(_("Timer entry"))
        self.createSetup("config")

    def createConfig(self):
        justplay = self.timer.justplay
        always_zap = self.timer.always_zap
        zap_wakeup = self.timer.zap_wakeup
        pipzap = self.timer.pipzap
        rename_repeat = self.timer.rename_repeat
        conflict_detection = self.timer.conflict_detection
        config.movielist.videodirs.load()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    def keyGo(self, result=None):
        if not self.timerentry_service_ref.isRecordable():
            self.session.openWithCallback(
                self.selectChannelSelector, MessageBox,
                _("You didn't select a channel to record from."),
                MessageBox.TYPE_ERROR)
        elif self.timerentry_remote.value:
            service_ref = self.timerentry_service_ref
            if self.timer.eit is not None:
                event = eEPGCache.getInstance().lookupEventId(
                    service_ref.ref, self.timer.eit)
                if event:
                    n = event.getNumOfLinkageServices()
                    if n > 1:
                        tlist = []
                        ref = self.session.nav.getCurrentlyPlayingServiceReference(
                        )
                        parent = service_ref.ref
                        selection = 0
                        for x in range(n):
                            i = event.getLinkageService(parent, x)
                            if i.toString() == ref.toString():
                                selection = x
                            tlist.append((i.getName(), i))
                        self.session.openWithCallback(
                            self.RemoteSubserviceSelected,
                            ChoiceBox,
                            title=_("Please select a subservice to record..."),
                            list=tlist,
                            selection=selection)
                        return
                    elif n > 0:
                        parent = service_ref.ref
                        service_ref = ServiceReference(
                            event.getLinkageService(parent, 0))
            #resolve alternative
            alternative_ref = GetWithAlternative(str(service_ref))
            service_ref = ':'.join(alternative_ref.split(':')[:11])

            # XXX: this will - without any hassle - ignore the value of repeated
            begin, end = self.getBeginEnd()

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

            rt_name = urllib.quote(
                self.timerentry_name.value.decode('utf8').encode(
                    'utf8', 'ignore'))
            rt_description = urllib.quote(
                self.timerentry_description.value.decode('utf8').encode(
                    'utf8', 'ignore'))
            rt_disabled = 0  # XXX: do we really want to hardcode this? why do we offer this option then?
            rt_repeated = 0  # XXX: same here
            rt_dirname = "/hdd/movie"

            if self.timerentry_justplay.value == "zap":
                rt_justplay = 1
            else:
                rt_justplay = 0

            rt_eit = 0
            if self.timer.eit is not None:
                rt_eit = self.timer.eit

            rt_afterEvent = {
                "deepstandby": AFTEREVENT.DEEPSTANDBY,
                "standby": AFTEREVENT.STANDBY,
                "nothing": AFTEREVENT.NONE,
                "auto": AFTEREVENT.AUTO
            }.get(self.timerentry_afterevent.value, AFTEREVENT.AUTO)

            url = "%s/web/timeradd?sRef=%s&begin=%s&end=%s&name=%s&description=%s&disabled=%s&justplay=%s&afterevent=%s&repeated=%s&dirname=%s&eit=%s" % (
                config.usage.remote_fallback.value.rsplit(":", 1)[0],
                service_ref, begin, end, rt_name, rt_description, rt_disabled,
                rt_justplay, rt_afterEvent, rt_repeated, rt_dirname, rt_eit)
            print "[RemoteTimer] debug remote", url
            from Screens.TimerEdit import getUrl
            getUrl(url).addCallback(self.remoteTimerOK).addErrback(
                self.remoteTimerNOK)

        else:

            self.timer.name = self.timerentry_name.value
            self.timer.description = self.timerentry_description.value
            self.timer.justplay = self.timerentry_justplay.value == "zap"
            self.timer.always_zap = self.timerentry_justplay.value == "zap+record"
            self.timer.zap_wakeup = self.timerentry_zapwakeup.value
            self.timer.pipzap = self.timerentry_pipzap.value
            self.timer.rename_repeat = self.timerentry_renamerepeat.value
            self.timer.conflict_detection = self.timerentry_conflictdetection.value
            if self.timerentry_justplay.value == "zap":
                if not self.timerentry_showendtime.value:
                    self.timerentry_endtime.value = self.timerentry_starttime.value
                    self.timerentry_afterevent.value = "nothing"
            self.timer.resetRepeated()
            self.timer.afterEvent = {
                "nothing": AFTEREVENT.NONE,
                "deepstandby": AFTEREVENT.DEEPSTANDBY,
                "standby": AFTEREVENT.STANDBY,
                "auto": AFTEREVENT.AUTO
            }[self.timerentry_afterevent.value]
            self.timer.descramble = {
                "normal": True,
                "descrambled+ecm": True,
                "scrambled+ecm": False,
            }[self.timerentry_recordingtype.value]
            self.timer.record_ecm = {
                "normal": False,
                "descrambled+ecm": True,
                "scrambled+ecm": True,
            }[self.timerentry_recordingtype.value]
            self.timer.service_ref = self.timerentry_service_ref
            self.timer.tags = self.timerentry_tags

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

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

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

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

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

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

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

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

    def remoteTimerOK(self, *args):
        self.close((False, True))

    def remoteTimerNOK(self, *args):
        print "[TimerEntry] Something when wrong with uploading timer"

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

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

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

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

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

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

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

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

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

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

    def tagEditFinished(self, ret):
        if ret is not None:
            self.timerentry_tags = ret
            self.timerentry_tagsset.setChoices(
                [not ret and "None" or " ".join(ret)])
            self["config"].invalidate(self.tagsSet)
Exemple #38
0
    def buildMovieListEntry(self, serviceref, info, begin, len):
        if serviceref.flags & eServiceReference.mustDescent:
            return None

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

        iconSize = 0

        if len <= 0:  #recalc len when not already done
            cur_idx = self.l.getCurrentSelectionIndex()
            x = self.list[cur_idx]
            if config.usage.load_length_of_movies_in_moviellist.value:
                len = x[1].getLength(x[0])  #recalc the movie length...
            else:
                len = 0  #dont recalc movielist to speedup loading the list
            self.list[cur_idx] = (
                x[0], x[1], x[2], len
            )  #update entry in list... so next time we don't need to recalc

        if len > 0:
            len = "%d:%02d" % (len / 60, len % 60)
        else:
            len = ""

        res = [None]

        txt = info.getName(serviceref)
        service = ServiceReference(
            info.getInfoString(serviceref, iServiceInformation.sServiceref))
        description = info.getInfoString(serviceref,
                                         iServiceInformation.sDescription)
        tags = info.getInfoString(serviceref, iServiceInformation.sTags)

        begin_string = ""
        if begin > 0:
            t = FuzzyTime(begin)
            begin_string = t[0] + ", " + t[1]

        ih = self.itemHeight

        if self.list_type == MovieList.LISTTYPE_ORIGINAL:
            ih1 = (ih * 2) / 5  # 75 -> 30
            ih2 = (ih * 2) / 3  # 75 -> 50
            res.append(
                MultiContentEntryText(pos=(0, 0),
                                      size=(width - 232, ih1),
                                      font=0,
                                      flags=RT_HALIGN_LEFT,
                                      text=txt))
            if self.tags:
                res.append(
                    MultiContentEntryText(pos=(width - 230, 0),
                                          size=(230, ih1),
                                          font=2,
                                          flags=RT_HALIGN_RIGHT,
                                          text=tags))
                if service is not None:
                    res.append(
                        MultiContentEntryText(pos=(230, ih2),
                                              size=(230, ih2 - ih1),
                                              font=1,
                                              flags=RT_HALIGN_LEFT,
                                              text=service.getServiceName()))
            else:
                if service is not None:
                    res.append(
                        MultiContentEntryText(pos=(width - 220, 0),
                                              size=(220, ih1),
                                              font=2,
                                              flags=RT_HALIGN_RIGHT,
                                              text=service.getServiceName()))
            res.append(
                MultiContentEntryText(pos=(0, ih1),
                                      size=(width, ih2 - ih1),
                                      font=1,
                                      flags=RT_HALIGN_LEFT,
                                      text=description))
            if config.skin.xres.value == 1920:
                res.append(
                    MultiContentEntryText(pos=(0, ih2),
                                          size=(220, ih - ih2),
                                          font=1,
                                          flags=RT_HALIGN_LEFT,
                                          text=begin_string))
            else:
                res.append(
                    MultiContentEntryText(pos=(0, ih2),
                                          size=(200, ih - ih2),
                                          font=1,
                                          flags=RT_HALIGN_LEFT,
                                          text=begin_string))
            res.append(
                MultiContentEntryText(pos=(width - 200, ih2),
                                      size=(198, ih - ih2),
                                      font=1,
                                      flags=RT_HALIGN_RIGHT,
                                      text=len))
        elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION:
            ih1 = ((ih * 8) + 14) / 15  # 37 -> 20, round up
            if len:
                lenSize = 58 * ih / 37
            else:
                lenSize = 0
            if config.skin.xres.value == 1920:
                res.append(
                    MultiContentEntryText(pos=(0, 0),
                                          size=(width - 200, ih1),
                                          font=0,
                                          flags=RT_HALIGN_LEFT,
                                          text=txt))
            else:
                res.append(
                    MultiContentEntryText(pos=(0, 0),
                                          size=(width - 140, ih1),
                                          font=0,
                                          flags=RT_HALIGN_LEFT,
                                          text=txt))
            res.append(
                MultiContentEntryText(pos=(0, ih1),
                                      size=(width - 184 - lenSize, ih - ih1),
                                      font=1,
                                      flags=RT_HALIGN_LEFT,
                                      text=description))
            if config.skin.xres.value == 1920:
                res.append(
                    MultiContentEntryText(pos=(width - 200, 6),
                                          size=(200, ih1),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=begin_string))
            else:
                res.append(
                    MultiContentEntryText(pos=(width - 140, 6),
                                          size=(140, ih1),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=begin_string))
            if service is not None:
                if config.skin.xres.value == 1920:
                    res.append(
                        MultiContentEntryText(pos=(width - 240 - lenSize, ih1),
                                              size=(240, ih - ih1),
                                              font=1,
                                              flags=RT_HALIGN_RIGHT,
                                              text=service.getServiceName()))
                else:
                    res.append(
                        MultiContentEntryText(pos=(width - 164 - lenSize, ih1),
                                              size=(164, ih - ih1),
                                              font=1,
                                              flags=RT_HALIGN_RIGHT,
                                              text=service.getServiceName()))
            if lenSize:
                res.append(
                    MultiContentEntryText(pos=(width - lenSize, ih1),
                                          size=(lenSize, ih - ih1),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=len))
        elif self.list_type == MovieList.LISTTYPE_COMPACT:
            ih1 = ((ih * 8) + 14) / 15  # 37 -> 20, round up
            if len:
                lenSize = 2 * ih
            else:
                lenSize = 0
            res.append(
                MultiContentEntryText(pos=(0, 0),
                                      size=(width - lenSize - iconSize, ih1),
                                      font=0,
                                      flags=RT_HALIGN_LEFT,
                                      text=txt))
            if self.tags:
                res.append(
                    MultiContentEntryText(pos=(width - 200, ih1),
                                          size=(200, ih - ih1),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=tags))
                if service is not None:
                    res.append(
                        MultiContentEntryText(pos=(200, ih1),
                                              size=(200, ih - ih1),
                                              font=1,
                                              flags=RT_HALIGN_LEFT,
                                              text=service.getServiceName()))
            else:
                if service is not None:
                    res.append(
                        MultiContentEntryText(pos=(width - 260, ih1),
                                              size=(260, ih - ih1),
                                              font=1,
                                              flags=RT_HALIGN_RIGHT,
                                              text=service.getServiceName()))
            res.append(
                MultiContentEntryText(pos=(0, ih1),
                                      size=(200, ih - ih1),
                                      font=1,
                                      flags=RT_HALIGN_LEFT,
                                      text=begin_string))
            if lenSize:
                res.append(
                    MultiContentEntryText(pos=(width - lenSize, 0),
                                          size=(lenSize, ih1),
                                          font=0,
                                          flags=RT_HALIGN_RIGHT,
                                          text=len))
        else:
            assert (self.list_type == MovieList.LISTTYPE_MINIMAL)
            if (self.descr_state == MovieList.SHOW_DESCRIPTION) or not len:
                dateSize = ih * 145 / 25  # 25 -> 145
                res.append(
                    MultiContentEntryText(pos=(0, 0),
                                          size=(width - iconSize - dateSize,
                                                ih),
                                          font=0,
                                          flags=RT_HALIGN_LEFT,
                                          text=txt))
                res.append(
                    MultiContentEntryText(pos=(width - dateSize, 4),
                                          size=(dateSize, ih),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=begin_string))
            else:
                lenSize = ih * 3  # 25 -> 75
                res.append(
                    MultiContentEntryText(pos=(0, 0),
                                          size=(width - lenSize - iconSize,
                                                ih),
                                          font=0,
                                          flags=RT_HALIGN_LEFT,
                                          text=txt))
                res.append(
                    MultiContentEntryText(pos=(width - lenSize, 0),
                                          size=(lenSize, ih),
                                          font=0,
                                          flags=RT_HALIGN_RIGHT,
                                          text=len))

        return res
Exemple #39
0
class RecordTimerEntry(timer.TimerEntry, object):
	def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.AUTO, checkOldTimers = False, dirname = None, tags = None, descramble = 'notset', record_ecm = 'notset', isAutoTimer = False, always_zap = False):
		timer.TimerEntry.__init__(self, int(begin), int(end))
		if checkOldTimers:
			if self.begin < time() - 1209600:
				self.begin = int(time())

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

		assert isinstance(serviceref, ServiceReference)

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

		if descramble == 'notset' and record_ecm == 'notset':
			if config.recording.ecm_data.value == 'descrambled+ecm':
				self.descramble = True
				self.record_ecm = True
			elif config.recording.ecm_data.value == 'scrambled+ecm':
				self.descramble = False
				self.record_ecm = True
			elif config.recording.ecm_data.value == 'normal':
				self.descramble = True
				self.record_ecm = False
		else:
			self.descramble = descramble
			self.record_ecm = record_ecm

		self.isAutoTimer = isAutoTimer
		self.wasInStandby = False

		self.log_entries = []
		self.resetState()

	def __repr__(self):
		if not self.disabled:
			return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s, isAutoTimer=%s)" % (self.name, ctime(self.begin), self.service_ref, self.justplay, self.isAutoTimer)
		else:
			return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s, isAutoTimer=%s, Disabled)" % (self.name, ctime(self.begin), self.service_ref, self.justplay, self.isAutoTimer)

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

	def freespace(self):
		self.MountPath = None
		if not self.dirname:
			dirname = findSafeRecordPath(defaultMoviePath())
		else:
			dirname = findSafeRecordPath(self.dirname)
			if dirname is None:
				dirname = findSafeRecordPath(defaultMoviePath())
				self.dirnameHadToFallback = True
		if not dirname:
			return False

		self.MountPath = dirname
		mountwriteable = os.access(dirname, os.W_OK)
		if not mountwriteable:
			self.log(0, ("Mount '%s' is not writeable." % dirname))
			return False

		s = os.statvfs(dirname)
		if (s.f_bavail * s.f_bsize) / 1000000 < 1024:
			self.log(0, "Not enough free space to record")
			return False
		else:
			self.log(0, "Found enough free space to record")
			return True

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

#		print "begin_date: ", begin_date
#		print "service_name: ", service_name
#		print "name:", self.name
#		print "description: ", self.description
#
		filename = begin_date + " - " + service_name
		if self.name:
			if config.recording.filename_composition.value == "short":
				filename = strftime("%Y%m%d", localtime(self.begin)) + " - " + self.name
			elif config.recording.filename_composition.value == "long":
				filename += " - " + self.name + " - " + self.description
			else:
				filename += " - " + self.name # standard

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

		self.Filename = Directories.getRecordingFilename(filename, self.MountPath)
		self.log(0, "Filename calculated as: '%s'" % self.Filename)
		return self.Filename

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

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

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

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

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

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

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

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

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

		if next_state == self.StatePrepared:
			if not self.justplay and not self.freespace():
				Notifications.AddPopup(text = _("Write error while recording. Disk full?\n%s") % self.name, type = MessageBox.TYPE_ERROR, timeout = 5, id = "DiskFullMessage")
				self.failed = True
				self.next_activation = time()
				self.end = time() + 5
				self.backoff = 0
				return True

			if self.always_zap:
				if Screens.Standby.inStandby:
					self.wasInStandby = True
					eActionMap.getInstance().bindAction('', -maxint - 1, self.keypress)
					#set service to zap after standby
					Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
					Screens.Standby.inStandby.paused_service = None
					#wakeup standby
					Screens.Standby.inStandby.Power()
					self.log(5, "wakeup and zap to recording service")
				else:
					cur_zap_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
					if cur_zap_ref and not cur_zap_ref.getPath():# we do not zap away if it is no live service
						Notifications.AddNotification(MessageBox, _("In order to record a timer, the TV was switched to the recording service!\n"), type=MessageBox.TYPE_INFO, timeout=20)
						self.failureCB(True)
						self.log(5, "zap to recording service")

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

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

		elif next_state == self.StateRunning:
			global wasRecTimerWakeup
			if os.path.exists("/tmp/was_rectimer_wakeup") and not wasRecTimerWakeup:
				wasRecTimerWakeup = int(open("/tmp/was_rectimer_wakeup", "r").read()) and True or False
				os.remove("/tmp/was_rectimer_wakeup")

			self.autostate = Screens.Standby.inStandby

			# if this timer has been cancelled, just go to "end" state.
			if self.cancelled:
				return True

			if self.failed:
				return True

			if self.justplay:
				if Screens.Standby.inStandby:
					self.wasInStandby = True
					eActionMap.getInstance().bindAction('', -maxint - 1, self.keypress)
					self.log(11, "wakeup and zap")
					#set service to zap after standby
					Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
					Screens.Standby.inStandby.paused_service = None
					#wakeup standby
					Screens.Standby.inStandby.Power()
				else:
					self.log(11, "zapping")
					NavigationInstance.instance.isMovieplayerActive()
					from Screens.ChannelSelection import ChannelSelection
					ChannelSelectionInstance = ChannelSelection.instance
					self.service_types = service_types_tv
					if ChannelSelectionInstance:
						if config.usage.multibouquet.value:
							bqrootstr = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet'
						else:
							bqrootstr = '%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'% self.service_types
						rootstr = ''
						serviceHandler = eServiceCenter.getInstance()
						rootbouquet = eServiceReference(bqrootstr)
						bouquet = eServiceReference(bqrootstr)
						bouquetlist = serviceHandler.list(bouquet)
						if not bouquetlist is None:
							while True:
								bouquet = bouquetlist.getNext()
								if bouquet.flags & eServiceReference.isDirectory:
									ChannelSelectionInstance.clearPath()
									ChannelSelectionInstance.setRoot(bouquet)
									servicelist = serviceHandler.list(bouquet)
									if not servicelist is None:
										serviceIterator = servicelist.getNext()
										while serviceIterator.valid():
											if self.service_ref.ref == serviceIterator:
												break
											serviceIterator = servicelist.getNext()
										if self.service_ref.ref == serviceIterator:
											break
							ChannelSelectionInstance.enterPath(rootbouquet)
							ChannelSelectionInstance.enterPath(bouquet)
							ChannelSelectionInstance.saveRoot()
							ChannelSelectionInstance.saveChannel(self.service_ref.ref)
						ChannelSelectionInstance.addToHistory(self.service_ref.ref)
					NavigationInstance.instance.playService(self.service_ref.ref)
				return True
			else:
				self.log(11, "start recording")
				record_res = self.record_service.start()

				if record_res:
					self.log(13, "start record returned %d" % record_res)
					self.do_backoff()
					# retry
					self.begin = time() + self.backoff
					return False
				return True
Exemple #40
0
def getMovieSearchList(rargs=None, locations=None):
    movieliste = []
    tag = None
    directory = None
    fields = None
    short = None
    extended = None
    searchstr = None

    if rargs:
        searchstr = getUrlArg2(rargs, "find")
        short = getUrlArg2(rargs, "short")
        extended = getUrlArg2(rargs, "extended")

    s = {'title': str(searchstr)}
    if short is not None:
        s['shortDesc'] = str(searchstr)
    if extended is not None:
        s['extDesc'] = str(searchstr)

    movielist = MovieList(None)
    vdir_list = []
    for x in moviedb.searchContent(s, 'ref', query_type="OR",
                                   exactmatch=False):
        vdir_list.append(eServiceReference(x[0]))
    root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + "/")
    movielist.load(root, None)
    movielist.reload(root=None, vdir=5, vdir_list=vdir_list)

    for (serviceref, info, begin, unknown) in movielist.list:
        if serviceref.flags & eServiceReference.mustDescent:
            continue

        length_minutes = 0
        txtdesc = ""
        filename = '/'.join(serviceref.toString().split("/")[1:])
        filename = '/' + filename
        name, ext = os.path.splitext(filename)

        sourceRef = ServiceReference(
            info.getInfoString(serviceref, iServiceInformation.sServiceref))
        rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate)

        movie = {
            'filename':
            filename,
            'filename_stripped':
            filename.split("/")[-1],
            'serviceref':
            serviceref.toString(),
            'length':
            "?:??",
            'lastseen':
            0,
            'filesize_readable':
            '',
            'recordingtime':
            rtime,
            'begintime':
            'undefined',
            'eventname':
            ServiceReference(serviceref).getServiceName().replace(
                '\xc2\x86', '').replace('\xc2\x87', ''),
            'servicename':
            sourceRef.getServiceName().replace('\xc2\x86',
                                               '').replace('\xc2\x87', ''),
            'tags':
            info.getInfoString(serviceref, iServiceInformation.sTags),
            'fullname':
            serviceref.toString(),
        }

        if rtime > 0:
            movie['begintime'] = FuzzyTime2(rtime)

        try:
            length_minutes = info.getLength(serviceref)
        except:  # noqa: E722
            pass

        if length_minutes:
            movie['length'] = "%d:%02d" % (length_minutes / 60,
                                           length_minutes % 60)
            #  if fields is None or 'pos' in fields:
            #  	movie['lastseen'] = getPosition(filename + '.cuts', length_minutes)

        if fields is None or 'desc' in fields:
            txtfile = name + '.txt'
            if ext.lower() != '.ts' and os.path.isfile(txtfile):
                with open(txtfile, "rb") as handle:
                    txtdesc = six.ensure_str(b''.join(handle.readlines()))

            event = info.getEvent(serviceref)
            extended_description = event and event.getExtendedDescription(
            ) or ""
            if extended_description == '' and txtdesc != '':
                extended_description = txtdesc
            movie['descriptionExtended'] = ConvertDesc(extended_description)
            desc = info.getInfoString(serviceref,
                                      iServiceInformation.sDescription)
            movie['description'] = ConvertDesc(desc)

        if fields is None or 'size' in fields:
            size = 0
            sz = ''

            try:
                size = os.stat(filename).st_size
                if size > 1073741824:
                    sz = "%.2f %s" % ((size / 1073741824.), _("GB"))
                elif size > 1048576:
                    sz = "%.2f %s" % ((size / 1048576.), _("MB"))
                elif size > 1024:
                    sz = "%.2f %s" % ((size / 1024.), _("kB"))
            except:  # noqa: E722
                pass

            movie['filesize'] = size
            movie['filesize_readable'] = sz

        movieliste.append(movie)

    return {"movies": movieliste, "locations": []}
Exemple #41
0
def getMovieDetails(sRef=None):

    service = ServiceReference(sRef)
    if service is not None:

        serviceref = service.ref
        length_minutes = 0
        txtdesc = ""
        fullpath = serviceref.getPath()
        filename = '/'.join(fullpath.split("/")[1:])
        filename = '/' + filename
        name, ext = os.path.splitext(filename)

        serviceHandler = eServiceCenter.getInstance()
        info = serviceHandler.info(serviceref)

        sourceRef = ServiceReference(
            info.getInfoString(serviceref, iServiceInformation.sServiceref))
        rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate)

        movie = {
            'filename':
            filename,
            'filename_stripped':
            filename.split("/")[-1],
            'serviceref':
            serviceref.toString(),
            'length':
            "?:??",
            'lastseen':
            0,
            'filesize_readable':
            '',
            'recordingtime':
            rtime,
            'begintime':
            'undefined',
            'eventname':
            service.getServiceName().replace('\xc2\x86',
                                             '').replace('\xc2\x87', ''),
            'servicename':
            sourceRef.getServiceName().replace('\xc2\x86',
                                               '').replace('\xc2\x87', ''),
            'tags':
            info.getInfoString(serviceref, iServiceInformation.sTags),
            'fullname':
            serviceref.toString(),
        }

        if rtime > 0:
            movie['begintime'] = FuzzyTime2(rtime)

        try:
            length_minutes = info.getLength(serviceref)
        except:  # noqa: E722
            pass

        if length_minutes:
            movie['length'] = "%d:%02d" % (length_minutes / 60,
                                           length_minutes % 60)
            movie['lastseen'] = _moviePlayState(filename + '.cuts', serviceref,
                                                length_minutes) or 0

        txtfile = name + '.txt'
        if ext.lower() != '.ts' and os.path.isfile(txtfile):
            with open(txtfile, "rb") as handle:
                txtdesc = six.ensure_str(b''.join(handle.readlines()))

        event = info.getEvent(serviceref)
        extended_description = event and event.getExtendedDescription() or ""
        if extended_description == '' and txtdesc != '':
            extended_description = txtdesc
        movie['descriptionExtended'] = ConvertDesc(extended_description)
        desc = info.getInfoString(serviceref, iServiceInformation.sDescription)
        movie['description'] = ConvertDesc(desc)

        size = 0
        sz = ''

        try:
            size = os.stat(filename).st_size
            if size > 1073741824:
                sz = "%.2f %s" % ((size / 1073741824.), _("GB"))
            elif size > 1048576:
                sz = "%.2f %s" % ((size / 1048576.), _("MB"))
            elif size > 1024:
                sz = "%.2f %s" % ((size / 1024.), _("kB"))
        except:  # noqa: E722
            pass

        movie['filesize'] = size
        movie['filesize_readable'] = sz

        return {"result": True, "movie": movie}
    else:
        return {
            "result": False,
        }
Exemple #42
0
def getMovieList(rargs=None, locations=None):
    movieliste = []
    tag = None
    directory = None
    fields = None
    bookmarklist = []

    if rargs:
        tag = getUrlArg2(rargs, "tag")
        directory = getUrlArg2(rargs, "dirname")
        fields = getUrlArg2(rargs, "fields")

    if directory is None:
        directory = defaultMoviePath()
    else:
        if not PY3:
            try:
                directory.decode('utf-8')
            except UnicodeDecodeError:
                try:
                    directory = directory.decode("cp1252").encode("utf-8")
                except UnicodeDecodeError:
                    directory = directory.decode("iso-8859-1").encode("utf-8")

    if not directory:
        directory = MOVIE_LIST_ROOT_FALLBACK

    if directory[-1] != "/":
        directory += "/"

    if not os.path.isdir(directory):
        return {
            "movies": [],
            "locations": [],
            "bookmarks": [],
            "directory": [],
        }

    root = eServiceReference(MOVIE_LIST_SREF_ROOT + directory)

    for item in sorted(os.listdir(directory)):
        abs_p = os.path.join(directory, item)
        if os.path.isdir(abs_p):
            bookmarklist.append(item)

    folders = [root]
    brecursive = False
    if rargs and b"recursive" in list(rargs.keys()):
        brecursive = True
        dirs = []
        locations = []
        if PY3:
            from glob import glob
            for subdirpath in glob(directory + "**/", recursive=True):
                locations.append(subdirpath)
                subdirpath = subdirpath[len(directory):]
                dirs.append(subdirpath)
        else:
            # FIXME SLOW!!!
            for subdirpath in [x[0] for x in os.walk(directory)]:
                locations.append(subdirpath)
                subdirpath = subdirpath[len(directory):]
                dirs.append(subdirpath)

        for f in sorted(dirs):
            if f != '':
                if f[-1] != "/":
                    f += "/"
                ff = eServiceReference(MOVIE_LIST_SREF_ROOT + directory + f)
                folders.append(ff)
    else:
        # get all locations
        if locations is not None:
            folders = []

            for f in locations:
                if f[-1] != "/":
                    f += "/"
                ff = eServiceReference(MOVIE_LIST_SREF_ROOT + f)
                folders.append(ff)

    if config.OpenWebif.parentalenabled.value:
        dir_is_protected = checkParentalProtection(directory)
    else:
        dir_is_protected = False

    if not dir_is_protected:
        movielist = MovieList(None)
        for root in folders:
            if tag is not None:
                movielist.load(root=root, filter_tags=[tag])
            else:
                movielist.load(root=root, filter_tags=None)

            for (serviceref, info, begin, unknown) in movielist.list:
                if serviceref.flags & eServiceReference.mustDescent:
                    continue

                # BAD fix
                _serviceref = serviceref.toString().replace('%25', '%')
                length_minutes = 0
                txtdesc = ""
                filename = '/'.join(_serviceref.split("/")[1:])
                filename = '/' + filename
                name, ext = os.path.splitext(filename)

                sourceRef = ServiceReference(
                    info.getInfoString(serviceref,
                                       iServiceInformation.sServiceref))
                rtime = info.getInfo(serviceref,
                                     iServiceInformation.sTimeCreate)

                movie = {
                    'filename':
                    filename,
                    'filename_stripped':
                    filename.split("/")[-1],
                    'serviceref':
                    _serviceref,
                    'length':
                    "?:??",
                    'lastseen':
                    0,
                    'filesize_readable':
                    '',
                    'recordingtime':
                    rtime,
                    'begintime':
                    'undefined',
                    'eventname':
                    ServiceReference(serviceref).getServiceName().replace(
                        '\xc2\x86', '').replace('\xc2\x87', ''),
                    'servicename':
                    sourceRef.getServiceName().replace('\xc2\x86', '').replace(
                        '\xc2\x87', ''),
                    'tags':
                    info.getInfoString(serviceref, iServiceInformation.sTags),
                    'fullname':
                    _serviceref,
                }

                if rtime > 0:
                    movie['begintime'] = FuzzyTime2(rtime)

                try:
                    length_minutes = info.getLength(serviceref)
                except:  # noqa: E722
                    pass

                if length_minutes:
                    movie['length'] = "%d:%02d" % (length_minutes / 60,
                                                   length_minutes % 60)
                    if fields is None or 'pos' in fields:
                        movie['lastseen'] = _moviePlayState(
                            filename + '.cuts', serviceref,
                            length_minutes) or 0

                if fields is None or 'desc' in fields:
                    txtfile = name + '.txt'
                    if ext.lower() != '.ts' and os.path.isfile(txtfile):
                        with open(txtfile, "rb") as handle:
                            txtdesc = six.ensure_str(b''.join(
                                handle.readlines()))

                    event = info.getEvent(serviceref)
                    extended_description = event and event.getExtendedDescription(
                    ) or ""
                    if extended_description == '' and txtdesc != '':
                        extended_description = txtdesc
                    movie['descriptionExtended'] = ConvertDesc(
                        extended_description)

                    desc = info.getInfoString(serviceref,
                                              iServiceInformation.sDescription)
                    movie['description'] = ConvertDesc(desc)

                if fields is None or 'size' in fields:
                    size = 0
                    sz = ''

                    try:
                        size = os.stat(filename).st_size
                        if size > 1073741824:
                            sz = "%.2f %s" % ((size / 1073741824.), _("GB"))
                        elif size > 1048576:
                            sz = "%.2f %s" % ((size / 1048576.), _("MB"))
                        elif size > 1024:
                            sz = "%.2f %s" % ((size / 1024.), _("kB"))
                    except:  # noqa: E722
                        pass

                    movie['filesize'] = size
                    movie['filesize_readable'] = sz

                movieliste.append(movie)


#		del movielist

    if locations is None:
        return {
            "movies": movieliste,
            "bookmarks": bookmarklist,
            "directory": directory,
            "recursive": brecursive
        }

    if brecursive:
        return {
            "movies": movieliste,
            "locations": locations,
            "directory": directory,
            "bookmarks": bookmarklist,
            "recursive": brecursive
        }
    else:
        return {
            "movies": movieliste,
            "locations": locations,
            "recursive": brecursive
        }
Exemple #43
0
class RecordTimerEntry(timer.TimerEntry, object):
	def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.AUTO, checkOldTimers = False, dirname = None, tags = None, descramble = 'notset', record_ecm = 'notset', rename_repeat = True, isAutoTimer = False, always_zap = False, MountPath = None):
		timer.TimerEntry.__init__(self, int(begin), int(end))
		if checkOldTimers:
			if self.begin < time() - 1209600:
				self.begin = int(time())

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

		assert isinstance(serviceref, ServiceReference)

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

		if descramble == 'notset' and record_ecm == 'notset':
			if config.recording.ecm_data.value == 'descrambled+ecm':
				self.descramble = True
				self.record_ecm = True
			elif config.recording.ecm_data.value == 'scrambled+ecm':
				self.descramble = False
				self.record_ecm = True
			elif config.recording.ecm_data.value == 'normal':
				self.descramble = True
				self.record_ecm = False
		else:
			self.descramble = descramble
			self.record_ecm = record_ecm

		self.needChangePriorityFrontend = config.usage.recording_frontend_priority.value != "-2" and config.usage.recording_frontend_priority.value != config.usage.frontend_priority.value
		self.change_frontend = False
		self.rename_repeat = rename_repeat
		self.isAutoTimer = isAutoTimer
		self.wasInStandby = False

		self.log_entries = []
		self.resetState()

	def __repr__(self):
		if not self.disabled:
			return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s, isAutoTimer=%s)" % (self.name, ctime(self.begin), self.service_ref, self.justplay, self.isAutoTimer)
		else:
			return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s, isAutoTimer=%s, Disabled)" % (self.name, ctime(self.begin), self.service_ref, self.justplay, self.isAutoTimer)

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

	def freespace(self):
		self.MountPath = None
		if not self.dirname:
			dirname = findSafeRecordPath(defaultMoviePath())
		else:
			dirname = findSafeRecordPath(self.dirname)
			if dirname is None:
				dirname = findSafeRecordPath(defaultMoviePath())
				self.dirnameHadToFallback = True
		if not dirname:
			return False

		self.MountPath = dirname
		mountwriteable = os.access(dirname, os.W_OK)
		if not mountwriteable:
			self.log(0, ("Mount '%s' is not writeable." % dirname))
			return False

		s = os.statvfs(dirname)
		if (s.f_bavail * s.f_bsize) / 1000000 < 1024:
			self.log(0, "Not enough free space to record")
			return False
		else:
			self.log(0, "Found enough free space to record")
			return True

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

#		print "begin_date: ", begin_date
#		print "service_name: ", service_name
#		print "name:", self.name
#		print "description: ", self.description
#
		filename = begin_date + " - " + service_name
		if self.name:
			if config.recording.filename_composition.value == "veryveryshort":
				filename = self.name
			elif config.recording.filename_composition.value == "veryshort":
				filename = self.name + " - " + begin_date
			elif config.recording.filename_composition.value == "short":
				filename = strftime("%Y%m%d", localtime(self.begin)) + " - " + self.name
			elif config.recording.filename_composition.value == "long":
				filename += " - " + self.name + " - " + self.description
			else:
				filename += " - " + self.name # standard

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

		self.Filename = Directories.getRecordingFilename(filename, self.MountPath)
		self.log(0, "Filename calculated as: '%s'" % self.Filename)
		return self.Filename

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

			self.setRecordingPreferredTuner()
			try:
				#not all images support recording type indicators
				self.record_service = rec_ref and NavigationInstance.instance.recordService(rec_ref,False,pNavigation.isRealRecording)
			except:
				self.record_service = rec_ref and NavigationInstance.instance.recordService(rec_ref)

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

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

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

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

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

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

	def activate(self):
		global wasRecTimerWakeup

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

		# print "[TIMER] activate called",time(),next_state,self.first_try_prepare,' pending ',self.messageBoxAnswerPending,' justTried ',self.justTriedFreeingTuner,' show ',self.messageStringShow,self.messageString #TODO remove

		if next_state == self.StatePrepared:
			if self.messageBoxAnswerPending:
				self.start_prepare = time() + 1 # call again in 1 second
				return False

			if self.justTriedFreeingTuner:
				self.start_prepare = time() + 5 # tryPrepare in 5 seconds
				self.justTriedFreeingTuner = False
				return False

			if not self.justplay and not self.freespace():
				Notifications.AddPopup(text = _("Write error while recording. Disk full?\n%s") % self.name, type = MessageBox.TYPE_ERROR, timeout = 5, id = "DiskFullMessage")
				self.failed = True
				self.next_activation = time()
				self.end = time() + 5
				self.backoff = 0
				return True

			if self.always_zap:
				if Screens.Standby.inStandby:
					self.wasInStandby = True
					eActionMap.getInstance().bindAction('', -maxint - 1, self.keypress)
					#set service to zap after standby
					Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
					Screens.Standby.inStandby.paused_service = None
					#wakeup standby
					Screens.Standby.inStandby.Power()
					self.log(5, "wakeup and zap to recording service")
				else:
					cur_zap_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
					if cur_zap_ref and not cur_zap_ref.getPath():# we do not zap away if it is no live service
						self.messageString += _("The TV was switched to the recording service!\n")
						self.messageStringShow = True
						self.setRecordingPreferredTuner()
						self.failureCB(True)
						self.log(5, "zap to recording service")

			if self.tryPrepare():
				self.log(6, "prepare ok, waiting for begin")
				if self.messageStringShow:
					Notifications.AddNotification(MessageBox, _("In order to record a timer, a tuner was freed successfully:\n\n") + self.messageString, type=MessageBox.TYPE_INFO, timeout=20)
				# create file to "reserve" the filename
				# because another recording at the same time on another service can try to record the same event
				# i.e. cable / sat.. then the second recording needs an own extension... when we create the file
				# here then calculateFilename is happy
				if not self.justplay:
					open(self.Filename + ".ts", "w").close()
					# give the Trashcan a chance to clean up
					try:
						Trashcan.instance.cleanIfIdle()
					except Exception, e:
						print "[TIMER] Failed to call Trashcan.instance.cleanIfIdle()"
						print "[TIMER] Error:", e
				# fine. it worked, resources are allocated.
				self.next_activation = self.begin
				self.backoff = 0
				return True

			self.log(7, "prepare failed")
			if self.first_try_prepare == 0:
				# (0) try to make a tuner available by disabling PIP
				self.first_try_prepare += 1
				from Screens.InfoBar import InfoBar
				from Screens.InfoBarGenerics import InfoBarPiP
				from Components.ServiceEventTracker import InfoBarCount
				InfoBarInstance = InfoBarCount == 1 and InfoBar.instance
				if InfoBarInstance and InfoBarPiP.pipShown(InfoBarInstance) == True:
					if config.recording.ask_to_abort_pip.value == "ask":
						self.log(8, "asking user to disable PIP")
						self.messageBoxAnswerPending = True
						Notifications.AddNotificationWithCallback(self.failureCB_pip, MessageBox, _("A timer failed to record!\nDisable PIP and try again?\n"), timeout=20)
					elif config.recording.ask_to_abort_pip.value in ("abort_no_msg", "abort_msg"):
						self.log(8, "disable PIP without asking")
						self.setRecordingPreferredTuner()
						self.failureCB_pip(True)
					return False
				else:
					self.log(8, "currently no PIP active... so we dont need to stop it")

			if self.first_try_prepare == 1:
				# (1) try to make a tuner available by aborting pseudo recordings
				self.first_try_prepare += 1
				self.backoff = 0
				if len(NavigationInstance.instance.getRecordings(False,pNavigation.isPseudoRecording)) > 0:
					if config.recording.ask_to_abort_pseudo_rec.value == "ask":
						self.log(8, "asking user to abort pseudo recordings")
						self.messageBoxAnswerPending = True
						Notifications.AddNotificationWithCallback(self.failureCB_pseudo_rec, MessageBox, _("A timer failed to record!\nAbort pseudo recordings (e.g. EPG refresh) and try again?\n"), timeout=20)
					elif config.recording.ask_to_abort_pseudo_rec.value in ("abort_no_msg", "abort_msg"):
						self.log(8, "abort pseudo recordings without asking")
						self.setRecordingPreferredTuner()
						self.failureCB_pseudo_rec(True)
					return False
				else:
					self.log(8, "currently no pseudo recordings active... so we dont need to stop it")

			if self.first_try_prepare == 2:
				# (2) try to make a tuner available by aborting streaming
				self.first_try_prepare += 1
				self.backoff = 0
				if len(NavigationInstance.instance.getRecordings(False,pNavigation.isStreaming)) > 0:
					if config.recording.ask_to_abort_streaming.value == "ask":
						self.log(8, "asking user to abort streaming")
						self.messageBoxAnswerPending = True
						Notifications.AddNotificationWithCallback(self.failureCB_streaming, MessageBox, _("A timer failed to record!\nAbort streaming and try again?\n"), timeout=20)
					elif config.recording.ask_to_abort_streaming.value in ("abort_no_msg", "abort_msg"):
						self.log(8, "abort streaming without asking")
						self.setRecordingPreferredTuner()
						self.failureCB_streaming(True)
					return False
				else:
					self.log(8, "currently no streaming active... so we dont need to stop it")

			if self.first_try_prepare == 3:
				# (3) try to make a tuner available by switching live TV to the recording service
				self.first_try_prepare += 1
				self.backoff = 0
				cur_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
				if cur_ref and not cur_ref.getPath():
					if Screens.Standby.inStandby:
						self.setRecordingPreferredTuner()
						self.failureCB(True)
					elif not config.recording.asktozap.value:
						self.log(8, "asking user to zap away")
						self.messageBoxAnswerPending = True
						Notifications.AddNotificationWithCallback(self.failureCB, MessageBox, _("A timer failed to record!\nDisable TV and try again?\n"), timeout=20)
					else: # zap without asking
						self.log(9, "zap without asking")
						self.setRecordingPreferredTuner()
						self.failureCB(True)
					return False
				elif cur_ref:
					self.log(8, "currently running service is not a live service.. so stopping it makes no sense")
				else:
					self.log(8, "currently no service running... so we dont need to stop it")

			if self.first_try_prepare == 4:
				# (4) freeing a tuner failed
				self.first_try_prepare += 1
				self.log(8, "freeing a tuner failed")
				if self.messageString:
					Notifications.AddNotification(MessageBox, _("No tuner is available for recording a timer!\n\nThe following methods of freeing a tuner were tried without success:\n\n") + self.messageString, type=MessageBox.TYPE_INFO, timeout=20)
				else:
					Notifications.AddNotification(MessageBox, _("No tuner is available for recording a timer!\n"), type=MessageBox.TYPE_INFO, timeout=20)

			return False

		elif next_state == self.StateRunning:

			if os.path.exists("/tmp/was_rectimer_wakeup") and not wasRecTimerWakeup:
				wasRecTimerWakeup = int(open("/tmp/was_rectimer_wakeup", "r").read()) and True or False

			# if this timer has been cancelled, just go to "end" state.
			if self.cancelled:
				return True

			if self.failed:
				return True

			if self.justplay:
				if Screens.Standby.inStandby:
					self.wasInStandby = True
					eActionMap.getInstance().bindAction('', -maxint - 1, self.keypress)
					self.log(11, "wakeup and zap")
					#set service to zap after standby
					Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
					Screens.Standby.inStandby.paused_service = None
					#wakeup standby
					Screens.Standby.inStandby.Power()
				else:
					self.log(11, "zapping")
					found = False
					notFound = False
					NavigationInstance.instance.isMovieplayerActive()
					from Screens.ChannelSelection import ChannelSelection
					ChannelSelectionInstance = ChannelSelection.instance
					if ChannelSelectionInstance:
						bqrootstr = getBqRootStr(self.service_ref.ref)
						rootstr = ''
						serviceHandler = eServiceCenter.getInstance()
						rootbouquet = eServiceReference(bqrootstr)
						bouquet = eServiceReference(bqrootstr)
						bouquetlist = serviceHandler.list(bouquet)
						# we need a way out of the loop,
						# if channel is not in bouquets
						bouquetcount = 0
						bouquets = []
						if not bouquetlist is None:
							while True:
								bouquet = bouquetlist.getNext()
								# can we make it easier?
								# or found a way to make another way for that
								if bouquets == []:
									bouquets.append(bouquet)
								else:
									for x in bouquets:
										if x != bouquet:
											bouquets.append(bouquet)
										else:
											bouquetcount += 1
								if bouquetcount >= 5:
									notFound = True
									break

								if bouquet.flags & eServiceReference.isDirectory:
									ChannelSelectionInstance.clearPath()
									ChannelSelectionInstance.setRoot(bouquet)
									servicelist = serviceHandler.list(bouquet)
									if not servicelist is None:
										serviceIterator = servicelist.getNext()
										while serviceIterator.valid():
											if self.service_ref.ref == serviceIterator:
												break
											serviceIterator = servicelist.getNext()
										if self.service_ref.ref == serviceIterator:
											break
							if found:
								ChannelSelectionInstance.enterPath(rootbouquet)
								ChannelSelectionInstance.enterPath(bouquet)
								ChannelSelectionInstance.saveRoot()
								ChannelSelectionInstance.saveChannel(self.service_ref.ref)
						if found:
							ChannelSelectionInstance.addToHistory(self.service_ref.ref)
					if notFound:
						# Can we get a result for that ?
						# see if you want to delete the running Timer
						self.switchToAll()
					else:
						NavigationInstance.instance.playService(self.service_ref.ref)
				return True
			else:
				self.log(11, "start recording")
				record_res = self.record_service.start()
				self.setRecordingPreferredTuner(setdefault=True)
				if record_res:
					self.log(13, "start record returned %d" % record_res)
					self.do_backoff()
					# retry
					self.begin = time() + self.backoff
					return False
				return True
Exemple #44
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 self.selectionChanged not in self['config'].onSelectionChanged:
            self['config'].onSelectionChanged.append(self.selectionChanged)
        self.selectionChanged()

    def createConfig(self):
        justplay = self.timer.justplay
        always_zap = self.timer.always_zap
        rename_repeat = self.timer.rename_repeat
        afterevent = {AFTEREVENT.NONE: 'nothing',
         AFTEREVENT.DEEPSTANDBY: 'deepstandby',
         AFTEREVENT.STANDBY: 'standby',
         AFTEREVENT.AUTO: 'auto'}[self.timer.afterEvent]
        if self.timer.record_ecm and self.timer.descramble:
            recordingtype = 'descrambled+ecm'
        elif self.timer.record_ecm:
            recordingtype = 'scrambled+ecm'
        elif self.timer.descramble:
            recordingtype = 'normal'
        weekday_table = ('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun')
        day = []
        weekday = 0
        for x in (0, 1, 2, 3, 4, 5, 6):
            day.append(0)

        if self.timer.repeated:
            type = 'repeated'
            if self.timer.repeated == 31:
                repeated = 'weekdays'
            elif self.timer.repeated == 127:
                repeated = 'daily'
            else:
                flags = self.timer.repeated
                repeated = 'user'
                count = 0
                for x in (0, 1, 2, 3, 4, 5, 6):
                    if flags == 1:
                        weekday = x
                    if flags & 1 == 1:
                        day[x] = 1
                        count += 1
                    else:
                        day[x] = 0
                    flags >>= 1

                if count == 1:
                    repeated = 'weekly'
        else:
            type = 'once'
            repeated = None
            weekday = int(strftime('%u', localtime(self.timer.begin))) - 1
            day[weekday] = 1
        self.timerentry_justplay = ConfigSelection(choices=[('zap', _('zap')), ('record', _('record')), ('zap+record', _('zap and record'))], default={0: 'record',
         1: 'zap',
         2: 'zap+record'}[justplay + 2 * always_zap])
        self.timertyp = self.timerentry_justplay.value
        if SystemInfo['DeepstandbySupport']:
            shutdownString = _('go to deep standby')
        else:
            shutdownString = _('shut down')
        self.timerentry_afterevent = ConfigSelection(choices=[('nothing', _('do nothing')),
         ('standby', _('go to standby')),
         ('deepstandby', shutdownString),
         ('auto', _('auto'))], default=afterevent)
        self.timerentry_recordingtype = ConfigSelection(choices=[('normal', _('normal')), ('descrambled+ecm', _('descramble and record ecm')), ('scrambled+ecm', _("don't descramble, record ecm"))], default=recordingtype)
        self.timerentry_type = ConfigSelection(choices=[('once', _('once')), ('repeated', _('repeated'))], default=type)
        self.timerentry_name = ConfigText(default=self.timer.name.replace('\xc2\x86', '').replace('\xc2\x87', '').encode('utf-8'), visible_width=50, fixed_size=False)
        self.timerentry_description_replaced = self.timer.description.replace('\xc2\x8a', ' ').encode('utf-8')
        self.timerentry_description = ConfigText(default=self.timerentry_description_replaced, visible_width=50, fixed_size=False)
        self.timerentry_tags = self.timer.tags[:]
        if not self.timerentry_tags:
            tagname = self.timer.name.strip()
            if tagname:
                tagname = tagname[0].upper() + tagname[1:].replace(' ', '_')
                self.timerentry_tags.append(tagname)
        self.timerentry_tagsset = ConfigSelection(choices=[not self.timerentry_tags and 'None' or ' '.join(self.timerentry_tags)])
        self.timerentry_repeated = ConfigSelection(default=repeated, choices=[('weekly', _('weekly')),
         ('daily', _('daily')),
         ('weekdays', _('Mon-Fri')),
         ('user', _('user defined'))])
        self.timerentry_renamerepeat = ConfigYesNo(default=rename_repeat)
        self.timerentry_date = ConfigDateTime(default=self.timer.begin, formatstring=_('%d %B %Y'), increment=86400)
        self.timerentry_starttime = ConfigClock(default=self.timer.begin)
        self.timerentry_endtime = ConfigClock(default=self.timer.end)
        self.timerentry_showendtime = ConfigSelection(default=self.timer.end > self.timer.begin + 3 and self.timer.justplay, choices=[(True, _('yes')), (False, _('no'))])
        default = self.timer.dirname or defaultMoviePath()
        tmp = config.movielist.videodirs.value
        if default not in tmp:
            tmp.append(default)
        self.timerentry_dirname = ConfigSelection(default=default, choices=tmp)
        self.timerentry_repeatedbegindate = ConfigDateTime(default=self.timer.repeatedbegindate, formatstring=_('%d.%B %Y'), increment=86400)
        self.timerentry_weekday = ConfigSelection(default=weekday_table[weekday], choices=[('mon', _('Monday')),
         ('tue', _('Tuesday')),
         ('wed', _('Wednesday')),
         ('thu', _('Thursday')),
         ('fri', _('Friday')),
         ('sat', _('Saturday')),
         ('sun', _('Sunday'))])
        self.timerentry_day = ConfigSubList()
        for x in (0, 1, 2, 3, 4, 5, 6):
            self.timerentry_day.append(ConfigYesNo(default=day[x]))

        servicename = 'N/A'
        try:
            servicename = str(self.timer.service_ref.getServiceName())
        except:
            pass

        self.timerentry_service_ref = self.timer.service_ref
        self.timerentry_service = ConfigSelection([servicename])

    def createSetup(self, widget):
        if self.timer not in self.session.nav.RecordTimer.timer_list:
            newtime = None
            if self.timerentry_justplay.value == 'zap' and self.timertyp != 'zap':
                newtime = self.getTimestamp(self.timerentry_date.value, self.timerentry_starttime.value) + config.recording.margin_before.value * 60
                newbegin = localtime(newtime)
            elif self.timerentry_justplay.value != 'zap' and self.timertyp == 'zap':
                newtime = self.getTimestamp(self.timerentry_date.value, self.timerentry_starttime.value) - config.recording.margin_before.value * 60
                newbegin = localtime(newtime)
            if newtime:
                self.timerentry_date.value = newtime
                self.timerentry_starttime.value = [newbegin.tm_hour, newbegin.tm_min]
            self.timertyp = self.timerentry_justplay.value
        self.list = []
        self.timerJustplayEntry = getConfigListEntry(_('Timer type'), self.timerentry_justplay, _('Chose between record and ZAP.'))
        self.list.append(self.timerJustplayEntry)
        self.entryName = getConfigListEntry(_('Name'), self.timerentry_name, _('Set the name the recording will get.'))
        self.list.append(self.entryName)
        self.entryDescription = getConfigListEntry(_('Description'), self.timerentry_description, _('Set the description of the recording.'))
        self.list.append(self.entryDescription)
        self.timerTypeEntry = getConfigListEntry(_('Repeat type'), self.timerentry_type, _('A repeating timer or just once?'))
        self.list.append(self.timerTypeEntry)
        if self.timerentry_type.value == 'once':
            self.frequencyEntry = None
        else:
            self.frequencyEntry = getConfigListEntry(_('Repeats'), self.timerentry_repeated, _('Choose between Daily, Weekly, Weekdays or user defined.'))
            self.list.append(self.frequencyEntry)
            self.repeatedbegindateEntry = getConfigListEntry(_('Starting on'), self.timerentry_repeatedbegindate, _('Set the date the timer must start.'))
            self.list.append(self.repeatedbegindateEntry)
            if self.timerentry_repeated.value == 'daily':
                pass
            if self.timerentry_repeated.value == 'weekdays':
                pass
            if self.timerentry_repeated.value == 'weekly':
                self.list.append(getConfigListEntry(_('Weekday'), self.timerentry_weekday))
            if self.timerentry_repeated.value == 'user':
                self.list.append(getConfigListEntry(_('Monday'), self.timerentry_day[0]))
                self.list.append(getConfigListEntry(_('Tuesday'), self.timerentry_day[1]))
                self.list.append(getConfigListEntry(_('Wednesday'), self.timerentry_day[2]))
                self.list.append(getConfigListEntry(_('Thursday'), self.timerentry_day[3]))
                self.list.append(getConfigListEntry(_('Friday'), self.timerentry_day[4]))
                self.list.append(getConfigListEntry(_('Saturday'), self.timerentry_day[5]))
                self.list.append(getConfigListEntry(_('Sunday'), self.timerentry_day[6]))
            if self.timerentry_justplay.value != 'zap':
                self.list.append(getConfigListEntry(_('Rename name and description for new events'), self.timerentry_renamerepeat))
        self.entryDate = getConfigListEntry(_('Date'), self.timerentry_date, _('Set the date the timer must start.'))
        if self.timerentry_type.value == 'once':
            self.list.append(self.entryDate)
        self.entryStartTime = getConfigListEntry(_('Start time'), self.timerentry_starttime, _('Set the time the timer must start.'))
        self.list.append(self.entryStartTime)
        self.entryShowEndTime = getConfigListEntry(_('Set end time'), self.timerentry_showendtime, _('Set the time the timer must stop.'))
        if self.timerentry_justplay.value == 'zap':
            self.list.append(self.entryShowEndTime)
        self.entryEndTime = getConfigListEntry(_('End time'), self.timerentry_endtime, _('Set the time the timer must stop.'))
        if self.timerentry_justplay.value != 'zap' or self.timerentry_showendtime.value:
            self.list.append(self.entryEndTime)
        self.channelEntry = getConfigListEntry(_('Channel'), self.timerentry_service, _('Set the channel for this timer.'))
        self.list.append(self.channelEntry)
        if self.timerentry_showendtime.value and self.timerentry_justplay.value == 'zap':
            self.list.append(getConfigListEntry(_('After event'), self.timerentry_afterevent, _("What action is required on complettion of the timer? 'Auto' lets the box return to the state it had when the timer started. 'Do nothing', 'Go to standby' and 'Go to deep standby' do ecaxtly that.")))
        description = free = ''
        try:
            if self.timerentry_justplay.value != 'zap':
                stat = statvfs(self.timerentry_dirname.value)
                a = float(stat.f_blocks) * stat.f_bsize / 1024 / 1024 / 1024
                b = float(stat.f_bavail) * stat.f_bsize / 1024 / 1024 / 1024
                c = 100.0 * b / a
                free = ('%0.f GB (%0.f %s) ' + _('free diskspace')) % (b, c, '%')
                description = _('Current location')
        except:
            pass

        self['locationdescription'].setText(description)
        self['locationfreespace'].setText(free)
        self.dirname = getConfigListEntry(_('Location'), self.timerentry_dirname, _('Where should the recording be saved?'))
        self.tagsSet = getConfigListEntry(_('Tags'), self.timerentry_tagsset, _('Choose a tag for easy finding a recording.'))
        if self.timerentry_justplay.value != 'zap':
            if config.usage.setup_level.index >= 2:
                self.list.append(self.dirname)
            if getPreferredTagEditor():
                self.list.append(self.tagsSet)
            self.list.append(getConfigListEntry(_('After Recording'), self.timerentry_afterevent, _("What action is required on complettion of the timer? 'Auto' lets the box return to the state it had when the timer started. 'Do nothing', 'Go to standby' and 'Go to deep standby' do ecaxtly that.")))
            self.list.append(getConfigListEntry(_('Recording type'), self.timerentry_recordingtype, _("Descramble & record ECM' gives the option to descramble afterwards if descrambling on recording failed. 'Don't descramble, record ECM' save a scramble recording that can be descrambled on playback. 'Normal' means descramble the recording and don't record ECM.")))
        self[widget].list = self.list
        self[widget].l.setList(self.list)

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

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

    def createSummary(self):
        return SetupSummary

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

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

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

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

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

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

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

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

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

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

    def keySelect(self):
        cur = self['config'].getCurrent()
        if cur == self.channelEntry:
            self.session.openWithCallback(self.finishedChannelSelection, ChannelSelection.SimpleChannelSelection, _('Select channel to record from'), currentBouquet=True)
        elif config.usage.setup_level.index >= 2 and cur == self.dirname:
            self.session.openWithCallback(self.pathSelected, MovieLocationBox, _('Select target folder'), self.timerentry_dirname.value, minFree=100)
        elif getPreferredTagEditor() and cur == self.tagsSet:
            self.session.openWithCallback(self.tagEditFinished, getPreferredTagEditor(), self.timerentry_tags)
        else:
            self.keyGo()

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

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

    def getBeginEnd(self):
        date = self.timerentry_date.value
        endtime = self.timerentry_endtime.value
        starttime = self.timerentry_starttime.value
        begin = self.getTimestamp(date, starttime)
        end = self.getTimestamp(date, endtime)
        if end < begin:
            end += 86400
        if self.timerentry_justplay.value == 'zap':
            if not self.timerentry_showendtime.value:
                end = begin + 1
        return (begin, end)

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

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

    def keyGo(self, result = None):
        if not self.timerentry_service_ref.isRecordable():
            self.session.openWithCallback(self.selectChannelSelector, MessageBox, _("You didn't select a channel to record from."), MessageBox.TYPE_ERROR)
            return
        self.timer.name = self.timerentry_name.value
        self.timer.description = self.timerentry_description.value if self.timerentry_description_replaced != self.timerentry_description.value else self.timer.description
        self.timer.justplay = self.timerentry_justplay.value == 'zap'
        self.timer.always_zap = self.timerentry_justplay.value == 'zap+record'
        self.timer.rename_repeat = self.timerentry_renamerepeat.value
        if self.timerentry_justplay.value == 'zap':
            if not self.timerentry_showendtime.value:
                self.timerentry_endtime.value = self.timerentry_starttime.value
                self.timerentry_afterevent.value = 'nothing'
        if self.timerentry_endtime.value == self.timerentry_starttime.value and self.timerentry_afterevent.value != 'nothing':
            self.timerentry_afterevent.value = 'nothing'
            self.session.open(MessageBox, _('Difference between timer begin and end must be equal or greater than %d minutes.\nEnd Action was disabled !') % 1, MessageBox.TYPE_INFO, timeout=30)
        self.timer.resetRepeated()
        self.timer.afterEvent = {'nothing': AFTEREVENT.NONE,
         'deepstandby': AFTEREVENT.DEEPSTANDBY,
         'standby': AFTEREVENT.STANDBY,
         'auto': AFTEREVENT.AUTO}[self.timerentry_afterevent.value]
        if self.timer.justplay:
            self.timer.afterEvent = AFTEREVENT.NONE
        self.timer.descramble = {'normal': True,
         'descrambled+ecm': True,
         'scrambled+ecm': False}[self.timerentry_recordingtype.value]
        self.timer.record_ecm = {'normal': False,
         'descrambled+ecm': True,
         'scrambled+ecm': True}[self.timerentry_recordingtype.value]
        self.timer.service_ref = self.timerentry_service_ref
        self.timer.tags = self.timerentry_tags
        if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
            self.timer.dirname = self.timerentry_dirname.value
            config.movielist.last_timer_videodir.value = self.timer.dirname
            config.movielist.last_timer_videodir.save()
        if self.timerentry_type.value == 'once':
            self.timer.begin, self.timer.end = self.getBeginEnd()
        if self.timerentry_type.value == 'repeated':
            if self.timerentry_repeated.value == 'daily':
                for x in (0, 1, 2, 3, 4, 5, 6):
                    self.timer.setRepeated(x)

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

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

            self.timer.repeatedbegindate = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
            if self.timer.repeated:
                self.timer.begin = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
                self.timer.end = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value)
            else:
                self.timer.begin = self.getTimestamp(time(), self.timerentry_starttime.value)
                self.timer.end = self.getTimestamp(time(), self.timerentry_endtime.value)
            if self.timer.end < self.timer.begin:
                self.timer.end += 86400
        if self.timer.eit is not None:
            event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
            if event:
                n = event.getNumOfLinkageServices()
                if n > 1:
                    tlist = []
                    ref = self.session.nav.getCurrentlyPlayingServiceOrGroup()
                    parent = self.timer.service_ref.ref
                    selection = 0
                    for x in range(n):
                        i = event.getLinkageService(parent, x)
                        if i.toString() == ref.toString():
                            selection = x
                        tlist.append((i.getName(), i))

                    self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_('Please select a subservice to record...'), list=tlist, selection=selection)
                    return
                if n > 0:
                    parent = self.timer.service_ref.ref
                    self.timer.service_ref = ServiceReference(event.getLinkageService(parent, 0))
        self.saveTimer()
        self.close((True, self.timer))

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

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

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

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

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

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

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

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

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

    def tagEditFinished(self, ret):
        if ret is not None:
            self.timerentry_tags = ret
            self.timerentry_tagsset.setChoices([not ret and 'None' or ' '.join(ret)])
            self['config'].invalidate(self.tagsSet)
def getStreamServiceName(ref):
	if isinstance(ref, eServiceReference):
		servicereference = ServiceReference(ref)
		if servicereference:
			return servicereference.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')
	return ""
Exemple #46
0
    def tunerShow(self):
        if self.entries:
            # Close info screen
            if self.info:
                self.info.hide()
                self.session.deleteDialog(self.info)
                self.info = None

            # Rebind InfoBar Events
            #self.bindInfoBar()

            # Only show the Tuner information dialog,
            # if no screen is displayed or the InfoBar is visible
            #TODO Info can also be showed if info.rectangle is outside currentdialog.rectangle

    #		if self.session.current_dialog is None \
    #			or isinstance(self.session.current_dialog, InfoBar):
    #MAYBE Tuner Informationen werden zusammen mit der EMCMediaCenter InfoBar angezeigt
    #or isinstance(self.session.current_dialog, EMCMediaCenter):

    # Delete entries:
    #  if entry reached timeout
    #  if number of entries is reached
            numberfinished = 0
            for id, win in sorted(self.entries.items(),
                                  key=lambda x: (x[1].end),
                                  reverse=True):
                if win.type == Finished:
                    numberfinished += 1
                if win.toberemoved == True \
                 or win.type == Finished and numberfinished > int( config.infobartunerstate.number_finished_records.value ):
                    # Delete Stopped Timers
                    self.session.deleteDialog(win)
                    del self.entries[id]

            # Update windows
            # Dynamic column resizing and repositioning
            widths = []
            for id, win in self.entries.items():
                if win.type == Record:
                    #TODO Avolid blocking - avoid using getTimer to update the timer times use timer.time_changed if possible
                    timer = getTimer(id)
                    if timer:
                        begin = timer.begin
                        end = timer.end
                        endless = timer.autoincrease

                        if not win.tuner or not win.tunertype:
                            win.tuner, win.tunertype = getTuner(
                                timer.record_service)
                        service_ref = None
                        if not win.channel or not win.number:
                            service_ref = timer.service_ref

                        del timer

                        if service_ref:
                            win.number = win.number or service_ref and getNumber(
                                service_ref.ref)
                            win.channel = win.channel or service_ref and service_ref.getServiceName(
                            )

                        win.updateTimes(begin, end, endless)
                        win.update()
                    else:
                        # Should never happen delete
                        begin = win.begin
                        end = time()
                        endless = False
                        win.updateType(Finished)
                        win.updateTimes(begin, end, endless)
                        win.update()
                elif win.type == Stream:
                    if config.infobartunerstate.show_streams.value:
                        #TODO Avolid blocking - avoid using getStream to update the current name
                        stream = getStream(id)
                        if stream:
                            ref = stream.getRecordServiceRef()

                            if not win.tuner or not win.tunertype:
                                win.tuner, win.tunertype = getTuner(
                                    stream.getRecordService())

                            del stream

                            epg = eEPGCache.getInstance()
                            event = epg and epg.lookupEventTime(ref, -1, 0)
                            if event:
                                name = event.getEventName()
                            else:
                                name = ""

                            begin = win.begin
                            end = None
                            endless = True

                            service_ref = None
                            if not win.number:
                                service_ref = ServiceReference(ref)
                                win.number = service_ref and getNumber(
                                    service_ref.ref)
                            if not win.channel:
                                service_ref = service_ref or ServiceReference(
                                    ref)
                                win.channel = win.channel or service_ref and service_ref.getServiceName(
                                )

                            win.updateName(name)
                            win.updateTimes(begin, end, endless)
                            win.update()
                        else:
                            win.toberemoved == True
                    else:
                        # Should never happen delete
                        begin = win.begin
                        end = time()
                        endless = False
                        win.updateType(Finished)
                        win.updateTimes(begin, end, endless)
                        win.update()
                else:
                    # Type Finished
                    win.update()

                # Calculate field width
                widths = map(lambda (w1, w2): max(w1, w2),
                             zip_longest(widths, win.widths))

            # Calculate field spacing
            spacing = self.spacing + int(
                config.infobartunerstate.offset_spacing.value)
            widths = [width + spacing if width > 0 else 0 for width in widths]

            # Apply user offsets
            posx = self.positionx + int(
                config.infobartunerstate.offset_horizontal.value)
            posy = self.positiony + int(
                config.infobartunerstate.offset_vertical.value)
            height = self.height

            # Resize, move and show windows
            for win in sorted(self.entries.itervalues(),
                              key=lambda x: (x.type, x.timeleft)):
                #for pos, win in enumerate( sorted( self.entries.itervalues(), key=lambda x: (x.type, x.timeleft) ) ):
                win.reorder(widths)
                win.move(posx, posy)
                posy += height
                # Show windows
                win.show()
Exemple #47
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
		res = [
			None, # no private data needed
			(eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]),
			(eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 0, RT_HALIGN_RIGHT, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4]))
		]
		if rec1 or rec2:
			if rec1:			
				clock_pic = self.getClockPixmap(service, beginTime, duration, eventId)
				# maybe Partnerbox too
				if rec2:
					clock_pic_partnerbox = getRemoteClockPixmap(self,service, beginTime, duration, eventId)
			else:
				clock_pic = getRemoteClockPixmap(self,service, beginTime, duration, eventId)
			if rec1 and rec2:
				# Partnerbox and local
				res.extend((
					(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, clock_pic),
					(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + 25, r3.top(), 21, 21, clock_pic_partnerbox),
					(eListboxPythonMultiContent.TYPE_TEXT, r3.left() + 50, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, serviceref.getServiceName() + ": " + EventName)))
			else:
				res.extend((
					(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, clock_pic),
					(eListboxPythonMultiContent.TYPE_TEXT, r3.left() + 25, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, serviceref.getServiceName() + ": " + EventName)))
		else:
			res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left(), r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, serviceref.getServiceName() + ": " + EventName))
		return res
Exemple #48
0
 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
Exemple #49
0
 def __init__(self, session):
     Screen.__init__(self, session)
     self.skin_path = resolveFilename(SCOPE_PLUGINS,
                                      "Extensions/RaedQuickSignal")
     dellog()
     if config.plugins.RaedQuickSignal.style.value == "AGC1":
         if config.plugins.RaedQuickSignal.piconpath.value == "PLUGIN":
             if config.plugins.RaedQuickSignal.enabledb.value == "Enable":
                 if isHD():
                     self.skin = SKIN_AGC_Picon_SNRdB
                 else:
                     self.skin = SKIN_AGC_Picon_SNRdB_FHD
             else:
                 if isHD():
                     self.skin = SKIN_AGC_Picon_NOSNRdB
                 else:
                     self.skin = SKIN_AGC_Picon_NOSNRdB_FHD
         elif config.plugins.RaedQuickSignal.piconpath.value == "MEDIA":
             if config.plugins.RaedQuickSignal.enabledb.value == "Enable":
                 if isHD():
                     self.skin = SKIN_AGC_Picon_media_SNRdB
                 else:
                     self.skin = SKIN_AGC_Picon_media_SNRdB_FHD
             else:
                 if isHD():
                     self.skin = SKIN_AGC_Picon_media_NOSNRdB
                 else:
                     self.skin = SKIN_AGC_Picon_media_NOSNRdB_FHD
     elif config.plugins.RaedQuickSignal.style.value == "AGC2":
         if config.plugins.RaedQuickSignal.enabledb.value == "Enable":
             if isHD():
                 self.skin = SKIN_AGC_Event_Des_SNRdB
             else:
                 self.skin = SKIN_AGC_Event_Des_SNRdB_FHD
         else:
             if isHD():
                 self.skin = SKIN_AGC_Event_Des_NOSNRdB
             else:
                 self.skin = SKIN_AGC_Event_Des_NOSNRdB_FHD
     elif config.plugins.RaedQuickSignal.style.value == "AGC3":
         if config.plugins.RaedQuickSignal.enabledb.value == "Enable":
             if isHD():
                 self.skin = SKIN_AGC_Weather_SNRdB
             else:
                 self.skin = SKIN_AGC_Weather_SNRdB_FHD
         else:
             if isHD():
                 self.skin = SKIN_AGC_Weather_NOSNRdB
             else:
                 self.skin = SKIN_AGC_Weather_NOSNRdB_FHD
     elif config.plugins.RaedQuickSignal.style.value == "Event1":
         if config.plugins.RaedQuickSignal.piconpath.value == "PLUGIN":
             if config.plugins.RaedQuickSignal.enabledb.value == "Enable":
                 if isHD():
                     self.skin = SKIN_Event_Progress_Picon_SNRdB
                 else:
                     self.skin = SKIN_Event_Progress_Picon_SNRdB_FHD
             else:
                 if isHD():
                     self.skin = SKIN_Event_Progress_Picon_NOSNRdB
                 else:
                     self.skin = SKIN_Event_Progress_Picon_NOSNRdB_FHD
         elif config.plugins.RaedQuickSignal.piconpath.value == "MEDIA":
             if config.plugins.RaedQuickSignal.enabledb.value == "Enable":
                 if isHD():
                     self.skin = SKIN_Event_Progress_Picon_media_SNRdB
                 else:
                     self.skin = SKIN_Event_Progress_Picon_media_SNRdB_FHD
             else:
                 if isHD():
                     self.skin = SKIN_Event_Progress_Picon_media_NOSNRdB
                 else:
                     self.skin = SKIN_Event_Progress_Picon_media_NOSNRdB_FHD
     elif config.plugins.RaedQuickSignal.style.value == "Event2":
         if config.plugins.RaedQuickSignal.enabledb.value == "Enable":
             if isHD():
                 self.skin = SKIN_Event_Progress_Event_Des_SNRdB
             else:
                 self.skin = SKIN_Event_Progress_Event_Des_SNRdB_FHD
         else:
             if isHD():
                 self.skin = SKIN_Event_Progress_Event_Des_NOSNRdB
             else:
                 self.skin = SKIN_Event_Progress_Event_Des_NOSNRdB_FHD
     elif config.plugins.RaedQuickSignal.style.value == "Event3":
         if config.plugins.RaedQuickSignal.enabledb.value == "Enable":
             if isHD():
                 self.skin = SKIN_Event_Progress_Weather_SNRdB
             else:
                 self.skin = SKIN_Event_Progress_Weather_SNRdB_FHD
         else:
             if isHD():
                 self.skin = SKIN_Event_Progress_Weather_NOSNRdB
             else:
                 self.skin = SKIN_Event_Progress_Weather_NOSNRdB_FHD
     elif config.plugins.RaedQuickSignal.style.value == "Full":
         if isHD():
             self.skin = SKIN_Full_Screen
         else:
             self.skin = SKIN_Full_Screen_FHD
     self.session = session
     self.startupservice = config.servicelist.startupservice.value
     logdata('self.startupservice', self.startupservice)
     sref = self.session.nav.getCurrentService()
     from ServiceReference import ServiceReference
     p = ServiceReference(str(sref))
     servicename = str(p.getServiceName())
     serviceurl = p.getPath()
     logdata('serviceurl', serviceurl)
     logdata('servicename', servicename)
     logdata('playeble-sref', sref)
     config.servicelist.startupservice.value = serviceurl
     config.servicelist.startupservice.save()
     self.servicelist = self.session.instantiateDialog(ChannelSelection)
     self["setupActions"] = ActionMap(
         ["WizardActions", "SetupActions", "MenuActions"], {
             "cancel": self.exit,
             "menu": self.showsetup,
             "up": self.keyUp,
             "down": self.keyDown,
             "left": self.keyLeft,
             "right": self.keyRight,
         })
     shown = True
     self.onLayoutFinish.append(self.layoutFinished)
def getMovieList(rargs=None, locations=None):
    movieliste = []
    tag = None
    directory = None
    fields = None
    bookmarklist = []

    if rargs and "tag" in rargs.keys():
        tag = rargs["tag"][0]

    if rargs and "dirname" in rargs.keys():
        directory = rargs["dirname"][0]

    if rargs and "fields" in rargs.keys():
        fields = rargs["fields"][0]

    if directory is None:
        directory = MovieSelection.defaultMoviePath()
    else:
        try:
            directory.decode('utf-8')
        except UnicodeDecodeError:
            try:
                directory = directory.decode("cp1252").encode("utf-8")
            except UnicodeDecodeError:
                directory = directory.decode("iso-8859-1").encode("utf-8")

    if not directory:
        directory = MOVIE_LIST_ROOT_FALLBACK

    if directory[-1] != "/":
        directory += "/"

    if not os.path.isdir(directory):
        return {
            "movies": [],
            "locations": [],
            "bookmarks": [],
            "directory": [],
        }

    root = eServiceReference(MOVIE_LIST_SREF_ROOT + directory)

    for item in sorted(os.listdir(directory)):
        abs_p = os.path.join(directory, item)
        if os.path.isdir(abs_p):
            bookmarklist.append(item)

    folders = [root]
    if rargs and "recursive" in rargs.keys():
        for f in bookmarklist:
            if f[-1] != "/":
                f += "/"
            ff = eServiceReference(MOVIE_LIST_SREF_ROOT + directory + f)
            folders.append(ff)

    # get all locations
    if locations is not None:
        folders = []

        for f in locations:
            if f[-1] != "/":
                f += "/"
            ff = eServiceReference(MOVIE_LIST_SREF_ROOT + f)
            folders.append(ff)

    if config.OpenWebif.parentalenabled.value:
        dir_is_protected = checkParentalProtection(directory)
    else:
        dir_is_protected = False

    if not dir_is_protected:
        for root in folders:
            movielist = MovieList(None)
            movielist.load(root, None)

            if tag is not None:
                movielist.reload(root=root, filter_tags=[tag])

            for (serviceref, info, begin, unknown) in movielist.list:
                if serviceref.flags & eServiceReference.mustDescent:
                    continue

                length_minutes = 0
                txtdesc = ""
                filename = '/'.join(serviceref.toString().split("/")[1:])
                filename = '/' + filename
                name, ext = os.path.splitext(filename)

                sourceRef = ServiceReference(
                    info.getInfoString(serviceref,
                                       iServiceInformation.sServiceref))
                rtime = info.getInfo(serviceref,
                                     iServiceInformation.sTimeCreate)

                movie = {
                    'filename':
                    filename,
                    'filename_stripped':
                    filename.split("/")[-1],
                    'serviceref':
                    serviceref.toString(),
                    'length':
                    "?:??",
                    'lastseen':
                    0,
                    'filesize_readable':
                    '',
                    'recordingtime':
                    rtime,
                    'begintime':
                    'undefined',
                    'eventname':
                    ServiceReference(serviceref).getServiceName().replace(
                        '\xc2\x86', '').replace('\xc2\x87', ''),
                    'servicename':
                    sourceRef.getServiceName().replace('\xc2\x86', '').replace(
                        '\xc2\x87', ''),
                    'tags':
                    info.getInfoString(serviceref, iServiceInformation.sTags),
                    'fullname':
                    serviceref.toString(),
                }

                if rtime > 0:
                    fuzzy_rtime = FuzzyTime(rtime)
                    movie['begintime'] = fuzzy_rtime[0] + ", " + fuzzy_rtime[1]

                try:
                    length_minutes = info.getLength(serviceref)
                except:  # noqa: E722
                    pass

                if length_minutes:
                    movie['length'] = "%d:%02d" % (length_minutes / 60,
                                                   length_minutes % 60)
                    if fields is None or 'pos' in fields:
                        movie['lastseen'] = getPosition(
                            filename + '.cuts', length_minutes)

                if fields is None or 'desc' in fields:
                    txtfile = name + '.txt'
                    if ext.lower() != '.ts' and os.path.isfile(txtfile):
                        with open(txtfile, "rb") as handle:
                            txtdesc = ''.join(handle.readlines())

                    event = info.getEvent(serviceref)
                    extended_description = event and event.getExtendedDescription(
                    ) or ""
                    if extended_description == '' and txtdesc != '':
                        extended_description = txtdesc
                    movie['descriptionExtended'] = unicode(
                        extended_description, 'utf_8',
                        errors='ignore').encode('utf_8', 'ignore')

                    desc = info.getInfoString(serviceref,
                                              iServiceInformation.sDescription)
                    movie['description'] = unicode(desc,
                                                   'utf_8',
                                                   errors='ignore').encode(
                                                       'utf_8', 'ignore')

                if fields is None or 'size' in fields:
                    size = 0
                    sz = ''

                    try:
                        size = os.stat(filename).st_size
                        if size > 1073741824:
                            sz = "%.2f %s" % ((size / 1073741824.), _("GB"))
                        elif size > 1048576:
                            sz = "%.2f %s" % ((size / 1048576.), _("MB"))
                        elif size > 1024:
                            sz = "%.2f %s" % ((size / 1024.), _("kB"))
                    except:  # noqa: E722
                        pass

                    movie['filesize'] = size
                    movie['filesize_readable'] = sz

                movieliste.append(movie)

    if locations is None:
        return {
            "movies": movieliste,
            "bookmarks": bookmarklist,
            "directory": directory
        }

    return {"movies": movieliste, "locations": locations}
Exemple #51
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["key_yellow"] = Label(_("Timer type"))
        self["key_blue"] = Label()

        self.createConfig()

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

        self.list = []
        ConfigListScreen.__init__(self, self.list, session=session)
        self.setTitle(_("Timer entry"))
        self.createSetup("config")

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

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

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

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

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

        self.timerentry_justplay = ConfigSelection(
            choices=[("zap", _("zap")), ("record", _("record")),
                     ("zap+record", _("zap and record"))],
            default={
                0: "record",
                1: "zap",
                2: "zap+record"
            }[justplay + 2 * always_zap])
        if SystemInfo["DeepstandbySupport"]:
            shutdownString = _("go to deep standby")
            choicelist = [("always", _("always")),
                          ("from_standby", _("only from standby")),
                          ("from_deep_standby", _("only from deep standby")),
                          ("never", _("never"))]
        else:
            shutdownString = _("shut down")
            choicelist = [("always", _("always")), ("never", _("never"))]
        self.timerentry_zapwakeup = ConfigSelection(choices=choicelist,
                                                    default=zap_wakeup)
        self.timerentry_afterevent = ConfigSelection(choices=[
            ("nothing", _("do nothing")), ("standby", _("go to standby")),
            ("deepstandby", shutdownString), ("auto", _("auto"))
        ],
                                                     default=afterevent)
        self.timerentry_recordingtype = ConfigSelection(choices=[
            ("normal", _("normal")),
            ("descrambled+ecm", _("descramble and record ecm")),
            ("scrambled+ecm", _("don't descramble, record ecm"))
        ],
                                                        default=recordingtype)
        self.timerentry_type = ConfigSelection(choices=[("once", _("once")),
                                                        ("repeated",
                                                         _("repeated"))],
                                               default=type)
        self.timerentry_name = ConfigText(default=self.timer.name,
                                          visible_width=50,
                                          fixed_size=False)
        self.timerentry_description = ConfigText(
            default=self.timer.description, visible_width=50, fixed_size=False)
        self.timerentry_tags = self.timer.tags[:]
        self.timerentry_tagsset = ConfigSelection(choices=[
            not self.timerentry_tags and "None"
            or " ".join(self.timerentry_tags)
        ])

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    def tagEditFinished(self, ret):
        if ret is not None:
            self.timerentry_tags = ret
            self.timerentry_tagsset.setChoices(
                [not ret and "None" or " ".join(ret)])
            self["config"].invalidate(self.tagsSet)
Exemple #52
0
def getStreamServiceName(ref):
    if isinstance(ref, eServiceReference):
        servicereference = ServiceReference(ref)
        if servicereference:
            return removeBad(servicereference.getServiceName())
    return ""
	def convertBouquets(self):
		self.readIndex = 0
		while True:
			if 'lamedb' not in self.workList[self.readIndex]:
				filename = DIR_TMP + self.workList[self.readIndex]
				hasRemoteTag = False
				if self.checkBouquetAllreadyInList(self.workList[self.readIndex], self.workList[self.readIndex]) is True:
					self.workList[self.readIndex] = self.workList[self.readIndex].replace('userbouquet.', 'userbouquet.remote_')
					hasRemoteTag = True

				fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w')
				try:
					lines = open(filename).readlines()
					was_html = False
					for line in lines:
						if was_html and '#DESCRIPTION' in line:
							was_html = False
							continue
						if '#NAME' in line and hasRemoteTag:
							hasRemoteTag = False
							line = line.replace('#NAME ', '#NAME remote_')
						was_html = False
						if 'http' in line:
							was_html = True
							continue
						elif '#SERVICE' in line:
							line = line.strip('\r\n')
							line = line.strip('\n')
							tmp = line.split('#SERVICE')
							if '::' in tmp[1]:
								desc = tmp[1].split("::")
								if (len(desc)) == 2:
									tmp2 = tmp[1].split('::')
									service_ref = ServiceReference(tmp2[0] + ':')
									tag = tmp2[0][1:]
							else:
								tag = tmp[1][1:-1]
								service_ref = ServiceReference(tag)
							if config.plugins.RemoteStreamConverter.transcoding.value:
								bitrate = config.plugins.RemoteStreamConverter.bitrate.value
								resolution = config.plugins.RemoteStreamConverter.resolution.value
								(width, height) = tuple(resolution.split('x'))
								framrate = config.plugins.RemoteStreamConverter.framerate.value
								aspectratio = config.plugins.RemoteStreamConverter.aspectratio.value
								interlaced = config.plugins.RemoteStreamConverter.interlaced.value
								args = "?bitrate=%s?width=%s?height=%s?aspectratio=%s?interlaced=%s:" % (bitrate, width, height, aspectratio, interlaced)
								
								out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + "%3A" + args + service_ref.getServiceName() + '\n' 
							else:
								out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName() + '\n'
						else:
							out = line
						fp.write(out)
				except:
					pass
				fp.close()
			self.readIndex += 1
			if self.readIndex == len(self.workList):
				break
		self.removeFiles(DIR_TMP, "userbouquet.")
Exemple #54
0
	def buildEPGSearchEntry(self, service, eventId, beginTime, duration, EventName):
		rec1 = self.getClockTypesForEntry(service, eventId, beginTime, duration)
		# Partnerbox
		if PartnerBoxIconsEnabled:
			rec2 = beginTime and isInRemoteTimer(self, beginTime, duration, service)
		else:
			rec2 = False
		r1 = self.weekday_rect
		r2 = self.datetime_rect
		r3 = self.descr_rect
		dx = self.piconSize[0] + self.piconDistance
		nowTime = int(time())
		remaining = ""
		if beginTime is not None:
			if nowTime < beginTime:
				remaining = _(" (%d min)") % (duration / 60)
			else:
				prefix = "+"
				total = ((beginTime+duration) - nowTime) / 60
				if total <= 0:
					prefix = ""
				remaining = _(" (%s%d min)") % (prefix, total)
		t = localtime(beginTime)
		serviceref = ServiceReference(service) # for Servicename
		if config.plugins.epgsearch.picons.value:
			if getPiconsName:
				picon = getPiconName(service)
			else:
				picon = self.findPicon(service)
			if picon != "":
				self.picon.setPara((self.piconSize[0], self.piconSize[1], 1, 1, False, 1, '#000f0f0f'))
				self.picon.startDecode(picon, 0, 0, False)
				png = self.picon.getData()
				dy = int((self.height - self.piconSize[1])/2.)
				res = [
					None, # no private data needed
					(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r1.left(), r1.top()+ dy, self.piconSize[0], self.piconSize[1], png),
					(eListboxPythonMultiContent.TYPE_TEXT, r1.left() + dx, r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]),
					(eListboxPythonMultiContent.TYPE_TEXT, r2.left() + dx, r2.top(), r2.width(), r1.height(), 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4]))
				]
			else:
				res = [
					None, # no private data needed
					(eListboxPythonMultiContent.TYPE_TEXT, r1.left() + dx, r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]),
					(eListboxPythonMultiContent.TYPE_TEXT, r2.left() + dx, r2.top(), r2.width(), r1.height(), 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4]))
				]
		else:
			res = [
				None, # no private data needed
				(eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]),
				(eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4]))
			]
		if config.plugins.epgsearch.picons.value:
			if rec1 or rec2:
				if rec1:
					clock_types = rec1
					# maybe Partnerbox too
					if rec2:
						if PartnerBoxZapRepIcons:
							clock_pic_partnerbox = getRemoteClockZapPixmap(self, service, beginTime, duration, eventId)
						else:
							clock_pic_partnerbox = getRemoteClockPixmap(self, service, beginTime, duration, eventId)
				else:
					if PartnerBoxZapRepIcons:
						clock_pic = getRemoteClockZapPixmap(self, service, beginTime, duration, eventId)
					else:
						clock_pic = getRemoteClockPixmap(self, service, beginTime, duration, eventId)
				if rec1 and rec2:
					# Partnerbox and local
					for i in range(len(clock_types)):
						res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + i * self.space + dx, r3.top() + self.dy, self.iconSize, self.iconSize, self.clocks[clock_types[i]]))
					res.extend((
						(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + (i + 1) * self.space + dx, r3.top() + self.dy, self.iconSize, self.iconSize, clock_pic_partnerbox),
						(eListboxPythonMultiContent.TYPE_TEXT, r3.left() + (i + 1) * self.space + self.pboxDistance + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining)))
				else:
					if rec1:
						for i in range(len(clock_types)):
							res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + i * self.space + dx, r3.top() + self.dy, self.iconSize, self.iconSize, self.clocks[clock_types[i]]))
						res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + (i + 1) * self.space + dx + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining))
					else:
						res.extend((
						(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + dx, r3.top() + self.dy, self.iconSize, self.iconSize, clock_pic),
						(eListboxPythonMultiContent.TYPE_TEXT, r3.left() + self.pboxDistance + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining)))
			else:
				res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + dx, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining))
		else:
			if rec1 or rec2:
				if rec1:
					clock_types = rec1
					# maybe Partnerbox too
					if rec2:
						if PartnerBoxZapRepIcons:
							clock_pic_partnerbox = getRemoteClockZapPixmap(self, service, beginTime, duration, eventId)
						else:
							clock_pic_partnerbox = getRemoteClockPixmap(self, service, beginTime, duration, eventId)
				else:
					if PartnerBoxZapRepIcons:
						clock_pic = getRemoteClockZapPixmap(self, service, beginTime, duration, eventId)
					else:
						clock_pic = getRemoteClockPixmap(self, service, beginTime, duration, eventId)
				if rec1 and rec2:
					# Partnerbox and local
					for i in range(len(clock_types)):
						res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + i * self.space, r3.top() + self.dy, self.iconSize, self.iconSize, self.clocks[clock_types[i]]))
					res.extend((
						(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + (i + 1) * self.space, r3.top() + self.dy, self.iconSize, self.iconSize, clock_pic_partnerbox),
						(eListboxPythonMultiContent.TYPE_TEXT, r3.left() + (i + 1) * self.space + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining)))
				else:
					if rec1:
						for i in range(len(clock_types)):
							res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left() + i * self.iconSize, r3.top() + self.dy, self.iconSize, self.iconSize, self.clocks[clock_types[i]]))
						res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + (i + 1) * self.space + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining))
					else:
						res.extend((
						(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top() + self.dy, self.iconSize, self.iconSize, clock_pic),
						(eListboxPythonMultiContent.TYPE_TEXT, r3.left() + self.space + self.nextIcon, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining)))
			else:
				res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left(), r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceref.getServiceName() + ": " + EventName + remaining))
		return res
def buildConfig(defaultTimer, timers, webif=False):
    # Generate List in RAM
    list = [
        '<?xml version="1.0" ?>\n<autotimer version="', CURRENT_CONFIG_VERSION,
        '">\n\n'
    ]
    append = list.append
    extend = list.extend
    defaultEncoding = getDefaultEncoding()

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

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

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

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

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

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

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

        if defaultTimer.getAvoidDuplicateDescription() > 0:
            if defaultTimer.searchForDuplicateDescription != 2:
                extend((' searchForDuplicateDescription="',
                        str(defaultTimer.searchForDuplicateDescription), '"'))
            if defaultTimer.descShortEqualExt:
                append(' descShortEqualExt="yes"')
            if defaultTimer.descShortExtEmpty:
                append(' descShortExtEmpty="yes"')
            if defaultTimer.ratioThresholdDuplicate != 0.8:
                extend((' ratioThresholdDuplicate="',
                        str(defaultTimer.ratioThresholdDuplicate), '"'))

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

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

    # SearchType
    if defaultTimer.searchType != "partial":
        extend((' searchType="', str(defaultTimer.searchType), '"'))

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

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

    # Only add seriesplugin related entry if true
    if defaultTimer.series_labeling:
        append(' series_labeling="yes"')
        if defaultTimer.series_save_filter:
            append(' series_save_filter="yes"')

    # Only add conflict detection related entry if False
    if not defaultTimer.conflict_detection:
        append(' conflict_detection="no"')

    # Only add always zap related entry if true
    if defaultTimer.always_zap:
        append(' always_zap="1"')

    # Only add zap wakeup entry if justplay is true
    if defaultTimer.justplay:
        extend((' zap_wakeup="', str(defaultTimer.zap_wakeup), '"'))

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

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

        # Bouquets
        for bouquet in defaultTimer.bouquets:
            ref = ServiceReference(str(bouquet))
            extend((
                '  <bouquet>',
                stringToXML(str(bouquet)),
                '</bouquet>\n',
            ))

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

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

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

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

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

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

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

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

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

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

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

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

        # Duplicate Description
        if timer.getAvoidDuplicateDescription():
            extend((' avoidDuplicateDescription="',
                    str(timer.getAvoidDuplicateDescription()), '"'))
            if timer.searchForDuplicateDescription != 2:
                extend((' searchForDuplicateDescription="',
                        str(timer.searchForDuplicateDescription), '"'))
            if timer.descShortEqualExt:
                append(' descShortEqualExt="yes"')
            if timer.descShortExtEmpty:
                append(' descShortExtEmpty="yes"')
            if timer.ratioThresholdDuplicate != 0.8:
                extend((' ratioThresholdDuplicate="',
                        str(timer.ratioThresholdDuplicate), '"'))

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

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

        # SearchType
        if timer.searchType != "partial":
            extend((' searchType="', str(timer.searchType), '"'))

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

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

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

        # Only add seriesplugin related entry if true
        if timer.series_labeling:
            append(' series_labeling="yes"')
            if timer.series_save_filter:
                append(' series_save_filter="yes"')

        # Only add conflict detection related entry if False
        if not timer.conflict_detection:
            append(' conflict_detection="no"')

        # Only add always zap related entry if true
        if timer.always_zap:
            append(' always_zap="1"')

        # Only add zap wakeup entry if justplay is true
        if timer.justplay:
            extend((' zap_wakeup="', str(timer.zap_wakeup), '"'))

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

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

            # Bouquets
            for bouquet in timer.bouquets:
                ref = ServiceReference(str(bouquet))
                extend((
                    '  <bouquet>',
                    stringToXML(str(bouquet)),
                    '</bouquet>\n',
                ))

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

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

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

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

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

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

    return list
def getMovieList(rargs=None, locations=None):
    movieliste = []

    tag = None
    if rargs and "tag" in rargs.keys():
        tag = rargs["tag"][0]

    directory = None
    if rargs and "dirname" in rargs.keys():
        directory = rargs["dirname"][0]

    fields = None
    if rargs and "fields" in rargs.keys():
        fields = rargs["fields"][0]
    else:
        fields = 'pos,size,desc'

    if directory is None:
        directory = MovieSelection.defaultMoviePath()
    else:
        directory = unquote(directory)
        try:
            directory.decode('utf-8')
        except UnicodeDecodeError:
            try:
                directory = directory.decode("cp1252").encode("utf-8")
            except UnicodeDecodeError:
                directory = directory.decode("iso-8859-1").encode("utf-8")

    if not directory:
        directory = "/media/"
    elif directory[-1] != "/":
        directory += "/"

    root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory)

    bookmarklist = [
        x for x in listdir(directory)
        if (x[0] != '.' and (isdir(join(directory, x)) or (
            islink(join(directory, x)) and exists(join(directory, x)))))
    ]
    bookmarklist.sort()

    folders = []
    folders.append(root)
    if rargs and "recursive" in rargs.keys():
        for f in bookmarklist:
            if f[-1] != "/":
                f += "/"
            ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory + f)
            folders.append(ff)

    # get all locations
    if locations is not None:
        folders = []
        for f in locations:
            if f[-1] != "/":
                f += "/"
            ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + f)
            folders.append(ff)

    if config.OpenWebif.parentalenabled.value:
        dir_is_protected = checkParentalProtection(directory)
    else:
        dir_is_protected = False

    import os

    if not dir_is_protected:
        for root in folders:
            movielist = MovieList(None)
            movielist.load(root, None)

            if tag != None:
                movielist.reload(root=root, filter_tags=[tag])
            #??? loadLength = True

            for (serviceref, info, begin, unknown) in movielist.list:
                if serviceref.flags & eServiceReference.mustDescent:
                    continue

                rtime = info.getInfo(serviceref,
                                     iServiceInformation.sTimeCreate)

                if rtime > 0:
                    t = FuzzyTime(rtime)
                    begin_string = t[0] + ", " + t[1]
                else:
                    begin_string = "undefined"

                try:
                    Len = info.getLength(serviceref)
                except:
                    Len = None

                filename = '/'.join(serviceref.toString().split("/")[1:])
                filename = '/' + filename
                if 'pos' in fields:
                    pos = getPosition(filename + '.cuts', Len)

                # get txt
                name, ext = os.path.splitext(filename)
                ext = ext.lower()

                txtdesc = ""

                if 'desc' in fields and ext != 'ts':
                    txtfile = name + '.txt'
                    if fileExists(txtfile):
                        txtlines = open(txtfile).readlines()
                        txtdesc = ""
                        for line in txtlines:
                            txtdesc += line

                if Len > 0:
                    Len = "%d:%02d" % (Len / 60, Len % 60)
                else:
                    Len = "?:??"

                sourceERef = info.getInfoString(
                    serviceref, iServiceInformation.sServiceref)
                sourceRef = ServiceReference(sourceERef)
                if 'desc' in fields:
                    event = info.getEvent(serviceref)
                    ext = event and event.getExtendedDescription() or ""
                    if ext == '' and txtdesc != '':
                        ext = txtdesc

                if 'desc' in fields:
                    desc = info.getInfoString(serviceref,
                                              iServiceInformation.sDescription)
                servicename = ServiceReference(
                    serviceref).getServiceName().replace('\xc2\x86',
                                                         '').replace(
                                                             '\xc2\x87', '')
                movie = {}
                movie['filename'] = filename
                movie['filename_stripped'] = filename.split("/")[-1]
                movie['eventname'] = servicename
                if 'desc' in fields:
                    movie['description'] = unicode(desc,
                                                   'utf_8',
                                                   errors='ignore').encode(
                                                       'utf_8', 'ignore')
                movie['begintime'] = begin_string
                movie['serviceref'] = serviceref.toString()
                movie['length'] = Len
                movie['tags'] = info.getInfoString(serviceref,
                                                   iServiceInformation.sTags)
                movie['filesize_readable'] = ''
                if 'size' in fields:
                    filename = filename.replace("'", "\'").replace("%", "\%")
                    size = 0
                    try:
                        size = os_stat(filename).st_size
                        sz = ''
                        if size > 1073741824:
                            sz = "%.2f %s" % ((size / 1073741824.), _("GB"))
                        elif size > 1048576:
                            sz = "%.2f %s" % ((size / 1048576.), _("MB"))
                        elif size > 1024:
                            sz = "%.2f %s" % ((size / 1024.), _("kB"))
                    except:
                        size = 0
                    movie['filesize'] = size
                    movie['filesize_readable'] = sz
                movie['fullname'] = serviceref.toString()
                if 'desc' in fields:
                    movie['descriptionExtended'] = unicode(
                        ext, 'utf_8',
                        errors='ignore').encode('utf_8', 'ignore')
                movie['servicename'] = sourceRef.getServiceName().replace(
                    '\xc2\x86', '').replace('\xc2\x87', '')
                movie['recordingtime'] = rtime
                if 'pos' in fields:
                    movie['lastseen'] = pos
                movieliste.append(movie)

    if locations == None:
        ml = {
            "movies": movieliste,
            "bookmarks": bookmarklist,
            "directory": directory
        }
    else:
        ml = {"movies": movieliste, "locations": locations}
    return ml
Exemple #57
0
    def buildMovieListEntry(self, serviceref, info, begin, data):
        width = self.l.getItemSize().width()
        iconSize = self.iconsWidth
        space = self.spaceIconeText
        r = self.spaceRight
        pathName = serviceref.getPath()
        res = [None]

        if serviceref.flags & eServiceReference.mustDescent:
            # Directory
            # Name is full path name
            valign_center = 0
            if self.list_type == MovieList.LISTTYPE_MINIMAL:
                valign_center = RT_VALIGN_CENTER
            x = iconSize + space
            tn = self.treeDescription
            if info is None:
                # Special case: "parent"
                txt = ".."
            else:
                p = os.path.split(pathName)
                if not p[1]:
                    # if path ends in '/', p is blank.
                    p = os.path.split(p[0])
                txt = p[1]
                if txt == ".Trash":
                    res.append(
                        MultiContentEntryPixmapAlphaTest(
                            pos=(0, self.trashShift),
                            size=(iconSize, self.iconTrash.size().height()),
                            png=self.iconTrash))
                    res.append(
                        MultiContentEntryText(
                            pos=(x, 0),
                            size=(width - x - tn - r, self.itemHeight),
                            font=0,
                            flags=RT_HALIGN_LEFT | valign_center,
                            text=_("Deleted items")))
                    res.append(
                        MultiContentEntryText(pos=(width - tn - r, 0),
                                              size=(tn, self.itemHeight),
                                              font=1,
                                              flags=RT_HALIGN_RIGHT
                                              | valign_center,
                                              text=_("Trash can")))
                    return res
            res.append(
                MultiContentEntryPixmapAlphaTest(pos=(0, self.dirShift),
                                                 size=(iconSize, iconSize),
                                                 png=self.iconFolder))
            res.append(
                MultiContentEntryText(pos=(x, 0),
                                      size=(width - x - tn - r,
                                            self.itemHeight),
                                      font=0,
                                      flags=RT_HALIGN_LEFT | valign_center,
                                      text=txt))
            res.append(
                MultiContentEntryText(pos=(width - tn - r, 0),
                                      size=(tn, self.itemHeight),
                                      font=1,
                                      flags=RT_HALIGN_RIGHT | valign_center,
                                      text=_("Directory")))
            return res
        if (data == -1) or (data is None):
            data = MovieListData()
            cur_idx = self.l.getCurrentSelectionIndex()
            x = self.list[cur_idx]  # x = ref,info,begin,...
            if config.usage.load_length_of_movies_in_moviellist.value:
                data.len = x[1].getLength(x[0])  #recalc the movie length...
            else:
                data.len = 0  #dont recalc movielist to speedup loading the list
            self.list[cur_idx] = (
                x[0], x[1], x[2], data
            )  #update entry in list... so next time we don't need to recalc
            data.txt = info.getName(serviceref)
            if config.movielist.hide_extensions.value:
                fileName, fileExtension = os.path.splitext(data.txt)
                if fileExtension in KNOWN_EXTENSIONS:
                    data.txt = fileName
            data.icon = None
            data.part = None
            if os.path.split(pathName)[1] in self.runningTimers:
                if self.playInBackground and serviceref == self.playInBackground:
                    data.icon = self.iconMoviePlayRec
                else:
                    data.icon = self.iconMovieRec
            elif self.playInBackground and serviceref == self.playInBackground:
                data.icon = self.iconMoviePlay
            else:
                switch = config.usage.show_icons_in_movielist.value
                data.part = moviePlayState(pathName + '.cuts', serviceref,
                                           data.len)
                if switch == 'i':
                    if data.part is None:
                        if config.usage.movielist_unseen.value:
                            data.icon = self.iconUnwatched
                    else:
                        data.icon = self.iconPart[data.part // 25]
                elif switch == 'p' or switch == 's':
                    if data.part is None:
                        if config.usage.movielist_unseen.value:
                            data.part = 0
                        data.partcol = 0x808080
                    else:
                        data.partcol = 0xf0f0f0
            service = ServiceReference(
                info.getInfoString(serviceref,
                                   iServiceInformation.sServiceref))
            if service is None:
                data.serviceName = None
            else:
                data.serviceName = service.getServiceName()
            data.description = info.getInfoString(
                serviceref, iServiceInformation.sDescription)

        len = data.len
        if len > 0:
            len = "%d:%02d" % (len / 60, len % 60)
        else:
            len = ""

        if data.icon is not None:
            if self.list_type in (MovieList.LISTTYPE_COMPACT_DESCRIPTION,
                                  MovieList.LISTTYPE_COMPACT):
                pos = (0, self.partIconeShiftCompact)
            elif self.list_type == MovieList.LISTTYPE_ORIGINAL:
                pos = (0, self.partIconeShiftOriginal)
            else:
                pos = (0, self.partIconeShiftMinimal)
            res.append(
                MultiContentEntryPixmapAlphaTest(
                    pos=pos,
                    size=(iconSize, data.icon.size().height()),
                    png=data.icon))
        switch = config.usage.show_icons_in_movielist.value
        if switch in ('p', 's'):
            if switch == 'p':
                iconSize = self.pbarLargeWidth
            if data.part is not None:
                res.append(
                    MultiContentEntryProgress(pos=(0, self.pbarShift),
                                              size=(iconSize, self.pbarHeight),
                                              percent=data.part,
                                              borderWidth=2,
                                              foreColor=data.partcol,
                                              foreColorSelected=None,
                                              backColor=None,
                                              backColorSelected=None))
        elif switch == 'i':
            pass
        else:
            iconSize = 0

        begin_string = ""
        if begin > 0:
            begin_string = ', '.join(FuzzyTime(begin, inPast=True))

        ih = self.itemHeight
        if self.list_type == MovieList.LISTTYPE_ORIGINAL:
            fc, sc = self.columnsOriginal[0], self.columnsOriginal[1]
            ih1 = (ih * 2) / 5  # 75 -> 30
            ih2 = (ih * 2) / 3  # 75 -> 50
            res.append(
                MultiContentEntryText(pos=(iconSize + space, 0),
                                      size=(width - fc - r, ih1),
                                      font=0,
                                      flags=RT_HALIGN_LEFT,
                                      text=data.txt))
            if self.tags:
                res.append(
                    MultiContentEntryText(pos=(width - fc - r, 0),
                                          size=(fc, ih1),
                                          font=2,
                                          flags=RT_HALIGN_RIGHT,
                                          text=info.getInfoString(
                                              serviceref,
                                              iServiceInformation.sTags)))
                if data.serviceName:
                    res.append(
                        MultiContentEntryText(pos=(sc - r, ih2),
                                              size=(sc, ih2 - ih1),
                                              font=1,
                                              flags=RT_HALIGN_LEFT,
                                              text=data.serviceName))
            else:
                if data.serviceName:
                    res.append(
                        MultiContentEntryText(pos=(width - fc - r, 0),
                                              size=(fc, ih1),
                                              font=2,
                                              flags=RT_HALIGN_RIGHT,
                                              text=data.serviceName))
            res.append(
                MultiContentEntryText(pos=(0, ih1),
                                      size=(width - r, ih2 - ih1),
                                      font=1,
                                      flags=RT_HALIGN_LEFT,
                                      text=data.description))
            res.append(
                MultiContentEntryText(pos=(0, ih2),
                                      size=(sc - r, ih - ih2),
                                      font=1,
                                      flags=RT_HALIGN_LEFT,
                                      text=begin_string))
            if len:
                res.append(
                    MultiContentEntryText(pos=(width - sc - r, ih2),
                                          size=(sc, ih - ih2),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=len))
        elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION:
            ih1 = ((ih * 8) + 14) / 15  # 37 -> 20, round up
            if len:
                lenSize = 58 * ih / 37
            else:
                lenSize = 0
            fc, sc, tc = self.columnsCompactDescription[
                0], self.columnsCompactDescription[
                    1], self.columnsCompactDescription[2]
            res.append(
                MultiContentEntryText(pos=(iconSize + space, 0),
                                      size=(width - sc - r, ih1),
                                      font=0,
                                      flags=RT_HALIGN_LEFT,
                                      text=data.txt))
            res.append(
                MultiContentEntryText(pos=(0, ih1),
                                      size=(width - tc - lenSize - r,
                                            ih - ih1),
                                      font=1,
                                      flags=RT_HALIGN_LEFT,
                                      text=data.description))
            res.append(
                MultiContentEntryText(pos=(width - fc - r, 0),
                                      size=(fc, ih1),
                                      font=1,
                                      flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER,
                                      text=begin_string))
            if data.serviceName:
                res.append(
                    MultiContentEntryText(pos=(width - tc - lenSize - r, ih1),
                                          size=(tc, ih - ih1),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=data.serviceName))
            if lenSize:
                res.append(
                    MultiContentEntryText(pos=(width - lenSize - r, ih1),
                                          size=(lenSize, ih - ih1),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=len))
        elif self.list_type == MovieList.LISTTYPE_COMPACT:
            col = self.compactColumn
            ih1 = ((ih * 8) + 14) / 15  # 37 -> 20, round up
            if len:
                lenSize = 2 * ih
            else:
                lenSize = 0
            res.append(
                MultiContentEntryText(pos=(iconSize + space, 0),
                                      size=(width - lenSize - iconSize -
                                            space - r, ih1),
                                      font=0,
                                      flags=RT_HALIGN_LEFT,
                                      text=data.txt))
            if self.tags:
                res.append(
                    MultiContentEntryText(pos=(width - col - r, ih1),
                                          size=(col, ih - ih1),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT,
                                          text=info.getInfoString(
                                              serviceref,
                                              iServiceInformation.sTags)))
                if data.serviceName:
                    res.append(
                        MultiContentEntryText(pos=(col, ih1),
                                              size=(col, ih - ih1),
                                              font=1,
                                              flags=RT_HALIGN_LEFT,
                                              text=data.serviceName))
            else:
                if data.serviceName:
                    res.append(
                        MultiContentEntryText(pos=(width - col - r, ih1),
                                              size=(col, ih - ih1),
                                              font=1,
                                              flags=RT_HALIGN_RIGHT,
                                              text=data.serviceName))
            res.append(
                MultiContentEntryText(pos=(0, ih1),
                                      size=(col, ih - ih1),
                                      font=1,
                                      flags=RT_HALIGN_LEFT,
                                      text=begin_string))
            if lenSize:
                res.append(
                    MultiContentEntryText(pos=(width - lenSize - r, 0),
                                          size=(lenSize, ih1),
                                          font=0,
                                          flags=RT_HALIGN_RIGHT,
                                          text=len))
        else:
            if (self.descr_state == MovieList.SHOW_DESCRIPTION) or not len:
                dateSize = ih * 145 / 25  # 25 -> 145
                res.append(
                    MultiContentEntryText(
                        pos=(iconSize + space, 0),
                        size=(width - iconSize - space - dateSize - r, ih),
                        font=0,
                        flags=RT_HALIGN_LEFT | RT_VALIGN_CENTER,
                        text=data.txt))
                res.append(
                    MultiContentEntryText(pos=(width - dateSize - r, 2),
                                          size=(dateSize, ih),
                                          font=1,
                                          flags=RT_HALIGN_RIGHT
                                          | RT_VALIGN_CENTER,
                                          text=begin_string))
            else:
                lenSize = ih * 3  # 25 -> 75
                res.append(
                    MultiContentEntryText(pos=(iconSize + space, 0),
                                          size=(width - lenSize - iconSize -
                                                space - r, ih),
                                          font=0,
                                          flags=RT_HALIGN_LEFT,
                                          text=data.txt))
                res.append(
                    MultiContentEntryText(pos=(width - lenSize - r, 0),
                                          size=(lenSize, ih),
                                          font=0,
                                          flags=RT_HALIGN_RIGHT,
                                          text=len))
        return res
def getMovieList(directory=None, tag=None, rargs=None):
    movieliste = []

    if directory == None:
        directory = config.usage.default_path.value

    if directory[-1] != "/":
        directory += "/"

    root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory)

    bookmarklist = [
        x for x in walk(directory).next()[1]
        if (x[0] != '.' and not islink(directory + '/' + x))
    ]
    bookmarklist.sort()

    folders = []
    folders.append(root)
    if rargs and "recursive" in rargs.keys():
        for f in bookmarklist:
            if f[-1] != "/":
                f += "/"
            ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory + f)
            folders.append(ff)

    #??? tagfilter = []

    for root in folders:

        movielist = MovieList(None)
        movielist.load(root, None)

        if tag != None:
            movielist.reload(root=root, filter_tags=[tag])
        #??? loadLength = True

        for (serviceref, info, begin, unknown) in movielist.list:
            if serviceref.flags & eServiceReference.mustDescent:
                continue

            rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate)

            if rtime > 0:
                t = FuzzyTime(rtime)
                begin_string = t[0] + ", " + t[1]
            else:
                begin_string = "undefined"

            try:
                Len = info.getLength(serviceref)
            except:
                Len = None

            if Len > 0:
                Len = "%d:%02d" % (Len / 60, Len % 60)
            else:
                Len = "?:??"

            sourceERef = info.getInfoString(serviceref,
                                            iServiceInformation.sServiceref)
            sourceRef = ServiceReference(sourceERef)

            event = info.getEvent(serviceref)
            ext = event and event.getExtendedDescription() or ""

            filename = '/'.join(serviceref.toString().split("/")[1:])
            servicename = ServiceReference(
                serviceref).getServiceName().replace('\xc2\x86', '').replace(
                    '\xc2\x87', '')
            movie = {}
            filename = '/' + filename
            movie['filename'] = filename
            movie['filename_stripped'] = filename.split("/")[-1]
            movie['eventname'] = servicename
            movie['description'] = info.getInfoString(
                serviceref, iServiceInformation.sDescription)
            movie['begintime'] = begin_string
            movie['serviceref'] = serviceref.toString()
            movie['length'] = Len
            movie['tags'] = info.getInfoString(serviceref,
                                               iServiceInformation.sTags)
            filename = filename.replace("'", "\'").replace("%", "\%")
            try:
                movie['filesize'] = os_stat(filename).st_size
            except:
                movie['filesize'] = 0
            movie['fullname'] = serviceref.toString()
            movie['descriptionExtended'] = ext
            movie['servicename'] = sourceRef.getServiceName().replace(
                '\xc2\x86', '').replace('\xc2\x87', '')
            movie['recordingtime'] = rtime

            movieliste.append(movie)

    ml = {
        "movies": movieliste,
        "bookmarks": bookmarklist,
        "directory": directory
    }

    if rargs and "zip" in rargs.keys():
        filename = rargs["zip"][0]
        import os
        if not os.path.exists(os.path.dirname(filename)):
            return {"result": False, "message": "zip file path not exist"}
        try:
            import json
            fd = open(filename, 'wb')
            #todo create zip using api
            #fd = gzip.GzipFile(filename=filename, mode='wb', compresslevel=9)
            fd.write(json.dumps(ml))
            fd.close()
            try:
                os.remove('%s.gz' % filename)
            except OSError:
                pass
            os.system('gzip %s' % filename)
        except (IOError, os.error), why:
            return {
                "result": False,
                "message": "create movielist zip error:%s" % why
            }
        return {"result": True, "message": "create movielist zip success"}
Exemple #59
0
class RecordTimerEntry(timer.TimerEntry, object):
    ######### the following static methods and members are only in use when the box is in (soft) standby
    wasInStandby = False
    wasInDeepStandby = False
    receiveRecordEvents = False

    @staticmethod
    def keypress(key=None, flag=1):
        if flag and (RecordTimerEntry.wasInStandby
                     or RecordTimerEntry.wasInDeepStandby):
            RecordTimerEntry.wasInStandby = False
            RecordTimerEntry.wasInDeepStandby = False
            eActionMap.getInstance().unbindAction('',
                                                  RecordTimerEntry.keypress)

    @staticmethod
    def setWasInDeepStandby():
        RecordTimerEntry.wasInDeepStandby = True
        eActionMap.getInstance().bindAction('', -maxint - 1,
                                            RecordTimerEntry.keypress)

    @staticmethod
    def setWasInStandby():
        if not RecordTimerEntry.wasInStandby:
            if not RecordTimerEntry.wasInDeepStandby:
                eActionMap.getInstance().bindAction('', -maxint - 1,
                                                    RecordTimerEntry.keypress)
            RecordTimerEntry.wasInDeepStandby = False
            RecordTimerEntry.wasInStandby = True

    @staticmethod
    def shutdown():
        quitMainloop(1)

    @staticmethod
    def staticGotRecordEvent(recservice, event):
        if event == iRecordableService.evEnd:
            print "RecordTimer.staticGotRecordEvent(iRecordableService.evEnd)"
            if not checkForRecordings():
                print "No recordings busy of sceduled within 6 minutes so shutdown"
                RecordTimerEntry.shutdown()  # immediate shutdown
        elif event == iRecordableService.evStart:
            print "RecordTimer.staticGotRecordEvent(iRecordableService.evStart)"

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

    @staticmethod
    def TryQuitMainloop():
        if not RecordTimerEntry.receiveRecordEvents and Screens.Standby.inStandby:
            print "RecordTimer.TryQuitMainloop"
            NavigationInstance.instance.record_event.append(
                RecordTimerEntry.staticGotRecordEvent)
            RecordTimerEntry.receiveRecordEvents = True
            # send fake event.. to check if another recordings are running or
            # other timers start in a few seconds
            RecordTimerEntry.staticGotRecordEvent(None,
                                                  iRecordableService.evEnd)


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

    def __init__(self,
                 serviceref,
                 begin,
                 end,
                 name,
                 description,
                 eit,
                 disabled=False,
                 justplay=False,
                 afterEvent=AFTEREVENT.AUTO,
                 checkOldTimers=False,
                 dirname=None,
                 tags=None,
                 descramble=True,
                 record_ecm=False,
                 always_zap=False,
                 zap_wakeup="always",
                 rename_repeat=True):
        timer.TimerEntry.__init__(self, int(begin), int(end))

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

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

        assert isinstance(serviceref, ServiceReference)

        if serviceref and serviceref.isRecordable():
            self.service_ref = serviceref
        else:
            self.service_ref = ServiceReference(None)
        self.eit = eit
        self.dontSave = False
        self.name = name
        self.description = description
        self.disabled = disabled
        self.timer = None
        self.__record_service = None
        self.start_prepare = 0
        self.justplay = justplay
        self.always_zap = always_zap
        self.zap_wakeup = zap_wakeup
        self.afterEvent = afterEvent
        self.dirname = dirname
        self.dirnameHadToFallback = False
        self.autoincrease = False
        self.autoincreasetime = 3600 * 24  # 1 day
        self.tags = tags or []
        self.descramble = descramble
        self.record_ecm = record_ecm
        self.rename_repeat = rename_repeat
        self.needChangePriorityFrontend = config.usage.recording_frontend_priority.value != "-2" and config.usage.recording_frontend_priority.value != config.usage.frontend_priority.value
        self.change_frontend = False
        self.log_entries = []
        self.resetState()

    def __repr__(self):
        return "RecordTimerEntry(name=%s, begin=%s, serviceref=%s, justplay=%s)" % (
            self.name, ctime(self.begin), self.service_ref, self.justplay)

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

    def calculateFilename(self, name=None):
        service_name = self.service_ref.getServiceName()
        begin_date = strftime("%Y%m%d %H%M", localtime(self.begin))
        name = name or self.name
        filename = begin_date + " - " + service_name
        if name:
            if config.recording.filename_composition.value == "short":
                filename = strftime("%Y%m%d", localtime(
                    self.begin)) + " - " + name
            elif config.recording.filename_composition.value == "long":
                filename += " - " + name + " - " + self.description
            else:
                filename += " - " + name  # standard

        if config.recording.ascii_filenames.value:
            filename = ASCIItranslit.legacyEncode(filename)
        if not self.dirname:
            dirname = findSafeRecordPath(defaultMoviePath())
        else:
            dirname = findSafeRecordPath(self.dirname)
            if dirname is None:
                dirname = findSafeRecordPath(defaultMoviePath())
                self.dirnameHadToFallback = True
        if not dirname:
            return None
        self.Filename = Directories.getRecordingFilename(filename, dirname)
        self.log(0, "Filename calculated as: '%s'" % self.Filename)
        return self.Filename

    def tryPrepare(self):
        if self.justplay:
            return True
        else:
            if not self.calculateFilename():
                self.do_backoff()
                self.start_prepare = time() + self.backoff
                return False
            rec_ref = self.service_ref and self.service_ref.ref
            if rec_ref and rec_ref.flags & eServiceReference.isGroup:
                rec_ref = getBestPlayableServiceReference(
                    rec_ref, eServiceReference())
                if not rec_ref:
                    self.log(
                        1,
                        "'get best playable service for group... record' failed"
                    )
                    return False
            self.setRecordingPreferredTuner()
            self.record_service = rec_ref and NavigationInstance.instance.recordService(
                rec_ref)

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

            name = self.name
            description = self.description
            if self.repeated:
                epgcache = eEPGCache.getInstance()
                queryTime = self.begin + (self.end - self.begin) / 2
                evt = epgcache.lookupEventTime(rec_ref, queryTime)
                if evt:
                    if self.rename_repeat:
                        event_description = evt.getShortDescription()
                        if not event_description:
                            event_description = evt.getExtendedDescription()
                        if event_description and event_description != description:
                            description = event_description
                        event_name = evt.getEventName()
                        if event_name and event_name != name:
                            name = event_name
                            if not self.calculateFilename(event_name):
                                self.do_backoff()
                                self.start_prepare = time() + self.backoff
                                return False
                    event_id = evt.getEventId()
                else:
                    event_id = -1
            else:
                event_id = self.eit
                if event_id is None:
                    event_id = -1

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

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

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

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

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

        if next_state == 1:
            if self.always_zap:
                if Screens.Standby.inStandby:
                    self.log(5, "wakeup and zap to recording service")
                    RecordTimerEntry.setWasInStandby()
                    #set service to zap after standby
                    Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
                    Screens.Standby.inStandby.paused_service = None
                    #wakeup standby
                    Screens.Standby.inStandby.Power()
                else:
                    if RecordTimerEntry.wasInDeepStandby:
                        RecordTimerEntry.setWasInStandby()
                    cur_zap_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference(
                    )
                    if cur_zap_ref and not cur_zap_ref.getPath(
                    ):  # we do not zap away if it is no live service
                        Notifications.AddNotification(
                            MessageBox,
                            _("In order to record a timer, the TV was switched to the recording service!\n"
                              ),
                            type=MessageBox.TYPE_INFO,
                            timeout=20)
                        self.setRecordingPreferredTuner()
                        self.failureCB(True)
                        self.log(5, "zap to recording service")

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

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

        elif next_state == self.StateRunning:
            # if this timer has been cancelled, just go to "end" state.
            if self.cancelled:
                return True
            if self.justplay:
                if Screens.Standby.inStandby:
                    if RecordTimerEntry.wasInDeepStandby and self.zap_wakeup in (
                            "always", "from_deep_standby"
                    ) or self.zap_wakeup in ("always", "from_standby"):
                        self.log(11, "wakeup and zap")
                        RecordTimerEntry.setWasInStandby()
                        #set service to zap after standby
                        Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
                        Screens.Standby.inStandby.paused_service = None
                        #wakeup standby
                        Screens.Standby.inStandby.Power()
                else:
                    if RecordTimerEntry.wasInDeepStandby:
                        RecordTimerEntry.setWasInStandby()
                    self.log(11, "zapping")
                    NavigationInstance.instance.playService(
                        self.service_ref.ref)
                return True
            else:
                self.log(11, "start recording")

                if RecordTimerEntry.wasInDeepStandby:
                    RecordTimerEntry.keypress()
                    if Screens.Standby.inStandby:  #In case some plugin did put the receiver already in standby
                        config.misc.standbyCounter.value = 0
                    else:
                        Notifications.AddNotification(
                            Screens.Standby.Standby,
                            StandbyCounterIncrease=False)
                record_res = self.record_service.start()
                self.setRecordingPreferredTuner(setdefault=True)
                if record_res:
                    self.log(13, "start record returned %d" % record_res)
                    self.do_backoff()
                    # retry
                    self.begin = time() + self.backoff
                    return False

                # Tell the trashcan we started recording. The trashcan gets events,
                # but cannot tell what the associated path is.
                Trashcan.instance.markDirty(self.Filename)

                return True
Exemple #60
0
def getMovieList(directory=None, tag=None, rargs=None, locations=None):
    movieliste = []

    if directory is None:
        directory = MovieSelection.defaultMoviePath()
    if not directory:
        directory = "/media/"
    elif directory[-1] != "/":
        directory += "/"

    root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory)

    bookmarklist = [
        x for x in listdir(directory)
        if (x[0] != '.' and (isdir(join(directory, x)) or (
            islink(join(directory, x)) and exists(join(directory, x)))))
    ]
    bookmarklist.sort()

    folders = []
    folders.append(root)
    if rargs and "recursive" in rargs.keys():
        for f in bookmarklist:
            if f[-1] != "/":
                f += "/"
            ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory + f)
            folders.append(ff)

    # get all locations
    if locations is not None:
        folders = []
        for f in locations:
            if f[-1] != "/":
                f += "/"
            ff = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + f)
            folders.append(ff)

    if config.ModernWebif.parentalenabled.value:
        dir_is_protected = checkParentalProtection(directory)
    else:
        dir_is_protected = False

    import os

    if not dir_is_protected:
        for root in folders:
            movielist = MovieList(None)
            movielist.load(root, None)

            if tag != None:
                movielist.reload(root=root, filter_tags=[tag])
            #??? loadLength = True

            for (serviceref, info, begin, unknown) in movielist.list:
                if serviceref.flags & eServiceReference.mustDescent:
                    continue

                rtime = info.getInfo(serviceref,
                                     iServiceInformation.sTimeCreate)

                if rtime > 0:
                    t = FuzzyTime(rtime)
                    begin_string = t[0] + ", " + t[1]
                else:
                    begin_string = "undefined"

                try:
                    Len = info.getLength(serviceref)
                except:
                    Len = None

                filename = '/'.join(serviceref.toString().split("/")[1:])
                filename = '/' + filename
                pos = getPosition(filename + '.cuts', Len)

                # get txt
                name, ext = os.path.splitext(filename)
                ext = ext.lower()

                txtdesc = ""

                if ext != 'ts':
                    txtfile = name + '.txt'
                    if fileExists(txtfile):
                        txtlines = open(txtfile).readlines()
                        txtdesc = ""
                        for line in txtlines:
                            txtdesc += line

                if Len > 0:
                    Len = "%d:%02d" % (Len / 60, Len % 60)
                else:
                    Len = "?:??"

                sourceERef = info.getInfoString(
                    serviceref, iServiceInformation.sServiceref)
                sourceRef = ServiceReference(sourceERef)
                event = info.getEvent(serviceref)
                ext = event and event.getExtendedDescription() or ""

                if ext == '' and txtdesc != '':
                    ext = txtdesc

                servicename = ServiceReference(
                    serviceref).getServiceName().replace('\xc2\x86',
                                                         '').replace(
                                                             '\xc2\x87', '')
                movie = {}
                movie['filename'] = filename
                movie['filename_stripped'] = filename.split("/")[-1]
                movie['eventname'] = servicename
                movie['description'] = info.getInfoString(
                    serviceref, iServiceInformation.sDescription)
                movie['begintime'] = begin_string
                movie['serviceref'] = serviceref.toString()
                movie['length'] = Len
                movie['tags'] = info.getInfoString(serviceref,
                                                   iServiceInformation.sTags)
                filename = filename.replace("'", "\'").replace("%", "\%")
                try:
                    movie['filesize'] = os_stat(filename).st_size
                except:
                    movie['filesize'] = 0
                movie['fullname'] = serviceref.toString()
                movie['descriptionExtended'] = ext
                movie['servicename'] = sourceRef.getServiceName().replace(
                    '\xc2\x86', '').replace('\xc2\x87', '')
                movie['recordingtime'] = rtime
                movie['lastseen'] = pos
                movieliste.append(movie)

    if locations == None:
        ml = {
            "movies": movieliste,
            "bookmarks": bookmarklist,
            "directory": directory
        }
    else:
        ml = {"movies": movieliste, "locations": locations}
    return ml