Example #1
0
class CryptoInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)

        self.active = False
        if int(config.usage.show_cryptoinfo.value) > 0:
            self.visible = True
        else:
            self.visible = False
        self.textvalue = ""
        self.poll_interval = 1000
        self.poll_enabled = True
        self.ecmdata = GetEcmInfo()

    @cached
    def getText(self):
        if int(config.usage.show_cryptoinfo.value) < 1:
            self.visible = False
            return ""
        self.visible = True
        data = self.ecmdata.getEcmData()
        return data[0]

    text = property(getText)
Example #2
0
class CryptoInfo(Poll, Converter, object):
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)

		self.type = type
		self.active = False
		self.visible = config.usage.show_cryptoinfo.value
		self.textvalue = ""
		self.poll_interval = 1000
		self.poll_enabled = True
		self.ecmdata = GetEcmInfo()
		
	@cached
	def getText(self):
		if not config.usage.show_cryptoinfo.value:
			self.visible = False
			data = ''
		else:
			self.visible = True
			if self.type == "VerboseInfo":
				data = self.ecmdata.getEcmData()[0]
			else:
				data = self.ecmdata.getInfo(self.type)
		return data
	text = property(getText)
Example #3
0
class CryptoInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)

        self.type = type
        self.active = False
        if int(config.usage.show_cryptoinfo.value) > 0:
            self.visible = True
        else:
            self.visible = False
        self.textvalue = ""
        self.poll_interval = 1000
        self.poll_enabled = True
        self.ecmdata = GetEcmInfo()

    @cached
    def getText(self):
        if int(config.usage.show_cryptoinfo.value) < 1:
            self.visible = False
            data = ''
        else:
            self.visible = True
            if self.type == "VerboseInfo":
                data = self.ecmdata.getEcmData()[0]
            else:
                data = self.ecmdata.getInfo(self.type)
        return data

    text = property(getText)
Example #4
0
class CryptoInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)

        self.active = False
        if int(config.usage.show_cryptoinfo.getValue()) > 0:
            self.visible = True
        else:
            self.visible = False
        self.textvalue = ""
        self.poll_interval = 1000
        self.poll_enabled = True
        self.ecmdata = GetEcmInfo()

    @cached
    def getText(self):
        if int(config.usage.show_cryptoinfo.getValue()) < 1:
            self.visible = False
            return ''
        self.visible = True
        data = self.ecmdata.getEcmData()
        return data[0]

    text = property(getText)
class PliExtraInfo(Poll, Converter):
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = type
		self.poll_interval = 1000
		self.poll_enabled = True
		self.info_fields = {
			# Field combinations accessible from skin
			"All": (
				(  # config.usage.show_cryptoinfo.value <= 0
					"ProviderName",
					"TransponderInfo",
					"TransponderName",
					"NewLine",
					"CryptoBar",
					"CryptoCurrentSource",
					"NewLine",
					"CryptoSpecial",
					"VideoCodec",
					"ResolutionString",
				), (  # config.usage.show_cryptoinfo.value > 0
					"ProviderName",
					"TransponderInfo",
					"TransponderName",
					"NewLine",
					"CryptoBar",
					"CryptoSpecial",
					"NewLine",
					"PIDInfo",
					"VideoCodec",
					"ResolutionString",
				)
			),
			"CryptoInfo": (
				(  # config.usage.show_cryptoinfo.value <= 0
					"CryptoBar",
					"CryptoCurrentSource",
					"CryptoSpecial",
				), (  # config.usage.show_cryptoinfo.value > 0
					"CryptoBar",
					"CryptoSpecial",
				)
			),
			"ServiceInfo": (
				"ProviderName",
				"TunerSystem",
				"TransponderFrequency",
				"TransponderPolarization",
				"TransponderSymbolRate",
				"TransponderFEC",
				"TransponderModulation",
				"OrbitalPosition",
				"TransponderName",
				"VideoCodec",
				"ResolutionString",
			),
			"TransponderInfo": (
				( # not feraw
					"StreamURLInfo",
				),
				(  # feraw and "DVB-T" not in feraw.get("tuner_type", "")
					"TunerSystem",
					"TransponderFrequencyMHz",
					"TransponderPolarization",
					"TransponderSymbolRate",
					"TransponderFEC",
					"TransponderModulation",
					"OrbitalPosition",
					"TransponderInfoMisPls",
				),
				(  # feraw and "DVB-T" in feraw.get("tuner_type", "")
					"TunerSystem",
					"TerrestrialChannelNumber",
					"TransponderFrequencyMHz",
					"TransponderPolarization",
					"TransponderSymbolRate",
					"TransponderFEC",
					"TransponderModulation",
					"OrbitalPosition",
				)
			),
			"TransponderInfo2line": (
				"ProviderName",
				"TunerSystem",
				"TransponderName",
				"NewLine",
				"TransponderFrequencyMHz",
				"TransponderPolarization",
				"TransponderSymbolRate",
				"TransponderModulationFEC",
			),
			"User": (),
		}
		self.ca_table = (
			("CryptoCaidSecaAvailable", "S", False),
			("CryptoCaidViaAvailable", "V", False),
			("CryptoCaidIrdetoAvailable", "I", False),
			("CryptoCaidNDSAvailable", "Nd", False),
			("CryptoCaidConaxAvailable", "Co", False),
			("CryptoCaidCryptoWAvailable", "Cw", False),
			("CryptoCaidPowerVUAvailable", "P", False),
			("CryptoCaidBetaAvailable", "B", False),
			("CryptoCaidNagraAvailable", "N", False),
			("CryptoCaidBissAvailable", "Bi", False),
			("CryptoCaidDre3Available", "D3", False),
			("CryptoCaidDreAvailable", "D", False),
			("CryptoCaidBulCrypt1Available", "B1", False),
			("CryptoCaidBulCrypt2Available", "B2", False),
			("CryptoCaidVerimatrixAvailable", "Vm", False),
			("CryptoCaidTandbergAvailable", "TB", False),
			("CryptoCaidSecaSelected", "S", True),
			("CryptoCaidViaSelected", "V", True),
			("CryptoCaidIrdetoSelected", "I", True),
			("CryptoCaidNDSSelected", "Nd", True),
			("CryptoCaidConaxSelected", "Co", True),
			("CryptoCaidCryptoWSelected", "Cw", True),
			("CryptoCaidPowerVUSelected", "P", True),
			("CryptoCaidBetaSelected", "B", True),
			("CryptoCaidNagraSelected", "N", True),
			("CryptoCaidBissSelected", "Bi", True),
			("CryptoCaidDre3Selected", "D3", True),
			("CryptoCaidDreSelected", "D", True),
			("CryptoCaidBulCrypt1Selected", "B1", True),
			("CryptoCaidBulCrypt2Selected", "B2", True),
			("CryptoCaidVerimatrixSelected", "Vm", True),
			("CryptoCaidTandbergSelected", "TB", True),
		)
		self.type = self.type.split(',')
		if self.type[0] == "User":
			self.info_fields[self.type[0]] = tuple(self.type[1:])
		self.type = self.type[0]
		self.ecmdata = GetEcmInfo()
		self.feraw = self.fedata = self.updateFEdata = None
		self.recursionCheck = set()

	def getCryptoInfo(self, info):
		if info.getInfo(iServiceInformation.sIsCrypted) == 1:
			data = self.ecmdata.getEcmData()
			self.current_source = data[0]
			self.current_caid = data[1]
			self.current_provid = data[2]
			self.current_ecmpid = data[3]
		else:
			self.current_source = ""
			self.current_caid = "0"
			self.current_provid = "0"
			self.current_ecmpid = "0"

	def createCryptoBar(self, info):
		res = ""
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		colors = parameters.get("PliExtraInfoColors", (0x0000FF00, 0x00FFFF00, 0x007F7F7F, 0x00FFFFFF)) # "found", "not found", "available", "default" colors

		for caid_entry in caid_data:
			if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
				color = "\c%08x" % colors[0] # green
			else:
				color = "\c%08x" % colors[2] # grey
				try:
					for caid in available_caids:
						if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
							color = "\c%08x" % colors[1] # yellow
				except:
					pass

			if color != "\c%08x" % colors[2] or caid_entry[4]:
				if res:
					res += " "
				res += color + caid_entry[3]

		res += "\c%08x" % colors[3] # white (this acts like a color "reset" for following strings
		return res

	def createCryptoSpecial(self, info):
		caid_name = "FTA"
		try:
			for caid_entry in caid_data:
				if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x:%04x:%04x:%04x" % (int(self.current_caid, 16), int(self.current_provid, 16), info.getInfo(iServiceInformation.sSID), int(self.current_ecmpid, 16))
		except:
			pass
		return ""

	def createResolution(self, info):
		xres = info.getInfo(iServiceInformation.sVideoWidth)
		if xres == -1:
			return ""
		yres = info.getInfo(iServiceInformation.sVideoHeight)
		mode = ("i", "p", " ")[info.getInfo(iServiceInformation.sProgressive)]
		fps = (info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000
		if not fps:
			try:
				if os.path.exists("/proc/stb/vmpeg/0/framerate"):
					print("[PliExtraInfo] Read /proc/stb/vmpeg/0/framerate")
					fps = (int(open("/proc/stb/vmpeg/0/framerate", "r").read()) + 500) / 1000
				elif os.path.exists("/proc/stb/vmpeg/0/fallback_framerate"):
					print("[PliExtraInfo] Read /proc/stb/vmpeg/0/fallback_framerate")
					fps = (int(open("/proc/stb/vmpeg/0/fallback_framerate", "r").read()) + 0) / 1000
			except:
				print("[PliExtraInfo] Read framerate failed.")
		if not mode:
			try:
				print("[PliExtraInfo] Read /proc/stb/vmpeg/0/progressive")
				mod = int(open("/proc/stb/vmpeg/0/progressive", "r").read())
				if mod == 1:
					mode = "p"
				else:
					mode = "i"
			except:
				print("[PliExtraInfo] Read /proc/stb/vmpeg/0/progressive failed.")
		return "%sx%s%s%s" % (xres, yres, mode, fps)

	def createGamma(self, info):
		return gamma_data.get(info.getInfo(iServiceInformation.sGamma), "")

	def createVideoCodec(self, info):
		return codec_data.get(info.getInfo(iServiceInformation.sVideoType), _("N/A"))

	def createPIDInfo(self, info):
		vpid = info.getInfo(iServiceInformation.sVideoPID)
		apid = info.getInfo(iServiceInformation.sAudioPID)
		pcrpid = info.getInfo(iServiceInformation.sPCRPID)
		sidpid = info.getInfo(iServiceInformation.sSID)
		tsid = info.getInfo(iServiceInformation.sTSID)
		onid = info.getInfo(iServiceInformation.sONID)
		if vpid < 0:
			vpid = 0
		if apid < 0:
			apid = 0
		if pcrpid < 0:
			pcrpid = 0
		if sidpid < 0:
			sidpid = 0
		if tsid < 0:
			tsid = 0
		if onid < 0:
			onid = 0
		return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid, pcrpid)

	def createInfoString(self, fieldGroup, fedata, feraw, info):
		if fieldGroup in self.recursionCheck:
			return _("?%s-recursive?") % fieldGroup
		self.recursionCheck.add(fieldGroup)

		fields = self.info_fields[fieldGroup]
		if fields and isinstance(fields[0], (tuple, list)):
			if fieldGroup == "TransponderInfo":
				fields = fields[feraw and int("DVB-T" in feraw.get("tuner_type", "")) + 1 or 0]
			else:
				fields = fields[int(config.usage.show_cryptoinfo.value) > 0]

		ret = ""
		vals = []
		for field in fields:
			val = None
			if field == "CryptoCurrentSource":
				self.getCryptoInfo(info)
				vals.append(self.current_source)
			elif field == "StreamURLInfo":
				val = self.createStreamURLInfo(info)
			elif field == "TransponderModulationFEC":
				val = self.createModulation(fedata) + '-' + self.createFEC(fedata, feraw)
			elif field == "TransponderName":
				val = self.createTransponderName(feraw)
			elif field == "ProviderName":
				val = self.createProviderName(info)
			elif field in ("NewLine", "NL"):
				ret += "  ".join(vals) + "\n"
				vals = []
			else:
				val = self.getTextByType(field)

			if val:
				vals.append(val)

		return ret + "  ".join(vals)

	def createStreamURLInfo(self, info):
		refstr = info.getInfoString(iServiceInformation.sServiceref)
		if "%3a//" in refstr.lower():
			return refstr.split(":")[10].replace("%3a", ":").replace("%3A", ":")
		return ""

	def createFrequency(self, feraw):
		frequency = feraw.get("frequency")
		if frequency:
			if "DVB-T" in feraw.get("tuner_type"):
				return "%d %s" % (int(frequency / 1000000. + 0.5), _("MHz"))
			else:
				return str(int(frequency / 1000 + 0.5))
		return ""

	def createChannelNumber(self, fedata, feraw):
		return "DVB-T" in feraw.get("tuner_type", "") and fedata.get("channel") or ""

	def createSymbolRate(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type", ""):
			bandwidth = fedata.get("bandwidth")
			if bandwidth:
				return bandwidth
		else:
			symbolrate = fedata.get("symbol_rate")
			if symbolrate:
				return str(symbolrate / 1000)
		return ""

	def createPolarization(self, fedata):
		return fedata.get("polarization_abbreviation") or ""

	def createFEC(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type", ""):
			code_rate_lp = fedata.get("code_rate_lp")
			code_rate_hp = fedata.get("code_rate_hp")
			guard_interval = fedata.get("guard_interval")
			if code_rate_lp and code_rate_hp and guard_interval:
				return code_rate_lp + "-" + code_rate_hp + "-" + guard_interval
		else:
			fec = fedata.get("fec_inner")
			if fec:
				return fec
		return ""

	def createModulation(self, fedata):
		if fedata.get("tuner_type") == _("Terrestrial"):
			constellation = fedata.get("constellation")
			if constellation:
				return constellation
		else:
			modulation = fedata.get("modulation")
			if modulation:
				return modulation
		return ""

	def createTunerType(self, feraw):
		return feraw.get("tuner_type") or ""

	def createTunerSystem(self, fedata):
		return fedata.get("system") or ""

	def createOrbPos(self, feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos:
			if orbpos > 1800:
				return _("%.1f° W") % ((3600 - orbpos) / 10.0)
			elif orbpos > 0:
				return _("%.1f° E") % (orbpos / 10.0)
		return ""

	def createOrbPosOrTunerSystem(self, fedata, feraw):
		orbpos = self.createOrbPos(feraw)
		if orbpos is not "":
			return orbpos
		return self.createTunerSystem(fedata)

	def createProviderName(self, info):
		return info.getInfoString(iServiceInformation.sProvider)

	def createMisPls(self, fedata):
		tmp = ""
		if fedata.get("is_id"):
			if fedata.get("is_id") > -1:
				tmp = "MIS %d" % fedata.get("is_id")
		if fedata.get("pls_code"):
			if fedata.get("pls_code") > 0:
				tmp = addspace(tmp) + "%s %d" % (fedata.get("pls_mode"), fedata.get("pls_code"))
		if fedata.get("t2mi_plp_id"):
			if fedata.get("t2mi_plp_id") > -1:
				tmp = addspace(tmp) + "T2MI %d PID %d" % (fedata.get("t2mi_plp_id"), fedata.get("t2mi_pid"))
		return tmp

	@cached
	def getText(self):
		self.recursionCheck.clear()
		return self.getTextByType(self.type)

	def getTextByType(self, textType):
		service = self.source.service
		if service is None:
			return ""
		info = service and service.info()

		if not info:
			return ""

		if textType == "CryptoBar":
			self.getCryptoInfo(info)
			return self.createCryptoBar(info)

		if textType == "CryptoSpecial":
			self.getCryptoInfo(info)
			return self.createCryptoSpecial(info)

		if textType == "Resolution":
			return self.createResolution(info)

		if textType == "ResolutionString":
			return addspace(self.createResolution(info)) + self.createGamma(info)

		if textType == "VideoCodec":
			return self.createVideoCodec(info)

		if textType == "Gamma":
			return self.createGamma(info)

		if self.updateFEdata:
			feinfo = service.frontendInfo()
			if feinfo:
				self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == "settings")
				if self.feraw:
					self.fedata = ConvertToHumanReadable(self.feraw)

		feraw = self.feraw
		if not feraw:
			feraw = info.getInfoObject(iServiceInformation.sTransponderData)
			fedata = ConvertToHumanReadable(feraw)
		else:
			fedata = self.fedata

		if textType in self.info_fields:
			return self.createInfoString(textType, fedata, feraw, info)

		if textType == "PIDInfo":
			return self.createPIDInfo(info)

		if textType == "ServiceRef":
			return self.createServiceRef(info)

		if not feraw:
			return ""

		if textType == "TransponderFrequency":
			return self.createFrequency(feraw)

		if textType == "TransponderFrequencyMHz":
			return self.createFrequency(fedata)

		if textType == "TransponderSymbolRate":
			return self.createSymbolRate(fedata, feraw)

		if textType == "TransponderPolarization":
			return self.createPolarization(fedata)

		if textType == "TransponderFEC":
			return self.createFEC(fedata, feraw)

		if textType == "TransponderModulation":
			return self.createModulation(fedata)

		if textType == "OrbitalPosition":
			return self.createOrbPos(feraw)

		if textType == "TunerType":
			return self.createTunerType(feraw)

		if textType == "TunerSystem":
			return self.createTunerSystem(fedata)

		if textType == "OrbitalPositionOrTunerSystem":
			return self.createOrbPosOrTunerSystem(fedata, feraw)

		if textType == "TerrestrialChannelNumber":
			return self.createChannelNumber(fedata, feraw)

		if textType == "TransponderInfoMisPls":
			return self.createMisPls(fedata)

		return _("?%s?") % textType

	text = property(getText)

	@cached
	def getBool(self):
		service = self.source.service
		info = service and service.info()

		if not info:
			return False

		request_caid = None
		for x in self.ca_table:
			if x[0] == self.type:
				request_caid = x[1]
				request_selected = x[2]
				break

		if request_caid is None:
			return False

		if info.getInfo(iServiceInformation.sIsCrypted) != 1:
			return False

		data = self.ecmdata.getEcmData()

		if data is None:
			return False

		current_caid = data[1]

		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in caid_data:
			if caid_entry[3] == request_caid:
				if request_selected:
					if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(caid_entry[1], 16):
						return True
				else: # request available
					try:
						for caid in available_caids:
							if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
								return True
					except:
						pass

		return False

	boolean = property(getBool)

	def changed(self, what):
		if what[0] == self.CHANGED_SPECIFIC:
			self.updateFEdata = False
			if what[1] == iPlayableService.evNewProgramInfo:
				self.updateFEdata = True
			if what[1] == iPlayableService.evEnd:
				self.feraw = self.fedata = None
			Converter.changed(self, what)
		elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
			self.updateFEdata = False
			Converter.changed(self, what)
Example #6
0
class BLExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (('0x100', '0x1ff', 'Seca', 'S',
                           True), ('0x500', '0x5ff', 'Via', 'V', True),
                          ('0x600', '0x6ff', 'Irdeto', 'I',
                           True), ('0x900', '0x9ff', 'NDS', 'Nd', True),
                          ('0xb00', '0xbff', 'Conax', 'Co',
                           True), ('0xd00', '0xdff', 'CryptoW', 'Cw', True),
                          ('0xe00', '0xeff', 'PowerVU', 'P',
                           False), ('0x1700', '0x17ff', 'Beta', 'B', True),
                          ('0x1800', '0x18ff', 'Nagra', 'N',
                           True), ('0x2600', '0x2600', 'Biss', 'Bi', False),
                          ('0x4ae0', '0x4ae1', 'Dre', 'D',
                           False), ('0x4aee', '0x4aee', 'BulCrypt', 'B1',
                                    False), ('0x5581', '0x5581', 'BulCrypt',
                                             'B2', False))
        self.ca_table = (('CryptoCaidSecaAvailable', 'S',
                          False), ('CryptoCaidViaAvailable', 'V', False),
                         ('CryptoCaidIrdetoAvailable', 'I',
                          False), ('CryptoCaidNDSAvailable', 'Nd', False),
                         ('CryptoCaidConaxAvailable', 'Co',
                          False), ('CryptoCaidCryptoWAvailable', 'Cw', False),
                         ('CryptoCaidPowerVUAvailable', 'P',
                          False), ('CryptoCaidBetaAvailable', 'B',
                                   False), ('CryptoCaidNagraAvailable', 'N',
                                            False), ('CryptoCaidBissAvailable',
                                                     'Bi', False),
                         ('CryptoCaidDreAvailable', 'D',
                          False), ('CryptoCaidBulCrypt1Available', 'B1',
                                   False), ('CryptoCaidBulCrypt2Available',
                                            'B2', False),
                         ('CryptoCaidSecaSelected', 'S',
                          True), ('CryptoCaidViaSelected', 'V',
                                  True), ('CryptoCaidIrdetoSelected', 'I',
                                          True), ('CryptoCaidNDSSelected',
                                                  'Nd', True),
                         ('CryptoCaidConaxSelected', 'Co',
                          True), ('CryptoCaidCryptoWSelected', 'Cw',
                                  True), ('CryptoCaidPowerVUSelected', 'P',
                                          True), ('CryptoCaidBetaSelected',
                                                  'B', True),
                         ('CryptoCaidNagraSelected', 'N',
                          True), ('CryptoCaidBissSelected', 'Bi',
                                  True), ('CryptoCaidDreSelected', 'D', True),
                         ('CryptoCaidBulCrypt1Selected', 'B1',
                          True), ('CryptoCaidBulCrypt2Selected', 'B2', True))
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None
        return

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ''
            self.current_caid = '0'
            self.current_provid = '0'
            self.current_ecmpid = '0'

    def createCryptoBar(self, info):
        res = ''
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        for caid_entry in self.caid_data:
            if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(
                    self.current_caid, 16) <= int(caid_entry[1], 16):
                color = '\\c0000??00'
            else:
                color = '\\c007?7?7?'
                try:
                    for caid in available_caids:
                        if caid >= int(caid_entry[0], 16) and caid <= int(
                                caid_entry[1], 16):
                            color = '\\c00????00'

                except:
                    pass

            if color != '\\c007?7?7?' or caid_entry[4]:
                if res:
                    res += ' '
                res += color + caid_entry[3]

        res += '\\c00??????'
        return res

    def createCryptoSeca(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x100', 16) and int(
                self.current_caid, 16) <= int('0x1ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0x100', 16) and caid <= int('0x1ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'S'
        res += '\\c00??????'
        return res

    def createCryptoVia(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x500', 16) and int(
                self.current_caid, 16) <= int('0x5ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0x500', 16) and caid <= int('0x5ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'V'
        res += '\\c00??????'
        return res

    def createCryptoIrdeto(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x600', 16) and int(
                self.current_caid, 16) <= int('0x6ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0x600', 16) and caid <= int('0x6ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'I'
        res += '\\c00??????'
        return res

    def createCryptoNDS(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x900', 16) and int(
                self.current_caid, 16) <= int('0x9ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0x900', 16) and caid <= int('0x9ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'NDS'
        res += '\\c00??????'
        return res

    def createCryptoConax(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0xb00', 16) and int(
                self.current_caid, 16) <= int('0xbff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0xb00', 16) and caid <= int('0xbff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'CO'
        res += '\\c00??????'
        return res

    def createCryptoCryptoW(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0xd00', 16) and int(
                self.current_caid, 16) <= int('0xdff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0xd00', 16) and caid <= int('0xdff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'CW'
        res += '\\c00??????'
        return res

    def createCryptoPowerVU(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0xe00', 16) and int(
                self.current_caid, 16) <= int('0xeff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0xe00', 16) and caid <= int('0xeff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'P'
        res += '\\c00??????'
        return res

    def createCryptoBeta(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x1700', 16) and int(
                self.current_caid, 16) <= int('0x17ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0x1700', 16) and caid <= int('0x17ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'B'
        res += '\\c00??????'
        return res

    def createCryptoNagra(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x1800', 16) and int(
                self.current_caid, 16) <= int('0x18ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0x1800', 16) and caid <= int('0x18ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'N'
        res += '\\c00??????'
        return res

    def createCryptoBiss(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x2600', 16) and int(
                self.current_caid, 16) <= int('0x26ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0x2600', 16) and caid <= int('0x26ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'BI'
        res += '\\c00??????'
        return res

    def createCryptoDre(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x4ae0', 16) and int(
                self.current_caid, 16) <= int('0x4ae1', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if caid >= int('0x4ae0', 16) and caid <= int('0x4ae1', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'DC'
        res += '\\c00??????'
        return res

    def createCryptoSpecial(self, info):
        caid_name = 'FTA'
        try:
            for caid_entry in self.caid_data:
                if int(self.current_caid,
                       16) >= int(caid_entry[0], 16) and int(
                           self.current_caid, 16) <= int(caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break

            return caid_name + ':%04x:%04x:%04x:%04x' % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(
                    iServiceInformation.sSID), int(self.current_ecmpid, 16))
        except:
            pass

        return ''

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ''
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ('i', 'p', '')[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        return str(xres) + 'x' + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return ('MPEG2', 'MPEG4', 'MPEG1', 'MPEG4-II', 'VC1', 'VC1-SM',
                '')[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        if vpid < 0:
            vpid = 0
        if apid < 0:
            apid = 0
        if pcrpid < 0:
            pcrpid = 0
        if sidpid < 0:
            sidpid = 0
        return 'Pids:%04d:%04d:%04d:%05d' % (vpid, apid, pcrpid, sidpid)

    def createTransponderInfo(self, fedata, feraw):
        return addspace(self.createTunerSystem(fedata)) + addspace(
            self.createFrequency(fedata)) + addspace(
                self.createPolarization(fedata)
            ) + addspace(self.createSymbolRate(fedata)) + addspace(
                self.createFEC(fedata)) + addspace(
                    self.createModulation(fedata)) + self.createOrbPos(feraw)

    def createFrequency(self, fedata):
        frequency = fedata.get('frequency')
        if frequency:
            return str(frequency / 1000)
        return ''

    def createSymbolRate(self, fedata):
        symbolrate = fedata.get('symbol_rate')
        if symbolrate:
            return str(symbolrate / 1000)
        return ''

    def createPolarization(self, fedata):
        polarization = fedata.get('polarization_abbreviation')
        if polarization:
            return polarization
        return ''

    def createFEC(self, fedata):
        fec = fedata.get('fec_inner')
        if fec:
            return fec
        return ''

    def createModulation(self, fedata):
        modulation = fedata.get('modulation')
        if modulation:
            return modulation
        return ''

    def createTunerType(self, feraw):
        tunertype = feraw.get('tuner_type')
        if tunertype:
            return tunertype
        return ''

    def createTunerSystem(self, fedata):
        tunersystem = fedata.get('system')
        if tunersystem:
            return tunersystem
        return ''

    def createOrbPos(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            return str(float(3600 - orbpos) / 10.0) + '\xc2\xb0 W'
        if orbpos > 0:
            return str(float(orbpos) / 10.0) + '\xc2\xb0 E'
        return ''

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not '':
            return orbpos
        return self.createTunerSystem(fedata)

    def createTransponderName(self, feraw):
        orb_pos = ''
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            if orbpos == 3590:
                orb_pos = 'Thor/Intelsat'
            elif orbpos == 3560:
                orb_pos = 'Amos (4'
            elif orbpos == 3550:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3530:
                orb_pos = 'Nilesat/Atlantic Bird'
            elif orbpos == 3520:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3475:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3460:
                orb_pos = 'Express'
            elif orbpos == 3450:
                orb_pos = 'Telstar'
            elif orbpos == 3420:
                orb_pos = 'Intelsat'
            elif orbpos == 3380:
                orb_pos = 'Nss'
            elif orbpos == 3355:
                orb_pos = 'Intelsat'
            elif orbpos == 3325:
                orb_pos = 'Intelsat'
            elif orbpos == 3300:
                orb_pos = 'Hispasat'
            elif orbpos == 3285:
                orb_pos = 'Intelsat'
            elif orbpos == 3170:
                orb_pos = 'Intelsat'
            elif orbpos == 3150:
                orb_pos = 'Intelsat'
            elif orbpos == 3070:
                orb_pos = 'Intelsat'
            elif orbpos == 3045:
                orb_pos = 'Intelsat'
            elif orbpos == 3020:
                orb_pos = 'Intelsat 9'
            elif orbpos == 2990:
                orb_pos = 'Amazonas'
            elif orbpos == 2900:
                orb_pos = 'Star One'
            elif orbpos == 2880:
                orb_pos = 'AMC 6 (72'
            elif orbpos == 2875:
                orb_pos = 'Echostar 6'
            elif orbpos == 2860:
                orb_pos = 'Horizons'
            elif orbpos == 2810:
                orb_pos = 'AMC5'
            elif orbpos == 2780:
                orb_pos = 'NIMIQ 4'
            elif orbpos == 2690:
                orb_pos = 'NIMIQ 1'
            elif orbpos == 3592:
                orb_pos = 'Thor/Intelsat'
            elif orbpos == 2985:
                orb_pos = 'Echostar 3,12'
            elif orbpos == 2830:
                orb_pos = 'Echostar 8'
            elif orbpos == 2630:
                orb_pos = 'Galaxy 19'
            elif orbpos == 2500:
                orb_pos = 'Echostar 10,11'
            elif orbpos == 2502:
                orb_pos = 'DirectTV 5'
            elif orbpos == 2410:
                orb_pos = 'Echostar 7 Anik F3'
            elif orbpos == 2391:
                orb_pos = 'Galaxy 23'
            elif orbpos == 2390:
                orb_pos = 'Echostar 9'
            elif orbpos == 2412:
                orb_pos = 'DirectTV 7S'
            elif orbpos == 2310:
                orb_pos = 'Galaxy 27'
            elif orbpos == 2311:
                orb_pos = 'Ciel 2'
            elif orbpos == 2120:
                orb_pos = 'Echostar 2'
            else:
                orb_pos = str(float(3600 - orbpos) / 10.0) + 'W'
        elif orbpos > 0:
            if orbpos == 192:
                orb_pos = 'Astra 1F'
            elif orbpos == 130:
                orb_pos = 'Hot Bird 6,7A,8'
            elif orbpos == 235:
                orb_pos = 'Astra 1E'
            elif orbpos == 1100:
                orb_pos = 'BSat 1A,2A'
            elif orbpos == 1101:
                orb_pos = 'N-Sat 110'
            elif orbpos == 1131:
                orb_pos = 'KoreaSat 5'
            elif orbpos == 1440:
                orb_pos = 'SuperBird 7,C2'
            elif orbpos == 1006:
                orb_pos = 'AsiaSat 2'
            elif orbpos == 1030:
                orb_pos = 'Express A2'
            elif orbpos == 1056:
                orb_pos = 'Asiasat 3S'
            elif orbpos == 1082:
                orb_pos = 'NSS 11'
            elif orbpos == 881:
                orb_pos = 'ST1'
            elif orbpos == 900:
                orb_pos = 'Yamal 201'
            elif orbpos == 917:
                orb_pos = 'Mesat'
            elif orbpos == 950:
                orb_pos = 'Insat 4B'
            elif orbpos == 951:
                orb_pos = 'NSS 6'
            elif orbpos == 765:
                orb_pos = 'Telestar'
            elif orbpos == 785:
                orb_pos = 'ThaiCom 5'
            elif orbpos == 800:
                orb_pos = 'Express'
            elif orbpos == 830:
                orb_pos = 'Insat 4A'
            elif orbpos == 850:
                orb_pos = 'Intelsat 709'
            elif orbpos == 750:
                orb_pos = 'Abs'
            elif orbpos == 720:
                orb_pos = 'Intelsat'
            elif orbpos == 705:
                orb_pos = 'Eutelsat W5'
            elif orbpos == 685:
                orb_pos = 'Intelsat'
            elif orbpos == 620:
                orb_pos = 'Intelsat 902'
            elif orbpos == 600:
                orb_pos = 'Intelsat 904'
            elif orbpos == 570:
                orb_pos = 'Nss'
            elif orbpos == 530:
                orb_pos = 'Express AM22'
            elif orbpos == 480:
                orb_pos = 'Eutelsat 2F2'
            elif orbpos == 450:
                orb_pos = 'Intelsat'
            elif orbpos == 420:
                orb_pos = 'Turksat 2A'
            elif orbpos == 400:
                orb_pos = 'Express AM1'
            elif orbpos == 390:
                orb_pos = 'Hellas Sat 2'
            elif orbpos == 380:
                orb_pos = 'Paksat 1'
            elif orbpos == 360:
                orb_pos = 'Eutelsat Sesat'
            elif orbpos == 335:
                orb_pos = 'Astra 1M'
            elif orbpos == 330:
                orb_pos = 'Eurobird 3'
            elif orbpos == 328:
                orb_pos = 'Galaxy 11'
            elif orbpos == 315:
                orb_pos = 'Astra 5A'
            elif orbpos == 310:
                orb_pos = 'Turksat'
            elif orbpos == 305:
                orb_pos = 'Arabsat'
            elif orbpos == 285:
                orb_pos = 'Eurobird 1'
            elif orbpos == 284:
                orb_pos = 'Eurobird/Astra'
            elif orbpos == 282:
                orb_pos = 'Eurobird/Astra'
            elif orbpos == 1220:
                orb_pos = 'AsiaSat'
            elif orbpos == 1380:
                orb_pos = 'Telstar 18'
            elif orbpos == 260:
                orb_pos = 'Badr 3/4'
            elif orbpos == 255:
                orb_pos = 'Eurobird 2'
            elif orbpos == 215:
                orb_pos = 'Eutelsat'
            elif orbpos == 216:
                orb_pos = 'Eutelsat W6'
            elif orbpos == 210:
                orb_pos = 'AfriStar 1'
            elif orbpos == 160:
                orb_pos = 'Eutelsat W2'
            elif orbpos == 100:
                orb_pos = 'Eutelsat W1'
            elif orbpos == 90:
                orb_pos = 'Eurobird 9'
            elif orbpos == 70:
                orb_pos = 'Eutelsat W3A'
            elif orbpos == 50:
                orb_pos = 'Sirius 4'
            elif orbpos == 48:
                orb_pos = 'Sirius 4'
            elif orbpos == 30:
                orb_pos = 'Telecom 2'
            else:
                orb_pos = str(float(orbpos) / 10.0) + 'E'
        return orb_pos

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ''
        info = service and service.info()
        if not info:
            return ''
        if self.type == 'CryptoInfo':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)
        if self.type == 'CryptoBar':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            else:
                return ''
        if self.type == 'CryptoSeca':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSeca(info)
            else:
                return ''
        if self.type == 'CryptoVia':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoVia(info)
            else:
                return ''
        if self.type == 'CryptoIrdeto':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoIrdeto(info)
            else:
                return ''
        if self.type == 'CryptoNDS':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNDS(info)
            else:
                return ''
        if self.type == 'CryptoConax':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoConax(info)
            else:
                return ''
        if self.type == 'CryptoCryptoW':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoCryptoW(info)
            else:
                return ''
        if self.type == 'CryptoBeta':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBeta(info)
            else:
                return ''
        if self.type == 'CryptoNagra':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNagra(info)
            else:
                return ''
        if self.type == 'CryptoBiss':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBiss(info)
            else:
                return ''
        if self.type == 'CryptoDre':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoDre(info)
            else:
                return ''
        if self.type == 'CryptoSpecial':
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            else:
                return ''
        if self.type == 'ResolutionString':
            return self.createResolution(info)
        elif self.type == 'VideoCodec':
            return self.createVideoCodec(info)
        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(True)
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)
        feraw = self.feraw
        fedata = self.fedata
        if not feraw or not fedata:
            return ''
        if self.type == 'All':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                return addspace(
                    self.createProviderName(info)
                ) + self.createTransponderInfo(
                    fedata, feraw) + '\n' + addspace(
                        self.createCryptoBar(info)) + addspace(
                            self.createCryptoSpecial(info)) + '\n' + addspace(
                                self.createPIDInfo(info)) + addspace(
                                    self.createVideoCodec(
                                        info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(
                    info)) + self.createTransponderInfo(
                        fedata,
                        feraw) + '\n' + addspace(self.createCryptoBar(
                            info)) + self.current_source + '\n' + addspace(
                                self.createCryptoSpecial(info)) + addspace(
                                    self.createVideoCodec(
                                        info)) + self.createResolution(info)
        if self.type == 'ServiceInfo':
            return addspace(self.createProviderName(info)) + addspace(
                self.createTunerSystem(fedata)) + addspace(
                    self.createFrequency(fedata)) + addspace(
                        self.createPolarization(fedata)) + addspace(
                            self.createSymbolRate(fedata)) + addspace(
                                self.createFEC(fedata)) + addspace(
                                    self.createModulation(fedata)) + addspace(
                                        self.createOrbPos(feraw)) + addspace(
                                            self.createVideoCodec(info)
                                        ) + self.createResolution(info)
        elif self.type == 'TransponderInfo2line':
            return addspace(self.createProviderName(info)) + addspace(
                self.createTunerSystem(fedata)) + addspace(
                    self.createTransponderName(feraw)
                ) + '\n' + self.createFrequency(
                    fedata) + addspace(' MHz') + addspace(
                        self.createPolarization(fedata)) + addspace(
                            self.createSymbolRate(fedata)
                        ) + self.createModulation(fedata) + '-' + addspace(
                            self.createFEC(fedata))
        elif self.type == 'TransponderInfo':
            return self.createTransponderInfo(fedata, feraw)
        elif self.type == 'TransponderFrequency':
            return self.createFrequency(fedata)
        elif self.type == 'TransponderSymbolRate':
            return self.createSymbolRate(fedata)
        elif self.type == 'TransponderPolarization':
            return self.createPolarization(fedata)
        elif self.type == 'TransponderFEC':
            return self.createFEC(fedata)
        elif self.type == 'TransponderModulation':
            return self.createModulation(fedata)
        elif self.type == 'OrbitalPosition':
            return self.createOrbPos(feraw)
        elif self.type == 'TunerType':
            return self.createTunerType(feraw)
        elif self.type == 'TunerSystem':
            return self.createTunerSystem(fedata)
        elif self.type == 'OrbitalPositionOrTunerSystem':
            return self.createOrbPosOrTunerSystem(fedata, feraw)
        elif self.type == 'PIDInfo':
            return self.createPIDInfo(info)
        else:
            return _('invalid type')

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()
        if not info:
            return False
        else:
            request_caid = None
            for x in self.ca_table:
                if x[0] == self.type:
                    request_caid = x[1]
                    request_selected = x[2]
                    break

            if request_caid is None:
                return False
            if info.getInfo(iServiceInformation.sIsCrypted) != 1:
                return False
            data = self.ecmdata.getEcmData()
            if data is None:
                return False
            current_caid = data[1]
            available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
            for caid_entry in self.caid_data:
                if caid_entry[3] == request_caid:
                    if request_selected:
                        if int(current_caid,
                               16) >= int(caid_entry[0], 16) and int(
                                   current_caid, 16) <= int(caid_entry[1], 16):
                            return True
                    else:
                        try:
                            for caid in available_caids:
                                if caid >= int(caid_entry[0],
                                               16) and caid <= int(
                                                   caid_entry[1], 16):
                                    return True

                        except:
                            pass

            return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
        return
Example #7
0
class PliExInfo(Poll, Converter, object):
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = type
		self.poll_interval = 1000
		self.poll_enabled = True
		self.caid_data = (
			( "0x100",  "0x1ff", "Seca",     "S",  True  ),
			( "0x500",  "0x5ff", "Via",      "V",  True  ),
			( "0x600",  "0x6ff", "Irdeto",   "I",  True  ),
			( "0x900",  "0x9ff", "NDS",      "Nd", True  ),
			( "0xb00",  "0xbff", "Conax",    "Co", True  ),
			( "0xd00",  "0xdff", "CryptoW",  "Cw", True  ),
			( "0xe00",  "0xeff", "PowerVU",  "P",  True ),
			("0x1700", "0x17ff", "Beta",     "B",  True  ),
			("0x1800", "0x18ff", "Nagra",    "N",  True  ),
			("0x2600", "0x2600", "Biss",     "Bi", True ),
			("0x2700", "0x2700", "Exset",     "Ex", True ),
			("0x4ae0", "0x4ae1", "Dre",      "D",  True ),
			("0x4aee", "0x4aee", "BulCrypt", "B1", False ),
			("0x5581", "0x5581", "BulCrypt", "B2", False )
		)
		self.ca_table = (
			("CryptoCaidSecaAvailable",	"S",	False),
			("CryptoCaidViaAvailable",	"V",	False),
			("CryptoCaidIrdetoAvailable",	"I",	False),
			("CryptoCaidNDSAvailable",	"Nd",	False),
			("CryptoCaidConaxAvailable",	"Co",	False),
			("CryptoCaidCryptoWAvailable",	"Cw",	False),
			("CryptoCaidPowerVUAvailable",	"P",	False),
			("CryptoCaidBetaAvailable",	"B",	False),
			("CryptoCaidNagraAvailable",	"N",	False),
			("CryptoCaidExsetAvailable",	"Ex",	False),
			("CryptoCaidBissAvailable",	"Bi",	False),
			("CryptoCaidDreAvailable",	"D",	False),
			("CryptoCaidBulCrypt1Available","B1",	False),
			("CryptoCaidBulCrypt2Available","B2",	False),
			("CryptoCaidSecaSelected",	"S",	True),
			("CryptoCaidViaSelected",	"V",	True),
			("CryptoCaidIrdetoSelected",	"I",	True),
			("CryptoCaidNDSSelected",	"Nd",	True),
			("CryptoCaidConaxSelected",	"Co",	True),
			("CryptoCaidCryptoWSelected",	"Cw",	True),
			("CryptoCaidPowerVUSelected",	"P",	True),
			("CryptoCaidBetaSelected",	"B",	True),
			("CryptoCaidNagraSelected",	"N",	True),
			("CryptoCaidBissSelected",	"Bi",	True),
			("CryptoCaidExsetSelected",	"Ex",	True),
			("CryptoCaidDreSelected",	"D",	True),
			("CryptoCaidBulCrypt1Selected",	"B1",	True),
			("CryptoCaidBulCrypt2Selected",	"B2",	True),
		)
		self.ecmdata = GetEcmInfo()
		self.feraw = self.fedata = self.updateFEdata = None

	def getCryptoInfo(self, info):
		if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
			data = self.ecmdata.getEcmData()
			self.current_source = data[0]
			self.current_caid = data[1]
			self.current_provid = data[2]
			self.current_ecmpid = data[3]
		else:
			self.current_source = ""
			self.current_caid = "0"
			self.current_provid = "0"
			self.current_ecmpid = "0"

	def createCryptoBar(self, info):
		res = ""
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(self.current_caid, 16) <= int(caid_entry[1], 16):
				color="\c0000??00"
			else:
				color = "\c007?7?7?"
				try:
					for caid in available_caids:
						if caid >= int(caid_entry[0], 16) and caid <= int(caid_entry[1], 16):
							color="\c00????00"
				except:
					pass

			if color != "\c007?7?7?" or caid_entry[4]:
				if res: res += " "
				res += color + caid_entry[3]

		res += "\c00??????"
		return res

	def createCryptoSpecial(self, info):
		caid_name = "FTA"
		try:
			for caid_entry in self.caid_data:
				if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x:%04x:%04x:%04x" % (int(self.current_caid,16), int(self.current_provid,16), info.getInfo(iServiceInformation.sSID), int(self.current_ecmpid,16))
		except:
			pass
		return ""

	def createResolution(self, info):
		xres = info.getInfo(iServiceInformation.sVideoWidth)
		if xres == -1:
			return ""
		yres = info.getInfo(iServiceInformation.sVideoHeight)
		mode = ("i", "p", "")[info.getInfo(iServiceInformation.sProgressive)]
		fps  = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
		return str(xres) + "x" + str(yres) + mode + fps

	def createVideoCodec(self, info):
		return ("MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM", "")[info.getInfo(iServiceInformation.sVideoType)]

	def createPIDInfo(self, info):
		vpid = info.getInfo(iServiceInformation.sVideoPID)
		apid = info.getInfo(iServiceInformation.sAudioPID)
		pcrpid = info.getInfo(iServiceInformation.sPCRPID)
		sidpid = info.getInfo(iServiceInformation.sSID)
		if vpid < 0 : vpid = 0
		if apid < 0 : apid = 0
		if pcrpid < 0 : pcrpid = 0
		if sidpid < 0 : sidpid = 0
		return "Pids:%04d:%04d:%04d:%05d" % (vpid, apid, pcrpid, sidpid)

	def createTransponderInfo(self, fedata, feraw):
		return addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
			+ addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) \
			+ self.createOrbPos(feraw)
		
	def createFrequency(self, feraw):
		frequency = feraw.get("frequency")
		if frequency:
			if "DVB-T" in feraw.get("tuner_type"):
				return str(int(frequency / 1000000 + 0.5))
			else:
				return str(int(frequency / 1000 + 0.5))
		return ""

	def createSymbolRate(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			bandwidth = fedata.get("bandwidth")
			if bandwidth:
				return bandwidth
		else:
			symbolrate = fedata.get("symbol_rate")
			if symbolrate:
				return str(symbolrate / 1000)
		return ""

	def createPolarization(self, fedata):
		polarization = fedata.get("polarization_abbreviation")
		if polarization:
			return polarization
		return ""

	def createFEC(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			code_rate_lp = fedata.get("code_rate_lp")
			code_rate_hp = fedata.get("code_rate_hp")
			if code_rate_lp and code_rate_hp:
				return code_rate_lp + "-" + code_rate_hp
		else:
			fec = fedata.get("fec_inner")
			if fec:
				return fec
		return ""

	def createModulation(self, fedata):
		if fedata.get("tuner_type") == _("Terrestrial"):
			constellation = fedata.get("constellation")
			if constellation:
				return constellation
		else:
			modulation = fedata.get("modulation")
			if modulation:
				return modulation
		return ""

	def createTunerType(self, feraw):
		tunertype = feraw.get("tuner_type")
		if tunertype:
			return tunertype
		return ""

	def createTunerSystem(self, fedata):
		tunersystem = fedata.get("system")
		if tunersystem:
			return tunersystem
		return ""

	def createOrbPos(self, feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
		elif orbpos > 0:
			return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
		return ""

	def createOrbPosOrTunerSystem(self, fedata,feraw):
		orbpos = self.createOrbPos(feraw)
		if orbpos is not "":
			return orbpos
		return self.createTunerSystem(fedata)

	def createProviderName(self, info):
		return info.getInfoString(iServiceInformation.sProvider)

	@cached
	def getText(self):

		service = self.source.service
		if service is None:
			return ""
		info = service and service.info()

		if not info:
			return ""

		if self.type == "CryptoInfo":
			self.getCryptoInfo(info)
			if config.usage.show_cryptoinfo.value:
				return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
			else:
				return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)

		if self.type == "CryptoBar":
			self.getCryptoInfo(info)
			return self.createCryptoBar(info)

		if self.type == "CryptoSpecial":
			self.getCryptoInfo(info)
			return self.createCryptoSpecial(info)

		if self.type == "ResolutionString":
			return self.createResolution(info)

		if self.type == "VideoCodec":
			return self.createVideoCodec(info)

		if self.updateFEdata:
			feinfo = service.frontendInfo()
			if feinfo:
				self.feraw = feinfo.getAll(False)
				if self.feraw:
					self.fedata = ConvertToHumanReadable(self.feraw)

		feraw = self.feraw
		fedata = self.fedata

		if not feraw or not fedata:
			return ""

		if self.type == "All":
			self.getCryptoInfo(info)
			if config.usage.show_cryptoinfo.value:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + "\n" \
				+ addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n" \
				+ addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
			else:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + "\n" \
				+ addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
				+ addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "ServiceInfo":	
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
			+ addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) \
			+ addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "TransponderInfo":	
			return self.createTransponderInfo(fedata,feraw)

		if self.type == "TransponderFrequency":
			return self.createFrequency(feraw)

		if self.type == "TransponderSymbolRate":
			return self.createSymbolRate(fedata, feraw)

		if self.type == "TransponderPolarization":
			return self.createPolarization(fedata)

		if self.type == "TransponderFEC":
			return self.createFEC(fedata, feraw)

		if self.type == "TransponderModulation":
			return self.createModulation(fedata)

		if self.type == "OrbitalPosition":
			return self.createOrbPos(feraw)

		if self.type == "TunerType":
			return self.createTunerType(feraw)

		if self.type == "TunerSystem":
			return self.createTunerSystem(fedata)

		if self.type == "OrbitalPositionOrTunerSystem":
			return self.createOrbPosOrTunerSystem(fedata,feraw)

		if self.type == "PIDInfo":
			return self.createPIDInfo(info)

		return _("invalid type")

	text = property(getText)

	@cached
	def getBool(self):
		service = self.source.service
		info = service and service.info()

		if not info:
			return False

		request_caid = None
		for x in self.ca_table:
			if x[0] == self.type:
				request_caid = x[1]
				request_selected = x[2]
				break

		if request_caid is None:
			return False

		if info.getInfo(iServiceInformation.sIsCrypted) != 1:
			return False

		data = self.ecmdata.getEcmData()

		if data is None:
			return False

		current_caid	= data[1]

		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if caid_entry[3] == request_caid:
				if(request_selected):
					if int(current_caid, 16) >= int(caid_entry[0], 16) and int(current_caid, 16) <= int(caid_entry[1], 16):
						return True
				else: # request available
					try:
						for caid in available_caids:
							if caid >= int(caid_entry[0], 16) and caid <= int(caid_entry[1], 16):
								return True
					except:
						pass

		return False

	boolean = property(getBool)

	def changed(self, what):
		if what[0] == self.CHANGED_SPECIFIC:
			self.updateFEdata = False
			if what[1] == iPlayableService.evNewProgramInfo:
				self.updateFEdata = True
			if what[1] == iPlayableService.evEnd:
				self.feraw = self.fedata = None
			Converter.changed(self, what)
		elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
			self.updateFEdata = False
			Converter.changed(self, what)
Example #8
0
class PliExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (("0x100", "0x1ff", "Seca", "S",
                           True), ("0x500", "0x5ff", "Via", "V", True),
                          ("0x600", "0x6ff", "Irdeto", "I",
                           True), ("0x900", "0x9ff", "NDS", "Nd", True),
                          ("0xb00", "0xbff", "Conax", "Co",
                           True), ("0xd00", "0xdff", "CryptoW", "Cw", True),
                          ("0xe00", "0xeff", "PowerVU", "P",
                           False), ("0x1700", "0x17ff", "Beta", "B", True),
                          ("0x1800", "0x18ff", "Nagra", "N",
                           True), ("0x2600", "0x2600", "Biss", "Bi", False),
                          ("0x4ae0", "0x4ae1", "Dre", "D",
                           False), ("0x4aee", "0x4aee", "BulCrypt", "B1",
                                    False), ("0x5581", "0x5581", "BulCrypt",
                                             "B2", False))
        self.ca_table = (
            ("CryptoCaidSecaAvailable", "S", False),
            ("CryptoCaidViaAvailable", "V", False),
            ("CryptoCaidIrdetoAvailable", "I", False),
            ("CryptoCaidNDSAvailable", "Nd", False),
            ("CryptoCaidConaxAvailable", "Co", False),
            ("CryptoCaidCryptoWAvailable", "Cw", False),
            ("CryptoCaidPowerVUAvailable", "P", False),
            ("CryptoCaidBetaAvailable", "B", False),
            ("CryptoCaidNagraAvailable", "N", False),
            ("CryptoCaidBissAvailable", "Bi", False),
            ("CryptoCaidDreAvailable", "D", False),
            ("CryptoCaidBulCrypt1Available", "B1", False),
            ("CryptoCaidBulCrypt2Available", "B2", False),
            ("CryptoCaidSecaSelected", "S", True),
            ("CryptoCaidViaSelected", "V", True),
            ("CryptoCaidIrdetoSelected", "I", True),
            ("CryptoCaidNDSSelected", "Nd", True),
            ("CryptoCaidConaxSelected", "Co", True),
            ("CryptoCaidCryptoWSelected", "Cw", True),
            ("CryptoCaidPowerVUSelected", "P", True),
            ("CryptoCaidBetaSelected", "B", True),
            ("CryptoCaidNagraSelected", "N", True),
            ("CryptoCaidBissSelected", "Bi", True),
            ("CryptoCaidDreSelected", "D", True),
            ("CryptoCaidBulCrypt1Selected", "B1", True),
            ("CryptoCaidBulCrypt2Selected", "B2", True),
        )
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None

    def getCryptoInfo(self, info):
        if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ""
            self.current_caid = "0"
            self.current_provid = "0"
            self.current_ecmpid = "0"

    def createCryptoBar(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(
                    self.current_caid, 16) <= int(caid_entry[1], 16):
                color = "\c0000??00"
            else:
                color = "\c007?7?7?"
                try:
                    for caid in available_caids:
                        if caid >= int(caid_entry[0], 16) and caid <= int(
                                caid_entry[1], 16):
                            color = "\c00????00"
                except:
                    pass

            if color != "\c007?7?7?" or caid_entry[4]:
                if res: res += " "
                res += color + caid_entry[3]

        res += "\c00??????"
        return res

    def createCryptoSpecial(self, info):
        caid_name = "FTA"
        try:
            for caid_entry in self.caid_data:
                if int(self.current_caid,
                       16) >= int(caid_entry[0], 16) and int(
                           self.current_caid, 16) <= int(caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break
            return caid_name + ":%04x:%04x:%04x:%04x" % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(
                    iServiceInformation.sSID), int(self.current_ecmpid, 16))
        except:
            pass
        return ""

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ""
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ("i", "p", "")[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        return str(xres) + "x" + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return ("MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM",
                "")[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        if vpid < 0: vpid = 0
        if apid < 0: apid = 0
        if pcrpid < 0: pcrpid = 0
        if sidpid < 0: sidpid = 0
        return "Pids:%04d:%04d:%04d:%05d" % (vpid, apid, pcrpid, sidpid)

    def createTransponderInfo(self, fedata, feraw):
        return addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata)) \
         + addspace(self.createSymbolRate(fedata)) + addspace(self.createFEC(fedata)) + addspace(self.createModulation(fedata)) \
         + self.createOrbPos(feraw)

    def createFrequency(self, fedata):
        frequency = fedata.get("frequency")
        if frequency:
            return str(frequency / 1000)
        return ""

    def createSymbolRate(self, fedata):
        symbolrate = fedata.get("symbol_rate")
        if symbolrate:
            return str(symbolrate / 1000)
        return ""

    def createPolarization(self, fedata):
        polarization = fedata.get("polarization_abbreviation")
        if polarization:
            return polarization
        return ""

    def createFEC(self, fedata):
        fec = fedata.get("fec_inner")
        if fec:
            return fec
        return ""

    def createModulation(self, fedata):
        modulation = fedata.get("modulation")
        if modulation:
            return modulation
        return ""

    def createTunerType(self, feraw):
        tunertype = feraw.get("tuner_type")
        if tunertype:
            return tunertype
        return ""

    def createTunerSystem(self, fedata):
        tunersystem = fedata.get("system")
        if tunersystem:
            return tunersystem
        return ""

    def createOrbPos(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
        elif orbpos > 0:
            return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
        return ""

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not "":
            return orbpos
        return self.createTunerSystem(fedata)

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):

        service = self.source.service
        if service is None:
            return ""
        info = service and service.info()

        if not info:
            return ""

        if self.type == "CryptoInfo":
            self.getCryptoInfo(info)
            # iq - [
            #			if config.usage.show_cryptoinfo.value:
            if config.usage.show_cryptoinfo.value != "off":
                # ]
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)

        if self.type == "CryptoBar":
            self.getCryptoInfo(info)
            return self.createCryptoBar(info)

        if self.type == "CryptoSpecial":
            self.getCryptoInfo(info)
            return self.createCryptoSpecial(info)

        if self.type == "ResolutionString":
            return self.createResolution(info)

        if self.type == "VideoCodec":
            return self.createVideoCodec(info)

        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(False)
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)

        feraw = self.feraw
        fedata = self.fedata

        if not feraw or not fedata:
            return ""

        if self.type == "All":
            self.getCryptoInfo(info)
            # iq - [
            #			if config.usage.show_cryptoinfo.value:
            if config.usage.show_cryptoinfo.value != "off":
                # ]
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + "\n" \
                + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n" \
                + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + "\n" \
                + addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
                + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "ServiceInfo":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata)) \
            + addspace(self.createSymbolRate(fedata)) + addspace(self.createFEC(fedata)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) \
            + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "TransponderInfo":
            return self.createTransponderInfo(fedata, feraw)

        if self.type == "TransponderFrequency":
            return self.createFrequency(fedata)

        if self.type == "TransponderSymbolRate":
            return self.createSymbolRate(fedata)

        if self.type == "TransponderPolarization":
            return self.createPolarization(fedata)

        if self.type == "TransponderFEC":
            return self.createFEC(fedata)

        if self.type == "TransponderModulation":
            return self.createModulation(fedata)

        if self.type == "OrbitalPosition":
            return self.createOrbPos(feraw)

        if self.type == "TunerType":
            return self.createTunerType(feraw)

        if self.type == "TunerSystem":
            return self.createTunerSystem(fedata)

        if self.type == "OrbitalPositionOrTunerSystem":
            return self.createOrbPosOrTunerSystem(fedata, feraw)

        if self.type == "PIDInfo":
            return self.createPIDInfo(info)

        return _("invalid type")

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()

        if not info:
            return False

        request_caid = None
        for x in self.ca_table:
            if x[0] == self.type:
                request_caid = x[1]
                request_selected = x[2]
                break

        if request_caid is None:
            return False

        if info.getInfo(iServiceInformation.sIsCrypted) != 1:
            return False

        data = self.ecmdata.getEcmData()

        if data is None:
            return False

        current_caid = data[1]

        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if caid_entry[3] == request_caid:
                if (request_selected):
                    if int(current_caid, 16) >= int(caid_entry[0], 16) and int(
                            current_caid, 16) <= int(caid_entry[1], 16):
                        return True
                else:  # request available
                    try:
                        for caid in available_caids:
                            if caid >= int(caid_entry[0], 16) and caid <= int(
                                    caid_entry[1], 16):
                                return True
                    except:
                        pass

        return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
Example #9
0
class BhExtraInfo(Poll, Converter, object):

    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (('0x1700',
          '0x17ff',
          'Beta',
          'B',
          True),
         ('0x600',
          '0x6ff',
          'Irdeto',
          'I',
          True),
         ('0x100',
          '0x1ff',
          'Seca',
          'S',
          True),
         ('0x500',
          '0x5ff',
          'Via',
          'V',
          True),
         ('0x1800',
          '0x18ff',
          'Nagra',
          'N',
          True),
         ('0xd00',
          '0xdff',
          'CryptoW',
          'CW',
          True),
         ('0x900',
          '0x9ff',
          'NDS',
          'ND',
          True),
         ('0xb00',
          '0xbff',
          'Conax',
          'CO',
          True),
         ('0x4ae0',
          '0x4ae1',
          'Dre',
          'DC',
          True),
         ('0x5581',
          '0x5581',
          'BulCrypt',
          'BU',
          True),
         ('0x2600',
          '0x2600',
          'Biss',
          'BI',
          True),
         ('0xe00',
          '0xeff',
          'PowerVU',
          'PV',
          True),
         ('0x4aee',
          '0x4aee',
          'BulCrypt',
          'BU',
          False))
        self.ca_table = (('CryptoCaidBetaAvailable', 'B', False),
         ('CryptoCaidIrdetoAvailable', 'I', False),
         ('CryptoCaidSecaAvailable', 'S', False),
         ('CryptoCaidViaAvailable', 'V', False),
         ('CryptoCaidNagraAvailable', 'N', False),
         ('CryptoCaidCryptoWAvailable', 'CW', False),
         ('CryptoCaidNDSAvailable', 'ND', False),
         ('CryptoCaidConaxAvailable', 'CO', False),
         ('CryptoCaidDreAvailable', 'DC', False),
         ('CryptoCaidBulCrypt2Available', 'BU', False),
         ('CryptoCaidBissAvailable', 'BI', False),
         ('CryptoCaidPowerVUAvailable', 'PV', False),
         ('CryptoCaidBulCrypt1Available', 'BU', False),
         ('CryptoCaidBetaSelected', 'B', True),
         ('CryptoCaidIrdetoSelected', 'I', True),
         ('CryptoCaidSecaSelected', 'S', True),
         ('CryptoCaidViaSelected', 'V', True),
         ('CryptoCaidNagraSelected', 'N', True),
         ('CryptoCaidCryptoWSelected', 'CW', True),
         ('CryptoCaidNDSSelected', 'ND', True),
         ('CryptoCaidConaxSelected', 'CO', True),
         ('CryptoCaidDreSelected', 'DC', True),
         ('CryptoCaidBulCrypt2Selected', 'BU', True),
         ('CryptoCaidBissSelected', 'BI', True),
         ('CryptoCaidPowerVUSelected', 'PV', True),
         ('CryptoCaidBulCrypt1Selected', 'BU', True))
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None
        return

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ''
            self.current_caid = '0'
            self.current_provid = '0'
            self.current_ecmpid = '0'

    def createCryptoBar(self, info):
        res = ''
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        for caid_entry in self.caid_data:
            if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(self.current_caid, 16) <= int(caid_entry[1], 16):
                color = '\\c0000??00'
            else:
                color = '\\c007?7?7?'
                try:
                    for caid in available_caids:
                        if caid >= int(caid_entry[0], 16) and caid <= int(caid_entry[1], 16):
                            color = '\\c00????00'

                except:
                    pass

            if color != '\\c007?7?7?' or caid_entry[4]:
                if res:
                    res += ' '
                res += color + caid_entry[3]

        res += '\\c00??????'
        return res

    def createCryptoSpecial(self, info):
        caid_name = 'Free To Air'
        try:
            for caid_entry in self.caid_data:
                if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(self.current_caid, 16) <= int(caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break

            return caid_name + ':%04x:%04x:%04x:%04x' % (int(self.current_caid, 16),
             int(self.current_provid, 16),
             info.getInfo(iServiceInformation.sSID),
             int(self.current_ecmpid, 16))
        except:
            pass

        return ''

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ''
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ('i', 'p', ' ')[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        return str(xres) + 'x' + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return ('MPEG2', 'MPEG4', 'MPEG1', 'MPEG4-II', 'VC1', 'VC1-SM', '')[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0:
            vpid = 0
        if apid < 0:
            apid = 0
        if pcrpid < 0:
            pcrpid = 0
        if sidpid < 0:
            sidpid = 0
        if tsid < 0:
            tsid = 0
        if onid < 0:
            onid = 0
        return '%d-%d:%05d:%04d:%04d:%04d' % (onid,
         tsid,
         sidpid,
         vpid,
         apid,
         pcrpid)

    def createTransponderInfo(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw))

    def createFrequency(self, feraw):
        frequency = feraw.get('frequency')
        if frequency:
            if 'DVB-T' in feraw.get('tuner_type'):
                return str(int(frequency / 1000000.0 + 0.5))
            else:
                return str(int(frequency / 1000 + 0.5))
        return ''

    def createChannelNumber(self, fedata, feraw):
        return 'DVB-T' in feraw.get('tuner_type') and fedata.get('channel') or ''

    def createSymbolRate(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            bandwidth = fedata.get('bandwidth')
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get('symbol_rate')
            if symbolrate:
                return str(symbolrate / 1000)
        return ''

    def createPolarization(self, fedata):
        return fedata.get('polarization_abbreviation') or ''

    def createFEC(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            code_rate_lp = fedata.get('code_rate_lp')
            code_rate_hp = fedata.get('code_rate_hp')
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + '-' + code_rate_hp
        else:
            fec = fedata.get('fec_inner')
            if fec:
                return fec
        return ''

    def createModulation(self, fedata):
        if fedata.get('tuner_type') == _('Terrestrial'):
            constellation = fedata.get('constellation')
            if constellation:
                return constellation
        else:
            modulation = fedata.get('modulation')
            if modulation:
                return modulation
        return ''

    def createTunerType(self, feraw):
        return feraw.get('tuner_type') or ''

    def createTunerSystem(self, fedata):
        return fedata.get('system') or ''

    def createOrbPos(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            return str(float(3600 - orbpos) / 10.0) + '\xc2\xb0 W'
        if orbpos > 0:
            return str(float(orbpos) / 10.0) + '\xc2\xb0 E'
        return ''

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not '':
            return orbpos
        return self.createTunerSystem(fedata)

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ''
        info = service and service.info()
        if not info:
            return ''
        if self.type == 'CryptoInfo':
            self.getCryptoInfo(info)
            if config.usage.show_cryptoinfo.value:
                return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)
        if self.type == 'CryptoBar':
            self.getCryptoInfo(info)
            return self.createCryptoBar(info)
        elif self.type == 'CryptoSpecial':
            self.getCryptoInfo(info)
            return self.createCryptoSpecial(info)
        elif self.type == 'ResolutionString':
            return self.createResolution(info)
        elif self.type == 'VideoCodec':
            return self.createVideoCodec(info)
        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == 'settings')
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)
        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            if not feraw:
                return ''
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata
        if self.type == 'All':
            self.getCryptoInfo(info)
            if config.usage.show_cryptoinfo.value:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw) + '\n' + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + '\n' + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw) + '\n' + addspace(self.createCryptoBar(info)) + self.current_source + '\n' + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
        if self.type == 'ServiceInfo':
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
        elif self.type == 'TransponderInfo':
            return self.createTransponderInfo(fedata, feraw)
        elif self.type == 'TransponderFrequency':
            return self.createFrequency(feraw)
        elif self.type == 'TransponderSymbolRate':
            return self.createSymbolRate(fedata, feraw)
        elif self.type == 'TransponderPolarization':
            return self.createPolarization(fedata)
        elif self.type == 'TransponderFEC':
            return self.createFEC(fedata, feraw)
        elif self.type == 'TransponderModulation':
            return self.createModulation(fedata)
        elif self.type == 'OrbitalPosition':
            return self.createOrbPos(feraw)
        elif self.type == 'TunerType':
            return self.createTunerType(feraw)
        elif self.type == 'TunerSystem':
            return self.createTunerSystem(fedata)
        elif self.type == 'OrbitalPositionOrTunerSystem':
            return self.createOrbPosOrTunerSystem(fedata, feraw)
        elif self.type == 'PIDInfo':
            return self.createPIDInfo(info)
        elif self.type == 'TerrestrialChannelNumber':
            return self.createChannelNumber(fedata, feraw)
        else:
            return _('invalid type')

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()
        if not info:
            return False
        else:
            request_caid = None
            for x in self.ca_table:
                if x[0] == self.type:
                    request_caid = x[1]
                    request_selected = x[2]
                    break

            if request_caid is None:
                return False
            if info.getInfo(iServiceInformation.sIsCrypted) != 1:
                return False
            data = self.ecmdata.getEcmData()
            if data is None:
                return False
            current_caid = data[1]
            available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
            for caid_entry in self.caid_data:
                if caid_entry[3] == request_caid:
                    if request_selected:
                        if int(current_caid, 16) >= int(caid_entry[0], 16) and int(current_caid, 16) <= int(caid_entry[1], 16):
                            return True
                    else:
                        try:
                            for caid in available_caids:
                                if caid >= int(caid_entry[0], 16) and caid <= int(caid_entry[1], 16):
                                    return True

                        except:
                            pass

            return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
        return
Example #10
0
class KravenExtraInfo(Poll, Converter, object):

    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (('0x100',
          '0x1ff',
          'Seca',
          'S',
          True),
         ('0x500',
          '0x5ff',
          'Via',
          'V',
          True),
         ('0x600',
          '0x6ff',
          'Irdeto',
          'I',
          True),
         ('0x900',
          '0x9ff',
          'NDS',
          'Nd',
          True),
         ('0xb00',
          '0xbff',
          'Conax',
          'Co',
          True),
         ('0xd00',
          '0xdff',
          'CryptoW',
          'Cw',
          True),
         ('0xe00',
          '0xeff',
          'PowerVU',
          'P',
          False),
         ('0x1700',
          '0x17ff',
          'Beta',
          'B',
          True),
         ('0x1800',
          '0x18ff',
          'Nagra',
          'N',
          True),
         ('0x2600',
          '0x2600',
          'Biss',
          'Bi',
          False),
         ('0x4ae0',
          '0x4ae1',
          'Dre',
          'D',
          False),
         ('0x4aee',
          '0x4aee',
          'BulCrypt',
          'B1',
          False),
         ('0x5581',
          '0x5581',
          'BulCrypt',
          'B2',
          False))
        self.ca_table = (('CryptoCaidSecaAvailable', 'S', False),
         ('CryptoCaidViaAvailable', 'V', False),
         ('CryptoCaidIrdetoAvailable', 'I', False),
         ('CryptoCaidNDSAvailable', 'Nd', False),
         ('CryptoCaidConaxAvailable', 'Co', False),
         ('CryptoCaidCryptoWAvailable', 'Cw', False),
         ('CryptoCaidPowerVUAvailable', 'P', False),
         ('CryptoCaidBetaAvailable', 'B', False),
         ('CryptoCaidNagraAvailable', 'N', False),
         ('CryptoCaidBissAvailable', 'Bi', False),
         ('CryptoCaidDreAvailable', 'D', False),
         ('CryptoCaidBulCrypt1Available', 'B1', False),
         ('CryptoCaidBulCrypt2Available', 'B2', False),
         ('CryptoCaidSecaSelected', 'S', True),
         ('CryptoCaidViaSelected', 'V', True),
         ('CryptoCaidIrdetoSelected', 'I', True),
         ('CryptoCaidNDSSelected', 'Nd', True),
         ('CryptoCaidConaxSelected', 'Co', True),
         ('CryptoCaidCryptoWSelected', 'Cw', True),
         ('CryptoCaidPowerVUSelected', 'P', True),
         ('CryptoCaidBetaSelected', 'B', True),
         ('CryptoCaidNagraSelected', 'N', True),
         ('CryptoCaidBissSelected', 'Bi', True),
         ('CryptoCaidDreSelected', 'D', True),
         ('CryptoCaidBulCrypt1Selected', 'B1', True),
         ('CryptoCaidBulCrypt2Selected', 'B2', True))
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None
        return

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ''
            self.current_caid = '0'
            self.current_provid = '0'
            self.current_ecmpid = '0'

    def createCryptoBar(self, info):
        res = ''
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        for caid_entry in self.caid_data:
            if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
                color = '\\c0000??00'
            else:
                color = '\\c007?7?7?'
                try:
                    for caid in available_caids:
                        if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
                            color = '\\c00????00'

                except:
                    pass

            if color != '\\c007?7?7?' or caid_entry[4]:
                if res:
                    res += ' '
                res += color + caid_entry[3]

        res += '\\c00??????'
        return res

    def createCryptoSeca(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x100', 16) <= caid <= int('0x1ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'S'
        res += '\\c00??????'
        return res

    def createCryptoVia(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x500', 16) <= caid <= int('0x5ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'V'
        res += '\\c00??????'
        return res

    def createCryptoIrdeto(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x600', 16) <= caid <= int('0x6ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'I'
        res += '\\c00??????'
        return res

    def createCryptoNDS(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x900', 16) <= caid <= int('0x9ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'NDS'
        res += '\\c00??????'
        return res

    def createCryptoConax(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xb00', 16) <= caid <= int('0xbff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'CO'
        res += '\\c00??????'
        return res

    def createCryptoCryptoW(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xd00', 16) <= caid <= int('0xdff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'CW'
        res += '\\c00??????'
        return res

    def createCryptoPowerVU(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xe00', 16) <= caid <= int('0xeff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'P'
        res += '\\c00??????'
        return res

    def createCryptoBeta(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1700', 16) <= int(self.current_caid, 16) <= int('0x17ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x1700', 16) <= caid <= int('0x17ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'B'
        res += '\\c00??????'
        return res

    def createCryptoNagra(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1800', 16) <= int(self.current_caid, 16) <= int('0x18ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x1800', 16) <= caid <= int('0x18ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'N'
        res += '\\c00??????'
        return res

    def createCryptoBiss(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x2600', 16) <= int(self.current_caid, 16) <= int('0x26ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x2600', 16) <= caid <= int('0x26ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'BI'
        res += '\\c00??????'
        return res

    def createCryptoDre(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int('0x4ae1', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'DC'
        res += '\\c00??????'
        return res

    def createCryptoSpecial(self, info):
        caid_name = 'FTA'
        try:
            for caid_entry in self.caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break

            return caid_name + ':%04x:%04x:%04x:%04x' % (int(self.current_caid, 16),
             int(self.current_provid, 16),
             info.getInfo(iServiceInformation.sSID),
             int(self.current_ecmpid, 16))
        except:
            pass

        return ''

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ''
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ('i', 'p', '', ' ')[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        if int(fps) <= 0:
            fps = ''
        return str(xres) + 'x' + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return ('MPEG2', 'MPEG4', 'MPEG1', 'MPEG4-II', 'VC1', 'VC1-SM', '')[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        if vpid < 0:
            vpid = 0
        if apid < 0:
            apid = 0
        if pcrpid < 0:
            pcrpid = 0
        if sidpid < 0:
            sidpid = 0
        return 'Pids:%04d:%04d:%04d:%05d' % (vpid,
         apid,
         pcrpid,
         sidpid)

    def createTransponderInfo(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + self.createFrequency(fedata) + '/' + self.createPolarization(fedata)
        else:
            tmp = addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + self.createOrbPos(feraw)

    def createFrequency(self, feraw):
        frequency = feraw.get('frequency')
        if frequency:
            return str(frequency)
        return ''

    def createChannelNumber(self, fedata, feraw):
        channel = channelnumbers.getChannelNumber(feraw.get('frequency'), feraw.get('tuner_number'))
        if channel:
            return _('CH') + '%s' % channel
        return ''

    def createSymbolRate(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            bandwidth = fedata.get('bandwidth')
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get('symbol_rate')
            if symbolrate:
                return str(symbolrate)
        return ''

    def createPolarization(self, fedata):
        polarization = fedata.get('polarization_abbreviation')
        if polarization:
            return polarization
        return ''

    def createFEC(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            code_rate_lp = fedata.get('code_rate_lp')
            code_rate_hp = fedata.get('code_rate_hp')
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + '-' + code_rate_hp
        else:
            fec = fedata.get('fec_inner')
            if fec:
                return fec
        return ''

    def createModulation(self, fedata):
        if fedata.get('tuner_type') == _('Terrestrial'):
            constellation = fedata.get('constellation')
            if constellation:
                return constellation
        else:
            modulation = fedata.get('modulation')
            if modulation:
                return modulation
        return ''

    def createTunerType(self, feraw):
        tunertype = feraw.get('tuner_type')
        if tunertype:
            return tunertype
        return ''

    def createTunerSystem(self, fedata):
        tunersystem = fedata.get('system')
        if tunersystem:
            return tunersystem
        return ''

    def createOrbPos(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            return str(float(3600 - orbpos) / 10.0) + '\xc2\xb0 W'
        if orbpos > 0:
            return str(float(orbpos) / 10.0) + '\xc2\xb0 E'
        return ''

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not '':
            return orbpos
        return self.createTunerSystem(fedata)

    def createTransponderName(self, feraw):
        orb_pos = ''
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            if orbpos == 3590:
                orb_pos = 'Thor/Intelsat'
            elif orbpos == 3560:
                orb_pos = 'Amos (4'
            elif orbpos == 3550:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3530:
                orb_pos = 'Nilesat/Atlantic Bird'
            elif orbpos == 3520:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3475:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3460:
                orb_pos = 'Express'
            elif orbpos == 3450:
                orb_pos = 'Telstar'
            elif orbpos == 3420:
                orb_pos = 'Intelsat'
            elif orbpos == 3380:
                orb_pos = 'Nss'
            elif orbpos == 3355:
                orb_pos = 'Intelsat'
            elif orbpos == 3325:
                orb_pos = 'Intelsat'
            elif orbpos == 3300:
                orb_pos = 'Hispasat'
            elif orbpos == 3285:
                orb_pos = 'Intelsat'
            elif orbpos == 3170:
                orb_pos = 'Intelsat'
            elif orbpos == 3150:
                orb_pos = 'Intelsat'
            elif orbpos == 3070:
                orb_pos = 'Intelsat'
            elif orbpos == 3045:
                orb_pos = 'Intelsat'
            elif orbpos == 3020:
                orb_pos = 'Intelsat 9'
            elif orbpos == 2990:
                orb_pos = 'Amazonas'
            elif orbpos == 2900:
                orb_pos = 'Star One'
            elif orbpos == 2880:
                orb_pos = 'AMC 6 (72'
            elif orbpos == 2875:
                orb_pos = 'Echostar 6'
            elif orbpos == 2860:
                orb_pos = 'Horizons'
            elif orbpos == 2810:
                orb_pos = 'AMC5'
            elif orbpos == 2780:
                orb_pos = 'NIMIQ 4'
            elif orbpos == 2690:
                orb_pos = 'NIMIQ 1'
            elif orbpos == 3592:
                orb_pos = 'Thor/Intelsat'
            elif orbpos == 2985:
                orb_pos = 'Echostar 3,12'
            elif orbpos == 2830:
                orb_pos = 'Echostar 8'
            elif orbpos == 2630:
                orb_pos = 'Galaxy 19'
            elif orbpos == 2500:
                orb_pos = 'Echostar 10,11'
            elif orbpos == 2502:
                orb_pos = 'DirectTV 5'
            elif orbpos == 2410:
                orb_pos = 'Echostar 7 Anik F3'
            elif orbpos == 2391:
                orb_pos = 'Galaxy 23'
            elif orbpos == 2390:
                orb_pos = 'Echostar 9'
            elif orbpos == 2412:
                orb_pos = 'DirectTV 7S'
            elif orbpos == 2310:
                orb_pos = 'Galaxy 27'
            elif orbpos == 2311:
                orb_pos = 'Ciel 2'
            elif orbpos == 2120:
                orb_pos = 'Echostar 2'
            else:
                orb_pos = str(float(3600 - orbpos) / 10.0) + 'W'
        elif orbpos > 0:
            if orbpos == 192:
                orb_pos = 'Astra 1F'
            elif orbpos == 130:
                orb_pos = 'Hot Bird 6,7A,8'
            elif orbpos == 235:
                orb_pos = 'Astra 1E'
            elif orbpos == 1100:
                orb_pos = 'BSat 1A,2A'
            elif orbpos == 1101:
                orb_pos = 'N-Sat 110'
            elif orbpos == 1131:
                orb_pos = 'KoreaSat 5'
            elif orbpos == 1440:
                orb_pos = 'SuperBird 7,C2'
            elif orbpos == 1006:
                orb_pos = 'AsiaSat 2'
            elif orbpos == 1030:
                orb_pos = 'Express A2'
            elif orbpos == 1056:
                orb_pos = 'Asiasat 3S'
            elif orbpos == 1082:
                orb_pos = 'NSS 11'
            elif orbpos == 881:
                orb_pos = 'ST1'
            elif orbpos == 900:
                orb_pos = 'Yamal 201'
            elif orbpos == 917:
                orb_pos = 'Mesat'
            elif orbpos == 950:
                orb_pos = 'Insat 4B'
            elif orbpos == 951:
                orb_pos = 'NSS 6'
            elif orbpos == 765:
                orb_pos = 'Telestar'
            elif orbpos == 785:
                orb_pos = 'ThaiCom 5'
            elif orbpos == 800:
                orb_pos = 'Express'
            elif orbpos == 830:
                orb_pos = 'Insat 4A'
            elif orbpos == 850:
                orb_pos = 'Intelsat 709'
            elif orbpos == 750:
                orb_pos = 'Abs'
            elif orbpos == 720:
                orb_pos = 'Intelsat'
            elif orbpos == 705:
                orb_pos = 'Eutelsat W5'
            elif orbpos == 685:
                orb_pos = 'Intelsat'
            elif orbpos == 620:
                orb_pos = 'Intelsat 902'
            elif orbpos == 600:
                orb_pos = 'Intelsat 904'
            elif orbpos == 570:
                orb_pos = 'Nss'
            elif orbpos == 530:
                orb_pos = 'Express AM22'
            elif orbpos == 480:
                orb_pos = 'Eutelsat 2F2'
            elif orbpos == 450:
                orb_pos = 'Intelsat'
            elif orbpos == 420:
                orb_pos = 'Turksat 2A'
            elif orbpos == 400:
                orb_pos = 'Express AM1'
            elif orbpos == 390:
                orb_pos = 'Hellas Sat 2'
            elif orbpos == 380:
                orb_pos = 'Paksat 1'
            elif orbpos == 360:
                orb_pos = 'Eutelsat Sesat'
            elif orbpos == 335:
                orb_pos = 'Astra 1M'
            elif orbpos == 330:
                orb_pos = 'Eurobird 3'
            elif orbpos == 328:
                orb_pos = 'Galaxy 11'
            elif orbpos == 315:
                orb_pos = 'Astra 5A'
            elif orbpos == 310:
                orb_pos = 'Turksat'
            elif orbpos == 305:
                orb_pos = 'Arabsat'
            elif orbpos == 285:
                orb_pos = 'Eurobird 1'
            elif orbpos == 284:
                orb_pos = 'Eurobird/Astra'
            elif orbpos == 282:
                orb_pos = 'Eurobird/Astra'
            elif orbpos == 1220:
                orb_pos = 'AsiaSat'
            elif orbpos == 1380:
                orb_pos = 'Telstar 18'
            elif orbpos == 260:
                orb_pos = 'Badr 3/4'
            elif orbpos == 255:
                orb_pos = 'Eurobird 2'
            elif orbpos == 215:
                orb_pos = 'Eutelsat'
            elif orbpos == 216:
                orb_pos = 'Eutelsat W6'
            elif orbpos == 210:
                orb_pos = 'AfriStar 1'
            elif orbpos == 160:
                orb_pos = 'Eutelsat W2'
            elif orbpos == 100:
                orb_pos = 'Eutelsat W1'
            elif orbpos == 90:
                orb_pos = 'Eurobird 9'
            elif orbpos == 70:
                orb_pos = 'Eutelsat W3A'
            elif orbpos == 50:
                orb_pos = 'Sirius 4'
            elif orbpos == 48:
                orb_pos = 'Sirius 4'
            elif orbpos == 30:
                orb_pos = 'Telecom 2'
            else:
                orb_pos = str(float(orbpos) / 10.0) + 'E'
        return orb_pos

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ''
        info = service and service.info()
        if not info:
            return ''
        if self.type == 'CryptoInfo':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)
        if self.type == 'CryptoBar':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            else:
                return ''
        if self.type == 'CryptoSeca':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSeca(info)
            else:
                return ''
        if self.type == 'CryptoVia':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoVia(info)
            else:
                return ''
        if self.type == 'CryptoIrdeto':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoIrdeto(info)
            else:
                return ''
        if self.type == 'CryptoNDS':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNDS(info)
            else:
                return ''
        if self.type == 'CryptoConax':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoConax(info)
            else:
                return ''
        if self.type == 'CryptoCryptoW':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoCryptoW(info)
            else:
                return ''
        if self.type == 'CryptoBeta':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBeta(info)
            else:
                return ''
        if self.type == 'CryptoNagra':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNagra(info)
            else:
                return ''
        if self.type == 'CryptoBiss':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBiss(info)
            else:
                return ''
        if self.type == 'CryptoDre':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoDre(info)
            else:
                return ''
        if self.type == 'CryptoSpecial':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            else:
                return ''
        if self.type == 'ResolutionString':
            return self.createResolution(info)
        elif self.type == 'VideoCodec':
            return self.createVideoCodec(info)
        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == 'settings')
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)
        feraw = self.feraw
        fedata = self.fedata
        if not feraw or not fedata:
            return ''
        if self.type == 'All':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw) + '\n' + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + '\n' + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw) + '\n' + addspace(self.createCryptoBar(info)) + self.current_source + '\n' + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
        if self.type == 'ServiceInfo':
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
        elif self.type == 'TransponderInfo2line':
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createTransponderName(feraw)) + '\n' + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata)) + addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))
        elif self.type == 'TransponderInfo':
            return self.createTransponderInfo(fedata, feraw)
        elif self.type == 'TransponderFrequency':
            return self.createFrequency(feraw)
        elif self.type == 'TransponderSymbolRate':
            return self.createSymbolRate(fedata, feraw)
        elif self.type == 'TransponderPolarization':
            return self.createPolarization(fedata)
        elif self.type == 'TransponderFEC':
            return self.createFEC(fedata, feraw)
        elif self.type == 'TransponderModulation':
            return self.createModulation(fedata)
        elif self.type == 'OrbitalPosition':
            return self.createOrbPos(feraw)
        elif self.type == 'TunerType':
            return self.createTunerType(feraw)
        elif self.type == 'TunerSystem':
            return self.createTunerSystem(fedata)
        elif self.type == 'OrbitalPositionOrTunerSystem':
            return self.createOrbPosOrTunerSystem(fedata, feraw)
        elif self.type == 'PIDInfo':
            return self.createPIDInfo(info)
        elif self.type == 'TerrestrialChannelNumber':
            return self.createChannelNumber(fedata, feraw)
        else:
            return _('invalid type')

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()
        if not info:
            return False
        else:
            request_caid = None
            for x in self.ca_table:
                if x[0] == self.type:
                    request_caid = x[1]
                    request_selected = x[2]
                    break

            if request_caid is None:
                return False
            if info.getInfo(iServiceInformation.sIsCrypted) != 1:
                return False
            data = self.ecmdata.getEcmData()
            if data is None:
                return False
            current_caid = data[1]
            available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
            for caid_entry in self.caid_data:
                if caid_entry[3] == request_caid:
                    if request_selected:
                        if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(caid_entry[1], 16):
                            return True
                    else:
                        try:
                            for caid in available_caids:
                                if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
                                    return True

                        except:
                            pass

            return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
        return
Example #11
0
class PGExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (('0x1700', '0x17ff', 'Beta', 'B',
                           True), ('0x600', '0x6ff', 'Irdeto', 'I', True),
                          ('0x100', '0x1ff', 'Seca', 'S',
                           True), ('0x500', '0x5ff', 'Via', 'V', True),
                          ('0x1800', '0x18ff', 'Nagra', 'N',
                           True), ('0xd00', '0xdff', 'CryptoW', 'CW', True),
                          ('0x900', '0x9ff', 'NDS', 'ND',
                           True), ('0xb00', '0xbff', 'Conax', 'CO', True),
                          ('0x4ae0', '0x4ae1', 'Dre', 'DC',
                           True), ('0x5581', '0x5581', 'BulCrypt', 'BU', True),
                          ('0x2600', '0x2600', 'Biss', 'BI',
                           True), ('0xe00', '0xeff', 'PowerVU', 'PV',
                                   True), ('0x4aee', '0x4aee', 'BulCrypt',
                                           'BU', False))
        self.ca_table = (('CryptoCaidBetaAvailable', 'B',
                          False), ('CryptoCaidIrdetoAvailable', 'I', False),
                         ('CryptoCaidSecaAvailable', 'S',
                          False), ('CryptoCaidViaAvailable', 'V', False),
                         ('CryptoCaidNagraAvailable', 'N',
                          False), ('CryptoCaidCryptoWAvailable', 'CW', False),
                         ('CryptoCaidNDSAvailable', 'ND',
                          False), ('CryptoCaidConaxAvailable', 'CO', False),
                         ('CryptoCaidDreAvailable', 'DC',
                          False), ('CryptoCaidBulCrypt2Available', 'BU',
                                   False), ('CryptoCaidBissAvailable', 'BI',
                                            False),
                         ('CryptoCaidPowerVUAvailable', 'PV',
                          False), ('CryptoCaidBulCrypt1Available', 'BU',
                                   False), ('CryptoCaidBetaSelected', 'B',
                                            True), ('CryptoCaidIrdetoSelected',
                                                    'I', True),
                         ('CryptoCaidSecaSelected', 'S',
                          True), ('CryptoCaidViaSelected', 'V', True),
                         ('CryptoCaidNagraSelected', 'N',
                          True), ('CryptoCaidCryptoWSelected', 'CW',
                                  True), ('CryptoCaidNDSSelected', 'ND', True),
                         ('CryptoCaidConaxSelected', 'CO',
                          True), ('CryptoCaidDreSelected', 'DC',
                                  True), ('CryptoCaidBulCrypt2Selected', 'BU',
                                          True), ('CryptoCaidBissSelected',
                                                  'BI', True),
                         ('CryptoCaidPowerVUSelected', 'PV',
                          True), ('CryptoCaidBulCrypt1Selected', 'BU', True))
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None
        return

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ''
            self.current_caid = '0'
            self.current_provid = '0'
            self.current_ecmpid = '0'

    def createCryptoBar(self, info):
        res = ''
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        for caid_entry in self.caid_data:
            if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(
                    self.current_caid, 16) <= int(caid_entry[1], 16):
                color = '\\c0000??00'
            else:
                color = '\\c007?7?7?'
                try:
                    for caid in available_caids:
                        if caid >= int(caid_entry[0], 16) and caid <= int(
                                caid_entry[1], 16):
                            color = '\\c00????00'

                except:
                    pass

            if color != '\\c007?7?7?' or caid_entry[4]:
                if res:
                    res += ' '
                res += color + caid_entry[3]

        res += '\\c00??????'
        return res

    def createCryptoSpecial(self, info):
        caid_name = 'Free To Air'
        try:
            for caid_entry in self.caid_data:
                if int(self.current_caid,
                       16) >= int(caid_entry[0], 16) and int(
                           self.current_caid, 16) <= int(caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break

            return caid_name + ':%04x:%04x:%04x:%04x' % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(
                    iServiceInformation.sSID), int(self.current_ecmpid, 16))
        except:
            pass

        return ''

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ''
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ('i', 'p', ' ')[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        return str(xres) + 'x' + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return ('MPEG2', 'MPEG4', 'MPEG1', 'MPEG4-II', 'VC1', 'VC1-SM',
                '')[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0:
            vpid = 0
        if apid < 0:
            apid = 0
        if pcrpid < 0:
            pcrpid = 0
        if sidpid < 0:
            sidpid = 0
        if tsid < 0:
            tsid = 0
        if onid < 0:
            onid = 0
        return '%d-%d:%05d:%04d:%04d:%04d' % (onid, tsid, sidpid, vpid, apid,
                                              pcrpid)

    def createTransponderInfo(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(
                self.createFrequency(feraw)) + addspace(
                    self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(feraw)) + addspace(
                self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(
            self.createSymbolRate(fedata, feraw)) + addspace(
                self.createFEC(fedata, feraw)) + addspace(
                    self.createModulation(fedata)) + addspace(
                        self.createOrbPos(feraw))

    def createFrequency(self, feraw):
        frequency = feraw.get('frequency')
        if frequency:
            if 'DVB-T' in feraw.get('tuner_type'):
                return str(int(frequency / 1000000.0 + 0.5))
            else:
                return str(int(frequency / 1000 + 0.5))
        return ''

    def createChannelNumber(self, fedata, feraw):
        return 'DVB-T' in feraw.get('tuner_type') and fedata.get(
            'channel') or ''

    def createSymbolRate(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            bandwidth = fedata.get('bandwidth')
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get('symbol_rate')
            if symbolrate:
                return str(symbolrate / 1000)
        return ''

    def createPolarization(self, fedata):
        return fedata.get('polarization_abbreviation') or ''

    def createFEC(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            code_rate_lp = fedata.get('code_rate_lp')
            code_rate_hp = fedata.get('code_rate_hp')
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + '-' + code_rate_hp
        else:
            fec = fedata.get('fec_inner')
            if fec:
                return fec
        return ''

    def createModulation(self, fedata):
        if fedata.get('tuner_type') == _('Terrestrial'):
            constellation = fedata.get('constellation')
            if constellation:
                return constellation
        else:
            modulation = fedata.get('modulation')
            if modulation:
                return modulation
        return ''

    def createTunerType(self, feraw):
        return feraw.get('tuner_type') or ''

    def createTunerSystem(self, fedata):
        return fedata.get('system') or ''

    def createOrbPos(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            return str(float(3600 - orbpos) / 10.0) + '\xc2\xb0 W'
        if orbpos > 0:
            return str(float(orbpos) / 10.0) + '\xc2\xb0 E'
        return ''

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not '':
            return orbpos
        return self.createTunerSystem(fedata)

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ''
        else:
            info = service and service.info()
            if not info:
                return ''
            if self.type == 'CryptoInfo':
                self.getCryptoInfo(info)
                if config.usage.show_cryptoinfo.value:
                    return addspace(self.createCryptoBar(
                        info)) + self.createCryptoSpecial(info)
                else:
                    return addspace(self.createCryptoBar(info)) + addspace(
                        self.current_source) + self.createCryptoSpecial(info)
            if self.type == 'CryptoBar':
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            if self.type == 'CryptoSpecial':
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            if self.type == 'ResolutionString':
                return self.createResolution(info)
            if self.type == 'VideoCodec':
                return self.createVideoCodec(info)
            if self.updateFEdata:
                feinfo = service.frontendInfo()
                if feinfo:
                    self.feraw = feinfo.getAll(
                        config.usage.infobar_frontend_source.value ==
                        'settings')
                    if self.feraw:
                        self.fedata = ConvertToHumanReadable(self.feraw)
            feraw = self.feraw
            if not feraw:
                feraw = info.getInfoObject(
                    iServiceInformation.sTransponderData)
                if not feraw:
                    return ''
                fedata = ConvertToHumanReadable(feraw)
            else:
                fedata = self.fedata
            if self.type == 'All':
                self.getCryptoInfo(info)
                if config.usage.show_cryptoinfo.value:
                    return addspace(self.createProviderName(
                        info)) + self.createTransponderInfo(
                            fedata, feraw) + '\n' + addspace(
                                self.createCryptoBar(info)) + addspace(
                                    self.createCryptoSpecial(info)
                                ) + '\n' + addspace(
                                    self.createPIDInfo(info)) + addspace(
                                        self.createVideoCodec(info)
                                    ) + self.createResolution(info)
                else:
                    return addspace(self.createProviderName(
                        info)) + self.createTransponderInfo(
                            fedata, feraw) + '\n' + addspace(
                                self.createCryptoBar(info)
                            ) + self.current_source + '\n' + addspace(
                                self.createCryptoSpecial(info)) + addspace(
                                    self.createVideoCodec(
                                        info)) + self.createResolution(info)
            if self.type == 'ServiceInfo':
                return addspace(self.createProviderName(info)) + addspace(
                    self.createTunerSystem(fedata)
                ) + addspace(self.createFrequency(feraw)) + addspace(
                    self.createPolarization(fedata)) + addspace(
                        self.createSymbolRate(fedata, feraw)) + addspace(
                            self.createFEC(fedata, feraw)) + addspace(
                                self.createModulation(fedata)) + addspace(
                                    self.createOrbPos(feraw)) + addspace(
                                        self.createVideoCodec(info)
                                    ) + self.createResolution(info)
            if self.type == 'TransponderInfo':
                return self.createTransponderInfo(fedata, feraw)
            if self.type == 'TransponderFrequency':
                return self.createFrequency(feraw)
            if self.type == 'TransponderSymbolRate':
                return self.createSymbolRate(fedata, feraw)
            if self.type == 'TransponderPolarization':
                return self.createPolarization(fedata)
            if self.type == 'TransponderFEC':
                return self.createFEC(fedata, feraw)
            if self.type == 'TransponderModulation':
                return self.createModulation(fedata)
            if self.type == 'OrbitalPosition':
                return self.createOrbPos(feraw)
            if self.type == 'TunerType':
                return self.createTunerType(feraw)
            if self.type == 'TunerSystem':
                return self.createTunerSystem(fedata)
            if self.type == 'OrbitalPositionOrTunerSystem':
                return self.createOrbPosOrTunerSystem(fedata, feraw)
            if self.type == 'PIDInfo':
                return self.createPIDInfo(info)
            if self.type == 'TerrestrialChannelNumber':
                return self.createChannelNumber(fedata, feraw)
            return _('invalid type')
            return

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()
        if not info:
            return False
        else:
            request_caid = None
            for x in self.ca_table:
                if x[0] == self.type:
                    request_caid = x[1]
                    request_selected = x[2]
                    break

            if request_caid is None:
                return False
            if info.getInfo(iServiceInformation.sIsCrypted) != 1:
                return False
            data = self.ecmdata.getEcmData()
            if data is None:
                return False
            current_caid = data[1]
            available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
            for caid_entry in self.caid_data:
                if caid_entry[3] == request_caid:
                    if request_selected:
                        if int(current_caid,
                               16) >= int(caid_entry[0], 16) and int(
                                   current_caid, 16) <= int(caid_entry[1], 16):
                            return True
                    else:
                        try:
                            for caid in available_caids:
                                if caid >= int(caid_entry[0],
                                               16) and caid <= int(
                                                   caid_entry[1], 16):
                                    return True

                        except:
                            pass

            return False
            return

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evUpdatedInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
        return
Example #12
0
class LdExtraInfo(Poll, Converter, object):
	ecmDict = { }

	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.DynamicSwitch = False
		self.type = type
		self.poll_interval = 9500
		self.poll_enabled = True
		self.caid_data = {
			( "0x100",  "0x1ff", "Seca",       "S" ),
			( "0x500",  "0x5ff", "Via",        "V" ),
			( "0x600",  "0x6ff", "Irdeto",     "I" ),
			( "0x900",  "0x9ff", "NDS",        "ND"),
			( "0xb00",  "0xbff", "Conax",      "CO"),
			( "0xd00",  "0xdff", "CryptoW",    "CW"),
			( "0xe00",  "0xeff", "PowerVU",    "P" ),
			("0x1000", "0x10FF", "Tandberg",   "TB"),
			("0x1700", "0x17ff", "Beta",       "B" ),
			("0x1800", "0x18ff", "Nagra",      "N" ),
			("0x2600", "0x2600", "Biss",       "BI"),
			("0x2700", "0x2710", "Dre3",       "D3"),
			("0x4ae0", "0x4ae1", "Dre",        "D" ),
			("0x4aee", "0x4aee", "BulCrypt",   "B1"),
			("0x5581", "0x5581", "BulCrypt",   "B2"),
			("0x5601", "0x5604", "Verimatrix", "VM") }
		self.ecmdata = GetEcmInfo()
		self.feraw = self.fedata = self.updateFEdata = None
		self.DynamicTimer = eTimer()
		if self.doSwitch:
			try:
				self.DynamicTimer.callback.append(self.doSwitch)
			except:
				return

	def getCryptoInfo(self, info):
		if info.getInfo(iServiceInformation.sIsCrypted) == 1:
			data = self.ecmdata.getEcmData()
			self.current_source = data[0]
			self.current_caid = data[1]
			self.current_provid = data[2]
			self.current_ecmpid = data[3]
		else:
			self.current_source = ""
			self.current_caid = "0"
			self.current_provid = "0"
			self.current_ecmpid = "0"

	def GetEcmInfo2(self):
		ecm = None
		data = {}
		try:
			ecm = open("/tmp/ecm.info", "rb").readlines()
			info = {}
			for line in ecm:
				x = line.lower().find("msec")
				if x != -1:
					info["ecm time"] = line[0:x+4]
				elif line.lower().find("response:") != -1:
					y = line.lower().find("response:")
					if y != -1:
						info["ecm time"] = line[y+9:].strip("\n\r")
				else:
					item = line.split(":", 1)
					if len(item) > 1:
						info[item[0].strip().lower()] = item[1].strip()
					else:
						if not info.has_key("caid"):
							x = line.lower().find("caid")
							if x != -1:
								y = line.find(",")
								if y != -1:
									info["caid"] = line[x+5:y]

			data['prov']  = info.get('prov', '')
			data['system'] = info.get('system', '')
			data['caid'] = info.get('caid', '0')
			data['pid'] = info.get('pid', '0')
			data['provider'] = info.get('provider', '')
			data['provid'] = info.get('provid', '')
			if data['provider'] == '':
				data['provider'] = info.get('prov', ' ')
			data['chid'] = info.get('chid', '0')
			data['using'] = info.get('using', '')
			data['decode'] = info.get('decode', '')
			data['source'] = info.get('source', '')
			data['reader'] = info.get('reader', '')
			data['address'] = info.get('address', 'Unknown')
			data['address_from'] = info.get('from', 'Unknown')
			data['from'] = info.get('from', 'Unknown')
			data['protocol'] = info.get('protocol', '')
			data['hops'] = info.get('hops', '0')
			data['share'] = info.get('share', '')
			data['ecm_time'] = info.get('ecm time', '?')
			data['Time'] = info.get('Time', '?')
			data['cw0'] = info.get('cw0', '0')
			data['cw1'] = info.get('cw1', '0')
		except:
			data['prov']  = ''
			data['system'] = ''
			data['caid'] = '0x00'
			data['pid'] = '0x00'
			data['provider'] = ''
			data['provid'] = ''
			data['chid'] = '0x00'
			data['using'] = ''
			data['decode'] = ''
			data['source'] = ''
			data['reader'] = ''
			data['address'] = ''
			data['address_from'] = ''
			data['from'] = ''
			data['protocol'] = ''
			data['hops'] = '0'
			data['share'] = ''
			data['ecm_time'] = '0'
			data['Time'] = '0'
			data['cw0'] = '0'
			data['cw1'] = '0'

		return data

	def get_caName(self):
		try:
			f = open("/etc/CurrentLdCamName",'r')
			name = f.readline().strip()
			f.close()
		except:
			name = "Common Interface"
		return name

	def get_Ecmtext(self):
		ecmtext = ''
		if fileExists('/tmp/ecm.info'):
			f = open('/tmp/ecm.info', 'r')
			for line in f.readlines():
				line = line.replace('\n', '')
				line = line.strip()
				if len(line) > 3:
					ecmtext = ecmtext + line + '\n'
			f.close()
		elif fileExists('/tmp/ecm0.info'):
			f = open('/tmp/ecm0.info', 'r')
			for line in f.readlines():
				line = line.replace('\n', '')
				line = line.strip()
				if len(line) > 3:
					ecmtext = ecmtext + line + '\n'
			f.close()
		elif fileExists('/tmp/ecm1.info'):
			f = open('/tmp/ecm1.info', 'r')
			for line in f.readlines():
				line = line.replace('\n', '')
				line = line.strip()
				if len(line) > 3:
					ecmtext = ecmtext + line + '\n'
			f.close()
		else:
			try:
				if len(ecmtext) < 5:
					ecmtext = '\n\n    ' + _('Ecm info not available.')
			except:
				return
		return str(ecmtext)

	def get_PIDtext(self):
		pidtext = ''
		if fileExists('/tmp/pid.info'):
			f = open('/tmp/pid.info', 'r')
			for line in f.readlines():
				line = line.replace('\n', '')
				line = line.strip()
				if len(line) > 3:
					pidtext = pidtext + line + '\n'
			f.close()
		else:
			try:
				if len(pidtext) < 5:
					pidtext = '\n\n    ' + _('Pid info not available.')
			except:
				return
		return str(pidtext)

	def provfile(self, caid, prov):
		ecm_info = self.GetEcmInfo2()
		provider = None
		pinfo = {}
		try:
			provider = open("/tmp/share.info", "rb").readlines()
		except:
			pass

		if provider:
			for line in provider:
				x = line.lower().find("id:")
				y = line.lower().find("card ")
				if x != -1 and y != -1:
					if caid != "0500":
						if line[x+3:].strip("\n\r") == prov.strip("\n\r") and line[y+5:y+9] == caid:
							x = line.lower().find("at ")
							if x != -1:
								y = line.lower().find("card ")
								if y != -1:
									pinfo["paddress"] = line[x+3:y-1]
								x = line.lower().find("sl:")
								if x != -1:
									y = line.lower().find("lev:")
									if y != -1:
										pinfo["slot"] = line[x+3:y-1]
										x = line.lower().find("dist:")
										if x != -1:
											pinfo["level"] = line[y+4:x-1]
											y = line.lower().find("id:")
											if y != -1:
												pinfo["distance"] = line[x+5:y-1]
					elif line[x+3:].strip("\n\r") == prov.strip("\n\r") and line[y+5:y+8] == caid[:-1]:
							x = line.lower().find("at ")
							if x != -1:
								y = line.lower().find("card ")
								if y != -1:
									pinfo["paddress"] = line[x+3:y-1]
								x = line.lower().find("sl:")
								if x != -1:
									y = line.lower().find("lev:")
									if y != -1:
										pinfo["slot"] = line[x+3:y-1]
										x = line.lower().find("dist:")
										if x != -1:
											pinfo["level"] = line[y+4:x-1]
											y = line.lower().find("id:")
											if y != -1:
												pinfo["distance"] = line[x+5:y-1]
		return pinfo

	def createCryptoBar(self, info):
		res = ""
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
				color="\c0000??00"
			else:
				color = "\c007?7?7?"
				try:
					for caid in available_caids:
						if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
							color="\c00????00"
				except:
					pass

			if res: res += " "
			res += color + caid_entry[3]

		res += "\c00??????"
		return res

	def createCryptoSeca(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x100', 16) <= caid <= int('0x1ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'S'
		res += "\c00??????"
		return res

	def createCryptoVia(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x500', 16) <= caid <= int('0x5ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'V'
		res += "\c00??????"
		return res

	def createCryptoIrdeto(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x600', 16) <= caid <= int('0x6ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'I'
		res += "\c00??????"
		return res

	def createCryptoNDS(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x900', 16) <= caid <= int('0x9ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'NDS'
		res += "\c00??????"
		return res

	def createCryptoConax(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xb00', 16) <= caid <= int('0xbff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'CO'
		res += "\c00??????"
		return res

	def createCryptoCryptoW(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xd00', 16) <= caid <= int('0xdff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'CW'
		res += "\c00??????"
		return res

	def createCryptoPowerVU(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xe00', 16) <= caid <= int('0xeff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'P'
		res += "\c00??????"
		return res

	def createCryptoTandberg(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1010', 16) <= int(self.current_caid, 16) <= int('0x1010', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1010', 16) <= caid <= int('0x1010', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'T'
		res += "\c00??????"
		return res

	def createCryptoBeta(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1700', 16) <= int(self.current_caid, 16) <= int('0x17ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1700', 16) <= caid <= int('0x17ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'B'
		res += "\c00??????"
		return res

	def createCryptoNagra(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1800', 16) <= int(self.current_caid, 16) <= int('0x18ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1800', 16) <= caid <= int('0x18ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'N'
		res += "\c00??????"
		return res

	def createCryptoBiss(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x2600', 16) <= int(self.current_caid, 16) <= int('0x26ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x2600', 16) <= caid <= int('0x26ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'BI'
		res += "\c00??????"
		return res

	def createCryptoDre(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int('0x4ae1', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'DC'
		res += "\c00??????"
		return res

	def createCryptoSpecial(self, info):
		service = self.source.service
		Is_Stream = service.streamed()
		is_crypted = info.getInfo(iServiceInformation.sIsCrypted)
		if Is_Stream:
			return _("IPTV")
		elif is_crypted != 1:
			return _("Free To Air")
		caid_name = _("Encrypt")
		try:
			for caid_entry in self.caid_data:
				if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x:%04x:%04x:%04x" % (int(self.current_caid,16), int(self.current_provid,16), info.getInfo(iServiceInformation.sSID), int(self.current_ecmpid,16))
		except:
			pass
		return ""

	def createCryptoNameCaid(self, info):
		service = self.source.service
		Is_Stream = service.streamed()
		is_crypted = info.getInfo(iServiceInformation.sIsCrypted)
		if Is_Stream:
			return _("IPTV")
		elif is_crypted != 1:
			return _("Free To Air")
		caid_name = _("Encrypt")
		try:
			for caid_entry in self.caid_data:
				if int(self.current_caid,16) == 0:
					return caid_name
				elif int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x" % (int(self.current_caid,16))
		except:
			pass
		return ""

	def createResolution(self, info):
		xres = info.getInfo(iServiceInformation.sVideoWidth)
		if xres == -1:
			return ""
		yres = info.getInfo(iServiceInformation.sVideoHeight)
		mode = ("i", "p", "", " ")[info.getInfo(iServiceInformation.sProgressive)]
		fps  = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
		if int(fps) <= 0:
			fps = ""
		return str(xres) + "x" + str(yres) + mode + fps

	def createVideoCodec(self, info):
		return codec_data.get(info.getInfo(iServiceInformation.sVideoType), "N/A")

	def createServiceRef(self, info):
		ref = info.getInfoString(iServiceInformation.sServiceref)
		if ref < 0 : ref = 0
		return "Ref: " + str(ref)

	def createPIDInfo(self, info):
		vpid = info.getInfo(iServiceInformation.sVideoPID)
		apid = info.getInfo(iServiceInformation.sAudioPID)
		pcrpid = info.getInfo(iServiceInformation.sPCRPID)
		sidpid = info.getInfo(iServiceInformation.sSID)
		tsid = info.getInfo(iServiceInformation.sTSID)
		onid = info.getInfo(iServiceInformation.sONID)
		if vpid < 0 : vpid = 0
		if apid < 0 : apid = 0
		if pcrpid < 0 : pcrpid = 0
		if sidpid < 0 : sidpid = 0
		if tsid < 0 : tsid = 0
		if onid < 0 : onid = 0
		return "Pid: %d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid, pcrpid)

	def createTransponderInfo(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type") or "DVB-T2" in feraw.get("tuner_type"):
			tmp = addspace(self.createChannelNumber(fedata, feraw)) + self.createFrequency(fedata) + "/" + self.createPolarization(fedata)
		else:
			tmp = addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
		return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
			+ addspace(self.createModulation(fedata)) + self.createOrbPos(feraw)

	def createTransponderInfo2(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type") or "DVB-T2" in feraw.get("tuner_type"):
			tmp = addspace(self.createChannelNumber(fedata, feraw)) + self.createFrequency(fedata) + "/" + self.createPolarization(fedata)
		else:
			tmp = addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
		if "DVB-T" in feraw.get("tuner_type") or "DVB-T2" in feraw.get("tuner_type"):
			return tmp + addspace(self.createSymbolRate(fedata, feraw))
		else:
			return tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
				+ addspace(self.createModulation(fedata)) + self.createOrbPos(feraw)

	def createFrequency(self, feraw):
		frequency = feraw.get("frequency")
		if frequency:
			return str(frequency)
		return ""

	def createChannelNumber(self, fedata, feraw):
		channel = channelnumbers.getChannelNumber(feraw.get("frequency"), feraw.get("tuner_number"))
		if channel:
			return _("CH") + "%s" % channel
		return ""

	def createSymbolRate(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type") or "DVB-T2" in feraw.get("tuner_type"):
			bandwidth = fedata.get("bandwidth")
			if bandwidth:
				return bandwidth
		else:
			symbolrate = fedata.get("symbol_rate")
			if symbolrate:
				return str(symbolrate)
		return ""

	def createPolarization(self, fedata):
		polarization = fedata.get("polarization_abbreviation")
		if polarization:
			return polarization
		return ""

	def createFEC(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type") or "DVB-T2" in feraw.get("tuner_type"):
			code_rate_lp = fedata.get("code_rate_lp")
			code_rate_hp = fedata.get("code_rate_hp")
			if code_rate_lp and code_rate_hp:
				return code_rate_lp + "-" + code_rate_hp
		else:
			fec = fedata.get("fec_inner")
			if fec:
				return fec
		return ""

	def createModulation(self, fedata):
		if fedata.get("tuner_type") == _("Terrestrial"):
			constellation = fedata.get("constellation")
			if constellation:
				return constellation
		else:
			modulation = fedata.get("modulation")
			if modulation:
				return modulation
		return ""

	def createTunerType(self, feraw):
		tunertype = feraw.get("tuner_type")
		if tunertype:
			return tunertype
		return ""

	def createTunerSystem(self, fedata):
		tunersystem = fedata.get("system")
		if tunersystem:
			return tunersystem
		return ""

	def createOrbPos(self, feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
		elif orbpos > 0:
			return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
		return ""

	def createOrbPosOrTunerSystem(self, fedata,feraw):
		orbpos = self.createOrbPos(feraw)
		if orbpos is not "":
			return orbpos
		return self.createTunerSystem(fedata)

	def createTransponderName(self,feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos is None: # Not satellite
			return ""
		freq = feraw.get("frequency")
		if freq and freq < 10700000: # C-band
			if orbpos > 1800:
				orbpos += 1
			else:
				orbpos -= 1

		sat_names = {
			30:   'Rascom/Eutelsat 3E',
			48:   'SES 5',
			70:   'Eutelsat 7E',
			90:   'Eutelsat 9E',
			100:  'Eutelsat 10E',
			130:  'Hot Bird',
			160:  'Eutelsat 16E',
			192:  'Astra 1KR/1L/1M/1N',
			200:  'Arabsat 20E',
			216:  'Eutelsat 21.5E',
			235:  'Astra 3',
			255:  'Eutelsat 25.5E',
			260:  'Badr 4/5/6',
			282:  'Astra 2E/2F/2G',
			305:  'Arabsat 30.5E',
			315:  'Astra 5',
			330:  'Eutelsat 33E',
			360:  'Eutelsat 36E',
			380:  'Paksat',
			390:  'Hellas Sat',
			400:  'Express 40E',
			420:  'Turksat',
			450:  'Intelsat 45E',
			480:  'Afghansat',
			490:  'Yamal 49E',
			530:  'Express 53E',
			570:  'NSS 57E',
			600:  'Intelsat 60E',
			620:  'Intelsat 62E',
			685:  'Intelsat 68.5E',
			705:  'Eutelsat 70.5E',
			720:  'Intelsat 72E',
			750:  'ABS',
			765:  'Apstar',
			785:  'ThaiCom',
			800:  'Express 80E',
			830:  'Insat',
			851:  'Intelsat/Horizons',
			880:  'ST2',
			900:  'Yamal 90E',
			915:  'Mesat',
			950:  'NSS/SES 95E',
			1005: 'AsiaSat 100E',
			1030: 'Express 103E',
			1055: 'Asiasat 105E',
			1082: 'NSS/SES 108E',
			1100: 'BSat/NSAT',
			1105: 'ChinaSat',
			1130: 'KoreaSat',
			1222: 'AsiaSat 122E',
			1380: 'Telstar 18',
			1440: 'SuperBird',
			2310: 'Ciel',
			2390: 'Echostar/Galaxy 121W',
			2410: 'Echostar/DirectTV 119W',
			2500: 'Echostar/DirectTV 110W',
			2630: 'Galaxy 97W',
			2690: 'NIMIQ 91W',
			2780: 'NIMIQ 82W',
			2830: 'Echostar/QuetzSat',
			2880: 'AMC 72W',
			2900: 'Star One',
			2985: 'Echostar 61.5W',
			2990: 'Amazonas',
			3020: 'Intelsat 58W',
			3045: 'Intelsat 55.5W',
			3070: 'Intelsat 53W',
			3100: 'Intelsat 50W',
			3150: 'Intelsat 45W',
			3169: 'Intelsat 43.1W',
			3195: 'SES 40.5W',
			3225: 'NSS/Telstar 37W',
			3255: 'Intelsat 34.5W',
			3285: 'Intelsat 31.5W',
			3300: 'Hispasat',
			3325: 'Intelsat 27.5W',
			3355: 'Intelsat 24.5W',
			3380: 'SES 22W',
			3400: 'NSS 20W',
			3420: 'Intelsat 18W',
			3450: 'Telstar 15W',
			3460: 'Express 14W',
			3475: 'Eutelsat 12.5W',
			3490: 'Express 11W',
			3520: 'Eutelsat 8W',
			3530: 'Nilesat/Eutelsat 7W',
			3550: 'Eutelsat 5W',
			3560: 'Amos',
			3592: 'Thor/Intelsat'
		}

		if orbpos in sat_names:
			return sat_names[orbpos]
		elif orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "W"
		else:
			return str((float(orbpos)) / 10.0) + "E"

	def createProviderName(self,info):
		return info.getInfoString(iServiceInformation.sProvider)

	@cached
	def get_caidlist(self):
		caidlist = {}
		service = self.source.service
		if service:
			info = service and service.info()
			if info:
				available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
				if available_caids:
					for cs in self.caid_data:
						caidlist[cs] = (self.caid_data.get(cs),0)
					for caid in available_caids:
						c = "%x" % int(caid)
						if len(c) == 3:
							c = "0%s" % c
						c = c[:2].upper()
						if self.caid_data.has_key(c):
							caidlist[c] = (self.caid_data.get(c),1)
					ecm_info = self.GetEcmInfo2()
					if ecm_info:
						emu_caid = ecm_info.get("caid", "")
						if emu_caid and emu_caid != "0x000":
							c = emu_caid.lstrip("0x")
							if len(c) == 3:
								c = "0%s" % c
							c = c[:2].upper()
							caidlist[c] = (self.caid_data.get(c),2)
		return caidlist

	getCaidlist = property(get_caidlist)

	@cached
	def getText(self):
		self.DynamicTimer.start(6000)
		service = self.source.service

		if service is None:
			return ""

		if service:
			info = service and service.info()
			is_crypted = info.getInfo(iServiceInformation.sIsCrypted)

		if not info:
			return ""

		if info:
			if info.getInfoObject(iServiceInformation.sCAIDs):
				ecm_info = self.GetEcmInfo2()
				if ecm_info:
					# caid
					caid = ecm_info.get("caid", '')
					caid = caid.lstrip("0x")
					caid = caid.upper()
					caid = caid.zfill(4)
					caid = "%s" % caid

					# prov
					prov = ecm_info.get("prov", "")
					prov = prov.lstrip("0x")
					prov = prov.upper()
					if prov == '':
					 prov = ''
					 prov = "%s" % prov.zfill(6)
					else:
					 prov = prov.zfill(6)
					 prov = "%s" % prov

					#provid cccam
					provid = ecm_info.get("provid", "")
					provid = provid.lstrip("0x")
					provid = provid.upper()
					provid = provid.zfill(6)
					provid = "%s" % provid

					#provider cccam
					provider = ecm_info.get("provider", "")
					provider = "%s" % provider
					provider = provider[:25]
				else:
					return ""

		if self.type == "CryptoInfo":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
			else:
				return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)

		if self.type == "CryptoBar":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBar(info)
			else:
				return ""

		if self.type == "CryptoSeca":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoSeca(info)
			else:
				return ""

		if self.type == "CryptoVia":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoVia(info)
			else:
				return ""

		if self.type == "CryptoIrdeto":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoIrdeto(info)
			else:
				return ""

		if self.type == "CryptoNDS":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNDS(info)
			else:
				return ""

		if self.type == "CryptoConax":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoConax(info)
			else:
				return ""

		if self.type == "CryptoCryptoW":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoCryptoW(info)
			else:
				return ""

		if self.type == "CryptoBeta":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBeta(info)
			else:
				return ""

		if self.type == "CryptoNagra":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNagra(info)
			else:
				return ""

		if self.type == "CryptoBiss":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBiss(info)
			else:
				return ""

		if self.type == "CryptoDre":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoDre(info)
			else:
				return ""

		if self.type == "CryptoTandberg":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoTandberg(info)
			else:
				return ""

		if self.type == "CryptoSpecial":
			data = self.GetEcmInfo2()
			if data['decode'] == "Network" or data['decode'] == "Local" or data['protocol'] == "gbox":
				return "Protocol Gbox"
			elif int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoSpecial(info)
			else:
				return ""

		if self.type == "CryptoNameCaid":
			data = self.GetEcmInfo2()
			if data['decode'] == "Network" or data['decode'] == "Local" or data['protocol'] == "gbox":
				return "Protocol Gbox"
			elif int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNameCaid(info)
			else:
				return ""

		if self.type == "ResolutionString":
			return self.createResolution(info)

		if self.type == "VideoCodec":
			return self.createVideoCodec(info)

		if self.type == "Ecmtext":
			return self.get_Ecmtext()

		if self.type == "PIDtext":
			data = self.GetEcmInfo2()
			if data['decode'] == "Network" or data['decode'] == "Local" or data['protocol'] == "gbox":
				return self.get_PIDtext()
			else:
				return ""

		if self.type == "InfoPeer":
			data = self.GetEcmInfo2()
			if data['decode'] == "Network" or data['decode'] == "Local" or data['protocol'] == "gbox":
				ecm_info = self.GetEcmInfo2()
				decode = ecm_info.get("decode", '')
				prov = ecm_info.get("prov", '')
				paddress = level = dist = ''
				if prov:
					prov = prov[0:4]
					prov_info = self.provfile(caid, prov)
					paddress = prov_info.get("paddress", '')
					if paddress:
						host = paddress.split(":")[0]
						if host in self.ecmDict:
							paddress = self.ecmDict[host]
					level = prov_info.get("level", None)
					dist = prov_info.get("distance", None)
				if decode:
					if decode == "Internal" or decode == "Local":
						return "CAID: %s   -  %s   -  ID: %s" % (caid, decode, prov)
					elif decode == "Network":
						return "CAID: %s   -  %s   -  ID: %s   %s    Level: %s   Dist: %s" % (caid, decode, prov, paddress, level, dist)
				return "CAID: %s   -  %s   -  ID: %s" % (data['caid'], data['decode'], data['prov'])

		if self.type == "ProviderName":
			return self.createProviderName(info)

		if self.type == "CamName":
			return self.get_caName()

		if self.type == "CaidList":
			return self.get_caidlist()

		elif self.type == "NetInfo":
			if is_crypted != 1:
				return ''
			data = self.GetEcmInfo2()
			if data['using']:
				return "CAID: %s   -  %s   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['address'], data['hops'], data['ecm_time'])
			elif data['reader']:
				return "CAID: %s   -  %s   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['address_from'], data['hops'], data['ecm_time'])
			elif data['decode']:
				ecm_info = self.GetEcmInfo2()
				decode = ecm_info.get("decode", '')
				prov = ecm_info.get("prov", '')
				paddress = level = dist = ''
				if prov:
					prov = prov[0:4]
					prov_info = self.provfile(caid, prov)
					paddress = prov_info.get("paddress", '')
					if paddress:
						host = paddress.split(":")[0]
						if host in self.ecmDict:
							paddress = self.ecmDict[host]
					level = prov_info.get("level", None)
					dist = prov_info.get("distance", None)
				if decode:
					if decode == "Internal" or decode == "Local":
						return "CAID: %s   -  %s   -  ID: %s" % (caid, decode, prov)
					elif decode == "Network":
						return "CAID: %s   -  %s   -  ID: %s   %s    Level: %s   Dist: %s" % (caid, decode, prov, paddress, level, dist)
				return "CAID: %s   -  %s   -  ID: %s" % (data['caid'], data['decode'], data['prov'])
			elif data['using'] or data['reader']:
				if data['address'] == "/dev/sci0":
					return "CAID: %s   -  Card in Slot #1   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['hops'], data['ecm_time'])
				elif data['address'] == "/dev/sci1":
					return "CAID: %s   -  Card in Slot #2   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['hops'], data['ecm_time'])
				else:
					if data['address_from'] == "/dev/sci0":
						return "CAID: %s   -  Card in Slot #1   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['hops'], data['ecm_time'])
					elif data['address_from'] == "/dev/sci1":
						return "CAID: %s   -  Card in Slot #2   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['hops'], data['ecm_time'])
			elif data['source']:
				if data['source'] == "emu":
					return "EMU %s" % (data['caid'])
				else:
					return "CAID: %s - %s %s" % (data['caid'], data['source'], data['ecm_time'])

		elif self.type == "EcmInfo":
			if is_crypted != 1:
				return ''
			data = self.GetEcmInfo2()
			name = caidnames(caid, provid)
			name = name[:15]
			return "Provider: %s %s " % (data['provider'], name)

		elif self.type == "EcmInfo2":
			if is_crypted != 1:
				return ''
			data = self.GetEcmInfo2()
			name = caidnames(caid, provid)
			name = name[:15]
			if data['using'] == "newcamd" or data['using'] == "NewCamd":
				return "Provider: %s %s " % (data['provider'], name)
			elif data['using'] == "CCcam" or data['using'] == "CCcam-s2s":
				return "Provider: %s %s " % (data['provider'], name)
			elif data['using'] == "gbox" or data['address'] == "127.0.0.1:*":
				return "Provider: %s %s " % (data['provider'], name)
			elif data['decode'] == "Network" or data['decode'] == "Local":
				ecm_info = self.GetEcmInfo2()
				return "CAID: %s     BoxId: %s %s " % (caid, data['provider'], name)
			else:
				if prov == '000000':
					return "CAID: %s     Provider: %s " % (data['caid'], name)
				else:
					return "CAID: %s     Provider: %s %s " % (data['caid'], data['provider'], name)
			return ""

		elif self.type == "E-C-N":
			if is_crypted != 1:
				return ''

			CamName = self.get_caName()
			if self.type == "CryptoNameCaid" or CamName == 'Common Interface':
				if int(config.usage.show_cryptoinfo.value) > 0:
					self.getCryptoInfo(info)
					return self.createCryptoNameCaid(info)
				else:
					return ""
			elif self.type == "CryptoSpecial" or CamName == 'Common Interface':
				if int(config.usage.show_cryptoinfo.value) > 0:
					self.getCryptoInfo(info)
					return self.createCryptoSpecial(info)
				else:
					return ""

			data = self.GetEcmInfo2()
			if data['reader'] or data['using'] or data['protocol'] or data['from'] or data['hops'] or data['decode'] or data['address']:
				if data['using'] == "fta":
					return "Fta"
				elif data['using'] == "emu" or data['from'] == "constcw":
					return "Emulator"
				elif data['hops'] == "0" and data['protocol'] == "none" or data['from'] == "cache*":
					return "Cache"
				elif data['using'] == "gbox" or data['address'] == "127.0.0.1:*":
					return "Sharing"
				elif data['hops'] == "0" and data['using'] == "sci" or data['hops'] == "0" and data['using'] == "smartreader+":
					return "Card"
				elif data['hops'] == "0" and data['protocol'] == "cccam" or data['hops'] == "0" and data['protocol'] == "newcamd":
					return "Card"
				elif data['hops'] == "0" and data['using'] == "newcamd" or data['hops'] == "0" and data['using'] == "NewCamd":
					return "Card"
				elif data['hops'] == "0" and data['using'] == "CCcam" or data['hops'] == "0" and data['using'] == "CCcam-s2s":
					return "Card"
				elif data['decode'] == "Local":
					return "Card"
				else:
					return "Network"
			elif data['reader'] or data['using'] or data['protocol'] or data['from'] or data['hops']:
				pos = data['address_from'].find('.') or data['from'].find('.')
				if pos > 1:
					return "Network"
				else:
					return "Card"
			return ""

		if self.updateFEdata:
			feinfo = service.frontendInfo()
			if feinfo:
				self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == "settings")
				if self.feraw:
					self.fedata = ConvertToHumanReadable(self.feraw)

		feraw = self.feraw
		if not feraw:
			feraw = info.getInfoObject(iServiceInformation.sTransponderData)
			if not feraw:
				return ""
			fedata = ConvertToHumanReadable(feraw)
		else:
			fedata = self.fedata
		if self.type == "All":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n"\
				+ addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n"\
				+ addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
			else:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n" \
				+ addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
				+ addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "AllSimpleLD":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				if "DVB-T" in feraw.get("tuner_type") or "DVB-T2" in feraw.get("tuner_type"):
					return addspace(self.createProviderName(info)) + self.createTransponderInfo2(fedata,feraw)
				else:
					return addspace(self.createProviderName(info)) + self.createTransponderInfo2(fedata,feraw) + '  (' + self.createTransponderName(feraw) + ') '
			else:
				if "DVB-T" in feraw.get("tuner_type") or "DVB-T2" in feraw.get("tuner_type"):
					return addspace(self.createProviderName(info)) + self.createTransponderInfo2(fedata,feraw)
				else:
					return addspace(self.createProviderName(info)) + self.createTransponderInfo2(fedata,feraw) + '  (' + self.createTransponderName(feraw) + ') '

		if self.type == "ServiceInfo":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
			+ addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createTransponderName(feraw))\
			+ addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "TransponderInfo2line":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createTransponderName(feraw)) + "\n" \
			+ addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
			+ addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))

		if self.type == "PIDInfo":
			return self.createPIDInfo(info)

		if self.type == "ServiceRef":
			return self.createServiceRef(info)

		if not feraw:
			return ""

		if self.type == "TransponderInfo":
			return self.createTransponderInfo(fedata,feraw)

		if self.type == "TransponderInfo2":
			return self.createTransponderInfo2(fedata,feraw)

		if self.type == "TransponderFrequency":
			return self.createFrequency(feraw)

		if self.type == "TransponderSymbolRate":
			return self.createSymbolRate(fedata, feraw)

		if self.type == "TransponderPolarization":
			return self.createPolarization(fedata)

		if self.type == "TransponderFEC":
			return self.createFEC(fedata, feraw)

		if self.type == "TransponderModulation":
			return self.createModulation(fedata)

		if self.type == "OrbitalPosition":
			return self.createOrbPos(feraw)

		if self.type == "TunerType":
			return self.createTunerType(feraw)

		if self.type == "TunerSystem":
			return self.createTunerSystem(fedata)

		if self.type == "OrbitalPositionOrTunerSystem":
			return self.createOrbPosOrTunerSystem(fedata,feraw)

		if self.type == "TerrestrialChannelNumber":
			return self.createChannelNumber(fedata, feraw)

		return ""

	text = property(getText)

	@cached
	def getBool(self):
		service = self.source.service
		info = service and service.info()

		if not info:
			return False

		if self.type == "CryptoCaidSecaAvailable":
			request_caid = "S"
			request_selected = False
		elif self.type == "CryptoCaidViaAvailable":
			request_caid = "V"
			request_selected = False
		elif self.type == "CryptoCaidIrdetoAvailable":
			request_caid = "I"
			request_selected = False
		elif self.type == "CryptoCaidNDSAvailable":
			request_caid = "ND"
			request_selected = False
		elif self.type == "CryptoCaidConaxAvailable":
			request_caid = "CO"
			request_selected = False
		elif self.type == "CryptoCaidCryptoWAvailable":
			request_caid = "CW"
			request_selected = False
		elif self.type == "CryptoCaidPowerVUAvailable":
			request_caid = "P"
			request_selected = False
		elif self.type == "CryptoCaidBetaAvailable":
			request_caid = "B"
			request_selected = False
		elif self.type == "CryptoCaidNagraAvailable":
			request_caid = "N"
			request_selected = False
		elif self.type == "CryptoCaidBissAvailable":
			request_caid = "BI"
			request_selected = False
		elif self.type == "CryptoCaidDre3Available":
			request_caid = "D3"
			request_selected = False
		elif self.type == "CryptoCaidDreAvailable":
			request_caid = "D"
			request_selected = False
		elif self.type == "CryptoCaidBulCrypt1Available":
			request_caid = "B1"
			request_selected = False
		elif self.type == "CryptoCaidBulCrypt2Available":
			request_caid = "B2"
			request_selected = False
		elif self.type == "CryptoCaidVerimatrixAvailable":
			request_caid = "VM"
			request_selected = False
		elif self.type == "CryptoCaidTandbergAvailable":
			request_caid = "TB"
			request_selected = False
		elif self.type == "CryptoCaidSecaSelected":
			request_caid = "S"
			request_selected = True
		elif self.type == "CryptoCaidViaSelected":
			request_caid = "V"
			request_selected = True
		elif self.type == "CryptoCaidIrdetoSelected":
			request_caid = "I"
			request_selected = True
		elif self.type == "CryptoCaidNDSSelected":
			request_caid = "ND"
			request_selected = True
		elif self.type == "CryptoCaidConaxSelected":
			request_caid = "CO"
			request_selected = True
		elif self.type == "CryptoCaidCryptoWSelected":
			request_caid = "CW"
			request_selected = True
		elif self.type == "CryptoCaidPowerVUSelected":
			request_caid = "P"
			request_selected = True
		elif self.type == "CryptoCaidBetaSelected":
			request_caid = "B"
			request_selected = True
		elif self.type == "CryptoCaidNagraSelected":
			request_caid = "N"
			request_selected = True
		elif self.type == "CryptoCaidBissSelected":
			request_caid = "BI"
			request_selected = True
		elif self.type == "CryptoCaidDre3Selected":
			request_caid = "D3"
			request_selected = True
		elif self.type == "CryptoCaidDreSelected":
			request_caid = "D"
			request_selected = True
		elif self.type == "CryptoCaidBulCrypt1Selected":
			request_caid = "B1"
			request_selected = True
		elif self.type == "CryptoCaidBulCrypt2Selected":
			request_caid = "B2"
			request_selected = True
		elif self.type == "CryptoCaidVerimatrixSelected":
			request_caid = "VM"
			request_selected = True
		elif self.type == "CryptoCaidTandbergSelected":
			request_caid = "TB"
			request_selected = True
		else:
			return False

		request_caid = None
		for x in self.ca_table:
			if x[0] == self.type:
				request_caid = x[1]
				request_selected = x[2]
				break

		if request_caid is None:
			return False

		if info.getInfo(iServiceInformation.sIsCrypted) != 1:
			return False

		data = self.ecmdata.getEcmData()
		data = self.GetEcmInfo2()

		if data is None:
			return False

		current_caid = data['caid'] or data[1]

		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if caid_entry[3] == request_caid:
				if request_selected:
					if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(caid_entry[1], 16):
						return True
				else: # request available
					try:
						for caid in available_caids:
							if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
								return True
					except:
						pass

		return False

	boolean = property(getBool)

	def changed(self, what):
		if what[0] == self.CHANGED_SPECIFIC:
			self.updateFEdata = False
			if what[1] == iPlayableService.evNewProgramInfo:
				self.updateFEdata = True
			elif what[1] == iPlayableService.evEnd:
				self.feraw = self.fedata = None
			Converter.changed(self, what)
		elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
			self.updateFEdata = False
			Converter.changed(self, what)
		else:
			self.what = what
			Converter.changed(self, what)

	def doSwitch(self):
		self.DynamicSwitch = True
		self.DynamicTimer.stop()
		Converter.changed(self, self.what)
Example #13
0
class PliExtraInfo(Poll, Converter):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.ca_table = (
            ("CryptoCaidDvnAvailable", "TB", False),
            ("CryptoCaidSmsxAvailable", "SM", False),
            ("CryptoCaidTongfangAvailable", "TF", False),
            ("CryptoCaidSecaAvailable", "S", False),
            ("CryptoCaidViaAvailable", "V", False),
            ("CryptoCaidIrdetoAvailable", "I", False),
            ("CryptoCaidNDSAvailable", "Nd", False),
            ("CryptoCaidConaxAvailable", "Co", False),
            ("CryptoCaidCryptoWAvailable", "Cw", False),
            ("CryptoCaidPowerVUAvailable", "P", False),
            ("CryptoCaidBetaAvailable", "B", False),
            ("CryptoCaidNagraAvailable", "N", False),
            ("CryptoCaidBissAvailable", "Bi", False),
            ("CryptoCaidDre3Available", "D3", False),
            ("CryptoCaidDreAvailable", "D", False),
            ("CryptoCaidBulCrypt1Available", "B1", False),
            ("CryptoCaidBulCrypt2Available", "B2", False),
            ("CryptoCaidVerimatrixAvailable", "Vm", False),
            ("CryptoCaidTandbergAvailable", "T", False),
            ("CryptoCaidDvnSelected", "TB", True),
            ("CryptoCaidSmsxSelected", "SM", True),
            ("CryptoCaidTongfangSelected", "TF", True),
            ("CryptoCaidSecaSelected", "S", True),
            ("CryptoCaidViaSelected", "V", True),
            ("CryptoCaidIrdetoSelected", "I", True),
            ("CryptoCaidNDSSelected", "Nd", True),
            ("CryptoCaidConaxSelected", "Co", True),
            ("CryptoCaidCryptoWSelected", "Cw", True),
            ("CryptoCaidPowerVUSelected", "P", True),
            ("CryptoCaidBetaSelected", "B", True),
            ("CryptoCaidNagraSelected", "N", True),
            ("CryptoCaidBissSelected", "Bi", True),
            ("CryptoCaidDre3Selected", "D3", True),
            ("CryptoCaidDreSelected", "D", True),
            ("CryptoCaidBulCrypt1Selected", "B1", True),
            ("CryptoCaidBulCrypt2Selected", "B2", True),
            ("CryptoCaidVerimatrixSelected", "Vm", True),
            ("CryptoCaidTandbergSelected", "T", True),
        )
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ""
            self.current_caid = "0"
            self.current_provid = "0"
            self.current_ecmpid = "0"

    def createCryptoBar(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        colors = parameters.get("PliExtraInfoColors", (
            0x0000FF00, 0x00FFFF00, 0x007F7F7F,
            0x00FFFFFF))  # "found", "not found", "available", "default" colors

        for caid_entry in caid_data:
            if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                    caid_entry[1], 16):
                color = Hex2strColor(colors[0])  # green
            else:
                color = Hex2strColor(colors[2])  # grey
                try:
                    for caid in available_caids:
                        if int(caid_entry[0], 16) <= caid <= int(
                                caid_entry[1], 16):
                            color = Hex2strColor(colors[1])  # yellow
                except:
                    pass

            if color != Hex2strColor(colors[2]) or caid_entry[4]:
                if res: res += " "
                res += color + caid_entry[3]

        res += Hex2strColor(
            colors[3]
        )  # white (this acts like a color "reset" for following strings
        return res

    def createCryptoSpecial(self, info):
        caid_system = _("CA System: ")
        caid_name = _("FTA")
        if int(self.current_caid, 16) == 0:
            return caid_system + caid_name
        try:
            for caid_entry in caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                        caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break
            caid_num = "%04x" % (int(self.current_caid, 16))
            caid_num = caid_num.upper()
            return caid_system + caid_name + "@" + caid_num
        except:
            pass
        return ""

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ""
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ("i", "p", "")[info.getInfo(iServiceInformation.sProgressive)]
        fps = (info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000
        if not fps:
            if os.path.exists("/proc/stb/vmpeg/0/framerate"):
                with open("/proc/stb/vmpeg/0/framerate", "r") as fp:
                    fps = (int(fp.read()) + 500) / 1000
            elif os.path.exists("/proc/stb/vmpeg/0/fallback_framerate"):
                with open("/proc/stb/vmpeg/0/fallback_framerate", "r") as fp:
                    fps = (int(fp.read()) + 0) / 1000
        if not mode:
            if os.path.exists("/proc/stb/vmpeg/0/progressive"):
                with open("/proc/stb/vmpeg/0/progressive", "r") as fp:
                    mode = "p" if int(fp.read(), 16) else "i"
        return "%sx%s%s%s" % (xres, yres, mode, fps)

    def createGamma(self, info):
        return ("SDR", "HDR", "HDR10", "HLG",
                "")[info.getInfo(iServiceInformation.sGamma)]

    def createVideoCodec(self, info):
        return codec_data.get(info.getInfo(iServiceInformation.sVideoType),
                              _("N/A"))

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0: vpid = 0
        if apid < 0: apid = 0
        if pcrpid < 0: pcrpid = 0
        if sidpid < 0: sidpid = 0
        if tsid < 0: tsid = 0
        if onid < 0: onid = 0
        return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid,
                                              pcrpid)

    def createTransponderInfo(self, fedata, feraw, info):
        if not feraw:
            refstr = info.getInfoString(iServiceInformation.sServiceref)
            if "%3a//" in refstr.lower():
                return refstr.split(":")[10].replace("%3a",
                                                     ":").replace("%3A", ":")
            return ""
        elif "DVB-T" in feraw.get("tuner_type"):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(
                self.createFrequency(feraw)) + addspace(
                    self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(feraw)) + addspace(
                self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
         + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createMisPls(fedata))

    def createFrequency(self, feraw):
        frequency = feraw.get("frequency")
        if frequency:
            if "DVB-T" in feraw.get("tuner_type"):
                return str(int(frequency / 1000000. + 0.5))
            else:
                return str(int(frequency / 1000 + 0.5))
        return ""

    def createChannelNumber(self, fedata, feraw):
        return "DVB-T" in feraw.get("tuner_type") and fedata.get(
            "channel") or ""

    def createSymbolRate(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            bandwidth = fedata.get("bandwidth")
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get("symbol_rate")
            if symbolrate:
                return str(symbolrate / 1000)
        return ""

    def createPolarization(self, fedata):
        return fedata.get("polarization_abbreviation") or ""

    def createFEC(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            code_rate_lp = fedata.get("code_rate_lp")
            code_rate_hp = fedata.get("code_rate_hp")
            guard_interval = fedata.get("guard_interval")
            if code_rate_lp and code_rate_hp and guard_interval:
                return code_rate_lp + "-" + code_rate_hp + "-" + guard_interval
        else:
            fec = fedata.get("fec_inner")
            if fec:
                return fec
        return ""

    def createModulation(self, fedata):
        if fedata.get("tuner_type") == _("Terrestrial"):
            constellation = fedata.get("constellation")
            if constellation:
                return constellation
        else:
            modulation = fedata.get("modulation")
            if modulation:
                return modulation
        return ""

    def createTunerType(self, feraw):
        return feraw.get("tuner_type") or ""

    def createTunerSystem(self, fedata):
        return fedata.get("system") or ""

    def createOrbPos(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            return _("%.1f° W") % ((3600 - orbpos) / 10.0)
        elif orbpos > 0:
            return _("%.1f° E") % (orbpos / 10.0)
        return ""

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not "":
            return orbpos
        return self.createTunerSystem(fedata)

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    def createMisPls(self, fedata):
        tmp = ""
        if fedata.get("is_id") > -1:
            tmp = "MIS %d" % fedata.get("is_id")
        if fedata.get("pls_code") > 0:
            tmp = addspace(tmp) + "%s %d" % (fedata.get("pls_mode"),
                                             fedata.get("pls_code"))
        if fedata.get("t2mi_plp_id") > -1:
            tmp = addspace(tmp) + "T2MI %d PID %d" % (
                fedata.get("t2mi_plp_id"), fedata.get("t2mi_pid"))
        return tmp

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ""
        info = service and service.info()

        if not info:
            return ""

        if self.type == "CryptoInfo":
            self.getCryptoInfo(info)
            if config.usage.show_cryptoinfo.value:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)

        if self.type == "CryptoBar":
            self.getCryptoInfo(info)
            return self.createCryptoBar(info)

        if self.type == "CryptoSpecial":
            self.getCryptoInfo(info)
            return self.createCryptoSpecial(info)

        if self.type == "Resolution":
            return self.createResolution(info)

        if self.type == "ResolutionString":
            return addspace(
                self.createResolution(info)) + self.createGamma(info)

        if self.type == "VideoCodec":
            return self.createVideoCodec(info)

        if self.type == "Gamma":
            return self.createGamma(info)

        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(
                    config.usage.infobar_frontend_source.value == "settings")
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)

        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata

        if self.type == "All":
            self.getCryptoInfo(info)
            if config.usage.show_cryptoinfo.value:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw, info) + "\n" \
                + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n" \
                + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + addspace(self.createResolution(info)) + self.createGamma(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw, info) + "\n" \
                + addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
                + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + addspace(self.createResolution(info)) + self.createGamma(info)

        if self.type == "PIDInfo":
            return self.createPIDInfo(info)

        if not feraw:
            return ""

        if self.type == "ServiceInfo":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
            + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) \
            + addspace(self.createVideoCodec(info)) + addspace(self.createResolution(info)) + self.createGamma(info)

        if self.type == "TransponderInfo":
            return self.createTransponderInfo(fedata, feraw, info)

        if self.type == "TransponderFrequency":
            return self.createFrequency(feraw)

        if self.type == "TransponderSymbolRate":
            return self.createSymbolRate(fedata, feraw)

        if self.type == "TransponderPolarization":
            return self.createPolarization(fedata)

        if self.type == "TransponderFEC":
            return self.createFEC(fedata, feraw)

        if self.type == "TransponderModulation":
            return self.createModulation(fedata)

        if self.type == "OrbitalPosition":
            return self.createOrbPos(feraw)

        if self.type == "TunerType":
            return self.createTunerType(feraw)

        if self.type == "TunerSystem":
            return self.createTunerSystem(fedata)

        if self.type == "OrbitalPositionOrTunerSystem":
            return self.createOrbPosOrTunerSystem(fedata, feraw)

        if self.type == "TerrestrialChannelNumber":
            return self.createChannelNumber(fedata, feraw)

        if self.type == "TransponderInfoMisPls":
            return self.createMisPls(fedata)

        return _("invalid type")

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()

        if not info:
            return False

        request_caid = None
        for x in self.ca_table:
            if x[0] == self.type:
                request_caid = x[1]
                request_selected = x[2]
                break

        if request_caid is None:
            return False

        if info.getInfo(iServiceInformation.sIsCrypted) != 1:
            return False

        data = self.ecmdata.getEcmData()

        if data is None:
            return False

        current_caid = data[1]

        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in caid_data:
            if caid_entry[3] == request_caid:
                if request_selected:
                    if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(
                            caid_entry[1], 16):
                        return True
                else:  # request available
                    try:
                        for caid in available_caids:
                            if int(caid_entry[0], 16) <= caid <= int(
                                    caid_entry[1], 16):
                                return True
                    except:
                        pass

        return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
Example #14
0
class LdExtraInfo(Poll, Converter, object):
	ecmDict = { }

	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = type
		self.poll_interval = 1000
		self.poll_enabled = True
		self.caid_data = {
			( "0x100",  "0x1ff", "Seca",     "S" ),
			( "0x500",  "0x5ff", "Via",      "V" ),
			( "0x600",  "0x6ff", "Irdeto",   "I" ),
			( "0x900",  "0x9ff", "NDS",      "ND" ),
			( "0xb00",  "0xbff", "Conax",    "CO" ),
			( "0xd00",  "0xdff", "CryptoW",  "CW" ),
			( "0xe00",  "0xeff", "PowerVU",  "P" ),
			("0x1000", "0x10FF", "Tandberg", "TB" ),
			("0x1700", "0x17ff", "Beta",     "B" ),
			("0x1800", "0x18ff", "Nagra",    "N" ),
			("0x2600", "0x2600", "Biss",     "BI" ),
			("0x4ae0", "0x4ae1", "Dre",      "D" ),
			("0x4aee", "0x4aee", "BulCrypt", "B1" ),
			("0x5581", "0x5581", "BulCrypt", "B2" ) }
		self.ecmdata = GetEcmInfo()
		self.feraw = self.fedata = self.updateFEdata = None
		self.DynamicTimer = eTimer()
		self.DynamicTimer.callback.append(self.doSwitch)

	def getCryptoInfo(self, info):
		if info.getInfo(iServiceInformation.sIsCrypted) == 1:
			data = self.ecmdata.getEcmData()
			self.current_source = data[0]
			self.current_caid = data[1]
			self.current_provid = data[2]
			self.current_ecmpid = data[3]
		else:
			self.current_source = ""
			self.current_caid = "0"
			self.current_provid = "0"
			self.current_ecmpid = "0"

	def GetEcmInfo2(self):
		ecm = None
		data = {}
		try:
			ecm = open("/tmp/ecm.info", "rb").readlines()
			info = {}
			for line in ecm:
				x = line.lower().find("msec")
				if x != -1:
					info["ecm time"] = line[0:x+4]
				elif line.lower().find("response:") != -1:
					y = line.lower().find("response:")
					if y != -1:
						info["ecm time"] = line[y+9:].strip("\n\r")
				else:
					item = line.split(":", 1)
					if len(item) > 1:
						info[item[0].strip().lower()] = item[1].strip()
					else:
						if not info.has_key("caid"):
							x = line.lower().find("caid")
							if x != -1:
								y = line.find(",")
								if y != -1:
									info["caid"] = line[x+5:y]

			data['prov']  = info.get('prov', '')
			data['system'] = info.get('system', '')
			data['caid'] = info.get('caid', '0')
			data['pid'] = info.get('pid', '0')
			data['provider'] = info.get('provider', '')
			data['provid'] = info.get('provid', '')
			if data['provider'] == '':
				data['provider'] = info.get('prov', ' ')
			data['chid'] = info.get('chid', '0')
			data['using'] = info.get('using', '')
			data['decode'] = info.get('decode', '')
			data['source'] = info.get('source', '')
			data['reader'] = info.get('reader', '')
			data['address'] = info.get('address', 'Unknown')
			data['address_from'] = info.get('from', 'Unknown')
			data['from'] = info.get('from', 'Unknown')
			data['protocol'] = info.get('protocol', '')
			data['hops'] = info.get('hops', '0')
			data['share'] = info.get('share', '')
			data['ecm_time'] = info.get('ecm time', '?')
			data['Time'] = info.get('Time', '?')
			data['cw0'] = info.get('cw0', '0')
			data['cw1'] = info.get('cw1', '0')
		except:
			data['prov']  = ''
			data['system'] = ''
			data['caid'] = '0x00'
			data['pid'] = '0x00'
			data['provider'] = ''
			data['provid'] = ''
			data['chid'] = '0x00'
			data['using'] = ''
			data['decode'] = ''
			data['source'] = ''
			data['reader'] = ''
			data['address'] = ''
			data['address_from'] = ''
			data['from'] = ''
			data['protocol'] = ''
			data['hops'] = '0'
			data['share'] = ''
			data['ecm_time'] = '0'
			data['Time'] = '0'
			data['cw0'] = '0'
			data['cw1'] = '0'

		return data

	def get_caName(self):
		try:
			f = open("/etc/CurrentLdCamName",'r')
			name = f.readline().strip()
			f.close()
		except:
			name = "Common Interface"
		return name

	def get_Ecmtext(self):
		ecmtext = ''
		if fileExists('/tmp/ecm.info'):
			f = open('/tmp/ecm.info', 'r')
			for line in f.readlines():
				line = line.replace('\n', '')
				line = line.strip()
				if len(line) > 3:
					ecmtext = ecmtext + line + '\n'
			f.close()
		elif fileExists('/tmp/ecm0.info'):
			f = open('/tmp/ecm0.info', 'r')
			for line in f.readlines():
				line = line.replace('\n', '')
				line = line.strip()
				if len(line) > 3:
					ecmtext = ecmtext + line + '\n'
			f.close()
		elif fileExists('/tmp/ecm1.info'):
			f = open('/tmp/ecm1.info', 'r')
			for line in f.readlines():
				line = line.replace('\n', '')
				line = line.strip()
				if len(line) > 3:
					ecmtext = ecmtext + line + '\n'
			f.close()
		if len(ecmtext) < 5:
			ecmtext = '\n\n    ' + _('Ecm info not available.')
		return str(ecmtext)

	def get_PIDtext(self):
		pidtext = ''
		if fileExists('/tmp/pid.info'):
			f = open('/tmp/pid.info', 'r')
			for line in f.readlines():
				line = line.replace('\n', '')
				line = line.strip()
				if len(line) > 3:
					pidtext = pidtext + line + '\n'
			f.close()
		if len(pidtext) < 5:
			pidtext = '\n\n    ' + _('Pid info not available.')
		return str(pidtext)

	def provfile(self, caid, prov):
		ecm_info = self.GetEcmInfo2()
		provider = None
		pinfo = {}
		try:
			provider = open("/tmp/share.info", "rb").readlines()
		except:
			pass

		if provider:
			for line in provider:
				x = line.lower().find("id:")
				y = line.lower().find("card ")
				if x != -1 and y != -1:
					if caid != "0500":
						if line[x+3:].strip("\n\r") == prov.strip("\n\r") and line[y+5:y+9] == caid:
							x = line.lower().find("at ")
							if x != -1:
								y = line.lower().find("card ")
								if y != -1:
									pinfo["paddress"] = line[x+3:y-1]
								x = line.lower().find("sl:")
								if x != -1:
									y = line.lower().find("lev:")
									if y != -1:
										pinfo["slot"] = line[x+3:y-1]
										x = line.lower().find("dist:")
										if x != -1:
											pinfo["level"] = line[y+4:x-1]
											y = line.lower().find("id:")
											if y != -1:
												pinfo["distance"] = line[x+5:y-1]
					elif line[x+3:].strip("\n\r") == prov.strip("\n\r") and line[y+5:y+8] == caid[:-1]:
							x = line.lower().find("at ")
							if x != -1:
								y = line.lower().find("card ")
								if y != -1:
									pinfo["paddress"] = line[x+3:y-1]
								x = line.lower().find("sl:")
								if x != -1:
									y = line.lower().find("lev:")
									if y != -1:
										pinfo["slot"] = line[x+3:y-1]
										x = line.lower().find("dist:")
										if x != -1:
											pinfo["level"] = line[y+4:x-1]
											y = line.lower().find("id:")
											if y != -1:
												pinfo["distance"] = line[x+5:y-1]
		return pinfo

	def createCryptoBar(self, info):
		res = ""
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
				color="\c0000??00"
			else:
				color = "\c007?7?7?"
				try:
					for caid in available_caids:
						if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
							color="\c00????00"
				except:
					pass

			if res: res += " "
			res += color + caid_entry[3]

		res += "\c00??????"
		return res

	def createCryptoSeca(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x100', 16) <= caid <= int('0x1ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'S'
		res += "\c00??????"
		return res

	def createCryptoVia(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x500', 16) <= caid <= int('0x5ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'V'
		res += "\c00??????"
		return res

	def createCryptoIrdeto(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x600', 16) <= caid <= int('0x6ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'I'
		res += "\c00??????"
		return res

	def createCryptoNDS(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x900', 16) <= caid <= int('0x9ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'NDS'
		res += "\c00??????"
		return res

	def createCryptoConax(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xb00', 16) <= caid <= int('0xbff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'CO'
		res += "\c00??????"
		return res

	def createCryptoCryptoW(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xd00', 16) <= caid <= int('0xdff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'CW'
		res += "\c00??????"
		return res

	def createCryptoPowerVU(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xe00', 16) <= caid <= int('0xeff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'P'
		res += "\c00??????"
		return res

	def createCryptoTandberg(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1010', 16) <= int(self.current_caid, 16) <= int('0x1010', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1010', 16) <= caid <= int('0x1010', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'T'
		res += "\c00??????"
		return res

	def createCryptoBeta(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1700', 16) <= int(self.current_caid, 16) <= int('0x17ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1700', 16) <= caid <= int('0x17ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'B'
		res += "\c00??????"
		return res

	def createCryptoNagra(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1800', 16) <= int(self.current_caid, 16) <= int('0x18ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1800', 16) <= caid <= int('0x18ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'N'
		res += "\c00??????"
		return res

	def createCryptoBiss(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x2600', 16) <= int(self.current_caid, 16) <= int('0x26ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x2600', 16) <= caid <= int('0x26ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'BI'
		res += "\c00??????"
		return res

	def createCryptoDre(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int('0x4ae1', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'DC'
		res += "\c00??????"
		return res

	def createCryptoSpecial(self, info):
		is_crypted = info.getInfo(iServiceInformation.sIsCrypted)
		if is_crypted != 1:
			return _("Free To Air")
		caid_name = _("Encrypt")
		try:
			for caid_entry in self.caid_data:
				if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x:%04x:%04x:%04x" % (int(self.current_caid,16), int(self.current_provid,16), info.getInfo(iServiceInformation.sSID), int(self.current_ecmpid,16))
		except:
			pass
		return ""

	def createCryptoNameCaid(self, info):
		is_crypted = info.getInfo(iServiceInformation.sIsCrypted)
		if is_crypted != 1:
			return _("Free To Air")
		caid_name = _("Encrypt")
		try:
			for caid_entry in self.caid_data:
				if int(self.current_caid,16) == 0:
					return caid_name
				elif int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2] 
					break
			return caid_name + ":%04x" % (int(self.current_caid,16))
		except:
			pass
		return ""

	def createResolution(self, info):
		xres = info.getInfo(iServiceInformation.sVideoWidth)
		if xres == -1:
			return ""
		yres = info.getInfo(iServiceInformation.sVideoHeight)
		mode = ("i", "p", "", " ")[info.getInfo(iServiceInformation.sProgressive)]
		fps  = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
		if int(fps) <= 0:
			fps = ""
		return str(xres) + "x" + str(yres) + mode + fps

	def createVideoCodec(self, info):
		return ("MPEG2", "MPEG4 H.264", "MPEG1", "MPEG4-VC", "VC1", "VC1-SM", "HEVC H.265", "")[info.getInfo(iServiceInformation.sVideoType)]

	def createServiceRef(self, info):
		ref = info.getInfoString(iServiceInformation.sServiceref)
		if ref < 0 : ref = 0
		return "Ref: " + str(ref)

	def createPIDInfo(self, info):
		vpid = info.getInfo(iServiceInformation.sVideoPID)
		apid = info.getInfo(iServiceInformation.sAudioPID)
		pcrpid = info.getInfo(iServiceInformation.sPCRPID)
		sidpid = info.getInfo(iServiceInformation.sSID)
		tsid = info.getInfo(iServiceInformation.sTSID)
		onid = info.getInfo(iServiceInformation.sONID)
		if vpid < 0 : vpid = 0
		if apid < 0 : apid = 0
		if pcrpid < 0 : pcrpid = 0
		if sidpid < 0 : sidpid = 0
		if tsid < 0 : tsid = 0
		if onid < 0 : onid = 0
		return "Pid: %d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid, pcrpid)

	def createTransponderInfo(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			tmp = addspace(self.createChannelNumber(fedata, feraw)) + self.createFrequency(fedata) + "/" + self.createPolarization(fedata)
		else:
			tmp = addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
		return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
			+ addspace(self.createModulation(fedata)) + self.createOrbPos(feraw)

	def createFrequency(self, feraw):
		frequency = feraw.get("frequency")
		if frequency:
			return str(frequency)
		return ""

	def createChannelNumber(self, fedata, feraw):
		channel = channelnumbers.getChannelNumber(feraw.get("frequency"), feraw.get("tuner_number"))
		if channel:
			return _("CH") + "%s" % channel
		return ""

	def createSymbolRate(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			bandwidth = fedata.get("bandwidth")
			if bandwidth:
				return bandwidth
		else:
			symbolrate = fedata.get("symbol_rate")
			if symbolrate:
				return str(symbolrate)
		return ""

	def createPolarization(self, fedata):
		polarization = fedata.get("polarization_abbreviation")
		if polarization:
			return polarization
		return ""

	def createFEC(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			code_rate_lp = fedata.get("code_rate_lp")
			code_rate_hp = fedata.get("code_rate_hp")
			if code_rate_lp and code_rate_hp:
				return code_rate_lp + "-" + code_rate_hp
		else:
			fec = fedata.get("fec_inner")
			if fec:
				return fec
		return ""

	def createModulation(self, fedata):
		if fedata.get("tuner_type") == _("Terrestrial"):
			constellation = fedata.get("constellation")
			if constellation:
				return constellation
		else:
			modulation = fedata.get("modulation")
			if modulation:
				return modulation
		return ""

	def createTunerType(self, feraw):
		tunertype = feraw.get("tuner_type")
		if tunertype:
			return tunertype
		return ""

	def createTunerSystem(self, fedata):
		tunersystem = fedata.get("system")
		if tunersystem:
			return tunersystem
		return ""

	def createOrbPos(self, feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
		elif orbpos > 0:
			return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
		return ""

	def createOrbPosOrTunerSystem(self, fedata,feraw):
		orbpos = self.createOrbPos(feraw)
		if orbpos is not "":
			return orbpos
		return self.createTunerSystem(fedata)

	def createTransponderName(self,feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos is None: # Not satellite
			return ""
		freq = feraw.get("frequency")
		if freq and freq < 10700000: # C-band
			if orbpos > 1800:
				orbpos += 1
			else:
				orbpos -= 1
				
		sat_names = {
			30:   'Rascom/Eutelsat 3E',
			48:   'SES 5',
			70:   'Eutelsat 7E',
			90:   'Eutelsat 9E',
			100:  'Eutelsat 10E',  
			130:  'Hot Bird',
			160:  'Eutelsat 16E',
			192:  'Astra 1KR/1L/1M/1N',
			200:  'Arabsat 20E',
			216:  'Eutelsat 21.5E',
			235:  'Astra 3',
			255:  'Eutelsat 25.5E',
			260:  'Badr 4/5/6',
			282:  'Astra 2E/2F/2G',
			305:  'Arabsat 30.5E',
			315:  'Astra 5',
			330:  'Eutelsat 33E',
			360:  'Eutelsat 36E',
			380:  'Paksat',
			390:  'Hellas Sat',
			400:  'Express 40E',
			420:  'Turksat',
			450:  'Intelsat 45E',
			480:  'Afghansat',
			490:  'Yamal 49E',
			530:  'Express 53E',
			570:  'NSS 57E',
			600:  'Intelsat 60E',
			620:  'Intelsat 62E',
			685:  'Intelsat 68.5E',
			705:  'Eutelsat 70.5E',
			720:  'Intelsat 72E',
			750:  'ABS',
			765:  'Apstar',
			785:  'ThaiCom',
			800:  'Express 80E',
			830:  'Insat',
			851:  'Intelsat/Horizons',
			880:  'ST2',
			900:  'Yamal 90E',
			915:  'Mesat',
			950:  'NSS/SES 95E',
			1005: 'AsiaSat 100E',
			1030: 'Express 103E',
			1055: 'Asiasat 105E',
			1082: 'NSS/SES 108E',
			1100: 'BSat/NSAT',
			1105: 'ChinaSat',
			1130: 'KoreaSat',
			1222: 'AsiaSat 122E',
			1380: 'Telstar 18',
			1440: 'SuperBird',
			2310: 'Ciel',
			2390: 'Echostar/Galaxy 121W',
			2410: 'Echostar/DirectTV 119W',
			2500: 'Echostar/DirectTV 110W',
			2630: 'Galaxy 97W',
			2690: 'NIMIQ 91W',
			2780: 'NIMIQ 82W',
			2830: 'Echostar/QuetzSat',
			2880: 'AMC 72W',
			2900: 'Star One',
			2985: 'Echostar 61.5W',
			2990: 'Amazonas',
			3020: 'Intelsat 58W',
			3045: 'Intelsat 55.5W',
			3070: 'Intelsat 53W',
			3100: 'Intelsat 50W',
			3150: 'Intelsat 45W',
			3169: 'Intelsat 43.1W',
			3195: 'SES 40.5W',
			3225: 'NSS/Telstar 37W',
			3255: 'Intelsat 34.5W',
			3285: 'Intelsat 31.5W',
			3300: 'Hispasat',
			3325: 'Intelsat 27.5W',
			3355: 'Intelsat 24.5W',
			3380: 'SES 22W',
			3400: 'NSS 20W',
			3420: 'Intelsat 18W',
			3450: 'Telstar 15W',
			3460: 'Express 14W',
			3475: 'Eutelsat 12.5W',
			3490: 'Express 11W',
			3520: 'Eutelsat 8W',
			3530: 'Nilesat/Eutelsat 7W',
			3550: 'Eutelsat 5W',
			3560: 'Amos',
			3592: 'Thor/Intelsat'
		}

		if orbpos in sat_names:
			return sat_names[orbpos]
		elif orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "W"
		else:
			return str((float(orbpos)) / 10.0) + "E"

	def createProviderName(self,info):
		return info.getInfoString(iServiceInformation.sProvider)

	@cached
	def get_caidlist(self):
		caidlist = {}
		service = self.source.service
		if service:
			info = service and service.info()
			if info:
				available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
				if available_caids:
					for cs in self.caid_data:
						caidlist[cs] = (self.caid_data.get(cs),0)

					for caid in available_caids:
						c = "%x" % int(caid)
						if len(c) == 3:
							c = "0%s" % c
						c = c[:2].upper()
						if self.caid_data.has_key(c):
							caidlist[c] = (self.caid_data.get(c),1)

					ecm_info = self.GetEcmInfo2()
					if ecm_info:
						emu_caid = ecm_info.get("caid", "")
						if emu_caid and emu_caid != "0x000":
							c = emu_caid.lstrip("0x")
							if len(c) == 3:
								c = "0%s" % c
							c = c[:2].upper()
							caidlist[c] = (self.caid_data.get(c),2)
		return caidlist

	getCaidlist = property(get_caidlist)

	@cached
	def getText(self):
		self.DynamicTimer.start(200)
		service = self.source.service

		if service is None:
			return ""

		if service:
			info = service and service.info()
			is_crypted = info.getInfo(iServiceInformation.sIsCrypted)

		if not info:
			return ""

		if info:
			if info.getInfoObject(iServiceInformation.sCAIDs):
				ecm_info = self.GetEcmInfo2()
				if ecm_info:
					# caid
					caid = ecm_info.get("caid", '')
					caid = caid.lstrip("0x")
					caid = caid.upper()
					caid = caid.zfill(4)
				else:
					return ""

		if self.type == "CryptoInfo":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
			else:
				return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)

		if self.type == "CryptoBar":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBar(info)
			else:
				return ""

		if self.type == "CryptoSeca":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoSeca(info)
			else:
				return ""

		if self.type == "CryptoVia":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoVia(info)
			else:
				return ""

		if self.type == "CryptoIrdeto":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoIrdeto(info)
			else:
				return ""

		if self.type == "CryptoNDS":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNDS(info)
			else:
				return ""

		if self.type == "CryptoConax":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoConax(info)
			else:
				return ""

		if self.type == "CryptoCryptoW":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoCryptoW(info)
			else:
				return ""

		if self.type == "CryptoBeta":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBeta(info)
			else:
				return ""

		if self.type == "CryptoNagra":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNagra(info)
			else:
				return ""

		if self.type == "CryptoBiss":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBiss(info)
			else:
				return ""

		if self.type == "CryptoDre":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoDre(info)
			else:
				return ""

		if self.type == "CryptoTandberg":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoTandberg(info)
			else:
				return ""

		if self.type == "CryptoSpecial":
			data = self.GetEcmInfo2()
			if data['decode'] == "Network" or data['decode'] == "Local" or data['protocol'] == "gbox":
				return "Protocol Gbox"
			elif int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoSpecial(info)
			else:
				return ""

		if self.type == "CryptoNameCaid":
			data = self.GetEcmInfo2()
			if data['decode'] == "Network" or data['decode'] == "Local" or data['protocol'] == "gbox":
				return "Protocol Gbox"
			elif int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNameCaid(info)
			else:
				return ""

		if self.type == "ResolutionString":
			return self.createResolution(info)

		if self.type == "VideoCodec":
			return self.createVideoCodec(info)

		if self.type == "Ecmtext":
			return self.get_Ecmtext()

		if self.type == "PIDtext":
			data = self.GetEcmInfo2()
			if data['decode'] == "Network" or data['decode'] == "Local" or data['protocol'] == "gbox":
				return self.get_PIDtext()
			else:
				return ""

		if self.type == "InfoPeer":
			data = self.GetEcmInfo2()
			if data['decode'] == "Network" or data['decode'] == "Local" or data['protocol'] == "gbox":
				ecm_info = self.GetEcmInfo2()
				decode = ecm_info.get("decode", '')
				prov = ecm_info.get("prov", '')
				paddress = level = dist = ''
				if prov:
					prov = prov[0:4]
					prov_info = self.provfile(caid, prov)
					paddress = prov_info.get("paddress", '')
					if paddress:
						host = paddress.split(":")[0]
						if host in self.ecmDict:
							paddress = self.ecmDict[host]
					level = prov_info.get("level", None)
					dist = prov_info.get("distance", None)
				if decode:
					if decode == "Internal" or decode == "Local":
						return "CAID: %s   -  %s   -  ID: %s" % (caid, decode, prov)
					elif decode == "Network":
						return "CAID: %s   -  %s   -  ID: %s   %s    Level: %s   Dist: %s" % (caid, decode, prov, paddress, level, dist)
				return "CAID: %s   -  %s   -  ID: %s" % (data['caid'], data['decode'], data['prov'])

		if self.type == "ProviderName":
			return self.createProviderName(info)

		if self.type == "CamName":
			return self.get_caName()

		if self.type == "CaidList":
			return self.get_caidlist()

		elif self.type == "NetInfo":
			if is_crypted != 1:
				return ''
			data = self.GetEcmInfo2()
			if data['using']:
				return "CAID: %s   -  %s   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['address'], data['hops'], data['ecm_time'])
			elif data['reader']:
				return "CAID: %s   -  %s   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['address_from'], data['hops'], data['ecm_time'])
			elif data['decode']:
				ecm_info = self.GetEcmInfo2()
				decode = ecm_info.get("decode", '')
				prov = ecm_info.get("prov", '')
				paddress = level = dist = ''
				if prov:
					prov = prov[0:4]
					prov_info = self.provfile(caid, prov)
					paddress = prov_info.get("paddress", '')
					if paddress:
						host = paddress.split(":")[0]
						if host in self.ecmDict:
							paddress = self.ecmDict[host]
					level = prov_info.get("level", None)
					dist = prov_info.get("distance", None)
				if decode:
					if decode == "Internal" or decode == "Local":
						return "CAID: %s   -  %s   -  ID: %s" % (caid, decode, prov)
					elif decode == "Network":
						return "CAID: %s   -  %s   -  ID: %s   %s    Level: %s   Dist: %s" % (caid, decode, prov, paddress, level, dist)
				return "CAID: %s   -  %s   -  ID: %s" % (data['caid'], data['decode'], data['prov'])
			elif data['using'] or data['reader']:
				if data['address'] == "/dev/sci0":
					return "CAID: %s   -  Card in Slot #1   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['hops'], data['ecm_time'])
				elif data['address'] == "/dev/sci1":
					return "CAID: %s   -  Card in Slot #2   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['hops'], data['ecm_time'])
				else:
					if data['address_from'] == "/dev/sci0":
						return "CAID: %s   -  Card in Slot #1   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['hops'], data['ecm_time'])
					elif data['address_from'] == "/dev/sci1":
						return "CAID: %s   -  Card in Slot #2   -  HOPS: %s   -  ECM: %ss" % (data['caid'], data['hops'], data['ecm_time'])
			elif data['source']:
				if data['source'] == "emu":
					return "EMU %s" % (data['caid'])
				else:
					return "CAID: %s - %s %s" % (data['caid'], data['source'], data['ecm_time'])

		elif self.type == "EcmInfo":
			if is_crypted != 1:
				return ''
			data = self.GetEcmInfo2()
			return "Provider: %s" % (data['provider'])

		elif self.type == "EcmInfo2":
			if is_crypted != 1:
				return ''
			data = self.GetEcmInfo2()
			if data['using'] == "newcamd" or data['using'] == "NewCamd":
				return "Provider: %s" % (data['provider'])
			elif data['using'] == "CCcam" or data['using'] == "CCcam-s2s":
				return "Provider: %s" % (data['provider'])
			elif data['using'] == "gbox" or data['address'] == "127.0.0.1:*":
				return "Provider: %s" % (data['provider'])
			elif data['decode'] == "Network" or data['decode'] == "Local":
				ecm_info = self.GetEcmInfo2()
				return "CAID: %s     BoxId: %s" % (caid, data['provider'])
			else:
				return "CAID: %s     Provider: %s" % (data['caid'], data['provider'])

		elif self.type == "E-C-N":
			if is_crypted != 1:
				return ''

			CamName = self.get_caName()
			if self.type == "CryptoNameCaid" or CamName == 'Common Interface':
				if int(config.usage.show_cryptoinfo.value) > 0:
					self.getCryptoInfo(info)
					return self.createCryptoNameCaid(info)
				else:
					return ""
			elif self.type == "CryptoSpecial" or CamName == 'Common Interface':
				if int(config.usage.show_cryptoinfo.value) > 0:
					self.getCryptoInfo(info)
					return self.createCryptoSpecial(info)
				else:
					return ""

			data = self.GetEcmInfo2()
			if data['reader'] or data['using'] or data['protocol'] or data['from'] or data['hops'] or data['decode'] or data['address']:
				if data['using'] == "fta":
					return "Fta"
				elif data['using'] == "emu" or data['from'] == "constcw":
					return "Emulator"
				elif data['hops'] == "0" and data['protocol'] == "none" or data['from'] == "cache*":
					return "Cache"
				elif data['using'] == "gbox" or data['address'] == "127.0.0.1:*":
					return "Sharing"
				elif data['hops'] == "0" and data['using'] == "sci" or data['hops'] == "0" and data['using'] == "smartreader+":
					return "Card"
				elif data['hops'] == "0" and data['protocol'] == "cccam" or data['hops'] == "0" and data['protocol'] == "newcamd":
					return "Card"
				elif data['hops'] == "0" and data['using'] == "newcamd" or data['hops'] == "0" and data['using'] == "NewCamd":
					return "Card"
				elif data['hops'] == "0" and data['using'] == "CCcam" or data['hops'] == "0" and data['using'] == "CCcam-s2s":
					return "Card"
				elif data['decode'] == "Local":
					return "Card"
				else:
					return "Network"
			elif data['reader'] or data['using'] or data['protocol'] or data['from'] or data['hops']:
				pos = data['address_from'].find('.') or data['from'].find('.')
				if pos > 1:
					return "Network"
				else:
					return "Card"
			return ""

		if self.updateFEdata:
			feinfo = service.frontendInfo()
			if feinfo:
				self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == "settings")
				if self.feraw:
					self.fedata = ConvertToHumanReadable(self.feraw)

		feraw = self.feraw
		if not feraw:
			feraw = info.getInfoObject(iServiceInformation.sTransponderData)
			if not feraw:
				return ""
			fedata = ConvertToHumanReadable(feraw)
		else:
			fedata = self.fedata
		if self.type == "All":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n"\
				+ addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n"\
				+ addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
			else:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n" \
				+ addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
				+ addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "ServiceInfo":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
			+ addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createTransponderName(feraw))\
			+ addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "TransponderInfo2line":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createTransponderName(feraw)) + '\n'\
			+ addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
			+ addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))

		if self.type == "PIDInfo":
			return self.createPIDInfo(info)

		if self.type == "ServiceRef":
			return self.createServiceRef(info)

		if not feraw:
			return ""

		if self.type == "TransponderInfo":
			return self.createTransponderInfo(fedata,feraw)

		if self.type == "TransponderFrequency":
			return self.createFrequency(feraw)

		if self.type == "TransponderSymbolRate":
			return self.createSymbolRate(fedata, feraw)

		if self.type == "TransponderPolarization":
			return self.createPolarization(fedata)

		if self.type == "TransponderFEC":
			return self.createFEC(fedata, feraw)

		if self.type == "TransponderModulation":
			return self.createModulation(fedata)

		if self.type == "OrbitalPosition":
			return self.createOrbPos(feraw)

		if self.type == "TunerType":
			return self.createTunerType(feraw)

		if self.type == "TunerSystem":
			return self.createTunerSystem(fedata)

		if self.type == "OrbitalPositionOrTunerSystem":
			return self.createOrbPosOrTunerSystem(fedata,feraw)

		if self.type == "TerrestrialChannelNumber":
			return self.createChannelNumber(fedata, feraw)

		return ""

	text = property(getText)

	@cached
	def getBool(self):
		service = self.source.service
		info = service and service.info()

		if not info:
			return False

		if self.type == "CryptoCaidSecaAvailable":
			request_caid = "S"
			request_selected = False
		elif self.type == "CryptoCaidViaAvailable":
			request_caid = "V"
			request_selected = False
		elif self.type == "CryptoCaidIrdetoAvailable":
			request_caid = "I"
			request_selected = False
		elif self.type == "CryptoCaidNDSAvailable":
			request_caid = "ND"
			request_selected = False
		elif self.type == "CryptoCaidConaxAvailable":
			request_caid = "CO"
			request_selected = False
		elif self.type == "CryptoCaidCryptoWAvailable":
			request_caid = "CW"
			request_selected = False
		elif self.type == "CryptoCaidPowerVUAvailable":
			request_caid = "P"
			request_selected = False
		elif self.type == "CryptoCaidBetaAvailable":
			request_caid = "B"
			request_selected = False
		elif self.type == "CryptoCaidNagraAvailable":
			request_caid = "N"
			request_selected = False
		elif self.type == "CryptoCaidBissAvailable":
			request_caid = "BI"
			request_selected = False
		elif self.type == "CryptoCaidDreAvailable":
			request_caid = "D"
			request_selected = False
		elif self.type == "CryptoCaidBulCrypt1Available":
			request_caid = "B1"
			request_selected = False
		elif self.type == "CryptoCaidBulCrypt2Available":
			request_caid = "B2"
			request_selected = False
		elif self.type == "CryptoCaidTandbergAvailable":
			request_caid = "TB"
			request_selected = False
		elif self.type == "CryptoCaidSecaSelected":
			request_caid = "S"
			request_selected = True
		elif self.type == "CryptoCaidViaSelected":
			request_caid = "V"
			request_selected = True
		elif self.type == "CryptoCaidIrdetoSelected":
			request_caid = "I"
			request_selected = True
		elif self.type == "CryptoCaidNDSSelected":
			request_caid = "ND"
			request_selected = True
		elif self.type == "CryptoCaidConaxSelected":
			request_caid = "CO"
			request_selected = True
		elif self.type == "CryptoCaidCryptoWSelected":
			request_caid = "CW"
			request_selected = True
		elif self.type == "CryptoCaidPowerVUSelected":
			request_caid = "P"
			request_selected = True
		elif self.type == "CryptoCaidBetaSelected":
			request_caid = "B"
			request_selected = True
		elif self.type == "CryptoCaidNagraSelected":
			request_caid = "N"
			request_selected = True
		elif self.type == "CryptoCaidBissSelected":
			request_caid = "BI"
			request_selected = True
		elif self.type == "CryptoCaidDreSelected":
			request_caid = "D"
			request_selected = True
		elif self.type == "CryptoCaidBulCrypt1Selected":
			request_caid = "B1"
			request_selected = True
		elif self.type == "CryptoCaidBulCrypt2Selected":
			request_caid = "B2"
			request_selected = True
		elif self.type == "CryptoCaidTandbergSelected":
			request_caid = "TB"
			request_selected = True
		else:
			return False

		request_caid = None
		for x in self.ca_table:
			if x[0] == self.type:
				request_caid = x[1]
				request_selected = x[2]
				break

		if request_caid is None:
			return False

		if info.getInfo(iServiceInformation.sIsCrypted) != 1:
			return False

		data = self.ecmdata.getEcmData()
		data = self.GetEcmInfo2()

		if data is None:
			return False

		current_caid = data['caid'] or data[1]

		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if caid_entry[3] == request_caid:
				if request_selected:
					if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(caid_entry[1], 16):
						return True
				else: # request available
					try:
						for caid in available_caids:
							if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
								return True
					except:
						pass

		return False

	boolean = property(getBool)

	def changed(self, what):
		if what[0] == self.CHANGED_SPECIFIC:
			self.updateFEdata = False
			if what[1] == iPlayableService.evNewProgramInfo:
				self.updateFEdata = True
			elif what[1] == iPlayableService.evEnd:
				self.feraw = self.fedata = None
			Converter.changed(self, what)
		elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
			self.updateFEdata = False
			Converter.changed(self, what)
		else:
			self.what = what
			Converter.changed(self, what)

	def doSwitch(self):
		self.DynamicTimer.stop()
		Converter.changed(self, self.what)
Example #15
0
class pliExpertInfo(Poll, Converter, object):
	SMART_LABEL = 0
	SMART_INFO_H = 1
	SMART_INFO_V = 2
	SERVICE_INFO = 3
	CRYPTO_INFO = 4
	FREQUENCY_INFO = 5

	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = {
				"ShowMe": self.SMART_LABEL,
				"ExpertInfo": self.SMART_INFO_H,
				"ExpertInfoVertical": self.SMART_INFO_V,
				"ServiceInfo": self.SERVICE_INFO,
				"CryptoInfo": self.CRYPTO_INFO,
				"FrequencyInfo": self.FREQUENCY_INFO
			}[type]

		self.poll_interval = 1000
		self.poll_enabled = True
		self.idnames = (
			( "0x100", "0x1FF","Seca"   ,"S" ),
			( "0x500", "0x5FF","Via"    ,"V" ),
			( "0x600", "0x6FF","Irdeto" ,"I" ),
			( "0x900", "0x9FF","NDS"    ,"Nd"),
			( "0xB00", "0xBFF","Conax"  ,"Co"),
			( "0xD00", "0xDFF","CryptoW","Cw"),
			("0x1700","0x17FF","Beta"   ,"B" ),
			("0x1800","0x18FF","Nagra"  ,"N" ))
		self.ecmdata = GetEcmInfo()

	@cached
	def getText(self):
		service = self.source.service
		try:
			info = service and service.info()
		except:
			try:
				info = eServiceCenter.getInstance().info(service)
			except:
				pass
		if not info:
			return ""

		Ret_Text = ""
		Sec_Text = ""
		Res_Text = ""
		showCryptoInfo = False

		if (self.type == self.SMART_INFO_H or self.type == self.SERVICE_INFO or self.type == self.CRYPTO_INFO or self.type == self.FREQUENCY_INFO): # HORIZONTAL
			sep = "  "
			sep2 = " - "
		elif (self.type == self.SMART_INFO_V): # VERTIKAL
			sep = "\n"
			sep2 = "\n"
		else:
			return ""	# unsupported orientation

		if (self.type == self.FREQUENCY_INFO):
			try:
				feinfo = (service and service.frontendInfo())
				prvd = info.getInfoString(iServiceInformation.sProvider)
				Ret_Text = self.short(prvd)
				frontendDataOrg = (feinfo and feinfo.getAll(True))
			except:
				try:
					frontendDataOrg = info.getInfoObject(service, iServiceInformation.sTransponderData)
					prvd = info.getInfoString(service, iServiceInformation.sProvider)
				except:
					pass

			if (frontendDataOrg is not None):
				frontendData = ConvertToHumanReadable(frontendDataOrg)
				if ((frontendDataOrg.get("tuner_type") == "DVB-S") or (frontendDataOrg.get("tuner_type") == "DVB-C")):
					frequency = (str((frontendData.get("frequency") / 1000)) + " MHz")
					symbolrate = (str((frontendData.get("symbol_rate") / 1000)))
					fec_inner = frontendData.get("fec_inner")
					if (frontendDataOrg.get("tuner_type") == "DVB-S"):
						Ret_Text += sep + frontendData.get("system")
						orbital_pos = int(frontendDataOrg["orbital_position"])
						if orbital_pos > 1800:
							if orbital_pos == 3590:
								orb_pos = 'Thor/Intelsat'
							elif orbital_pos == 3560:
								orb_pos = 'Amos (4'
							elif orbital_pos == 3550:
								orb_pos = 'Atlantic Bird'
							elif orbital_pos == 3530:
								orb_pos = 'Nilesat/Atlantic Bird'
							elif orbital_pos == 3520:
								orb_pos = 'Atlantic Bird'
							elif orbital_pos == 3475:
								orb_pos = 'Atlantic Bird'
							elif orbital_pos == 3460:
								orb_pos = 'Express'
							elif orbital_pos == 3450:
								orb_pos = 'Telstar'
							elif orbital_pos == 3420:
								orb_pos = 'Intelsat'
							elif orbital_pos == 3380:
								orb_pos = 'Nss'
							elif orbital_pos == 3355:
								orb_pos = 'Intelsat'
							elif orbital_pos == 3325:
								orb_pos = 'Intelsat'
							elif orbital_pos == 3300:
								orb_pos = 'Hispasat'
							elif orbital_pos == 3285:
								orb_pos = 'Intelsat'
							elif orbital_pos == 3170:
								orb_pos = 'Intelsat'
							elif orbital_pos == 3150:
								orb_pos = 'Intelsat'
							elif orbital_pos == 3070:
								orb_pos = 'Intelsat'
							elif orbital_pos == 3045:
								orb_pos = 'Intelsat'
							elif orbital_pos == 3020:
								orb_pos = 'Intelsat 9'
							elif orbital_pos == 2990:
								orb_pos = 'Amazonas'
							elif orbital_pos == 2900:
								orb_pos = 'Star One'
							elif orbital_pos == 2880:
								orb_pos = 'AMC 6 (72'
							elif orbital_pos == 2875:
								orb_pos = 'Echostar 6'
							elif orbital_pos == 2860:
								orb_pos = 'Horizons'
							elif orbital_pos == 2810:
								orb_pos = 'AMC5'
							elif orbital_pos == 2780:
								orb_pos = 'NIMIQ 4'
							elif orbital_pos == 2690:
								orb_pos = 'NIMIQ 1'
							elif orbital_pos == 3592:
								orb_pos = 'Thor/Intelsat'
							elif orbital_pos == 2985:
								orb_pos = 'Echostar 3,12'
							elif orbital_pos == 2830:
								orb_pos = 'Echostar 8'
							elif orbital_pos == 2630:
								orb_pos = 'Galaxy 19'
							elif orbital_pos == 2500:
								orb_pos = 'Echostar 10,11'
							elif orbital_pos == 2502:
								orb_pos = 'DirectTV 5'
							elif orbital_pos == 2410:
								orb_pos = 'Echostar 7 Anik F3'
							elif orbital_pos == 2391:
								orb_pos = 'Galaxy 23'
							elif orbital_pos == 2390:
								orb_pos = 'Echostar 9'
							elif orbital_pos == 2412:
								orb_pos = 'DirectTV 7S'
							elif orbital_pos == 2310:
								orb_pos = 'Galaxy 27'
							elif orbital_pos == 2311:
								orb_pos = 'Ciel 2'
							elif orbital_pos == 2120:
								orb_pos = 'Echostar 2'
							else:
								orb_pos = str((float(3600 - orbital_pos))/10.0) + "W"
						elif orbital_pos > 0:
							if orbital_pos == 192:
								orb_pos = 'Astra 1F'
							elif orbital_pos == 130:
								orb_pos = 'Hot Bird 6,7A,8'
							elif orbital_pos == 235:
								orb_pos = 'Astra 1E'
							elif orbital_pos == 1100:
								orb_pos = 'BSat 1A,2A'
							elif orbital_pos == 1101:
								orb_pos = 'N-Sat 110'
							elif orbital_pos == 1131:
								orb_pos = 'KoreaSat 5'
							elif orbital_pos == 1440:
								orb_pos = 'SuperBird 7,C2'
							elif orbital_pos == 1006:
								orb_pos = 'AsiaSat 2'
							elif orbital_pos == 1030:
								orb_pos = 'Express A2'
							elif orbital_pos == 1056:
								orb_pos = 'Asiasat 3S'
							elif orbital_pos == 1082:
								orb_pos = 'NSS 11'
							elif orbital_pos == 881:
								orb_pos = 'ST1'
							elif orbital_pos == 900:
								orb_pos = 'Yamal 201'
							elif orbital_pos == 917:
								orb_pos = 'Mesat'
							elif orbital_pos == 950:
								orb_pos = 'Insat 4B'
							elif orbital_pos == 951:
								orb_pos = 'NSS 6'
							elif orbital_pos == 765:
								orb_pos = 'Telestar'
							elif orbital_pos == 785:
								orb_pos = 'ThaiCom 5'
							elif orbital_pos == 800:
								orb_pos = 'Express'
							elif orbital_pos == 830:
								orb_pos = 'Insat 4A'
							elif orbital_pos == 850:
								orb_pos = 'Intelsat 709'
							elif orbital_pos == 750:
								orb_pos = 'Abs'
							elif orbital_pos == 720:
								orb_pos = 'Intelsat'
							elif orbital_pos == 705:
								orb_pos = 'Eutelsat W5'
							elif orbital_pos == 685:
								orb_pos = 'Intelsat'
							elif orbital_pos == 620:
								orb_pos = 'Intelsat 902'
							elif orbital_pos == 600:
								orb_pos = 'Intelsat 904'
							elif orbital_pos == 570:
								orb_pos = 'Nss'
							elif orbital_pos == 530:
								orb_pos = 'Express AM22'
							elif orbital_pos == 480:
								orb_pos = 'Eutelsat 2F2'
							elif orbital_pos == 450:
								orb_pos = 'Intelsat'
							elif orbital_pos == 420:
								orb_pos = 'Turksat 2A'
							elif orbital_pos == 400:
								orb_pos = 'Express AM1'
							elif orbital_pos == 390:
								orb_pos = 'Hellas Sat 2'
							elif orbital_pos == 380:
								orb_pos = 'Paksat 1'
							elif orbital_pos == 360:
								orb_pos = 'Eutelsat Sesat'
							elif orbital_pos == 335:
								orb_pos = 'Astra 1M'
							elif orbital_pos == 330:
								orb_pos = 'Eurobird 3'
							elif orbital_pos == 328:
								orb_pos = 'Galaxy 11'
							elif orbital_pos == 315:
								orb_pos = 'Astra 5A'
							elif orbital_pos == 310:
								orb_pos = 'Turksat'
							elif orbital_pos == 305:
								orb_pos = 'Arabsat'
							elif orbital_pos == 285:
								orb_pos = 'Eurobird 1'
							elif orbital_pos == 284:
								orb_pos = 'Eurobird/Astra'
							elif orbital_pos == 282:
								orb_pos = 'Eurobird/Astra'
							elif orbital_pos == 1220:
								orb_pos = 'AsiaSat'
							elif orbital_pos == 1380:
								orb_pos = 'Telstar 18'
							elif orbital_pos == 260:
								orb_pos = 'Badr 3/4'
							elif orbital_pos == 255:
								orb_pos = 'Eurobird 2'
							elif orbital_pos == 215:
								orb_pos = 'Eutelsat'
							elif orbital_pos == 216:
								orb_pos = 'Eutelsat W6'
							elif orbital_pos == 210:
								orb_pos = 'AfriStar 1'
							elif orbital_pos == 160:
								orb_pos = 'Eutelsat W2'
							elif orbital_pos == 100:
								orb_pos = 'Eutelsat W1'
							elif orbital_pos == 90:
								orb_pos = 'Eurobird 9'
							elif orbital_pos == 70:
								orb_pos = 'Eutelsat W3A'
							elif orbital_pos == 50:
								orb_pos = 'Sirius 4'
							elif orbital_pos == 48:
								orb_pos = 'Sirius 4'
							elif orbital_pos == 30:
								orb_pos = 'Telecom 2'
							else:
								orb_pos = str((float(orbital_pos))/10.0) + "E"
						Ret_Text += sep + orb_pos + "\n"
						Ret_Text += frequency + sep + frontendData.get("polarization_abbreviation")
						Ret_Text += sep + symbolrate
						Ret_Text += sep + frontendData.get("modulation") + "-" + fec_inner
					else:
						Ret_Text += sep + "DVB-C " + frequency + " MHz" + sep + fec_inner + sep + symbolrate
				elif (frontendData.get("tuner_type") == "DVB-T"):
					frequency = (str((frontendData.get("frequency") / 1000)) + " MHz")
					Ret_Text = "Frequency: " + frequency

		if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.SERVICE_INFO):

			xresol = info.getInfo(iServiceInformation.sVideoWidth)
			yresol = info.getInfo(iServiceInformation.sVideoHeight)
			feinfo = (service and service.frontendInfo())

			prvd = info.getInfoString(iServiceInformation.sProvider)
			Ret_Text = self.short(prvd)

			frontendDataOrg = (feinfo and feinfo.getAll(True))
			if (frontendDataOrg is not None):
				frontendData = ConvertToHumanReadable(frontendDataOrg)
				if ((frontendDataOrg.get("tuner_type") == "DVB-S") or (frontendDataOrg.get("tuner_type") == "DVB-C")):
					frequency = (str((frontendData.get("frequency") / 1000)))
					symbolrate = (str((frontendData.get("symbol_rate") / 1000)))
					fec_inner = frontendData.get("fec_inner")
					if (frontendDataOrg.get("tuner_type") == "DVB-S"):
						Ret_Text += sep + frontendData.get("system")
						Ret_Text += sep + frequency + frontendData.get("polarization_abbreviation")
						Ret_Text += sep + symbolrate
						Ret_Text += sep + fec_inner + " " + frontendData.get("modulation")
						orbital_pos = int(frontendDataOrg["orbital_position"])
						if orbital_pos > 1800:
							orb_pos = str((float(3600 - orbital_pos)) / 10.0) + "W"
						elif orbital_pos > 0:
							orb_pos = str((float(orbital_pos)) / 10.0) + "E"
						Ret_Text += sep + orb_pos
					else:
						Ret_Text += sep + "DVB-C " + frequency + " MHz" + sep + fec_inner + sep + symbolrate
				elif (frontendDataOrg.get("tuner_type") == "DVB-T"):
					frequency = (str((frontendData.get("frequency") / 1000)))
					Ret_Text += sep + "DVB-T" + sep + "Frequency:" + sep + frequency + " MHz"

			if (feinfo is not None) and (xresol > 0):
				Res_Text += ("MPEG2 ", "MPEG4 ", "MPEG1 ", "MPEG4-II ", "VC1 ", "VC1-SM ", "")[info.getInfo(iServiceInformation.sVideoType)]
				Res_Text += str(xresol) + "x" + str(yresol)
				Res_Text += ("i", "p", "")[info.getInfo(iServiceInformation.sProgressive)]
				Res_Text += str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)

		if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.CRYPTO_INFO):

			decCI = "0"
			Sec_Text = ""
			if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
				data = self.ecmdata.getEcmData()
				if not config.usage.show_cryptoinfo.getValue():
					showCryptoInfo = True
					Sec_Text = data[0] + "\n"
				decCI = data[1]
				provid = data[2]
				pid = data[3]

				if decCI != '0':
					decCIfull = "%04x" % int(decCI, 16)
					for idline in self.idnames:
						if int(decCI, 16) >= int(idline[0], 16) and int(decCI, 16) <= int(idline[1], 16):
							decCIfull = idline[2] + ":" + decCIfull
							break
					Sec_Text += decCIfull
					if provid != '0':
						Sec_Text += ":%04x" % int(provid, 16)
					else:
						Sec_Text += ":"
					if pid != '0':
						Sec_Text += ":%04x:%04x" % (info.getInfo(iServiceInformation.sSID),int(pid, 16))

			elif not config.usage.show_cryptoinfo.getValue():
				showCryptoInfo = True
				Sec_Text = "FTA"
			res = ""
			searchIDs = (info.getInfoObject(iServiceInformation.sCAIDs))
			for idline in self.idnames:
				if int(decCI, 16) >= int(idline[0], 16) and int(decCI, 16) <= int(idline[1], 16):
					color="\c0000??00"
				else:
					color = "\c007?7?7?"
					try:
						for oneID in searchIDs:
							if oneID >= int(idline[0], 16) and oneID <= int(idline[1], 16):
								color="\c00????00"
					except:
						pass
				res += color + idline[3] + " "

			if (self.type != self.CRYPTO_INFO):
				Ret_Text += "\n"
			Ret_Text += res + "\c00?????? " + Sec_Text

		if Res_Text != "":
			if showCryptoInfo:
				Ret_Text += sep + Res_Text
			else:
				Ret_Text += "\n" + Res_Text

		return Ret_Text

	text = property(getText)

	def changed(self, what):
		Converter.changed(self, what)

	def short(self, langTxt):
		if (self.type == self.SMART_INFO_V and len(langTxt)>23):
			retT = langTxt[:20] + "..."
			return retT
		else:
			return langTxt
Example #16
0
class pliExpertInfo(Poll, Converter, object):
	SMART_LABEL = 0
	SMART_INFO_H = 1
	SMART_INFO_V = 2
	SERVICE_INFO = 3
	CRYPTO_INFO = 4
	
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = {
				"ShowMe": self.SMART_LABEL,
				"ExpertInfo": self.SMART_INFO_H,
				"ExpertInfoVertical": self.SMART_INFO_V,
				"ServiceInfo": self.SERVICE_INFO,
				"CryptoInfo": self.CRYPTO_INFO
			}[type]

		self.poll_interval = 1000
		self.poll_enabled = True
		self.idnames = (
			( "0x100", "0x1FF","Seca"   ,"S" ),
			( "0x500", "0x5FF","Via"    ,"V" ),
			( "0x600", "0x6FF","Irdeto" ,"I" ),
			( "0x900", "0x9FF","NDS"    ,"Nd"),
			( "0xB00", "0xBFF","Conax"  ,"Co"),
			( "0xD00", "0xDFF","CryptoW","Cw"),
			("0x1700","0x17FF","Beta"   ,"B" ),
			("0x1800","0x18FF","Nagra"  ,"N" ))
		self.ecmdata = GetEcmInfo()

	@cached
	def getText(self):
		service = self.source.service
		info = service and service.info()
		if not info:
			return ""	

		Ret_Text = ""
		Sec_Text = ""
		Res_Text = ""
		showCryptoInfo = False

		if (self.type == self.SMART_INFO_H or self.type == self.SERVICE_INFO or self.type == self.CRYPTO_INFO): # HORIZONTAL
			sep = "  "
			sep2 = " - "
		elif (self.type == self.SMART_INFO_V): # VERTIKAL
			sep = "\n"
			sep2 = "\n"
		else:
			return ""	# unsupported orientation
		
		if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.SERVICE_INFO):
			
			xresol = info.getInfo(iServiceInformation.sVideoWidth)
			yresol = info.getInfo(iServiceInformation.sVideoHeight)
			feinfo = (service and service.frontendInfo())

			prvd = info.getInfoString(iServiceInformation.sProvider)
			Ret_Text = self.short(prvd)

			frontendDataOrg = (feinfo and feinfo.getAll(False))
			if (frontendDataOrg is not None):
				frontendData = ConvertToHumanReadable(frontendDataOrg)
				if ((frontendDataOrg.get("tuner_type") == "DVB-S") or (frontendDataOrg.get("tuner_type") == "DVB-C")):
					frequency = (str((frontendData.get("frequency") / 1000)))
					symbolrate = (str((frontendData.get("symbol_rate") / 1000)))
					fec_inner = frontendData.get("fec_inner")
					if (frontendDataOrg.get("tuner_type") == "DVB-S"):
						Ret_Text += sep + frontendData.get("system")
						Ret_Text += sep + frequency + frontendData.get("polarization_abbreviation")
						Ret_Text += sep + symbolrate
						Ret_Text += sep + fec_inner + " " + frontendData.get("modulation")
						orbital_pos = int(frontendDataOrg["orbital_position"])
						if orbital_pos > 1800:
							orb_pos = str((float(3600 - orbital_pos)) / 10.0) + "W"
						elif orbital_pos > 0:
							orb_pos = str((float(orbital_pos)) / 10.0) + "E"
						Ret_Text += sep + orb_pos
					else:
						Ret_Text += sep + "DVB-C " + frequency + " MHz" + sep + fec_inner + sep + symbolrate
				elif (frontendDataOrg.get("tuner_type") == "DVB-T"):
					frequency = (str((frontendData.get("frequency") / 1000)))
					Ret_Text += sep + "DVB-T" + sep + "Frequency:" + sep + frequency + " MHz"

			if (feinfo is not None) and (xresol > 0):
				Res_Text += ("MPEG2 ", "MPEG4 ", "MPEG1 ", "MPEG4-II ", "VC1 ", "VC1-SM ", "")[info.getInfo(iServiceInformation.sVideoType)]
				Res_Text += str(xresol) + "x" + str(yresol) 
				Res_Text += ("i", "p", "")[info.getInfo(iServiceInformation.sProgressive)]
				Res_Text += str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)

		if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.CRYPTO_INFO):

			decCI = "0" 
			Sec_Text = ""
			if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
				data = self.ecmdata.getEcmData()
				if not config.usage.show_cryptoinfo.value:
					showCryptoInfo = True
					Sec_Text = data[0] + "\n"
				decCI = data[1]
				provid = data[2]
				pid = data[3]	

				if decCI != '0':
					decCIfull = "%04x" % int(decCI, 16)
					for idline in self.idnames:
						if int(decCI, 16) >= int(idline[0], 16) and int(decCI, 16) <= int(idline[1], 16):
							decCIfull = idline[2] + ":" + decCIfull
							break
					Sec_Text += decCIfull
					if provid != '0':
						Sec_Text += ":%04x" % int(provid, 16)
					else:
						Sec_Text += ":"
					if pid != '0':
						Sec_Text += ":%04x:%04x" % (info.getInfo(iServiceInformation.sSID),int(pid, 16))
			
			elif not config.usage.show_cryptoinfo.value:
				showCryptoInfo = True
				Sec_Text = "FTA"
			res = ""			
			try:
				searchIDs = (info.getInfoObject(iServiceInformation.sCAIDs))
			except:
				searchIDs = 0
				pass
			for idline in self.idnames:
				if int(decCI, 16) >= int(idline[0], 16) and int(decCI, 16) <= int(idline[1], 16):                    
					color="\c0000??00"
				else:
					color = "\c007?7?7?"
					try:
						for oneID in searchIDs:
							if oneID >= int(idline[0], 16) and oneID <= int(idline[1], 16):
								color="\c00????00"
					except:
						pass
				res += color + idline[3] + " "
			
			if (self.type != self.CRYPTO_INFO):
				Ret_Text += "\n"
			Ret_Text += res + "\c00?????? " + Sec_Text
		
		if Res_Text != "":
			if showCryptoInfo:
				Ret_Text += sep + Res_Text
			else:
				Ret_Text += "\n" + Res_Text

		return Ret_Text

	text = property(getText)

	def changed(self, what):
		Converter.changed(self, what)

	def short(self, langTxt):
		if (self.type == self.SMART_INFO_V and len(langTxt)>23):
			retT = langTxt[:20] + "..."
			return retT
		else:
			return langTxt
Example #17
0
class PliExtraInfo(Poll, Converter, object):
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = type
		self.poll_interval = 1000
		self.poll_enabled = True
		self.ca_table = (
			("CryptoCaidSecaAvailable",	"S",	False),
			("CryptoCaidViaAvailable",	"V",	False),
			("CryptoCaidIrdetoAvailable",	"I",	False),
			("CryptoCaidNDSAvailable",	"Nd",	False),
			("CryptoCaidConaxAvailable",	"Co",	False),
			("CryptoCaidCryptoWAvailable",	"Cw",	False),
			("CryptoCaidPowerVUAvailable",	"P",	False),
			("CryptoCaidBetaAvailable",	"B",	False),
			("CryptoCaidNagraAvailable",	"N",	False),
			("CryptoCaidBissAvailable",	"Bi",	False),
			("CryptoCaidDreAvailable",	"D",	False),
			("CryptoCaidBulCrypt1Available","B1",	False),
			("CryptoCaidBulCrypt2Available","B2",	False),
			("CryptoCaidTandbergAvailable", "TB",   False),
			("CryptoCaidSecaSelected",	"S",	True),
			("CryptoCaidViaSelected",	"V",	True),
			("CryptoCaidIrdetoSelected",	"I",	True),
			("CryptoCaidNDSSelected",	"Nd",	True),
			("CryptoCaidConaxSelected",	"Co",	True),
			("CryptoCaidCryptoWSelected",	"Cw",	True),
			("CryptoCaidPowerVUSelected",	"P",	True),
			("CryptoCaidBetaSelected",	"B",	True),
			("CryptoCaidNagraSelected",	"N",	True),
			("CryptoCaidBissSelected",	"Bi",	True),
			("CryptoCaidDreSelected",	"D",	True),
			("CryptoCaidBulCrypt1Selected",	"B1",	True),
			("CryptoCaidBulCrypt2Selected",	"B2",	True),
			("CryptoCaidTandbergSelected",  "TB",   True),
		)
		self.ecmdata = GetEcmInfo()
		self.feraw = self.fedata = self.updateFEdata = None

	def getCryptoInfo(self, info):
		if info.getInfo(iServiceInformation.sIsCrypted) == 1:
			data = self.ecmdata.getEcmData()
			self.current_source = data[0]
			self.current_caid = data[1]
			self.current_provid = data[2]
			self.current_ecmpid = data[3]
		else:
			self.current_source = ""
			self.current_caid = "0"
			self.current_provid = "0"
			self.current_ecmpid = "0"

	def createCryptoBar(self, info):
		res = ""
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in caid_data:
			if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
				color="\c0000??00"
			else:
				color = "\c007?7?7?"
				try:
					for caid in available_caids:
						if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
							color="\c00????00"
				except:
					pass

			if color != "\c007?7?7?" or caid_entry[4]:
				if res: res += " "
				res += color + caid_entry[3]

		res += "\c00??????"
		return res

	def createCryptoSpecial(self, info):
		caid_name = "FTA"
		try:
			for caid_entry in caid_data:
				if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x:%04x:%04x:%04x" % (int(self.current_caid,16), int(self.current_provid,16), info.getInfo(iServiceInformation.sSID), int(self.current_ecmpid,16))
		except:
			pass
		return ""

	def createResolution(self, info):
		xres = info.getInfo(iServiceInformation.sVideoWidth)
		if xres == -1:
			return ""
		yres = info.getInfo(iServiceInformation.sVideoHeight)
		mode = ("i", "p", " ")[info.getInfo(iServiceInformation.sProgressive)]
		fps  = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
		gamma = ("SDR", "HDR", "HDR10", "HLG", "")[info.getInfo(iServiceInformation.sGamma)]
		return str(xres) + "x" + str(yres) + mode + fps + addspace(gamma)

	def createVideoCodec(self, info):
		return codec_data.get(info.getInfo(iServiceInformation.sVideoType), "N/A")

	def createPIDInfo(self, info):
		vpid = info.getInfo(iServiceInformation.sVideoPID)
		apid = info.getInfo(iServiceInformation.sAudioPID)
		pcrpid = info.getInfo(iServiceInformation.sPCRPID)
		sidpid = info.getInfo(iServiceInformation.sSID)
		tsid = info.getInfo(iServiceInformation.sTSID)
		onid = info.getInfo(iServiceInformation.sONID)
		if vpid < 0 : vpid = 0
		if apid < 0 : apid = 0
		if pcrpid < 0 : pcrpid = 0
		if sidpid < 0 : sidpid = 0
		if tsid < 0 : tsid = 0
		if onid < 0 : onid = 0
		return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid, pcrpid)

	def createTransponderInfo(self, fedata, feraw, info):
		if not feraw:
			refstr = info.getInfoString(iServiceInformation.sServiceref)
			if "%3a//" in refstr.lower():
				return refstr.split(":")[10].replace("%3a", ":").replace("%3A", ":")
			return ""
		elif "DVB-T" in feraw.get("tuner_type"):
			tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata))
		else:
			tmp = addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata))
		return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
			+ addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createMisPls(fedata))

	def createFrequency(self, feraw):
		frequency = feraw.get("frequency")
		if frequency:
			if "DVB-T" in feraw.get("tuner_type"):
				return str(int(frequency / 1000000. + 0.5))
			else:
				return str(int(frequency / 1000 + 0.5))
		return ""

	def createChannelNumber(self, fedata, feraw):
		return "DVB-T" in feraw.get("tuner_type") and fedata.get("channel") or ""

	def createSymbolRate(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			bandwidth = fedata.get("bandwidth")
			if bandwidth:
				return bandwidth
		else:
			symbolrate = fedata.get("symbol_rate")
			if symbolrate:
				return str(symbolrate / 1000)
		return ""

	def createPolarization(self, fedata):
		return fedata.get("polarization_abbreviation") or ""

	def createFEC(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			code_rate_lp = fedata.get("code_rate_lp")
			code_rate_hp = fedata.get("code_rate_hp")
			guard_interval = fedata.get('guard_interval')
			if code_rate_lp and code_rate_hp and guard_interval:
				return code_rate_lp + "-" + code_rate_hp + "-" + guard_interval
		else:
			fec = fedata.get("fec_inner")
			if fec:
				return fec
		return ""

	def createModulation(self, fedata):
		if fedata.get("tuner_type") == _("Terrestrial"):
			constellation = fedata.get("constellation")
			if constellation:
				return constellation
		else:
			modulation = fedata.get("modulation")
			if modulation:
				return modulation
		return ""

	def createTunerType(self, feraw):
		return feraw.get("tuner_type") or ""

	def createTunerSystem(self, fedata):
		return fedata.get("system") or ""

	def createOrbPos(self, feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
		elif orbpos > 0:
			return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
		return ""

	def createOrbPosOrTunerSystem(self, fedata,feraw):
		orbpos = self.createOrbPos(feraw)
		if orbpos is not "":
			return orbpos
		return self.createTunerSystem(fedata)

	def createProviderName(self, info):
		return info.getInfoString(iServiceInformation.sProvider)

	def createMisPls(self, fedata):
		tmp = ""
		if fedata.get("is_id") > -1:
			tmp = "MIS %d" % fedata.get("is_id")
		if fedata.get("pls_code") > 0:
			tmp = addspace(tmp) + "%s %d" % (fedata.get("pls_mode"), fedata.get("pls_code"))
		return tmp

	@cached
	def getText(self):
		service = self.source.service
		if service is None:
			return ""
		info = service and service.info()

		if not info:
			return ""

		if self.type == "CryptoInfo":
			self.getCryptoInfo(info)
			if config.usage.show_cryptoinfo.value:
				return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
			else:
				return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)

		if self.type == "CryptoBar":
			self.getCryptoInfo(info)
			return self.createCryptoBar(info)

		if self.type == "CryptoSpecial":
			self.getCryptoInfo(info)
			return self.createCryptoSpecial(info)

		if self.type == "ResolutionString":
			return self.createResolution(info)

		if self.type == "VideoCodec":
			return self.createVideoCodec(info)

		if self.updateFEdata:
			feinfo = service.frontendInfo()
			if feinfo:
				self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == "settings")
				if self.feraw:
					self.fedata = ConvertToHumanReadable(self.feraw)

		feraw = self.feraw
		if not feraw:
			feraw = info.getInfoObject(iServiceInformation.sTransponderData)
			fedata = ConvertToHumanReadable(feraw)
		else:
			fedata = self.fedata

		if self.type == "All":
			self.getCryptoInfo(info)
			if config.usage.show_cryptoinfo.value:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw, info) + "\n" \
				+ addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n" \
				+ addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
			else:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw, info) + "\n" \
				+ addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
				+ addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "PIDInfo":
			return self.createPIDInfo(info)

		if not feraw:
			return ""

		if self.type == "ServiceInfo":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
			+ addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) \
			+ addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "TransponderInfo":
			return self.createTransponderInfo(fedata, feraw, info)

		if self.type == "TransponderFrequency":
			return self.createFrequency(feraw)

		if self.type == "TransponderSymbolRate":
			return self.createSymbolRate(fedata, feraw)

		if self.type == "TransponderPolarization":
			return self.createPolarization(fedata)

		if self.type == "TransponderFEC":
			return self.createFEC(fedata, feraw)

		if self.type == "TransponderModulation":
			return self.createModulation(fedata)

		if self.type == "OrbitalPosition":
			return self.createOrbPos(feraw)

		if self.type == "TunerType":
			return self.createTunerType(feraw)

		if self.type == "TunerSystem":
			return self.createTunerSystem(fedata)

		if self.type == "OrbitalPositionOrTunerSystem":
			return self.createOrbPosOrTunerSystem(fedata,feraw)

		if self.type == "TerrestrialChannelNumber":
			return self.createChannelNumber(fedata, feraw)

		return _("invalid type")

	text = property(getText)

	@cached
	def getBool(self):
		service = self.source.service
		info = service and service.info()

		if not info:
			return False

		request_caid = None
		for x in self.ca_table:
			if x[0] == self.type:
				request_caid = x[1]
				request_selected = x[2]
				break

		if request_caid is None:
			return False

		if info.getInfo(iServiceInformation.sIsCrypted) != 1:
			return False

		data = self.ecmdata.getEcmData()

		if data is None:
			return False

		current_caid	= data[1]

		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in caid_data:
			if caid_entry[3] == request_caid:
				if request_selected:
					if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(caid_entry[1], 16):
						return True
				else: # request available
					try:
						for caid in available_caids:
							if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
								return True
					except:
						pass

		return False

	boolean = property(getBool)

	def changed(self, what):
		if what[0] == self.CHANGED_SPECIFIC:
			self.updateFEdata = False
			if what[1] == iPlayableService.evNewProgramInfo:
				self.updateFEdata = True
			if what[1] == iPlayableService.evEnd:
				self.feraw = self.fedata = None
			Converter.changed(self, what)
		elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
			self.updateFEdata = False
			Converter.changed(self, what)
Example #18
0
class pliExpertInfo(Poll, Converter, object):
    SMART_LABEL = 0
    SMART_INFO_H = 1
    SMART_INFO_V = 2
    SERVICE_INFO = 3
    CRYPTO_INFO = 4
    FREQUENCY_INFO = 5

    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = {
            "ShowMe": self.SMART_LABEL,
            "ExpertInfo": self.SMART_INFO_H,
            "ExpertInfoVertical": self.SMART_INFO_V,
            "ServiceInfo": self.SERVICE_INFO,
            "CryptoInfo": self.CRYPTO_INFO,
            "FrequencyInfo": self.FREQUENCY_INFO
        }[type]

        self.poll_interval = 1000
        self.poll_enabled = True
        self.idnames = (("0x100", "0x1FF", "Seca",
                         "S"), ("0x500", "0x5FF", "Via",
                                "V"), ("0x600", "0x6FF", "Irdeto",
                                       "I"), ("0x900", "0x9FF", "NDS", "Nd"),
                        ("0xB00", "0xBFF", "Conax",
                         "Co"), ("0xD00", "0xDFF", "CryptoW",
                                 "Cw"), ("0x1700", "0x17FF", "Beta", "B"),
                        ("0x1800", "0x18FF", "Nagra",
                         "N"), ("0x2600", "0x26FF", "BISS", "Bi"))
        self.ecmdata = GetEcmInfo()

    @cached
    def getText(self):
        service = self.source.service
        try:
            info = service and service.info()
        except:
            try:
                info = eServiceCenter.getInstance().info(service)
            except:
                pass
        if not info:
            return ""

        Ret_Text = ""
        Sec_Text = ""
        Res_Text = ""
        showCryptoInfo = False

        if (self.type == self.SMART_INFO_H or self.type == self.SERVICE_INFO
                or self.type == self.CRYPTO_INFO
                or self.type == self.FREQUENCY_INFO):  # HORIZONTAL
            sep = "  "
            sep2 = " - "
        elif (self.type == self.SMART_INFO_V):  # VERTIKAL
            sep = "\n"
            sep2 = "\n"
        else:
            return ""  # unsupported orientation

        if (self.type == self.FREQUENCY_INFO):
            try:
                feinfo = (service and service.frontendInfo())
                prvd = info.getInfoString(iServiceInformation.sProvider)
                Ret_Text = self.short(prvd)
                frontendDataOrg = (feinfo and feinfo.getAll(True))
            except:
                try:
                    frontendDataOrg = info.getInfoObject(
                        service, iServiceInformation.sTransponderData)
                    prvd = info.getInfoString(service,
                                              iServiceInformation.sProvider)
                except:
                    pass

            if (frontendDataOrg is not None):
                frontendData = ConvertToHumanReadable(frontendDataOrg)
                if ((frontendDataOrg.get("tuner_type") == "DVB-S")
                        or (frontendDataOrg.get("tuner_type") == "DVB-C")):
                    frequency = (str(
                        (frontendData.get("frequency") / 1000)) + " MHz")
                    symbolrate = (str(
                        (frontendData.get("symbol_rate") / 1000)))
                    fec_inner = frontendData.get("fec_inner")
                    if (frontendDataOrg.get("tuner_type") == "DVB-S"):
                        Ret_Text += sep + frontendData.get("system")
                        orbital_pos = int(frontendDataOrg["orbital_position"])
                        if orbital_pos > 1800:
                            if orbital_pos == 3590:
                                orb_pos = 'Thor/Intelsat'
                            elif orbital_pos == 3560:
                                orb_pos = 'Amos (4'
                            elif orbital_pos == 3550:
                                orb_pos = 'Atlantic Bird'
                            elif orbital_pos == 3530:
                                orb_pos = 'Nilesat/Atlantic Bird'
                            elif orbital_pos == 3520:
                                orb_pos = 'Atlantic Bird'
                            elif orbital_pos == 3475:
                                orb_pos = 'Atlantic Bird'
                            elif orbital_pos == 3460:
                                orb_pos = 'Express'
                            elif orbital_pos == 3450:
                                orb_pos = 'Telstar'
                            elif orbital_pos == 3420:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 3380:
                                orb_pos = 'Nss'
                            elif orbital_pos == 3355:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 3325:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 3300:
                                orb_pos = 'Hispasat'
                            elif orbital_pos == 3285:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 3170:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 3150:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 3070:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 3045:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 3020:
                                orb_pos = 'Intelsat 9'
                            elif orbital_pos == 2990:
                                orb_pos = 'Amazonas'
                            elif orbital_pos == 2900:
                                orb_pos = 'Star One'
                            elif orbital_pos == 2880:
                                orb_pos = 'AMC 6 (72'
                            elif orbital_pos == 2875:
                                orb_pos = 'Echostar 6'
                            elif orbital_pos == 2860:
                                orb_pos = 'Horizons'
                            elif orbital_pos == 2810:
                                orb_pos = 'AMC5'
                            elif orbital_pos == 2780:
                                orb_pos = 'NIMIQ 4'
                            elif orbital_pos == 2690:
                                orb_pos = 'NIMIQ 1'
                            elif orbital_pos == 3592:
                                orb_pos = 'Thor/Intelsat'
                            elif orbital_pos == 2985:
                                orb_pos = 'Echostar 3,12'
                            elif orbital_pos == 2830:
                                orb_pos = 'Echostar 8'
                            elif orbital_pos == 2630:
                                orb_pos = 'Galaxy 19'
                            elif orbital_pos == 2500:
                                orb_pos = 'Echostar 10,11'
                            elif orbital_pos == 2502:
                                orb_pos = 'DirectTV 5'
                            elif orbital_pos == 2410:
                                orb_pos = 'Echostar 7 Anik F3'
                            elif orbital_pos == 2391:
                                orb_pos = 'Galaxy 23'
                            elif orbital_pos == 2390:
                                orb_pos = 'Echostar 9'
                            elif orbital_pos == 2412:
                                orb_pos = 'DirectTV 7S'
                            elif orbital_pos == 2310:
                                orb_pos = 'Galaxy 27'
                            elif orbital_pos == 2311:
                                orb_pos = 'Ciel 2'
                            elif orbital_pos == 2120:
                                orb_pos = 'Echostar 2'
                            else:
                                orb_pos = str(
                                    (float(3600 - orbital_pos)) / 10.0) + "W"
                        elif orbital_pos > 0:
                            if orbital_pos == 192:
                                orb_pos = 'Astra 1F'
                            elif orbital_pos == 130:
                                orb_pos = 'Hot Bird 6,7A,8'
                            elif orbital_pos == 235:
                                orb_pos = 'Astra 1E'
                            elif orbital_pos == 1100:
                                orb_pos = 'BSat 1A,2A'
                            elif orbital_pos == 1101:
                                orb_pos = 'N-Sat 110'
                            elif orbital_pos == 1131:
                                orb_pos = 'KoreaSat 5'
                            elif orbital_pos == 1440:
                                orb_pos = 'SuperBird 7,C2'
                            elif orbital_pos == 1006:
                                orb_pos = 'AsiaSat 2'
                            elif orbital_pos == 1030:
                                orb_pos = 'Express A2'
                            elif orbital_pos == 1056:
                                orb_pos = 'Asiasat 3S'
                            elif orbital_pos == 1082:
                                orb_pos = 'NSS 11'
                            elif orbital_pos == 881:
                                orb_pos = 'ST1'
                            elif orbital_pos == 900:
                                orb_pos = 'Yamal 201'
                            elif orbital_pos == 917:
                                orb_pos = 'Mesat'
                            elif orbital_pos == 950:
                                orb_pos = 'Insat 4B'
                            elif orbital_pos == 951:
                                orb_pos = 'NSS 6'
                            elif orbital_pos == 765:
                                orb_pos = 'Telestar'
                            elif orbital_pos == 785:
                                orb_pos = 'ThaiCom 5'
                            elif orbital_pos == 800:
                                orb_pos = 'Express'
                            elif orbital_pos == 830:
                                orb_pos = 'Insat 4A'
                            elif orbital_pos == 850:
                                orb_pos = 'Intelsat 709'
                            elif orbital_pos == 750:
                                orb_pos = 'Abs'
                            elif orbital_pos == 720:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 705:
                                orb_pos = 'Eutelsat W5'
                            elif orbital_pos == 685:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 620:
                                orb_pos = 'Intelsat 902'
                            elif orbital_pos == 600:
                                orb_pos = 'Intelsat 904'
                            elif orbital_pos == 570:
                                orb_pos = 'Nss'
                            elif orbital_pos == 530:
                                orb_pos = 'Express AM22'
                            elif orbital_pos == 480:
                                orb_pos = 'Eutelsat 2F2'
                            elif orbital_pos == 450:
                                orb_pos = 'Intelsat'
                            elif orbital_pos == 420:
                                orb_pos = 'Turksat 2A'
                            elif orbital_pos == 400:
                                orb_pos = 'Express AM1'
                            elif orbital_pos == 390:
                                orb_pos = 'Hellas Sat 2'
                            elif orbital_pos == 380:
                                orb_pos = 'Paksat 1'
                            elif orbital_pos == 360:
                                orb_pos = 'Eutelsat Sesat'
                            elif orbital_pos == 335:
                                orb_pos = 'Astra 1M'
                            elif orbital_pos == 330:
                                orb_pos = 'Eurobird 3'
                            elif orbital_pos == 328:
                                orb_pos = 'Galaxy 11'
                            elif orbital_pos == 315:
                                orb_pos = 'Astra 5A'
                            elif orbital_pos == 310:
                                orb_pos = 'Turksat'
                            elif orbital_pos == 305:
                                orb_pos = 'Arabsat'
                            elif orbital_pos == 285:
                                orb_pos = 'Eurobird 1'
                            elif orbital_pos == 284:
                                orb_pos = 'Eurobird/Astra'
                            elif orbital_pos == 282:
                                orb_pos = 'Eurobird/Astra'
                            elif orbital_pos == 1220:
                                orb_pos = 'AsiaSat'
                            elif orbital_pos == 1380:
                                orb_pos = 'Telstar 18'
                            elif orbital_pos == 260:
                                orb_pos = 'Badr 3/4'
                            elif orbital_pos == 255:
                                orb_pos = 'Eurobird 2'
                            elif orbital_pos == 215:
                                orb_pos = 'Eutelsat'
                            elif orbital_pos == 216:
                                orb_pos = 'Eutelsat W6'
                            elif orbital_pos == 210:
                                orb_pos = 'AfriStar 1'
                            elif orbital_pos == 160:
                                orb_pos = 'Eutelsat W2'
                            elif orbital_pos == 100:
                                orb_pos = 'Eutelsat W1'
                            elif orbital_pos == 90:
                                orb_pos = 'Eurobird 9'
                            elif orbital_pos == 70:
                                orb_pos = 'Eutelsat W3A'
                            elif orbital_pos == 50:
                                orb_pos = 'Sirius 4'
                            elif orbital_pos == 48:
                                orb_pos = 'Sirius 4'
                            elif orbital_pos == 30:
                                orb_pos = 'Telecom 2'
                            else:
                                orb_pos = str(
                                    (float(orbital_pos)) / 10.0) + "E"
                        Ret_Text += sep + orb_pos + "\n"
                        Ret_Text += frequency + sep + frontendData.get(
                            "polarization_abbreviation")
                        Ret_Text += sep + symbolrate
                        Ret_Text += sep + frontendData.get(
                            "modulation") + "-" + fec_inner
                    else:
                        Ret_Text += sep + "DVB-C " + frequency + " MHz" + sep + fec_inner + sep + symbolrate
                elif (frontendData.get("tuner_type") == "DVB-T"):
                    frequency = (str(
                        (frontendData.get("frequency") / 1000)) + " MHz")
                    Ret_Text = "Frequency: " + frequency

        if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V
                or self.type == self.SERVICE_INFO):

            xresol = info.getInfo(iServiceInformation.sVideoWidth)
            yresol = info.getInfo(iServiceInformation.sVideoHeight)
            feinfo = (service and service.frontendInfo())

            prvd = info.getInfoString(iServiceInformation.sProvider)
            Ret_Text = self.short(prvd)

            frontendDataOrg = (feinfo and feinfo.getAll(True))
            if (frontendDataOrg is not None):
                frontendData = ConvertToHumanReadable(frontendDataOrg)
                if ((frontendDataOrg.get("tuner_type") == "DVB-S")
                        or (frontendDataOrg.get("tuner_type") == "DVB-C")):
                    frequency = (str((frontendData.get("frequency") / 1000)))
                    symbolrate = (str(
                        (frontendData.get("symbol_rate") / 1000)))
                    fec_inner = frontendData.get("fec_inner")
                    if (frontendDataOrg.get("tuner_type") == "DVB-S"):
                        Ret_Text += sep + frontendData.get("system")
                        Ret_Text += sep + frequency + frontendData.get(
                            "polarization_abbreviation")
                        Ret_Text += sep + symbolrate
                        Ret_Text += sep + fec_inner + " " + frontendData.get(
                            "modulation")
                        orbital_pos = int(frontendDataOrg["orbital_position"])
                        if orbital_pos > 1800:
                            orb_pos = str(
                                (float(3600 - orbital_pos)) / 10.0) + "W"
                        elif orbital_pos > 0:
                            orb_pos = str((float(orbital_pos)) / 10.0) + "E"
                        Ret_Text += sep + orb_pos
                    else:
                        Ret_Text += sep + "DVB-C " + frequency + " MHz" + sep + fec_inner + sep + symbolrate
                elif (frontendDataOrg.get("tuner_type") == "DVB-T"):
                    frequency = (str((frontendData.get("frequency") / 1000)))
                    Ret_Text += sep + "DVB-T" + sep + "Frequency:" + sep + frequency + " MHz"

            if (feinfo is not None) and (xresol > 0):
                Res_Text += ("MPEG2", "MPEG4 H.264", "MPEG1", "MPEG4-VC",
                             "VC1", "VC1-SM", "HEVC H.265",
                             "")[info.getInfo(iServiceInformation.sVideoType)]
                Res_Text += str(xresol) + "x" + str(yresol)
                Res_Text += ("i", "p", "")[info.getInfo(
                    iServiceInformation.sProgressive)]
                Res_Text += str(
                    (info.getInfo(iServiceInformation.sFrameRate) + 500) /
                    1000)

        if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V
                or self.type == self.CRYPTO_INFO):

            decCI = "0"
            Sec_Text = ""
            if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
                data = self.ecmdata.getEcmData()
                if not config.usage.show_cryptoinfo.value:
                    showCryptoInfo = True
                    Sec_Text = data[0] + "\n"
                decCI = data[1]
                provid = data[2]
                pid = data[3]

                if decCI != '0':
                    decCIfull = "%04x" % int(decCI, 16)
                    for idline in self.idnames:
                        if int(decCI, 16) >= int(idline[0], 16) and int(
                                decCI, 16) <= int(idline[1], 16):
                            decCIfull = idline[2] + ":" + decCIfull
                            break
                    Sec_Text += decCIfull
                    if provid != '0':
                        Sec_Text += ":%04x" % int(provid, 16)
                    else:
                        Sec_Text += ":"
                    if pid != '0':
                        Sec_Text += ":%04x:%04x" % (info.getInfo(
                            iServiceInformation.sSID), int(pid, 16))

            elif not config.usage.show_cryptoinfo.value:
                showCryptoInfo = True
                Sec_Text = "FTA"
            res = ""
            searchIDs = (info.getInfoObject(iServiceInformation.sCAIDs))
            for idline in self.idnames:
                if int(decCI, 16) >= int(idline[0], 16) and int(
                        decCI, 16) <= int(idline[1], 16):
                    color = "\c0000??00"
                else:
                    color = "\c007?7?7?"
                    try:
                        for oneID in searchIDs:
                            if oneID >= int(idline[0], 16) and oneID <= int(
                                    idline[1], 16):
                                color = "\c00????00"
                    except:
                        pass
                res += color + idline[3] + " "

            if (self.type != self.CRYPTO_INFO):
                Ret_Text += "\n"
            Ret_Text += res + "\c00?????? " + Sec_Text

        if Res_Text != "":
            if showCryptoInfo:
                Ret_Text += sep + Res_Text
            else:
                Ret_Text += "\n" + Res_Text

        return Ret_Text

    text = property(getText)

    def changed(self, what):
        Converter.changed(self, what)

    def short(self, langTxt):
        if (self.type == self.SMART_INFO_V and len(langTxt) > 23):
            retT = langTxt[:20] + "..."
            return retT
        else:
            return langTxt
class PliExtraInfo(Poll, Converter, object):
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = type
		self.poll_interval = 1000
		self.poll_enabled = True
		self.caid_data = (
			( "0x100",  "0x1ff", "Seca",    "S" ),
			( "0x500",  "0x5ff", "Via",     "V" ),
			( "0x600",  "0x6ff", "Irdeto",  "I" ),
			( "0x900",  "0x9ff", "NDS",     "Nd"),
			( "0xb00",  "0xbff", "Conax",   "Co"),
			( "0xd00",  "0xdff", "CryptoW", "Cw"),
			("0x1700", "0x17ff", "Beta",    "B" ),
			("0x1800", "0x18ff", "Nagra",   "N" ),
			("0x2600", "0x2600", "Biss",    "Bi"),
			("0x4ae0", "0x4ae1", "Dre",     "D" )
		)
		self.ecmdata = GetEcmInfo()
	
	def getCryptoInfo(self,info):
		if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
			data = self.ecmdata.getEcmData()
			self.current_source = data[0]
			self.current_caid = data[1]
			self.current_provid = data[2]
			self.current_ecmpid = data[3]
		else:
			self.current_source = ""
			self.current_caid = "0"
			self.current_provid = "0"
			self.current_ecmpid = "0"
	
	def createCryptoBar(self,info):
		res = ""
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
			
		for caid_entry in self.caid_data:
			if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(self.current_caid, 16) <= int(caid_entry[1], 16):
				color="\c0000??00"
			else:
				color = "\c007?7?7?"
				try:
					for caid in available_caids:
						if caid >= int(caid_entry[0], 16) and caid <= int(caid_entry[1], 16):
							color="\c00????00"
				except:
					pass

			if res: res += " "
			res += color + caid_entry[3]
		
		res += "\c00??????"
		return res
	
	def createCryptoSpecial(self,info):
		caid_name = "FTA"
		try:
			for caid_entry in self.caid_data:
				if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x:%04x:%04x:%04x" % (int(self.current_caid,16),int(self.current_provid,16),info.getInfo(iServiceInformation.sSID),int(self.current_ecmpid,16))
		except:
			pass
		return ""
	
	def createResolution(self,info):
		xres = info.getInfo(iServiceInformation.sVideoWidth)
		if xres == -1:
			return ""
		yres = info.getInfo(iServiceInformation.sVideoHeight)
		mode = ("i", "p", "")[info.getInfo(iServiceInformation.sProgressive)]
		fps  = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
		return str(xres) + "x" + str(yres) + mode + fps

	def createVideoCodec(self,info):
		return ("MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM", "")[info.getInfo(iServiceInformation.sVideoType)]
		
	def createFrequency(self,fedata):
		frequency = fedata.get("frequency")
		if frequency: 
			return str(frequency / 1000)
		return ""		
	
	def createSymbolRate(self,fedata):
		symbolrate = fedata.get("symbol_rate")
		if symbolrate:
			return str(symbolrate / 1000)
		return ""
			
	def createPolarization(self,fedata):
		polarization = fedata.get("polarization_abbreviation")
		if polarization:
			return polarization
		return ""

	def createFEC(self,fedata):
		fec = fedata.get("fec_inner")
		if fec:
			return fec
		return ""

	def createModulation(self,fedata):
		modulation = fedata.get("modulation")
		if modulation:
			return modulation
		return ""
	
	def createTunerType(self,feraw):
		tunertype = feraw.get("tuner_type")
		if tunertype:
			return tunertype
		return ""

	def createTunerSystem(self,fedata):
		tunersystem = fedata.get("system")
		if tunersystem:
			return tunersystem
		return ""

	def createOrbPos(self,feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "W"
		elif orbpos > 0:
			return str((float(orbpos)) / 10.0) + "E"
		return ""

	def createProviderName(self,info):
		return info.getInfoString(iServiceInformation.sProvider)

	@cached
	def getText(self):

		service = self.source.service
		if service is None:
			return ""
		info = service and service.info()

		if not info:
			return ""

		if self.type == "CryptoBar":
			self.getCryptoInfo(info)
			return self.createCryptoBar(info)

		if self.type == "CryptoSpecial":
			self.getCryptoInfo(info)
			return self.createCryptoSpecial(info)

		if self.type == "ResolutionString":
			return self.createResolution(info)

		if self.type == "VideoCodec":
			return self.createVideoCodec(info)

		feinfo = service.frontendInfo()
		if feinfo is None:
			return ""

		feraw = feinfo.getAll(False)
		if feraw is None:
			return ""

		fedata = ConvertToHumanReadable(feraw)
		if fedata is None:
			return ""

		if self.type == "TransponderFrequency":
			return self.createFrequency(fedata)

		if self.type == "TransponderSymbolRate":
			return self.createSymbolRate(fedata)

		if self.type == "TransponderPolarization":
			return self.createPolarization(fedata)

		if self.type == "TransponderFEC":
			return self.createFEC(fedata)

		if self.type == "TransponderModulation":
			return self.createModulation(fedata)

		if self.type == "OrbitalPosition":
			return self.createOrbPos(feraw)

		if self.type == "TunerType":
			return self.createTunerType(feraw)	

		if self.type == "TunerSystem":
			return self.createTunerSystem(fedata)

		if self.type == "All":
			self.getCryptoInfo(info)
			if config.usage.show_cryptoinfo.value:
				return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
				+ addspace(self.createSymbolRate(fedata)) + addspace(self.createFEC(fedata)) + addspace(self.createModulation(fedata)) + self.createOrbPos(feraw) + "\n"\
				+ addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n"\
				+ addspace(self.createVideoCodec(info)) + self.createResolution(info)
			else:
				return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
				+ addspace(self.createSymbolRate(fedata)) + addspace(self.createFEC(fedata)) + addspace(self.createModulation(fedata)) + self.createOrbPos(feraw) + "\n"\
				+ addspace(self.createCryptoBar(info)) + self.current_source + "\n"\
				+ addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

		return _("invalid type")

	text = property(getText)

	@cached
	def getBool(self):
		service = self.source.service
		info = service and service.info()

		if not info:
			return False

		if self.type == "CryptoCaidSecaAvailable":
			request_caid = "S"
			request_selected = False
		elif self.type == "CryptoCaidViaAvailable":
			request_caid = "V"
			request_selected = False
		elif self.type == "CryptoCaidIrdetoAvailable":
			request_caid = "I"
			request_selected = False
		elif self.type == "CryptoCaidNDSAvailable":
			request_caid = "Nd"
			request_selected = False
		elif self.type == "CryptoCaidConaxAvailable":
			request_caid = "Co"
			request_selected = False
		elif self.type == "CryptoCaidCryptoWAvailable":
			request_caid = "Cw"
			request_selected = False
		elif self.type == "CryptoCaidBetaAvailable":
			request_caid = "B"
			request_selected = False
		elif self.type == "CryptoCaidNagraAvailable":
			request_caid = "N"
			request_selected = False
		elif self.type == "CryptoCaidBissAvailable":
			request_caid = "Bi"
			request_selected = False
		elif self.type == "CryptoCaidDreAvailable":
			request_caid = "D"
			request_selected = False
		elif self.type == "CryptoCaidSecaSelected":
			request_caid = "S"
			request_selected = True
		elif self.type == "CryptoCaidViaSelected":
			request_caid = "V"
			request_selected = True
		elif self.type == "CryptoCaidIrdetoSelected":
			request_caid = "I"
			request_selected = True
		elif self.type == "CryptoCaidNDSSelected":
			request_caid = "Nd"
			request_selected = True
		elif self.type == "CryptoCaidConaxSelected":
			request_caid = "Co"
			request_selected = True
		elif self.type == "CryptoCaidCryptoWSelected":
			request_caid = "Cw"
			request_selected = True
		elif self.type == "CryptoCaidBetaSelected":
			request_caid = "B"
			request_selected = True
		elif self.type == "CryptoCaidNagraSelected":
			request_caid = "N"
			request_selected = True
		elif self.type == "CryptoCaidBissSelected":
			request_caid = "Bi"
			request_selected = True
		elif self.type == "CryptoCaidDreSelected":
			request_caid = "D"
			request_selected = True
		else:
			return False

		if info.getInfo(iServiceInformation.sIsCrypted) != 1:
			return False

		data = self.ecmdata.getEcmData()

		if data is None:
			return False

		current_caid	= data[1]
		#current_provid	= data[2]
		#current_ecmpid	= data[3]

		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if caid_entry[3] == request_caid:
				if(request_selected):
					if int(current_caid, 16) >= int(caid_entry[0], 16) and int(current_caid, 16) <= int(caid_entry[1], 16):
						return True
				else: # request available
					try:
						for caid in available_caids:
							if caid >= int(caid_entry[0], 16) and caid <= int(caid_entry[1], 16):
								return True
					except:
						pass

		return False

	boolean = property(getBool)

	def changed(self, what):
		Converter.changed(self, what)
Example #20
0
class PliExtraInfo(Poll, Converter, object):
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = type
		self.poll_interval = 1000
		self.poll_enabled = True
		self.caid_data = (
			( "0x100",  "0x1ff", "Seca",     "S",  True  ),
			( "0x500",  "0x5ff", "Via",      "V",  True  ),
			( "0x600",  "0x6ff", "Irdeto",   "I",  True  ),
			( "0x900",  "0x9ff", "NDS",      "Nd", True  ),
			( "0xb00",  "0xbff", "Conax",    "Co", True  ),
			( "0xd00",  "0xdff", "CryptoW",  "Cw", True  ),
			( "0xe00",  "0xeff", "PowerVU",  "P",  False ),
			("0x1700", "0x17ff", "Beta",     "B",  True  ),
			("0x1800", "0x18ff", "Nagra",    "N",  True  ),
			("0x2600", "0x2600", "Biss",     "Bi", False ),
			("0x4ae0", "0x4ae1", "Dre",      "D",  False ),
			("0x4aee", "0x4aee", "BulCrypt", "B1", False ),
			("0x5581", "0x5581", "BulCrypt", "B2", False )
		)
		self.ca_table = (
			("CryptoCaidSecaAvailable",	"S",	False),
			("CryptoCaidViaAvailable",	"V",	False),
			("CryptoCaidIrdetoAvailable",	"I",	False),
			("CryptoCaidNDSAvailable",	"Nd",	False),
			("CryptoCaidConaxAvailable",	"Co",	False),
			("CryptoCaidCryptoWAvailable",	"Cw",	False),
			("CryptoCaidPowerVUAvailable",	"P",	False),
			("CryptoCaidBetaAvailable",	"B",	False),
			("CryptoCaidNagraAvailable",	"N",	False),
			("CryptoCaidBissAvailable",	"Bi",	False),
			("CryptoCaidDreAvailable",	"D",	False),
			("CryptoCaidBulCrypt1Available","B1",	False),
			("CryptoCaidBulCrypt2Available","B2",	False),
			("CryptoCaidSecaSelected",	"S",	True),
			("CryptoCaidViaSelected",	"V",	True),
			("CryptoCaidIrdetoSelected",	"I",	True),
			("CryptoCaidNDSSelected",	"Nd",	True),
			("CryptoCaidConaxSelected",	"Co",	True),
			("CryptoCaidCryptoWSelected",	"Cw",	True),
			("CryptoCaidPowerVUSelected",	"P",	True),
			("CryptoCaidBetaSelected",	"B",	True),
			("CryptoCaidNagraSelected",	"N",	True),
			("CryptoCaidBissSelected",	"Bi",	True),
			("CryptoCaidDreSelected",	"D",	True),
			("CryptoCaidBulCrypt1Selected",	"B1",	True),
			("CryptoCaidBulCrypt2Selected",	"B2",	True),
		)
		self.ecmdata = GetEcmInfo()
		self.feraw = self.fedata = self.updateFEdata = None

	def getCryptoInfo(self, info):
		if info.getInfo(iServiceInformation.sIsCrypted) == 1:
			data = self.ecmdata.getEcmData()
			self.current_source = data[0]
			self.current_caid = data[1]
			self.current_provid = data[2]
			self.current_ecmpid = data[3]
		else:
			self.current_source = ""
			self.current_caid = "0"
			self.current_provid = "0"
			self.current_ecmpid = "0"

	def createCryptoBar(self, info):
		res = ""
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
				color="\c0000??00"
			else:
				color = "\c007?7?7?"
				try:
					for caid in available_caids:
						if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
							color="\c00????00"
				except:
					pass

			if color != "\c007?7?7?" or caid_entry[4]:
				if res: res += " "
				res += color + caid_entry[3]

		res += "\c00??????"
		return res

	def createCryptoSeca(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x100', 16) <= caid <= int('0x1ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'S'
		res += "\c00??????"
		return res

	def createCryptoVia(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x500', 16) <= caid <= int('0x5ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'V'
		res += "\c00??????"
		return res

	def createCryptoIrdeto(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x600', 16) <= caid <= int('0x6ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'I'
		res += "\c00??????"
		return res

	def createCryptoNDS(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x900', 16) <= caid <= int('0x9ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'NDS'
		res += "\c00??????"
		return res

	def createCryptoConax(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xb00', 16) <= caid <= int('0xbff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'CO'
		res += "\c00??????"
		return res

	def createCryptoCryptoW(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xd00', 16) <= caid <= int('0xdff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'CW'
		res += "\c00??????"
		return res

	def createCryptoPowerVU(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xe00', 16) <= caid <= int('0xeff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'P'
		res += "\c00??????"
		return res

	def createCryptoBeta(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1700', 16) <= int(self.current_caid, 16) <= int('0x17ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1700', 16) <= caid <= int('0x17ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'B'
		res += "\c00??????"
		return res

	def createCryptoNagra(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1800', 16) <= int(self.current_caid, 16) <= int('0x18ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1800', 16) <= caid <= int('0x18ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'N'
		res += "\c00??????"
		return res

	def createCryptoBiss(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x2600', 16) <= int(self.current_caid, 16) <= int('0x26ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x2600', 16) <= caid <= int('0x26ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'BI'
		res += "\c00??????"
		return res

	def createCryptoDre(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int('0x4ae1', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'DC'
		res += "\c00??????"
		return res

	def createCryptoSpecial(self, info):
		caid_name = "FTA"
		try:
			for caid_entry in self.caid_data:
				if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x:%04x:%04x" % (int(self.current_caid,16), int(self.current_provid,16), info.getInfo(iServiceInformation.sSID))
		except:
			pass
		return ""

	def createResolution(self, info):
		video_height = 0
		video_width = 0
		video_pol = " "
		video_rate = 0
		if path.exists("/proc/stb/vmpeg/0/yres"):
			f = open("/proc/stb/vmpeg/0/yres", "r")
			try:
				video_height = int(f.read(),16)
			except:
				pass
			f.close()
		if path.exists("/proc/stb/vmpeg/0/xres"):
			f = open("/proc/stb/vmpeg/0/xres", "r")
			try:
				video_width = int(f.read(),16)
			except:
				pass
			f.close()
		if path.exists("/proc/stb/vmpeg/0/progressive"):
			f = open("/proc/stb/vmpeg/0/progressive", "r")
			try:
				video_pol = "p" if int(f.read(),16) else "i"
			except:
				pass
			f.close()
		if path.exists("/proc/stb/vmpeg/0/framerate"):
			f = open("/proc/stb/vmpeg/0/framerate", "r")
			try:
				video_rate = int(f.read())
			except:
				pass
			f.close()

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

	def createVideoCodec(self, info):
		return ("MPEG2", "AVC", "MPEG1", "MPEG4-VC", "VC1", "VC1-SM", "HEVC", "")[info.getInfo(iServiceInformation.sVideoType)]

	def createServiceRef(self, info):
		return info.getInfoString(iServiceInformation.sServiceref)

	def createPIDInfo(self, info):
		vpid = info.getInfo(iServiceInformation.sVideoPID)
		apid = info.getInfo(iServiceInformation.sAudioPID)
		pcrpid = info.getInfo(iServiceInformation.sPCRPID)
		sidpid = info.getInfo(iServiceInformation.sSID)
		tsid = info.getInfo(iServiceInformation.sTSID)
		onid = info.getInfo(iServiceInformation.sONID)
		if vpid < 0 : vpid = 0
		if apid < 0 : apid = 0
		if pcrpid < 0 : pcrpid = 0
		if sidpid < 0 : sidpid = 0
		if tsid < 0 : tsid = 0
		if onid < 0 : onid = 0
		return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid, pcrpid)

	def createTransponderInfo(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
		else:
			tmp = addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
		return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
			+ addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw))

	def createFrequency(self, fedata):
		frequency = fedata.get("frequency")
		if frequency:
			return str(frequency)
		return ""

	def createChannelNumber(self, fedata, feraw):
		return "DVB-T" in feraw.get("tuner_type") and fedata.get("channel") or ""

	def createSymbolRate(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			bandwidth = fedata.get("bandwidth")
			if bandwidth:
				return bandwidth
		else:
			symbolrate = fedata.get("symbol_rate")
			if symbolrate:
				return str(symbolrate)
		return ""

	def createPolarization(self, fedata):
		return fedata.get("polarization_abbreviation") or ""

	def createFEC(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			code_rate_lp = fedata.get("code_rate_lp")
			code_rate_hp = fedata.get("code_rate_hp")
			if code_rate_lp and code_rate_hp:
				return code_rate_lp + "-" + code_rate_hp
		else:
			fec = fedata.get("fec_inner")
			if fec:
				return fec
		return ""

	def createModulation(self, fedata):
		if fedata.get("tuner_type") == _("Terrestrial"):
			constellation = fedata.get("constellation")
			if constellation:
				return constellation
		else:
			modulation = fedata.get("modulation")
			if modulation:
				return modulation
		return ""

	def createTunerType(self, feraw):
		return feraw.get("tuner_type") or ""

	def createTunerSystem(self, fedata):
		return fedata.get("system") or ""

	def createOrbPos(self, feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
		elif orbpos > 0:
			return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
		return ""

	def createOrbPosOrTunerSystem(self, fedata,feraw):
		orbpos = self.createOrbPos(feraw)
		if orbpos is not "":
			return orbpos
		return self.createTunerSystem(fedata)

	def createTransponderName(self,feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos is None: # Not satellite
			return ""
		freq = feraw.get("frequency")
		if freq and freq < 10700000: # C-band
			if orbpos > 1800:
				orbpos += 1
			else:
				orbpos -= 1
				
		sat_names = {
			30:   'Rascom/Eutelsat 3E',
			48:   'SES 5',
			70:   'Eutelsat 7E',
			90:   'Eutelsat 9E',
			100:  'Eutelsat 10E',  
			130:  'Hot Bird',
			160:  'Eutelsat 16E',
			192:  'Astra 1KR/1L/1M/1N',
			200:  'Arabsat 20E',
			216:  'Eutelsat 21.5E',
			235:  'Astra 3',
			255:  'Eutelsat 25.5E',
			260:  'Badr 4/5/6',
			282:  'Astra 2E/2F/2G',
			305:  'Arabsat 30.5E',
			315:  'Astra 5',
			330:  'Eutelsat 33E',
			360:  'Eutelsat 36E',
			380:  'Paksat',
			390:  'Hellas Sat',
			400:  'Express 40E',
			420:  'Turksat',
			450:  'Intelsat 45E',
			480:  'Afghansat',
			490:  'Yamal 49E',
			530:  'Express 53E',
			570:  'NSS 57E',
			600:  'Intelsat 60E',
			620:  'Intelsat 62E',
			685:  'Intelsat 68.5E',
			705:  'Eutelsat 70.5E',
			720:  'Intelsat 72E',
			750:  'ABS',
			765:  'Apstar',
			785:  'ThaiCom',
			800:  'Express 80E',
			830:  'Insat',
			851:  'Intelsat/Horizons',
			880:  'ST2',
			900:  'Yamal 90E',
			915:  'Mesat',
			950:  'NSS/SES 95E',
			1005: 'AsiaSat 100E',
			1030: 'Express 103E',
			1055: 'Asiasat 105E',
			1082: 'NSS/SES 108E',
			1100: 'BSat/NSAT',
			1105: 'ChinaSat',
			1130: 'KoreaSat',
			1222: 'AsiaSat 122E',
			1380: 'Telstar 18',
			1440: 'SuperBird',
			2310: 'Ciel',
			2390: 'Echostar/Galaxy 121W',
			2410: 'Echostar/DirectTV 119W',
			2500: 'Echostar/DirectTV 110W',
			2630: 'Galaxy 97W',
			2690: 'NIMIQ 91W',
			2780: 'NIMIQ 82W',
			2830: 'Echostar/QuetzSat',
			2880: 'AMC 72W',
			2900: 'Star One',
			2985: 'Echostar 61.5W',
			2990: 'Amazonas',
			3020: 'Intelsat 58W',
			3045: 'Intelsat 55.5W',
			3070: 'Intelsat 53W',
			3100: 'Intelsat 50W',
			3150: 'Intelsat 45W',
			3169: 'Intelsat 43.1W',
			3195: 'SES 40.5W',
			3225: 'NSS/Telstar 37W',
			3255: 'Intelsat 34.5W',
			3285: 'Intelsat 31.5W',
			3300: 'Hispasat',
			3325: 'Intelsat 27.5W',
			3355: 'Intelsat 24.5W',
			3380: 'SES 22W',
			3400: 'NSS 20W',
			3420: 'Intelsat 18W',
			3450: 'Telstar 15W',
			3460: 'Express 14W',
			3475: 'Eutelsat 12.5W',
			3490: 'Express 11W',
			3520: 'Eutelsat 8W',
			3530: 'Nilesat/Eutelsat 7W',
			3550: 'Eutelsat 5W',
			3560: 'Amos',
			3592: 'Thor/Intelsat'
		}
		
		if orbpos in sat_names:
			return sat_names[orbpos]
		elif orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "W"
		else:
			return str((float(orbpos)) / 10.0) + "E"

	def createProviderName(self,info):
		return info.getInfoString(iServiceInformation.sProvider)

	@cached
	def getText(self):
		service = self.source.service
		if service is None:
			return ""
		info = service and service.info()

		if not info:
			return ""

		if self.type == "CryptoInfo":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
			else:
				return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)

		if self.type == "CryptoBar":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBar(info)
			else:
				return ""

		if self.type == "CryptoSeca":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoSeca(info)
			else:
				return ""

		if self.type == "CryptoVia":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoVia(info)
			else:
				return ""

		if self.type == "CryptoIrdeto":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoIrdeto(info)
			else:
				return ""

		if self.type == "CryptoNDS":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNDS(info)
			else:
				return ""

		if self.type == "CryptoConax":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoConax(info)
			else:
				return ""

		if self.type == "CryptoCryptoW":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoCryptoW(info)
			else:
				return ""

		if self.type == "CryptoBeta":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBeta(info)
			else:
				return ""

		if self.type == "CryptoNagra":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNagra(info)
			else:
				return ""

		if self.type == "CryptoBiss":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBiss(info)
			else:
				return ""

		if self.type == "CryptoDre":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoDre(info)
			else:
				return ""

		if self.type == "CryptoSpecial":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoSpecial(info)
			else:
				return ""

		if self.type == "ResolutionString":
			return self.createResolution(info)

		if self.type == "VideoCodec":
			return self.createVideoCodec(info)

		if self.updateFEdata:
			feinfo = service.frontendInfo()
			if feinfo:
				self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == "settings")
				if self.feraw:
					self.fedata = ConvertToHumanReadable(self.feraw)

		feraw = self.feraw
		if not feraw:
			feraw = info.getInfoObject(iServiceInformation.sTransponderData)
			if not feraw:
				return ""
			fedata = ConvertToHumanReadable(feraw)
		else:
			fedata = self.fedata
		if self.type == "All":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n"\
				+ addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n"\
				+ addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
			else:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n" \
				+ addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
				+ addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "ServiceInfo":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
			+ addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createTransponderName(feraw))\
			+ addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "TransponderInfo2line":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createTransponderName(feraw)) + '\n'\
			+ addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
			+ addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))

		if self.type == "PIDInfo":
			return self.createPIDInfo(info)

		if self.type == "ServiceRef":
			return self.createServiceRef(info)

		if not feraw:
			return ""

		if self.type == "TransponderInfo":
			return self.createTransponderInfo(fedata, feraw)

		if self.type == "TransponderFrequency":
			return self.createFrequency(feraw)

		if self.type == "TransponderSymbolRate":
			return self.createSymbolRate(fedata, feraw)

		if self.type == "TransponderPolarization":
			return self.createPolarization(fedata)

		if self.type == "TransponderFEC":
			return self.createFEC(fedata, feraw)

		if self.type == "TransponderModulation":
			return self.createModulation(fedata)

		if self.type == "OrbitalPosition":
			return self.createOrbPos(feraw)

		if self.type == "TunerType":
			return self.createTunerType(feraw)

		if self.type == "TunerSystem":
			return self.createTunerSystem(fedata)

		if self.type == "OrbitalPositionOrTunerSystem":
			return self.createOrbPosOrTunerSystem(fedata,feraw)

		if self.type == "TerrestrialChannelNumber":
			return self.createChannelNumber(fedata, feraw)

		return _("invalid type")

	text = property(getText)

	@cached
	def getBool(self):
		service = self.source.service
		info = service and service.info()

		if not info:
			return False

		request_caid = None
		for x in self.ca_table:
			if x[0] == self.type:
				request_caid = x[1]
				request_selected = x[2]
				break

		if request_caid is None:
			return False

		if info.getInfo(iServiceInformation.sIsCrypted) != 1:
			return False

		data = self.ecmdata.getEcmData()

		if data is None:
			return False

		current_caid	= data[1]

		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if caid_entry[3] == request_caid:
				if request_selected:
					if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(caid_entry[1], 16):
						return True
				else: # request available
					try:
						for caid in available_caids:
							if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
								return True
					except:
						pass

		return False

	boolean = property(getBool)

	def changed(self, what):
		if what[0] == self.CHANGED_SPECIFIC:
			self.updateFEdata = False
			if what[1] == iPlayableService.evNewProgramInfo:
				self.updateFEdata = True
			if what[1] == iPlayableService.evEnd:
				self.feraw = self.fedata = None
			Converter.changed(self, what)
		elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
			self.updateFEdata = False
			Converter.changed(self, what)
Example #21
0
class pliExpertInfo(Poll, Converter, object):
	SMART_LABEL = 0
	SMART_INFO_H = 1
	SMART_INFO_V = 2
	SERVICE_INFO = 3
	CRYPTO_INFO = 4
	
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = {
				"ShowMe": self.SMART_LABEL,
				"ExpertInfo": self.SMART_INFO_H,
				"ExpertInfoVertical": self.SMART_INFO_V,
				"ServiceInfo": self.SERVICE_INFO,
				"CryptoInfo": self.CRYPTO_INFO
			}[type]

		self.poll_interval = 1000
		self.poll_enabled = True
		self.idnames = (
			( "0x100", "0x1FF","Seca"   ,"S" ),
			( "0x500", "0x5FF","Via"    ,"V" ),
			( "0x600", "0x6FF","Irdeto" ,"I" ),
			( "0x900", "0x9FF","NDS"    ,"Nd"),
			( "0xB00", "0xBFF","Conax"  ,"Co"),
			( "0xD00", "0xDFF","CryptoW","Cw"),
			("0x1700","0x17FF","Beta"   ,"B" ),
			("0x1800","0x18FF","Nagra"  ,"N" ))
		self.ecmdata = GetEcmInfo()

	@cached
	def getText(self):
		service = self.source.service
		info = service and service.info()
		if not info:
			return ""	

		Ret_Text = ""
		Sec_Text = ""
		Res_Text = ""
		showCryptoInfo = False

		if (self.type == self.SMART_INFO_H or self.type == self.SERVICE_INFO or self.type == self.CRYPTO_INFO): # HORIZONTAL
			sep = "  "
			sep2 = " - "
		elif (self.type == self.SMART_INFO_V): # VERTIKAL
			sep = "\n"
			sep2 = "\n"
		else:
			return ""	# unsupported orientation
		
		if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.SERVICE_INFO):
			
			xresol = info.getInfo(iServiceInformation.sVideoWidth)
			yresol = info.getInfo(iServiceInformation.sVideoHeight)
			feinfo = (service and service.frontendInfo())

			prvd = info.getInfoString(iServiceInformation.sProvider)
			Ret_Text = self.short(prvd)

			frontendDataOrg = (feinfo and feinfo.getAll(False))
			if (frontendDataOrg is not None):
				frontendData = ConvertToHumanReadable(frontendDataOrg)
				if ((frontendDataOrg.get("tuner_type") == "DVB-S") or (frontendDataOrg.get("tuner_type") == "DVB-C")):
					frequency = (str((frontendData.get("frequency") / 1000)))
					symbolrate = (str((frontendData.get("symbol_rate") / 1000)))
					fec_inner = frontendData.get("fec_inner")
					if (frontendDataOrg.get("tuner_type") == "DVB-S"):
						Ret_Text += sep + frontendData.get("system")
						Ret_Text += sep + frequency + frontendData.get("polarization_abbreviation")
						Ret_Text += sep + symbolrate
						Ret_Text += sep + fec_inner + " " + frontendData.get("modulation")
						orbital_pos = int(frontendDataOrg["orbital_position"])
						if orbital_pos > 1800:
							orb_pos = str((float(3600 - orbital_pos)) / 10.0) + "W"
						elif orbital_pos > 0:
							orb_pos = str((float(orbital_pos)) / 10.0) + "E"
						Ret_Text += sep + orb_pos
					else:
						Ret_Text += sep + "DVB-C " + frequency + " MHz" + sep + fec_inner + sep + symbolrate
				elif (frontendDataOrg.get("tuner_type") == "DVB-T"):
					frequency = (str((frontendData.get("frequency") / 1000)))
					Ret_Text += sep + "DVB-T" + sep + "Frequency:" + sep + frequency + " MHz"

			if (feinfo is not None) and (xresol > 0):
				Res_Text += ("MPEG2 ", "MPEG4 ", "MPEG1 ", "MPEG4-II ", "VC1 ", "VC1-SM ", "")[info.getInfo(iServiceInformation.sVideoType)]
				Res_Text += str(xresol) + "x" + str(yresol) 
				Res_Text += ("i", "p", "")[info.getInfo(iServiceInformation.sProgressive)]
				Res_Text += str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)

		if (self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.CRYPTO_INFO):

			decCI = "0" 
			Sec_Text = ""
			if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
				data = self.ecmdata.getEcmData()
				if not config.usage.show_cryptoinfo.value:
					showCryptoInfo = True
					Sec_Text = data[0] + "\n"
				decCI = data[1]
				provid = data[2]
				pid = data[3]	

				if decCI != '0':
					decCIfull = "%04x" % int(decCI, 16)
					for idline in self.idnames:
						if int(decCI, 16) >= int(idline[0], 16) and int(decCI, 16) <= int(idline[1], 16):
							decCIfull = idline[2] + ":" + decCIfull
							break
					Sec_Text += decCIfull
					if provid != '0':
						Sec_Text += ":%04x" % int(provid, 16)
					else:
						Sec_Text += ":"
					if pid != '0':
						Sec_Text += ":%04x:%04x" % (info.getInfo(iServiceInformation.sSID),int(pid, 16))
			
			elif not config.usage.show_cryptoinfo.value:
				showCryptoInfo = True
				Sec_Text = "FTA"
			res = ""			
			searchIDs = (info.getInfoObject(iServiceInformation.sCAIDs))
			for idline in self.idnames:
				if int(decCI, 16) >= int(idline[0], 16) and int(decCI, 16) <= int(idline[1], 16):                    
					color="\c0000??00"
				else:
					color = "\c007?7?7?"
					try:
						for oneID in searchIDs:
							if oneID >= int(idline[0], 16) and oneID <= int(idline[1], 16):
								color="\c00????00"
					except:
						pass
				res += color + idline[3] + " "
			
			if (self.type != self.CRYPTO_INFO):
				Ret_Text += "\n"
			Ret_Text += res + "\c00?????? " + Sec_Text
		
		if Res_Text != "":
			if showCryptoInfo:
				Ret_Text += sep + Res_Text
			else:
				Ret_Text += "\n" + Res_Text

		return Ret_Text

	text = property(getText)

	def changed(self, what):
		Converter.changed(self, what)

	def short(self, langTxt):
		if (self.type == self.SMART_INFO_V and len(langTxt)>23):
			retT = langTxt[:20] + "..."
			return retT
		else:
			return langTxt
Example #22
0
class PliExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (('0x100', '0x1ff', 'Seca', 'S',
                           True), ('0x500', '0x5ff', 'Via', 'V', True),
                          ('0x600', '0x6ff', 'Irdeto', 'I',
                           True), ('0x900', '0x9ff', 'NDS', 'Nd', True),
                          ('0xb00', '0xbff', 'Conax', 'Co',
                           True), ('0xd00', '0xdff', 'CryptoW', 'Cw', True),
                          ('0xe00', '0xeff', 'PowerVU', 'P',
                           False), ('0x1700', '0x17ff', 'Beta', 'B', True),
                          ('0x1800', '0x18ff', 'Nagra', 'N',
                           True), ('0x2600', '0x2600', 'Biss', 'Bi', False),
                          ('0x4ae0', '0x4ae1', 'Dre', 'D',
                           False), ('0x4aee', '0x4aee', 'BulCrypt', 'B1',
                                    False), ('0x5581', '0x5581', 'BulCrypt',
                                             'B2', False))
        self.ca_table = (('CryptoCaidSecaAvailable', 'S',
                          False), ('CryptoCaidViaAvailable', 'V', False),
                         ('CryptoCaidIrdetoAvailable', 'I',
                          False), ('CryptoCaidNDSAvailable', 'Nd', False),
                         ('CryptoCaidConaxAvailable', 'Co',
                          False), ('CryptoCaidCryptoWAvailable', 'Cw', False),
                         ('CryptoCaidPowerVUAvailable', 'P',
                          False), ('CryptoCaidBetaAvailable', 'B',
                                   False), ('CryptoCaidNagraAvailable', 'N',
                                            False), ('CryptoCaidBissAvailable',
                                                     'Bi', False),
                         ('CryptoCaidDreAvailable', 'D',
                          False), ('CryptoCaidBulCrypt1Available', 'B1',
                                   False), ('CryptoCaidBulCrypt2Available',
                                            'B2', False),
                         ('CryptoCaidSecaSelected', 'S',
                          True), ('CryptoCaidViaSelected', 'V',
                                  True), ('CryptoCaidIrdetoSelected', 'I',
                                          True), ('CryptoCaidNDSSelected',
                                                  'Nd', True),
                         ('CryptoCaidConaxSelected', 'Co',
                          True), ('CryptoCaidCryptoWSelected', 'Cw',
                                  True), ('CryptoCaidPowerVUSelected', 'P',
                                          True), ('CryptoCaidBetaSelected',
                                                  'B', True),
                         ('CryptoCaidNagraSelected', 'N',
                          True), ('CryptoCaidBissSelected', 'Bi',
                                  True), ('CryptoCaidDreSelected', 'D', True),
                         ('CryptoCaidBulCrypt1Selected', 'B1',
                          True), ('CryptoCaidBulCrypt2Selected', 'B2', True))
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None
        return

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ''
            self.current_caid = '0'
            self.current_provid = '0'
            self.current_ecmpid = '0'

    def createCryptoBar(self, info):
        res = ''
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        for caid_entry in self.caid_data:
            if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                    caid_entry[1], 16):
                color = '\\c0000??00'
            else:
                color = '\\c007?7?7?'
                try:
                    for caid in available_caids:
                        if int(caid_entry[0], 16) <= caid <= int(
                                caid_entry[1], 16):
                            color = '\\c00????00'

                except:
                    pass

            if color != '\\c007?7?7?' or caid_entry[4]:
                if res:
                    res += ' '
                res += color + caid_entry[3]

        res += '\\c00??????'
        return res

    def createCryptoSeca(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x100', 16) <= caid <= int('0x1ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'S'
        res += '\\c00??????'
        return res

    def createCryptoVia(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x500', 16) <= caid <= int('0x5ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'V'
        res += '\\c00??????'
        return res

    def createCryptoIrdeto(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x600', 16) <= caid <= int('0x6ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'I'
        res += '\\c00??????'
        return res

    def createCryptoNDS(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x900', 16) <= caid <= int('0x9ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'NDS'
        res += '\\c00??????'
        return res

    def createCryptoConax(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xb00', 16) <= caid <= int('0xbff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'CO'
        res += '\\c00??????'
        return res

    def createCryptoCryptoW(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xd00', 16) <= caid <= int('0xdff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'CW'
        res += '\\c00??????'
        return res

    def createCryptoPowerVU(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xe00', 16) <= caid <= int('0xeff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'P'
        res += '\\c00??????'
        return res

    def createCryptoBeta(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1700', 16) <= int(self.current_caid, 16) <= int(
                '0x17ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x1700', 16) <= caid <= int('0x17ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'B'
        res += '\\c00??????'
        return res

    def createCryptoNagra(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1800', 16) <= int(self.current_caid, 16) <= int(
                '0x18ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x1800', 16) <= caid <= int('0x18ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'N'
        res += '\\c00??????'
        return res

    def createCryptoBiss(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x2600', 16) <= int(self.current_caid, 16) <= int(
                '0x26ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x2600', 16) <= caid <= int('0x26ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'BI'
        res += '\\c00??????'
        return res

    def createCryptoDre(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int(
                '0x4ae1', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'DC'
        res += '\\c00??????'
        return res

    def createCryptoSpecial(self, info):
        caid_name = 'FTA'
        try:
            for caid_entry in self.caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                        caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break

            return caid_name + ':%04x:%04x:%04x' % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(iServiceInformation.sSID))
        except:
            pass

        return ''

    def createResolution(self, info):
        video_height = 0
        video_width = 0
        video_pol = ' '
        video_rate = 0
        if path.exists('/proc/stb/vmpeg/0/yres'):
            f = open('/proc/stb/vmpeg/0/yres', 'r')
            try:
                video_height = int(f.read(), 16)
            except:
                pass

            f.close()
        if path.exists('/proc/stb/vmpeg/0/xres'):
            f = open('/proc/stb/vmpeg/0/xres', 'r')
            try:
                video_width = int(f.read(), 16)
            except:
                pass

            f.close()
        if path.exists('/proc/stb/vmpeg/0/progressive'):
            f = open('/proc/stb/vmpeg/0/progressive', 'r')
            try:
                video_pol = 'p' if int(f.read(), 16) else 'i'
            except:
                pass

            f.close()
        if path.exists('/proc/stb/vmpeg/0/framerate'):
            f = open('/proc/stb/vmpeg/0/framerate', 'r')
            try:
                video_rate = int(f.read())
            except:
                pass

            f.close()
        fps = str((video_rate + 500) / 1000)
        return str(video_width) + 'x' + str(video_height) + video_pol + fps

    def createVideoCodec(self, info):
        return ('MPEG2', 'MPEG4', 'MPEG1', 'MPEG4-II', 'VC1', 'VC1-SM',
                '')[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0:
            vpid = 0
        if apid < 0:
            apid = 0
        if pcrpid < 0:
            pcrpid = 0
        if sidpid < 0:
            sidpid = 0
        if tsid < 0:
            tsid = 0
        if onid < 0:
            onid = 0
        return '%d-%d:%05d:%04d:%04d:%04d' % (onid, tsid, sidpid, vpid, apid,
                                              pcrpid)

    def createTransponderInfo(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(
                self.createFrequency(fedata)) + addspace(
                    self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(fedata)) + addspace(
                self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(
            self.createSymbolRate(fedata, feraw)) + addspace(
                self.createFEC(fedata, feraw)) + addspace(
                    self.createModulation(fedata)) + addspace(
                        self.createOrbPos(feraw))

    def createFrequency(self, fedata):
        frequency = fedata.get('frequency')
        if frequency:
            return str(frequency)
        return ''

    def createChannelNumber(self, fedata, feraw):
        return 'DVB-T' in feraw.get('tuner_type') and fedata.get(
            'channel') or ''

    def createSymbolRate(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            bandwidth = fedata.get('bandwidth')
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get('symbol_rate')
            if symbolrate:
                return str(symbolrate)
        return ''

    def createPolarization(self, fedata):
        return fedata.get('polarization_abbreviation') or ''

    def createFEC(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            code_rate_lp = fedata.get('code_rate_lp')
            code_rate_hp = fedata.get('code_rate_hp')
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + '-' + code_rate_hp
        else:
            fec = fedata.get('fec_inner')
            if fec:
                return fec
        return ''

    def createModulation(self, fedata):
        if fedata.get('tuner_type') == _('Terrestrial'):
            constellation = fedata.get('constellation')
            if constellation:
                return constellation
        else:
            modulation = fedata.get('modulation')
            if modulation:
                return modulation
        return ''

    def createTunerType(self, feraw):
        return feraw.get('tuner_type') or ''

    def createTunerSystem(self, fedata):
        return fedata.get('system') or ''

    def createOrbPos(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            return str(float(3600 - orbpos) / 10.0) + '\xc2\xb0 W'
        if orbpos > 0:
            return str(float(orbpos) / 10.0) + '\xc2\xb0 E'
        return ''

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not '':
            return orbpos
        return self.createTunerSystem(fedata)

    def createTransponderName(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos is None:
            return ''
        else:
            freq = feraw.get('frequency')
            if freq and freq < 10700000:
                if orbpos > 1800:
                    orbpos += 1
                else:
                    orbpos -= 1
            sat_names = {
                30: 'Rascom/Eutelsat 3E',
                48: 'SES 5',
                70: 'Eutelsat 7E',
                90: 'Eutelsat 9E',
                100: 'Eutelsat 10E',
                130: 'Hot Bird',
                160: 'Eutelsat 16E',
                192: 'Astra 1KR/1L/1M/1N',
                200: 'Arabsat 20E',
                216: 'Eutelsat 21.5E',
                235: 'Astra 3',
                255: 'Eutelsat 25.5E',
                260: 'Badr 4/5/6',
                282: 'Astra 2E/2F/2G',
                305: 'Arabsat 30.5E',
                315: 'Astra 5',
                330: 'Eutelsat 33E',
                360: 'Eutelsat 36E',
                380: 'Paksat',
                390: 'Hellas Sat',
                400: 'Express 40E',
                420: 'Turksat',
                450: 'Intelsat 45E',
                480: 'Afghansat',
                490: 'Yamal 49E',
                530: 'Express 53E',
                570: 'NSS 57E',
                600: 'Intelsat 60E',
                620: 'Intelsat 62E',
                685: 'Intelsat 68.5E',
                705: 'Eutelsat 70.5E',
                720: 'Intelsat 72E',
                750: 'ABS',
                765: 'Apstar',
                785: 'ThaiCom',
                800: 'Express 80E',
                830: 'Insat',
                851: 'Intelsat/Horizons',
                880: 'ST2',
                900: 'Yamal 90E',
                915: 'Mesat',
                950: 'NSS/SES 95E',
                1005: 'AsiaSat 100E',
                1030: 'Express 103E',
                1055: 'Asiasat 105E',
                1082: 'NSS/SES 108E',
                1100: 'BSat/NSAT',
                1105: 'ChinaSat',
                1130: 'KoreaSat',
                1222: 'AsiaSat 122E',
                1380: 'Telstar 18',
                1440: 'SuperBird',
                2310: 'Ciel',
                2390: 'Echostar/Galaxy 121W',
                2410: 'Echostar/DirectTV 119W',
                2500: 'Echostar/DirectTV 110W',
                2630: 'Galaxy 97W',
                2690: 'NIMIQ 91W',
                2780: 'NIMIQ 82W',
                2830: 'Echostar/QuetzSat',
                2880: 'AMC 72W',
                2900: 'Star One',
                2985: 'Echostar 61.5W',
                2990: 'Amazonas',
                3020: 'Intelsat 58W',
                3045: 'Intelsat 55.5W',
                3070: 'Intelsat 53W',
                3100: 'Intelsat 50W',
                3150: 'Intelsat 45W',
                3169: 'Intelsat 43.1W',
                3195: 'SES 40.5W',
                3225: 'NSS/Telstar 37W',
                3255: 'Intelsat 34.5W',
                3285: 'Intelsat 31.5W',
                3300: 'Hispasat',
                3325: 'Intelsat 27.5W',
                3355: 'Intelsat 24.5W',
                3380: 'SES 22W',
                3400: 'NSS 20W',
                3420: 'Intelsat 18W',
                3450: 'Telstar 15W',
                3460: 'Express 14W',
                3475: 'Eutelsat 12.5W',
                3490: 'Express 11W',
                3520: 'Eutelsat 8W',
                3530: 'Nilesat/Eutelsat 7W',
                3550: 'Eutelsat 5W',
                3560: 'Amos',
                3592: 'Thor/Intelsat'
            }
            if orbpos in sat_names:
                return sat_names[orbpos]
            if orbpos > 1800:
                return str(float(3600 - orbpos) / 10.0) + 'W'
            return str(float(orbpos) / 10.0) + 'E'
            return

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ''
        info = service and service.info()
        if not info:
            return ''
        if self.type == 'CryptoInfo':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)
        if self.type == 'CryptoBar':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            else:
                return ''
        if self.type == 'CryptoSeca':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSeca(info)
            else:
                return ''
        if self.type == 'CryptoVia':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoVia(info)
            else:
                return ''
        if self.type == 'CryptoIrdeto':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoIrdeto(info)
            else:
                return ''
        if self.type == 'CryptoNDS':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNDS(info)
            else:
                return ''
        if self.type == 'CryptoConax':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoConax(info)
            else:
                return ''
        if self.type == 'CryptoCryptoW':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoCryptoW(info)
            else:
                return ''
        if self.type == 'CryptoBeta':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBeta(info)
            else:
                return ''
        if self.type == 'CryptoNagra':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNagra(info)
            else:
                return ''
        if self.type == 'CryptoBiss':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBiss(info)
            else:
                return ''
        if self.type == 'CryptoDre':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoDre(info)
            else:
                return ''
        if self.type == 'CryptoSpecial':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            else:
                return ''
        if self.type == 'ResolutionString':
            return self.createResolution(info)
        elif self.type == 'VideoCodec':
            return self.createVideoCodec(info)
        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(
                    config.usage.infobar_frontend_source.value == 'settings')
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)
        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            if not feraw:
                return ''
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata
        if self.type == 'All':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(
                    self.createProviderName(info)
                ) + self.createTransponderInfo(fedata, feraw) + addspace(
                    self.createTransponderName(feraw)) + '\n' + addspace(
                        self.createCryptoBar(info)) + addspace(
                            self.createCryptoSpecial(info)) + '\n' + addspace(
                                self.createPIDInfo(info)) + addspace(
                                    self.createVideoCodec(
                                        info)) + self.createResolution(info)
            else:
                return addspace(
                    self.createProviderName(info)
                ) + self.createTransponderInfo(fedata, feraw) + addspace(
                    self.createTransponderName(feraw)) + '\n' + addspace(
                        self.createCryptoBar(
                            info)) + self.current_source + '\n' + addspace(
                                self.createCryptoSpecial(info)) + addspace(
                                    self.createVideoCodec(
                                        info)) + self.createResolution(info)
        if self.type == 'ServiceInfo':
            return addspace(self.createProviderName(info)) + addspace(
                self.createTunerSystem(fedata)) + addspace(
                    self.createFrequency(feraw)) + addspace(
                        self.createPolarization(fedata)) + addspace(
                            self.createSymbolRate(fedata, feraw)) + addspace(
                                self.createFEC(fedata, feraw)) + addspace(
                                    self.createModulation(fedata)) + addspace(
                                        self.createOrbPos(feraw)) + addspace(
                                            self.createTransponderName(
                                                feraw)) + addspace(
                                                    self.createVideoCodec(info)
                                                ) + self.createResolution(info)
        elif self.type == 'ServiceInfoFreq':
            return addspace(
                self.createFrequency(feraw)) + ' POL : ' + addspace(
                    self.createPolarization(fedata)) + ' FEC : ' + addspace(
                        self.createFEC(fedata, feraw)) + ' SR : ' + addspace(
                            self.createSymbolRate(
                                fedata, feraw)) + ' MOD : ' + addspace(
                                    self.createModulation(fedata))
        if self.type == 'ServiceInfoCrypt':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.createCryptoSpecial(info))
            else:
                return "'Emu Info'"
        if self.type == 'EmuInfoCrypt':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(info))
            else:
                return "'Emu Info'"
        if self.type == 'EmuInfoCryptSpecial':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoSpecial(info))
            else:
                return "'Emu Info'"
        if self.type == 'TransponderInfo2line':
            return addspace(self.createProviderName(info)) + addspace(
                self.createTunerSystem(fedata)) + addspace(
                    self.createTransponderName(feraw)) + '\n' + addspace(
                        self.createFrequency(fedata)) + addspace(
                            self.createPolarization(fedata)) + addspace(
                                self.createSymbolRate(fedata, feraw)
                            ) + self.createModulation(fedata) + '-' + addspace(
                                self.createFEC(fedata, feraw))
        elif self.type == 'ProviderName':
            return self.createProviderName(info)
        elif self.type == 'TransponderName':
            return self.createTransponderName(feraw)
        elif self.type == 'TunerSystem':
            return self.createTunerSystem(fedata)
        elif self.type == 'PIDInfo':
            return self.createPIDInfo(info)
        elif not feraw:
            return ''
        elif self.type == 'TransponderInfo':
            return self.createTransponderInfo(fedata, feraw)
        elif self.type == 'TransponderFrequency':
            return self.createFrequency(feraw)
        elif self.type == 'TransponderSymbolRate':
            return self.createSymbolRate(fedata, feraw)
        elif self.type == 'TransponderPolarization':
            return self.createPolarization(fedata)
        elif self.type == 'TransponderFEC':
            return self.createFEC(fedata, feraw)
        elif self.type == 'TransponderModulation':
            return self.createModulation(fedata)
        elif self.type == 'OrbitalPosition':
            return self.createOrbPos(feraw)
        elif self.type == 'TunerType':
            return self.createTunerType(feraw)
        elif self.type == 'TunerSystem':
            return self.createTunerSystem(fedata)
        elif self.type == 'OrbitalPositionOrTunerSystem':
            return self.createOrbPosOrTunerSystem(fedata, feraw)
        elif self.type == 'TerrestrialChannelNumber':
            return self.createChannelNumber(fedata, feraw)
        else:
            return _('invalid type')

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()
        if not info:
            return False
        else:
            request_caid = None
            for x in self.ca_table:
                if x[0] == self.type:
                    request_caid = x[1]
                    request_selected = x[2]
                    break

            if request_caid is None:
                return False
            if info.getInfo(iServiceInformation.sIsCrypted) != 1:
                return False
            data = self.ecmdata.getEcmData()
            if data is None:
                return False
            current_caid = data[1]
            available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
            for caid_entry in self.caid_data:
                if caid_entry[3] == request_caid:
                    if request_selected:
                        if int(caid_entry[0], 16) <= int(
                                current_caid, 16) <= int(caid_entry[1], 16):
                            return True
                    else:
                        try:
                            for caid in available_caids:
                                if int(caid_entry[0], 16) <= caid <= int(
                                        caid_entry[1], 16):
                                    return True

                        except:
                            pass

            return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
        return
Example #23
0
class pliExpertInfo(Poll, Converter, object):
    SMART_LABEL = 0
    SMART_INFO_H = 1
    SMART_INFO_V = 2
    SERVICE_INFO = 3
    CRYPTO_INFO = 4
    FREQUENCY_INFO = 5

    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = {
            'ShowMe': self.SMART_LABEL,
            'ExpertInfo': self.SMART_INFO_H,
            'ExpertInfoVertical': self.SMART_INFO_V,
            'ServiceInfo': self.SERVICE_INFO,
            'CryptoInfo': self.CRYPTO_INFO,
            'FrequencyInfo': self.FREQUENCY_INFO
        }[type]
        self.poll_interval = 1000
        self.poll_enabled = True
        self.idnames = (('0x100', '0x1FF', 'Seca',
                         'S'), ('0x500', '0x5FF', 'Via',
                                'V'), ('0x600', '0x6FF', 'Irdeto',
                                       'I'), ('0x900', '0x9FF', 'NDS', 'Nd'),
                        ('0xB00', '0xBFF', 'Conax', 'Co'), ('0xD00', '0xDFF',
                                                            'CryptoW', 'Cw'),
                        ('0x1700', '0x17FF', 'Beta', 'B'), ('0x1800', '0x18FF',
                                                            'Nagra', 'N'))
        self.ecmdata = GetEcmInfo()

    @cached
    def getText(self):
        service = self.source.service
        try:
            info = service and service.info()
        except:
            try:
                info = eServiceCenter.getInstance().info(service)
            except:
                pass

        if not info:
            return ''
        else:
            Ret_Text = ''
            Sec_Text = ''
            Res_Text = ''
            showCryptoInfo = False
            if self.type == self.SMART_INFO_H or self.type == self.SERVICE_INFO or self.type == self.CRYPTO_INFO or self.type == self.FREQUENCY_INFO:
                sep = '  '
                sep2 = ' - '
            elif self.type == self.SMART_INFO_V:
                sep = '\n'
                sep2 = '\n'
            else:
                return ''
            if self.type == self.FREQUENCY_INFO:
                try:
                    feinfo = service and service.frontendInfo()
                    prvd = info.getInfoString(iServiceInformation.sProvider)
                    Ret_Text = self.short(prvd)
                    frontendDataOrg = feinfo and feinfo.getAll(True)
                except:
                    try:
                        frontendDataOrg = info.getInfoObject(
                            service, iServiceInformation.sTransponderData)
                        prvd = info.getInfoString(
                            service, iServiceInformation.sProvider)
                    except:
                        pass

                if frontendDataOrg is not None:
                    frontendData = ConvertToHumanReadable(frontendDataOrg)
                    if frontendDataOrg.get(
                            'tuner_type') == 'DVB-S' or frontendDataOrg.get(
                                'tuner_type') == 'DVB-C':
                        frequency = str(
                            frontendData.get('frequency') / 1000) + ' MHz'
                        symbolrate = str(
                            frontendData.get('symbol_rate') / 1000)
                        fec_inner = frontendData.get('fec_inner')
                        if frontendDataOrg.get('tuner_type') == 'DVB-S':
                            Ret_Text += sep + frontendData.get('system')
                            orbital_pos = int(
                                frontendDataOrg['orbital_position'])
                            if orbital_pos > 1800:
                                if orbital_pos == 3590:
                                    orb_pos = 'Thor/Intelsat'
                                elif orbital_pos == 3560:
                                    orb_pos = 'Amos (4'
                                elif orbital_pos == 3550:
                                    orb_pos = 'Atlantic Bird'
                                elif orbital_pos == 3530:
                                    orb_pos = 'Nilesat/Atlantic Bird'
                                elif orbital_pos == 3520:
                                    orb_pos = 'Atlantic Bird'
                                elif orbital_pos == 3475:
                                    orb_pos = 'Atlantic Bird'
                                elif orbital_pos == 3460:
                                    orb_pos = 'Express'
                                elif orbital_pos == 3450:
                                    orb_pos = 'Telstar'
                                elif orbital_pos == 3420:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3380:
                                    orb_pos = 'Nss'
                                elif orbital_pos == 3355:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3325:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3300:
                                    orb_pos = 'Hispasat'
                                elif orbital_pos == 3285:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3170:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3150:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3070:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3045:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3020:
                                    orb_pos = 'Intelsat 9'
                                elif orbital_pos == 2990:
                                    orb_pos = 'Amazonas'
                                elif orbital_pos == 2900:
                                    orb_pos = 'Star One'
                                elif orbital_pos == 2880:
                                    orb_pos = 'AMC 6 (72'
                                elif orbital_pos == 2875:
                                    orb_pos = 'Echostar 6'
                                elif orbital_pos == 2860:
                                    orb_pos = 'Horizons'
                                elif orbital_pos == 2810:
                                    orb_pos = 'AMC5'
                                elif orbital_pos == 2780:
                                    orb_pos = 'NIMIQ 4'
                                elif orbital_pos == 2690:
                                    orb_pos = 'NIMIQ 1'
                                elif orbital_pos == 3592:
                                    orb_pos = 'Thor/Intelsat'
                                elif orbital_pos == 2985:
                                    orb_pos = 'Echostar 3,12'
                                elif orbital_pos == 2830:
                                    orb_pos = 'Echostar 8'
                                elif orbital_pos == 2630:
                                    orb_pos = 'Galaxy 19'
                                elif orbital_pos == 2500:
                                    orb_pos = 'Echostar 10,11'
                                elif orbital_pos == 2502:
                                    orb_pos = 'DirectTV 5'
                                elif orbital_pos == 2410:
                                    orb_pos = 'Echostar 7 Anik F3'
                                elif orbital_pos == 2391:
                                    orb_pos = 'Galaxy 23'
                                elif orbital_pos == 2390:
                                    orb_pos = 'Echostar 9'
                                elif orbital_pos == 2412:
                                    orb_pos = 'DirectTV 7S'
                                elif orbital_pos == 2310:
                                    orb_pos = 'Galaxy 27'
                                elif orbital_pos == 2311:
                                    orb_pos = 'Ciel 2'
                                elif orbital_pos == 2120:
                                    orb_pos = 'Echostar 2'
                                else:
                                    orb_pos = str(
                                        float(3600 - orbital_pos) / 10.0) + 'W'
                            elif orbital_pos > 0:
                                if orbital_pos == 192:
                                    orb_pos = 'Astra 1F'
                                elif orbital_pos == 130:
                                    orb_pos = 'Hot Bird 6,7A,8'
                                elif orbital_pos == 235:
                                    orb_pos = 'Astra 1E'
                                elif orbital_pos == 1100:
                                    orb_pos = 'BSat 1A,2A'
                                elif orbital_pos == 1101:
                                    orb_pos = 'N-Sat 110'
                                elif orbital_pos == 1131:
                                    orb_pos = 'KoreaSat 5'
                                elif orbital_pos == 1440:
                                    orb_pos = 'SuperBird 7,C2'
                                elif orbital_pos == 1006:
                                    orb_pos = 'AsiaSat 2'
                                elif orbital_pos == 1030:
                                    orb_pos = 'Express A2'
                                elif orbital_pos == 1056:
                                    orb_pos = 'Asiasat 3S'
                                elif orbital_pos == 1082:
                                    orb_pos = 'NSS 11'
                                elif orbital_pos == 881:
                                    orb_pos = 'ST1'
                                elif orbital_pos == 900:
                                    orb_pos = 'Yamal 201'
                                elif orbital_pos == 917:
                                    orb_pos = 'Mesat'
                                elif orbital_pos == 950:
                                    orb_pos = 'Insat 4B'
                                elif orbital_pos == 951:
                                    orb_pos = 'NSS 6'
                                elif orbital_pos == 765:
                                    orb_pos = 'Telestar'
                                elif orbital_pos == 785:
                                    orb_pos = 'ThaiCom 5'
                                elif orbital_pos == 800:
                                    orb_pos = 'Express'
                                elif orbital_pos == 830:
                                    orb_pos = 'Insat 4A'
                                elif orbital_pos == 850:
                                    orb_pos = 'Intelsat 709'
                                elif orbital_pos == 750:
                                    orb_pos = 'Abs'
                                elif orbital_pos == 720:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 705:
                                    orb_pos = 'Eutelsat W5'
                                elif orbital_pos == 685:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 620:
                                    orb_pos = 'Intelsat 902'
                                elif orbital_pos == 600:
                                    orb_pos = 'Intelsat 904'
                                elif orbital_pos == 570:
                                    orb_pos = 'Nss'
                                elif orbital_pos == 530:
                                    orb_pos = 'Express AM22'
                                elif orbital_pos == 480:
                                    orb_pos = 'Eutelsat 2F2'
                                elif orbital_pos == 450:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 420:
                                    orb_pos = 'Turksat 2A'
                                elif orbital_pos == 400:
                                    orb_pos = 'Express AM1'
                                elif orbital_pos == 390:
                                    orb_pos = 'Hellas Sat 2'
                                elif orbital_pos == 380:
                                    orb_pos = 'Paksat 1'
                                elif orbital_pos == 360:
                                    orb_pos = 'Eutelsat Sesat'
                                elif orbital_pos == 335:
                                    orb_pos = 'Astra 1M'
                                elif orbital_pos == 330:
                                    orb_pos = 'Eurobird 3'
                                elif orbital_pos == 328:
                                    orb_pos = 'Galaxy 11'
                                elif orbital_pos == 315:
                                    orb_pos = 'Astra 5A'
                                elif orbital_pos == 310:
                                    orb_pos = 'Turksat'
                                elif orbital_pos == 305:
                                    orb_pos = 'Arabsat'
                                elif orbital_pos == 285:
                                    orb_pos = 'Eurobird 1'
                                elif orbital_pos == 284:
                                    orb_pos = 'Eurobird/Astra'
                                elif orbital_pos == 282:
                                    orb_pos = 'Eurobird/Astra'
                                elif orbital_pos == 1220:
                                    orb_pos = 'AsiaSat'
                                elif orbital_pos == 1380:
                                    orb_pos = 'Telstar 18'
                                elif orbital_pos == 260:
                                    orb_pos = 'Badr 3/4'
                                elif orbital_pos == 255:
                                    orb_pos = 'Eurobird 2'
                                elif orbital_pos == 215:
                                    orb_pos = 'Eutelsat'
                                elif orbital_pos == 216:
                                    orb_pos = 'Eutelsat W6'
                                elif orbital_pos == 210:
                                    orb_pos = 'AfriStar 1'
                                elif orbital_pos == 160:
                                    orb_pos = 'Eutelsat W2'
                                elif orbital_pos == 100:
                                    orb_pos = 'Eutelsat W1'
                                elif orbital_pos == 90:
                                    orb_pos = 'Eurobird 9'
                                elif orbital_pos == 70:
                                    orb_pos = 'Eutelsat W3A'
                                elif orbital_pos == 50:
                                    orb_pos = 'Sirius 4'
                                elif orbital_pos == 48:
                                    orb_pos = 'Sirius 4'
                                elif orbital_pos == 30:
                                    orb_pos = 'Telecom 2'
                                else:
                                    orb_pos = str(
                                        float(orbital_pos) / 10.0) + 'E'
                            Ret_Text += sep + orb_pos + '\n'
                            Ret_Text += frequency + sep + frontendData.get(
                                'polarization_abbreviation')
                            Ret_Text += sep + symbolrate
                            Ret_Text += sep + frontendData.get(
                                'modulation') + '-' + fec_inner
                        else:
                            Ret_Text += sep + 'DVB-C ' + frequency + ' MHz' + sep + fec_inner + sep + symbolrate
                    elif frontendData.get('tuner_type') == 'DVB-T':
                        frequency = str(
                            frontendData.get('frequency') / 1000) + ' MHz'
                        Ret_Text = 'Frequency: ' + frequency
            if self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.SERVICE_INFO:
                xresol = info.getInfo(iServiceInformation.sVideoWidth)
                yresol = info.getInfo(iServiceInformation.sVideoHeight)
                feinfo = service and service.frontendInfo()
                prvd = info.getInfoString(iServiceInformation.sProvider)
                Ret_Text = self.short(prvd)
                frontendDataOrg = feinfo and feinfo.getAll(True)
                if frontendDataOrg is not None:
                    frontendData = ConvertToHumanReadable(frontendDataOrg)
                    if frontendDataOrg.get(
                            'tuner_type') == 'DVB-S' or frontendDataOrg.get(
                                'tuner_type') == 'DVB-C':
                        frequency = str(frontendData.get('frequency') / 1000)
                        symbolrate = str(
                            frontendData.get('symbol_rate') / 1000)
                        fec_inner = frontendData.get('fec_inner')
                        if frontendDataOrg.get('tuner_type') == 'DVB-S':
                            Ret_Text += sep + frontendData.get('system')
                            Ret_Text += sep + frequency + frontendData.get(
                                'polarization_abbreviation')
                            Ret_Text += sep + symbolrate
                            Ret_Text += sep + fec_inner + ' ' + frontendData.get(
                                'modulation')
                            orbital_pos = int(
                                frontendDataOrg['orbital_position'])
                            if orbital_pos > 1800:
                                orb_pos = str(
                                    float(3600 - orbital_pos) / 10.0) + 'W'
                            elif orbital_pos > 0:
                                orb_pos = str(float(orbital_pos) / 10.0) + 'E'
                            Ret_Text += sep + orb_pos
                        else:
                            Ret_Text += sep + 'DVB-C ' + frequency + ' MHz' + sep + fec_inner + sep + symbolrate
                    elif frontendDataOrg.get('tuner_type') == 'DVB-T':
                        frequency = str(frontendData.get('frequency') / 1000)
                        Ret_Text += sep + 'DVB-T' + sep + 'Frequency:' + sep + frequency + ' MHz'
                if feinfo is not None and xresol > 0:
                    Res_Text += ('MPEG2 ', 'MPEG4 ', 'MPEG1 ', 'MPEG4-II ',
                                 'VC1 ', 'VC1-SM ', '')[info.getInfo(
                                     iServiceInformation.sVideoType)]
                    Res_Text += str(xresol) + 'x' + str(yresol)
                    Res_Text += ('i', 'p', '')[info.getInfo(
                        iServiceInformation.sProgressive)]
                    Res_Text += str(
                        (info.getInfo(iServiceInformation.sFrameRate) + 500) /
                        1000)
            if self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.CRYPTO_INFO:
                decCI = '0'
                Sec_Text = ''
                if info.getInfo(iServiceInformation.sIsCrypted) == 1:
                    data = self.ecmdata.getEcmData()
                    if not config.usage.show_cryptoinfo.value:
                        showCryptoInfo = True
                        Sec_Text = data[0] + '\n'
                    decCI = data[1]
                    provid = data[2]
                    pid = data[3]
                    if decCI != '0':
                        decCIfull = '%04x' % int(decCI, 16)
                        for idline in self.idnames:
                            if int(decCI, 16) >= int(idline[0], 16) and int(
                                    decCI, 16) <= int(idline[1], 16):
                                decCIfull = idline[2] + ':' + decCIfull
                                break

                        Sec_Text += decCIfull
                        if provid != '0':
                            Sec_Text += ':%04x' % int(provid, 16)
                        else:
                            Sec_Text += ':'
                        if pid != '0':
                            Sec_Text += ':%04x:%04x' % (info.getInfo(
                                iServiceInformation.sSID), int(pid, 16))
                elif not config.usage.show_cryptoinfo.value:
                    showCryptoInfo = True
                    Sec_Text = 'FTA'
                res = ''
                searchIDs = info.getInfoObject(iServiceInformation.sCAIDs)
                for idline in self.idnames:
                    if int(decCI, 16) >= int(idline[0], 16) and int(
                            decCI, 16) <= int(idline[1], 16):
                        color = '\\c0000??00'
                    else:
                        color = '\\c007?7?7?'
                        try:
                            for oneID in searchIDs:
                                if oneID >= int(idline[0],
                                                16) and oneID <= int(
                                                    idline[1], 16):
                                    color = '\\c00????00'

                        except:
                            pass

                    res += color + idline[3] + ' '

                if self.type != self.CRYPTO_INFO:
                    Ret_Text += '\n'
                Ret_Text += res + '\\c00?????? ' + Sec_Text
            if Res_Text != '':
                if showCryptoInfo:
                    Ret_Text += sep + Res_Text
                else:
                    Ret_Text += '\n' + Res_Text
            return Ret_Text

    text = property(getText)

    def changed(self, what):
        Converter.changed(self, what)

    def short(self, langTxt):
        if self.type == self.SMART_INFO_V and len(langTxt) > 23:
            retT = langTxt[:20] + '...'
            return retT
        else:
            return langTxt
Example #24
0
class PliExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (("0x100", "0x1ff", "Seca", "S",
                           True), ("0x500", "0x5ff", "Via", "V", True),
                          ("0x600", "0x6ff", "Irdeto", "I",
                           True), ("0x900", "0x9ff", "NDS", "Nd", True),
                          ("0xb00", "0xbff", "Conax", "Co",
                           True), ("0xd00", "0xdff", "CryptoW", "Cw", True),
                          ("0xe00", "0xeff", "PowerVU", "P",
                           False), ("0x1700", "0x17ff", "Beta", "B", True),
                          ("0x1800", "0x18ff", "Nagra", "N",
                           True), ("0x2600", "0x2600", "Biss", "Bi", False),
                          ("0x4ae0", "0x4ae1", "Dre", "D",
                           False), ("0x4aee", "0x4aee", "BulCrypt", "B1",
                                    False), ("0x5581", "0x5581", "BulCrypt",
                                             "B2", False))
        self.ca_table = (
            ("CryptoCaidSecaAvailable", "S", False),
            ("CryptoCaidViaAvailable", "V", False),
            ("CryptoCaidIrdetoAvailable", "I", False),
            ("CryptoCaidNDSAvailable", "Nd", False),
            ("CryptoCaidConaxAvailable", "Co", False),
            ("CryptoCaidCryptoWAvailable", "Cw", False),
            ("CryptoCaidPowerVUAvailable", "P", False),
            ("CryptoCaidBetaAvailable", "B", False),
            ("CryptoCaidNagraAvailable", "N", False),
            ("CryptoCaidBissAvailable", "Bi", False),
            ("CryptoCaidDreAvailable", "D", False),
            ("CryptoCaidBulCrypt1Available", "B1", False),
            ("CryptoCaidBulCrypt2Available", "B2", False),
            ("CryptoCaidSecaSelected", "S", True),
            ("CryptoCaidViaSelected", "V", True),
            ("CryptoCaidIrdetoSelected", "I", True),
            ("CryptoCaidNDSSelected", "Nd", True),
            ("CryptoCaidConaxSelected", "Co", True),
            ("CryptoCaidCryptoWSelected", "Cw", True),
            ("CryptoCaidPowerVUSelected", "P", True),
            ("CryptoCaidBetaSelected", "B", True),
            ("CryptoCaidNagraSelected", "N", True),
            ("CryptoCaidBissSelected", "Bi", True),
            ("CryptoCaidDreSelected", "D", True),
            ("CryptoCaidBulCrypt1Selected", "B1", True),
            ("CryptoCaidBulCrypt2Selected", "B2", True),
        )
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ""
            self.current_caid = "0"
            self.current_provid = "0"
            self.current_ecmpid = "0"

    def createCryptoBar(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                    caid_entry[1], 16):
                color = "\c0000??00"
            else:
                color = "\c007?7?7?"
                try:
                    for caid in available_caids:
                        if int(caid_entry[0], 16) <= caid <= int(
                                caid_entry[1], 16):
                            color = "\c00????00"
                except:
                    pass

            if color != "\c007?7?7?" or caid_entry[4]:
                if res: res += " "
                res += color + caid_entry[3]

        res += "\c00??????"
        return res

    def createCryptoSeca(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x100', 16) <= caid <= int('0x1ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'S'
        res += "\c00??????"
        return res

    def createCryptoVia(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x500', 16) <= caid <= int('0x5ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'V'
        res += "\c00??????"
        return res

    def createCryptoIrdeto(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x600', 16) <= caid <= int('0x6ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'I'
        res += "\c00??????"
        return res

    def createCryptoNDS(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x900', 16) <= caid <= int('0x9ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'NDS'
        res += "\c00??????"
        return res

    def createCryptoConax(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0xb00', 16) <= caid <= int('0xbff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'CO'
        res += "\c00??????"
        return res

    def createCryptoCryptoW(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0xd00', 16) <= caid <= int('0xdff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'CW'
        res += "\c00??????"
        return res

    def createCryptoPowerVU(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0xe00', 16) <= caid <= int('0xeff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'P'
        res += "\c00??????"
        return res

    def createCryptoBeta(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1700', 16) <= int(self.current_caid, 16) <= int(
                '0x17ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x1700', 16) <= caid <= int('0x17ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'B'
        res += "\c00??????"
        return res

    def createCryptoNagra(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1800', 16) <= int(self.current_caid, 16) <= int(
                '0x18ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x1800', 16) <= caid <= int('0x18ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'N'
        res += "\c00??????"
        return res

    def createCryptoBiss(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x2600', 16) <= int(self.current_caid, 16) <= int(
                '0x26ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x2600', 16) <= caid <= int('0x26ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'BI'
        res += "\c00??????"
        return res

    def createCryptoDre(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int(
                '0x4ae1', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'DC'
        res += "\c00??????"
        return res

    def createCryptoSpecial(self, info):
        caid_name = "FTA"
        try:
            for caid_entry in self.caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                        caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break
            return caid_name + ":%04x:%04x:%04x" % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(iServiceInformation.sSID))
        except:
            pass
        return ""

    def createResolution(self, info):
        video_height = 0
        video_width = 0
        video_pol = " "
        video_rate = 0
        if path.exists("/proc/stb/vmpeg/0/yres"):
            f = open("/proc/stb/vmpeg/0/yres", "r")
            try:
                video_height = int(f.read(), 16)
            except:
                pass
            f.close()
        if path.exists("/proc/stb/vmpeg/0/xres"):
            f = open("/proc/stb/vmpeg/0/xres", "r")
            try:
                video_width = int(f.read(), 16)
            except:
                pass
            f.close()
        if path.exists("/proc/stb/vmpeg/0/progressive"):
            f = open("/proc/stb/vmpeg/0/progressive", "r")
            try:
                video_pol = "p" if int(f.read(), 16) else "i"
            except:
                pass
            f.close()
        if path.exists("/proc/stb/vmpeg/0/framerate"):
            f = open("/proc/stb/vmpeg/0/framerate", "r")
            try:
                video_rate = int(f.read())
            except:
                pass
            f.close()

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

    def createVideoCodec(self, info):
        return ("MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM",
                "")[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0: vpid = 0
        if apid < 0: apid = 0
        if pcrpid < 0: pcrpid = 0
        if sidpid < 0: sidpid = 0
        if tsid < 0: tsid = 0
        if onid < 0: onid = 0
        return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid,
                                              pcrpid)

    def createTransponderInfo(self, fedata, feraw):
        if not feraw:
            return ""
        elif "DVB-T" in feraw.get("tuner_type"):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(
                self.createFrequency(feraw)) + addspace(
                    self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(feraw)) + addspace(
                self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
         + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw))

    def createFrequency(self, fedata):
        frequency = fedata.get("frequency")
        if frequency:
            return str(frequency)
        return ""

    def createChannelNumber(self, fedata, feraw):
        return "DVB-T" in feraw.get("tuner_type") and fedata.get(
            "channel") or ""

    def createSymbolRate(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            bandwidth = fedata.get("bandwidth")
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get("symbol_rate")
            if symbolrate:
                return str(symbolrate)
        return ""

    def createPolarization(self, fedata):
        return fedata.get("polarization_abbreviation") or ""

    def createFEC(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            code_rate_lp = fedata.get("code_rate_lp")
            code_rate_hp = fedata.get("code_rate_hp")
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + "-" + code_rate_hp
        else:
            fec = fedata.get("fec_inner")
            if fec:
                return fec
        return ""

    def createModulation(self, fedata):
        if fedata.get("tuner_type") == _("Terrestrial"):
            constellation = fedata.get("constellation")
            if constellation:
                return constellation
        else:
            modulation = fedata.get("modulation")
            if modulation:
                return modulation
        return ""

    def createTunerType(self, feraw):
        return feraw.get("tuner_type") or ""

    def createTunerSystem(self, fedata):
        return fedata.get("system") or ""

    def createOrbPos(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
        elif orbpos > 0:
            return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
        return ""

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not "":
            return orbpos
        return self.createTunerSystem(fedata)

    def createTransponderName(self, feraw):
        freq = feraw.get("frequency")
        c_band = False
        if freq and freq < 10700000:
            c_band = True

        orb_pos = ""
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            if c_band:
                orbpos += 1
            if orbpos == 3592:
                orb_pos = 'Thor/Intelsat'
            elif orbpos == 3560:
                orb_pos = 'Amos'
            elif orbpos == 3550:
                orb_pos = 'Eutelsat 5W'
            elif orbpos == 3530:
                orb_pos = 'Nilesat/Eutelsat 7W'
            elif orbpos == 3520:
                orb_pos = 'Eutelsat 8W'
            elif orbpos == 3490:
                orb_pos = 'Express 11W'
            elif orbpos == 3475:
                orb_pos = 'Eutelsat 12.5W'
            elif orbpos == 3460:
                orb_pos = 'Express 14W'
            elif orbpos == 3450:
                orb_pos = 'Telstar 15W'
            elif orbpos == 3420:
                orb_pos = 'Intelsat 18W'
            elif orbpos == 3400:
                orb_pos = 'NSS 20W'
            elif orbpos == 3380:
                orb_pos = 'SES 22W'
            elif orbpos == 3355:
                orb_pos = 'Intelsat 24.5W'
            elif orbpos == 3325:
                orb_pos = 'Intelsat 27.5W'
            elif orbpos == 3300:
                orb_pos = 'Hispasat'
            elif orbpos == 3285:
                orb_pos = 'Intelsat 31.5W'
            elif orbpos == 3255:
                orb_pos = 'Intelsat 34.5W'
            elif orbpos == 3225:
                orb_pos = 'NSS/Telstar 37W'
            elif orbpos == 3195:
                orb_pos = 'SES 40.5W'
            elif orbpos == 3169:
                orb_pos = 'Intelsat 43.1W'
            elif orbpos == 3150:
                orb_pos = 'Intelsat 45W'
            elif orbpos == 3100:
                orb_pos = 'Intelsat 50W'
            elif orbpos == 3070:
                orb_pos = 'Intelsat 53W'
            elif orbpos == 3045:
                orb_pos = 'Intelsat 55.5W'
            elif orbpos == 3020:
                orb_pos = 'Intelsat 58W'
            elif orbpos == 2990:
                orb_pos = 'Amazonas'
            elif orbpos == 2985:
                orb_pos = 'Echostar 61.5W'
            elif orbpos == 2900:
                orb_pos = 'Star One'
            elif orbpos == 2880:
                orb_pos = 'AMC 72W'
            elif orbpos == 2830:
                orb_pos = 'Echostar/QuetzSat'
            elif orbpos == 2780:
                orb_pos = 'NIMIQ 82W'
            elif orbpos == 2690:
                orb_pos = 'NIMIQ 91W'
            elif orbpos == 2630:
                orb_pos = 'Galaxy 97W'
            elif orbpos == 2500:
                orb_pos = 'Echostar/DirectTV 110W'
            elif orbpos == 2410:
                orb_pos = 'Echostar/DirectTV 119W'
            elif orbpos == 2390:
                orb_pos = 'Echostar/Galaxy 121W'
            elif orbpos == 2310:
                orb_pos = 'Ciel'
            elif c_band:
                orb_pos = str((float(3600 - orbpos)) / 10.0) + "W C-band"
            else:
                orb_pos = str((float(3600 - orbpos)) / 10.0) + "W"
        elif orbpos > 0:
            if c_band:
                orbpos -= 1
            if orbpos == 130:
                orb_pos = 'Hot Bird'
            elif orbpos == 192:
                orb_pos = 'Astra 1KR/1L/1M/1N'
            elif orbpos == 235:
                orb_pos = 'Astra 3'
            elif orbpos == 1100:
                orb_pos = 'BSat/NSAT'
            elif orbpos == 1105:
                orb_pos = 'ChinaSat'
            elif orbpos == 1130:
                orb_pos = 'KoreaSat'
            elif orbpos == 1440:
                orb_pos = 'SuperBird'
            elif orbpos == 1005:
                orb_pos = 'AsiaSat 100E'
            elif orbpos == 1030:
                orb_pos = 'Express 103E'
            elif orbpos == 1055:
                orb_pos = 'Asiasat 105E'
            elif orbpos == 1082:
                orb_pos = 'NSS/SES 108E'
            elif orbpos == 880:
                orb_pos = 'ST2'
            elif orbpos == 900:
                orb_pos = 'Yamal 90E'
            elif orbpos == 915:
                orb_pos = 'Mesat'
            elif orbpos == 950:
                orb_pos = 'NSS/SES 95E'
            elif orbpos == 765:
                orb_pos = 'Apstar'
            elif orbpos == 785:
                orb_pos = 'ThaiCom'
            elif orbpos == 800:
                orb_pos = 'Express 80E'
            elif orbpos == 830:
                orb_pos = 'Insat'
            elif orbpos == 851:
                orb_pos = 'Intelsat/Horizons'
            elif orbpos == 750:
                orb_pos = 'ABS'
            elif orbpos == 720:
                orb_pos = 'Intelsat 72E'
            elif orbpos == 705:
                orb_pos = 'Eutelsat 70.5E'
            elif orbpos == 685:
                orb_pos = 'Intelsat 68.5E'
            elif orbpos == 620:
                orb_pos = 'Intelsat 902'
            elif orbpos == 600:
                orb_pos = 'Intelsat 904'
            elif orbpos == 570:
                orb_pos = 'NSS 57E'
            elif orbpos == 530:
                orb_pos = 'Express 53E'
            elif orbpos == 490:
                orb_pos = 'Yamal 49E'
            elif orbpos == 480:
                orb_pos = 'Afghansat'
            elif orbpos == 450:
                orb_pos = 'Intelsat 45E'
            elif orbpos == 420:
                orb_pos = 'Turksat'
            elif orbpos == 400:
                orb_pos = 'Express 40E'
            elif orbpos == 390:
                orb_pos = 'Hellas Sat'
            elif orbpos == 380:
                orb_pos = 'Paksat'
            elif orbpos == 360:
                orb_pos = 'Eutelsat 36E'
            elif orbpos == 330:
                orb_pos = 'Eutelsat 33E'
            elif orbpos == 315:
                orb_pos = 'Astra 5'
            elif orbpos == 305:
                orb_pos = 'Arabsat 30.5E'
            elif orbpos == 282:
                orb_pos = 'Astra 2E/2F/2G'
            elif orbpos == 1222:
                orb_pos = 'AsiaSat 122E'
            elif orbpos == 1380:
                orb_pos = 'Telstar 18'
            elif orbpos == 260:
                orb_pos = 'Badr 4/5/6'
            elif orbpos == 255:
                orb_pos = 'Eutelsat 25.5E'
            elif orbpos == 215:
                orb_pos = 'Eutelsat 21.5E'
            elif orbpos == 200:
                orb_pos = 'Arabsat 20E'
            elif orbpos == 160:
                orb_pos = 'Eutelsat 16E'
            elif orbpos == 100:
                orb_pos = 'Eutelsat 10E'
            elif orbpos == 90:
                orb_pos = 'Eutelsat 9E'
            elif orbpos == 70:
                orb_pos = 'Eutelsat 7E'
            elif orbpos == 48:
                orb_pos = 'SES 5'
            elif orbpos == 30:
                orb_pos = 'Rascom/Eutelsat 3E'
            elif c_band:
                orb_pos = str((float(orbpos)) / 10.0) + "E C-band"
            else:
                orb_pos = str((float(orbpos)) / 10.0) + "E"
        return orb_pos

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ""
        info = service and service.info()

        if not info:
            return ""

        if self.type == "CryptoInfo":
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)

        if self.type == "CryptoBar":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            else:
                return ""

        if self.type == "CryptoSeca":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSeca(info)
            else:
                return ""

        if self.type == "CryptoVia":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoVia(info)
            else:
                return ""

        if self.type == "CryptoIrdeto":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoIrdeto(info)
            else:
                return ""

        if self.type == "CryptoNDS":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNDS(info)
            else:
                return ""

        if self.type == "CryptoConax":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoConax(info)
            else:
                return ""

        if self.type == "CryptoCryptoW":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoCryptoW(info)
            else:
                return ""

        if self.type == "CryptoBeta":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBeta(info)
            else:
                return ""

        if self.type == "CryptoNagra":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNagra(info)
            else:
                return ""

        if self.type == "CryptoBiss":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBiss(info)
            else:
                return ""

        if self.type == "CryptoDre":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoDre(info)
            else:
                return ""

        if self.type == "CryptoSpecial":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            else:
                return ""

        if self.type == "ResolutionString":
            return self.createResolution(info)

        if self.type == "VideoCodec":
            return self.createVideoCodec(info)

        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(
                    config.usage.infobar_frontend_source.value == "settings")
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)

        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata
        if self.type == "All":
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n"\
                + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n"\
                + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n" \
                + addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
                + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "PIDInfo":
            return self.createPIDInfo(info)

        if not feraw:
            return ""

        if self.type == "ServiceInfo":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
            + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createTransponderName(feraw))\
            + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "TransponderInfo2line":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createTransponderName(feraw)) + '\n'\
            + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
            + addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))

        if self.type == "TransponderInfo":
            return self.createTransponderInfo(fedata, feraw)

        if self.type == "TransponderFrequency":
            return self.createFrequency(feraw)

        if self.type == "TransponderSymbolRate":
            return self.createSymbolRate(fedata, feraw)

        if self.type == "TransponderPolarization":
            return self.createPolarization(fedata)

        if self.type == "TransponderFEC":
            return self.createFEC(fedata, feraw)

        if self.type == "TransponderModulation":
            return self.createModulation(fedata)

        if self.type == "OrbitalPosition":
            return self.createOrbPos(feraw)

        if self.type == "TunerType":
            return self.createTunerType(feraw)

        if self.type == "TunerSystem":
            return self.createTunerSystem(fedata)

        if self.type == "OrbitalPositionOrTunerSystem":
            return self.createOrbPosOrTunerSystem(fedata, feraw)

        if self.type == "TerrestrialChannelNumber":
            return self.createChannelNumber(fedata, feraw)

        return _("invalid type")

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()

        if not info:
            return False

        request_caid = None
        for x in self.ca_table:
            if x[0] == self.type:
                request_caid = x[1]
                request_selected = x[2]
                break

        if request_caid is None:
            return False

        if info.getInfo(iServiceInformation.sIsCrypted) != 1:
            return False

        data = self.ecmdata.getEcmData()

        if data is None:
            return False

        current_caid = data[1]

        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if caid_entry[3] == request_caid:
                if request_selected:
                    if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(
                            caid_entry[1], 16):
                        return True
                else:  # request available
                    try:
                        for caid in available_caids:
                            if int(caid_entry[0], 16) <= caid <= int(
                                    caid_entry[1], 16):
                                return True
                    except:
                        pass

        return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
class j00zekModPliExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.ca_table = (('CryptoCaidSeca MediaguardAvailable', 'S',
                          False), ('CryptoCaidViaccessAvailable', 'V', False),
                         ('CryptoCaidIrdetoAvailable', 'I',
                          False), ('CryptoCaidNDS VideoguardAvailable', 'ND',
                                   False), ('CryptoCaidConaxAvailable', 'CO',
                                            False),
                         ('CryptoCaidCryptoWorksAvailable', 'CW',
                          False), ('CryptoCaidPowerVUAvailable', 'PV', False),
                         ('CryptoCaidBetaCryptAvailable', 'BC',
                          False), ('CryptoCaidNagravisionAvailable', 'N',
                                   False), ('CryptoCaidBissAvailable', 'B',
                                            False),
                         ('CryptoCaidDreCryptAvailable', 'DC',
                          False), ('CryptoCaidBulCrypt1Available', 'B1',
                                   False), ('CryptoCaidBulCrypt2Available',
                                            'B2', False),
                         ('CryptoCaidDG-CryptAvailable', 'DG',
                          False), ('CryptoCaidCryptoGuardAvailable', 'CG',
                                   False), ('CryptoCaidVerimatrixAvailable',
                                            'VM', False),
                         ('CryptoCaidTandbergAvailable', 'TB',
                          False), ('CryptoCaidSeca MediaguardSelected', 'S',
                                   True), ('CryptoCaidViaccessSelected', 'V',
                                           True), ('CryptoCaidIrdetoSelected',
                                                   'I', True),
                         ('CryptoCaidNDS VideoguardSelected', 'ND',
                          True), ('CryptoCaidConaxSelected', 'CO', True),
                         ('CryptoCaidCryptoWorksSelected', 'CW',
                          True), ('CryptoCaidPowerVUSelected', 'PV', True),
                         ('CryptoCaidBetaCryptSelected', 'BC',
                          True), ('CryptoCaidNagravisionSelected', 'N',
                                  True), ('CryptoCaidBissSelected', 'B', True),
                         ('CryptoCaidDreCryptSelected', 'DC',
                          True), ('CryptoCaidBulCrypt1Selected', 'B1',
                                  True), ('CryptoCaidBulCrypt2Selected', 'B2',
                                          True), ('CryptoCaidDG-CryptSelected',
                                                  'DG', True),
                         ('CryptoCaidCryptoGuardSelected', 'CG',
                          True), ('CryptoCaidVerimatrixSelected', 'VM',
                                  True), ('CryptoCaidTandbergSelected', 'TB',
                                          True))
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None
        return

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ''
            self.current_caid = '0'
            self.current_provid = '0'
            self.current_ecmpid = '0'

    def createCryptoBar(self, info):
        res = ''
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        for caid_entry in caid_data:
            if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                    caid_entry[1], 16):
                color = '\\c0000??00'
            else:
                color = '\\c007?7?7?'
                try:
                    for caid in available_caids:
                        if int(caid_entry[0], 16) <= caid <= int(
                                caid_entry[1], 16):
                            color = '\\c00????00'

                except:
                    pass

            if color != '\\c007?7?7?' or caid_entry[4]:
                if res:
                    res += ' '
                res += color + caid_entry[3]

        res += '\\c00??????'
        return res

    def createCryptoSpecial(self, info):
        caid_name = 'FTA'
        try:
            for caid_entry in caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                        caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break

            return caid_name + ':%04x:%04x:%04x:%04x' % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(
                    iServiceInformation.sSID), int(self.current_ecmpid, 16))
        except:
            pass

        return ''

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ''
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ('i', 'p', ' ')[info.getInfo(iServiceInformation.sProgressive)]
        fps = (info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000
        if not fps:
            try:
                fps = (int(open('/proc/stb/vmpeg/0/framerate', 'r').read()) +
                       500) / 1000
            except:
                pass

        gamma = ('SDR', 'HDR', 'HDR10', 'HLG',
                 '')[info.getInfo(iServiceInformation.sGamma)]
        return '%sx%s%s%s %s' % (xres, yres, mode, fps, gamma)

    def createVideoCodec(self, info):
        return codec_data.get(info.getInfo(iServiceInformation.sVideoType),
                              'N/A')

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0:
            vpid = 0
        if apid < 0:
            apid = 0
        if pcrpid < 0:
            pcrpid = 0
        if sidpid < 0:
            sidpid = 0
        if tsid < 0:
            tsid = 0
        if onid < 0:
            onid = 0
        return '%d-%d:%05d:%04d:%04d:%04d' % (onid, tsid, sidpid, vpid, apid,
                                              pcrpid)

    def createTransponderInfo(self, fedata, feraw, info):
        if not feraw:
            refstr = info.getInfoString(iServiceInformation.sServiceref)
            if '%3a//' in refstr.lower():
                return refstr.split(':')[10].replace('%3a',
                                                     ':').replace('%3A', ':')
            return ''
        if 'DVB-T' in feraw.get('tuner_type'):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(
                self.createFrequency(feraw)) + addspace(
                    self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(feraw)) + addspace(
                self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(
            self.createSymbolRate(fedata, feraw)) + addspace(
                self.createFEC(fedata, feraw)) + addspace(
                    self.createModulation(fedata)) + addspace(
                        self.createOrbPos(feraw)) + addspace(
                            self.createMisPls(fedata))

    def createFrequency(self, feraw):
        frequency = feraw.get('frequency')
        if frequency:
            if 'DVB-T' in feraw.get('tuner_type'):
                return str(int(frequency / 1000000.0 + 0.5))
            else:
                return str(int(frequency / 1000 + 0.5))
        return ''

    def createChannelNumber(self, fedata, feraw):
        return 'DVB-T' in feraw.get('tuner_type') and fedata.get(
            'channel') or ''

    def createSymbolRate(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            bandwidth = fedata.get('bandwidth')
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get('symbol_rate')
            if symbolrate:
                return str(symbolrate / 1000)
        return ''

    def createPolarization(self, fedata):
        return fedata.get('polarization_abbreviation') or ''

    def createFEC(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            code_rate_lp = fedata.get('code_rate_lp')
            code_rate_hp = fedata.get('code_rate_hp')
            guard_interval = fedata.get('guard_interval')
            if code_rate_lp and code_rate_hp and guard_interval:
                return code_rate_lp + '-' + code_rate_hp + '-' + guard_interval
        else:
            fec = fedata.get('fec_inner')
            if fec:
                return fec
        return ''

    def createModulation(self, fedata):
        if fedata.get('tuner_type') == _('Terrestrial'):
            constellation = fedata.get('constellation')
            if constellation:
                return constellation
        else:
            modulation = fedata.get('modulation')
            if modulation:
                return modulation
        return ''

    def createTunerType(self, feraw):
        return feraw.get('tuner_type') or ''

    def createTunerSystem(self, fedata):
        return fedata.get('system') or ''

    def createOrbPos(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            return str(float(3600 - orbpos) / 10.0) + '\xc2\xb0 W'
        if orbpos > 0:
            return str(float(orbpos) / 10.0) + '\xc2\xb0 E'
        return ''

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not '':
            return orbpos
        return self.createTunerSystem(fedata)

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    def createMisPls(self, fedata):
        tmp = ''
        if fedata.get('is_id') > -1:
            tmp = 'MIS %d' % fedata.get('is_id')
        if fedata.get('pls_code') > 0:
            tmp = addspace(tmp) + '%s %d' % (fedata.get('pls_mode'),
                                             fedata.get('pls_code'))
        if fedata.get('t2mi_plp_id') > -1:
            tmp = addspace(tmp) + 'T2MI %d PID %d' % (
                fedata.get('t2mi_plp_id'), fedata.get('t2mi_pid'))
        return tmp

    @cached
    def getText(self):
        try:
            self.showCryptoinfo = config.usage.show_cryptoinfo.value
        except Exception:
            self.showCryptoinfo = True
        try:
            self.infobarFrontendSource = config.usage.infobar_frontend_source.value
        except Exception:
            self.infobarFrontendSource = "settings"
        service = self.source.service
        if service is None:
            return ''
        info = service and service.info()
        if not info:
            return ''
        if self.type == 'CryptoInfo':
            self.getCryptoInfo(info)
            if self.showCryptoinfo:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)
        if self.type == 'CryptoBar':
            self.getCryptoInfo(info)
            return self.createCryptoBar(info)
        elif self.type == 'CryptoSpecial':
            self.getCryptoInfo(info)
            return self.createCryptoSpecial(info)
        elif self.type == 'ResolutionString':
            return self.createResolution(info)
        elif self.type == 'VideoCodec':
            return self.createVideoCodec(info)
        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(
                    self.infobarFrontendSource == 'settings')
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)
        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata
        if self.type == 'All':
            self.getCryptoInfo(info)
            if self.showCryptoinfo:
                return addspace(
                    self.createProviderName(info)
                ) + self.createTransponderInfo(
                    fedata, feraw, info) + '\n' + addspace(
                        self.createCryptoBar(info)) + addspace(
                            self.createCryptoSpecial(info)) + '\n' + addspace(
                                self.createPIDInfo(info)) + addspace(
                                    self.createVideoCodec(
                                        info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(
                    info)) + self.createTransponderInfo(
                        fedata, feraw,
                        info) + '\n' + addspace(self.createCryptoBar(
                            info)) + self.current_source + '\n' + addspace(
                                self.createCryptoSpecial(info)) + addspace(
                                    self.createVideoCodec(
                                        info)) + self.createResolution(info)
        if self.type == 'PIDInfo':
            return self.createPIDInfo(info)
        elif not feraw:
            return ''
        elif self.type == 'ServiceInfo':
            return addspace(self.createProviderName(info)) + addspace(
                self.createTunerSystem(fedata)) + addspace(
                    self.createFrequency(feraw)) + addspace(
                        self.createPolarization(fedata)) + addspace(
                            self.createSymbolRate(fedata, feraw)) + addspace(
                                self.createFEC(fedata, feraw)) + addspace(
                                    self.createModulation(fedata)) + addspace(
                                        self.createOrbPos(feraw)) + addspace(
                                            self.createVideoCodec(info)
                                        ) + self.createResolution(info)
        elif self.type == 'TransponderInfo':
            return self.createTransponderInfo(fedata, feraw, info)
        elif self.type == 'TransponderFrequency':
            return self.createFrequency(feraw)
        elif self.type == 'TransponderSymbolRate':
            return self.createSymbolRate(fedata, feraw)
        elif self.type == 'TransponderPolarization':
            return self.createPolarization(fedata)
        elif self.type == 'TransponderFEC':
            return self.createFEC(fedata, feraw)
        elif self.type == 'TransponderModulation':
            return self.createModulation(fedata)
        elif self.type == 'OrbitalPosition':
            return self.createOrbPos(feraw)
        elif self.type == 'TunerType':
            return self.createTunerType(feraw)
        elif self.type == 'TunerSystem':
            return self.createTunerSystem(fedata)
        elif self.type == 'OrbitalPositionOrTunerSystem':
            return self.createOrbPosOrTunerSystem(fedata, feraw)
        elif self.type == 'TerrestrialChannelNumber':
            return self.createChannelNumber(fedata, feraw)
        else:
            return _('invalid type')

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()
        if not info:
            return False
        else:
            request_caid = None
            for x in self.ca_table:
                if x[0] == self.type:
                    request_caid = x[1]
                    request_selected = x[2]
                    break

            if request_caid is None:
                return False
            if info.getInfo(iServiceInformation.sIsCrypted) != 1:
                return False
            data = self.ecmdata.getEcmData()
            if data is None:
                return False
            current_caid = data[1]
            available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
            for caid_entry in caid_data:
                if caid_entry[3] == request_caid:
                    if request_selected:
                        if int(caid_entry[0], 16) <= int(
                                current_caid, 16) <= int(caid_entry[1], 16):
                            return True
                    else:
                        try:
                            for caid in available_caids:
                                if int(caid_entry[0], 16) <= caid <= int(
                                        caid_entry[1], 16):
                                    return True

                        except:
                            pass

            return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
        return
Example #26
0
class PliExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.ca_table = (
            ("CryptoCaidSecaAvailable", "S", False),
            ("CryptoCaidViaAvailable", "V", False),
            ("CryptoCaidIrdetoAvailable", "I", False),
            ("CryptoCaidNDSAvailable", "Nd", False),
            ("CryptoCaidConaxAvailable", "Co", False),
            ("CryptoCaidCryptoWAvailable", "Cw", False),
            ("CryptoCaidPowerVUAvailable", "P", False),
            ("CryptoCaidBetaAvailable", "B", False),
            ("CryptoCaidNagraAvailable", "N", False),
            ("CryptoCaidBissAvailable", "Bi", False),
            ("CryptoCaidDreAvailable", "D", False),
            ("CryptoCaidBulCrypt1Available", "B1", False),
            ("CryptoCaidBulCrypt2Available", "B2", False),
            ("CryptoCaidTandbergAvailable", "TB", False),
            ("CryptoCaidSecaSelected", "S", True),
            ("CryptoCaidViaSelected", "V", True),
            ("CryptoCaidIrdetoSelected", "I", True),
            ("CryptoCaidNDSSelected", "Nd", True),
            ("CryptoCaidConaxSelected", "Co", True),
            ("CryptoCaidCryptoWSelected", "Cw", True),
            ("CryptoCaidPowerVUSelected", "P", True),
            ("CryptoCaidBetaSelected", "B", True),
            ("CryptoCaidNagraSelected", "N", True),
            ("CryptoCaidBissSelected", "Bi", True),
            ("CryptoCaidDreSelected", "D", True),
            ("CryptoCaidBulCrypt1Selected", "B1", True),
            ("CryptoCaidBulCrypt2Selected", "B2", True),
            ("CryptoCaidTandbergSelected", "TB", True),
        )
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ""
            self.current_caid = "0"
            self.current_provid = "0"
            self.current_ecmpid = "0"

    def createCryptoBar(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in caid_data:
            if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                    caid_entry[1], 16):
                color = "\c0000??00"
            else:
                color = "\c007?7?7?"
                try:
                    for caid in available_caids:
                        if int(caid_entry[0], 16) <= caid <= int(
                                caid_entry[1], 16):
                            color = "\c00????00"
                except:
                    pass

            if color != "\c007?7?7?" or caid_entry[4]:
                if res: res += " "
                res += color + caid_entry[3]

        res += "\c00??????"
        return res

    def createCryptoSpecial(self, info):
        caid_name = "FTA"
        try:
            for caid_entry in caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                        caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break
            return caid_name + ":%04x:%04x:%04x:%04x" % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(
                    iServiceInformation.sSID), int(self.current_ecmpid, 16))
        except:
            pass
        return ""

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ""
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ("i", "p", " ")[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        return str(xres) + "x" + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return codec_data.get(info.getInfo(iServiceInformation.sVideoType),
                              "N/A")

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0: vpid = 0
        if apid < 0: apid = 0
        if pcrpid < 0: pcrpid = 0
        if sidpid < 0: sidpid = 0
        if tsid < 0: tsid = 0
        if onid < 0: onid = 0
        return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid,
                                              pcrpid)

    def createTransponderInfo(self, fedata, feraw, info):
        if not feraw:
            refstr = info.getInfoString(iServiceInformation.sServiceref)
            if "%3a//" in refstr.lower():
                return refstr.split(":")[10].replace("%3a",
                                                     ":").replace("%3A", ":")
            return ""
        elif "DVB-T" in feraw.get("tuner_type"):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(
                self.createFrequency(feraw)) + addspace(
                    self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(feraw)) + addspace(
                self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
         + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createMisPls(fedata))

    def createFrequency(self, feraw):
        frequency = feraw.get("frequency")
        if frequency:
            if "DVB-T" in feraw.get("tuner_type"):
                return str(int(frequency / 1000000. + 0.5))
            else:
                return str(int(frequency / 1000 + 0.5))
        return ""

    def createChannelNumber(self, fedata, feraw):
        return "DVB-T" in feraw.get("tuner_type") and fedata.get(
            "channel") or ""

    def createSymbolRate(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            bandwidth = fedata.get("bandwidth")
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get("symbol_rate")
            if symbolrate:
                return str(symbolrate / 1000)
        return ""

    def createPolarization(self, fedata):
        return fedata.get("polarization_abbreviation") or ""

    def createFEC(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            code_rate_lp = fedata.get("code_rate_lp")
            code_rate_hp = fedata.get("code_rate_hp")
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + "-" + code_rate_hp
        else:
            fec = fedata.get("fec_inner")
            if fec:
                return fec
        return ""

    def createModulation(self, fedata):
        if fedata.get("tuner_type") == _("Terrestrial"):
            constellation = fedata.get("constellation")
            if constellation:
                return constellation
        else:
            modulation = fedata.get("modulation")
            if modulation:
                return modulation
        return ""

    def createTunerType(self, feraw):
        return feraw.get("tuner_type") or ""

    def createTunerSystem(self, fedata):
        return fedata.get("system") or ""

    def createOrbPos(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
        elif orbpos > 0:
            return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
        return ""

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not "":
            return orbpos
        return self.createTunerSystem(fedata)

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    def createMisPls(self, fedata):
        tmp = ""
        if fedata.get("is_id") > -1:
            tmp = "MIS %d" % fedata.get("is_id")
        if fedata.get("pls_code") > 0:
            tmp = addspace(tmp) + "%s %d" % (fedata.get("pls_mode"),
                                             fedata.get("pls_code"))
        return tmp

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ""
        info = service and service.info()

        if not info:
            return ""

        if self.type == "CryptoInfo":
            self.getCryptoInfo(info)
            if config.usage.show_cryptoinfo.value:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)

        if self.type == "CryptoBar":
            self.getCryptoInfo(info)
            return self.createCryptoBar(info)

        if self.type == "CryptoSpecial":
            self.getCryptoInfo(info)
            return self.createCryptoSpecial(info)

        if self.type == "ResolutionString":
            return self.createResolution(info)

        if self.type == "VideoCodec":
            return self.createVideoCodec(info)

        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(
                    config.usage.infobar_frontend_source.value == "settings")
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)

        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata

        if self.type == "All":
            self.getCryptoInfo(info)
            if config.usage.show_cryptoinfo.value:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw, info) + "\n" \
                + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n" \
                + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw, info) + "\n" \
                + addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
                + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "PIDInfo":
            return self.createPIDInfo(info)

        if not feraw:
            return ""

        if self.type == "ServiceInfo":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
            + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) \
            + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "TransponderInfo":
            return self.createTransponderInfo(fedata, feraw, info)

        if self.type == "TransponderFrequency":
            return self.createFrequency(feraw)

        if self.type == "TransponderSymbolRate":
            return self.createSymbolRate(fedata, feraw)

        if self.type == "TransponderPolarization":
            return self.createPolarization(fedata)

        if self.type == "TransponderFEC":
            return self.createFEC(fedata, feraw)

        if self.type == "TransponderModulation":
            return self.createModulation(fedata)

        if self.type == "OrbitalPosition":
            return self.createOrbPos(feraw)

        if self.type == "TunerType":
            return self.createTunerType(feraw)

        if self.type == "TunerSystem":
            return self.createTunerSystem(fedata)

        if self.type == "OrbitalPositionOrTunerSystem":
            return self.createOrbPosOrTunerSystem(fedata, feraw)

        if self.type == "TerrestrialChannelNumber":
            return self.createChannelNumber(fedata, feraw)

        return _("invalid type")

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()

        if not info:
            return False

        request_caid = None
        for x in self.ca_table:
            if x[0] == self.type:
                request_caid = x[1]
                request_selected = x[2]
                break

        if request_caid is None:
            return False

        if info.getInfo(iServiceInformation.sIsCrypted) != 1:
            return False

        data = self.ecmdata.getEcmData()

        if data is None:
            return False

        current_caid = data[1]

        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in caid_data:
            if caid_entry[3] == request_caid:
                if request_selected:
                    if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(
                            caid_entry[1], 16):
                        return True
                else:  # request available
                    try:
                        for caid in available_caids:
                            if int(caid_entry[0], 16) <= caid <= int(
                                    caid_entry[1], 16):
                                return True
                    except:
                        pass

        return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
Example #27
0
class PliExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (
            ("0x100", "0x1ff", "Seca", "S", True),
            ("0x500", "0x5ff", "Via", "V", True),
            ("0x600", "0x6ff", "Irdeto", "I", True),
            ("0x900", "0x9ff", "NDS", "Nd", True),
            ("0xb00", "0xbff", "Conax", "Co", True),
            ("0xd00", "0xdff", "CryptoW", "Cw", True),
            ("0xe00", "0xeff", "PowerVU", "P", False),
            ("0x1700", "0x17ff", "Beta", "B", True),
            ("0x1800", "0x18ff", "Nagra", "N", True),
            ("0x2600", "0x2600", "Biss", "Bi", False),
            ("0x4ae0", "0x4ae1", "Dre", "D", False),
            ("0x4aee", "0x4aee", "BulCrypt", "B1", False),
            ("0x5581", "0x5581", "BulCrypt", "B2", False),
        )
        self.ca_table = (
            ("CryptoCaidSecaAvailable", "S", False),
            ("CryptoCaidViaAvailable", "V", False),
            ("CryptoCaidIrdetoAvailable", "I", False),
            ("CryptoCaidNDSAvailable", "Nd", False),
            ("CryptoCaidConaxAvailable", "Co", False),
            ("CryptoCaidCryptoWAvailable", "Cw", False),
            ("CryptoCaidPowerVUAvailable", "P", False),
            ("CryptoCaidBetaAvailable", "B", False),
            ("CryptoCaidNagraAvailable", "N", False),
            ("CryptoCaidBissAvailable", "Bi", False),
            ("CryptoCaidDreAvailable", "D", False),
            ("CryptoCaidBulCrypt1Available", "B1", False),
            ("CryptoCaidBulCrypt2Available", "B2", False),
            ("CryptoCaidSecaSelected", "S", True),
            ("CryptoCaidViaSelected", "V", True),
            ("CryptoCaidIrdetoSelected", "I", True),
            ("CryptoCaidNDSSelected", "Nd", True),
            ("CryptoCaidConaxSelected", "Co", True),
            ("CryptoCaidCryptoWSelected", "Cw", True),
            ("CryptoCaidPowerVUSelected", "P", True),
            ("CryptoCaidBetaSelected", "B", True),
            ("CryptoCaidNagraSelected", "N", True),
            ("CryptoCaidBissSelected", "Bi", True),
            ("CryptoCaidDreSelected", "D", True),
            ("CryptoCaidBulCrypt1Selected", "B1", True),
            ("CryptoCaidBulCrypt2Selected", "B2", True),
        )
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ""
            self.current_caid = "0"
            self.current_provid = "0"
            self.current_ecmpid = "0"

    def createCryptoBar(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(self.current_caid, 16) <= int(
                caid_entry[1], 16
            ):
                color = "\c0000??00"
            else:
                color = "\c007?7?7?"
                try:
                    for caid in available_caids:
                        if caid >= int(caid_entry[0], 16) and caid <= int(caid_entry[1], 16):
                            color = "\c00????00"
                except:
                    pass

            if color != "\c007?7?7?" or caid_entry[4]:
                if res:
                    res += " "
                res += color + caid_entry[3]

        res += "\c00??????"
        return res

    def createCryptoSeca(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0x100", 16) and int(self.current_caid, 16) <= int("0x1ff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0x100", 16) and caid <= int("0x1ff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "S"
        res += "\c00??????"
        return res

    def createCryptoVia(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0x500", 16) and int(self.current_caid, 16) <= int("0x5ff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0x500", 16) and caid <= int("0x5ff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "V"
        res += "\c00??????"
        return res

    def createCryptoIrdeto(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0x600", 16) and int(self.current_caid, 16) <= int("0x6ff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0x600", 16) and caid <= int("0x6ff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "I"
        res += "\c00??????"
        return res

    def createCryptoNDS(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0x900", 16) and int(self.current_caid, 16) <= int("0x9ff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0x900", 16) and caid <= int("0x9ff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "NDS"
        res += "\c00??????"
        return res

    def createCryptoConax(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0xb00", 16) and int(self.current_caid, 16) <= int("0xbff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0xb00", 16) and caid <= int("0xbff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "CO"
        res += "\c00??????"
        return res

    def createCryptoCryptoW(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0xd00", 16) and int(self.current_caid, 16) <= int("0xdff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0xd00", 16) and caid <= int("0xdff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "CW"
        res += "\c00??????"
        return res

    def createCryptoPowerVU(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0xe00", 16) and int(self.current_caid, 16) <= int("0xeff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0xe00", 16) and caid <= int("0xeff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "P"
        res += "\c00??????"
        return res

    def createCryptoBeta(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0x1700", 16) and int(self.current_caid, 16) <= int("0x17ff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0x1700", 16) and caid <= int("0x17ff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "B"
        res += "\c00??????"
        return res

    def createCryptoNagra(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0x1800", 16) and int(self.current_caid, 16) <= int("0x18ff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0x1800", 16) and caid <= int("0x18ff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "N"
        res += "\c00??????"
        return res

    def createCryptoBiss(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0x2600", 16) and int(self.current_caid, 16) <= int("0x26ff", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0x2600", 16) and caid <= int("0x26ff", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "BI"
        res += "\c00??????"
        return res

    def createCryptoDre(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int("0x4ae0", 16) and int(self.current_caid, 16) <= int("0x4ae1", 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int("0x4ae0", 16) and caid <= int("0x4ae1", 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + "DC"
        res += "\c00??????"
        return res

    def createCryptoSpecial(self, info):
        caid_name = "FTA"
        try:
            for caid_entry in self.caid_data:
                if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(self.current_caid, 16) <= int(
                    caid_entry[1], 16
                ):
                    caid_name = caid_entry[2]
                    break
            return caid_name + ":%04x:%04x:%04x:%04x" % (
                int(self.current_caid, 16),
                int(self.current_provid, 16),
                info.getInfo(iServiceInformation.sSID),
                int(self.current_ecmpid, 16),
            )
        except:
            pass
        return ""

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ""
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ("i", "p", "")[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        return str(xres) + "x" + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return ("MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM", "")[
            info.getInfo(iServiceInformation.sVideoType)
        ]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        if vpid < 0:
            vpid = 0
        if apid < 0:
            apid = 0
        if pcrpid < 0:
            pcrpid = 0
        if sidpid < 0:
            sidpid = 0
        return "Pids:%04d:%04d:%04d:%05d" % (vpid, apid, pcrpid, sidpid)

    def createTransponderInfo(self, fedata, feraw):
        return (
            addspace(self.createTunerSystem(fedata))
            + addspace(self.createFrequency(fedata))
            + addspace(self.createPolarization(fedata))
            + addspace(self.createSymbolRate(fedata))
            + addspace(self.createFEC(fedata))
            + addspace(self.createModulation(fedata))
            + self.createOrbPos(feraw)
        )

    def createFrequency(self, fedata):
        frequency = fedata.get("frequency")
        if frequency:
            return str(frequency / 1000)
        return ""

    def createSymbolRate(self, fedata):
        symbolrate = fedata.get("symbol_rate")
        if symbolrate:
            return str(symbolrate / 1000)
        return ""

    def createPolarization(self, fedata):
        polarization = fedata.get("polarization_abbreviation")
        if polarization:
            return polarization
        return ""

    def createFEC(self, fedata):
        fec = fedata.get("fec_inner")
        if fec:
            return fec
        return ""

    def createModulation(self, fedata):
        modulation = fedata.get("modulation")
        if modulation:
            return modulation
        return ""

    def createTunerType(self, feraw):
        tunertype = feraw.get("tuner_type")
        if tunertype:
            return tunertype
        return ""

    def createTunerSystem(self, fedata):
        tunersystem = fedata.get("system")
        if tunersystem:
            return tunersystem
        return ""

    def createOrbPos(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
        elif orbpos > 0:
            return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
        return ""

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not "":
            return orbpos
        return self.createTunerSystem(fedata)

    def createTransponderName(self, feraw):
        orb_pos = ""
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            if orbpos == 3590:
                orb_pos = "Thor/Intelsat"
            elif orbpos == 3560:
                orb_pos = "Amos (4"
            elif orbpos == 3550:
                orb_pos = "Atlantic Bird"
            elif orbpos == 3530:
                orb_pos = "Nilesat/Atlantic Bird"
            elif orbpos == 3520:
                orb_pos = "Atlantic Bird"
            elif orbpos == 3475:
                orb_pos = "Atlantic Bird"
            elif orbpos == 3460:
                orb_pos = "Express"
            elif orbpos == 3450:
                orb_pos = "Telstar"
            elif orbpos == 3420:
                orb_pos = "Intelsat"
            elif orbpos == 3380:
                orb_pos = "Nss"
            elif orbpos == 3355:
                orb_pos = "Intelsat"
            elif orbpos == 3325:
                orb_pos = "Intelsat"
            elif orbpos == 3300:
                orb_pos = "Hispasat"
            elif orbpos == 3285:
                orb_pos = "Intelsat"
            elif orbpos == 3170:
                orb_pos = "Intelsat"
            elif orbpos == 3150:
                orb_pos = "Intelsat"
            elif orbpos == 3070:
                orb_pos = "Intelsat"
            elif orbpos == 3045:
                orb_pos = "Intelsat"
            elif orbpos == 3020:
                orb_pos = "Intelsat 9"
            elif orbpos == 2990:
                orb_pos = "Amazonas"
            elif orbpos == 2900:
                orb_pos = "Star One"
            elif orbpos == 2880:
                orb_pos = "AMC 6 (72"
            elif orbpos == 2875:
                orb_pos = "Echostar 6"
            elif orbpos == 2860:
                orb_pos = "Horizons"
            elif orbpos == 2810:
                orb_pos = "AMC5"
            elif orbpos == 2780:
                orb_pos = "NIMIQ 4"
            elif orbpos == 2690:
                orb_pos = "NIMIQ 1"
            elif orbpos == 3592:
                orb_pos = "Thor/Intelsat"
            elif orbpos == 2985:
                orb_pos = "Echostar 3,12"
            elif orbpos == 2830:
                orb_pos = "Echostar 8"
            elif orbpos == 2630:
                orb_pos = "Galaxy 19"
            elif orbpos == 2500:
                orb_pos = "Echostar 10,11"
            elif orbpos == 2502:
                orb_pos = "DirectTV 5"
            elif orbpos == 2410:
                orb_pos = "Echostar 7 Anik F3"
            elif orbpos == 2391:
                orb_pos = "Galaxy 23"
            elif orbpos == 2390:
                orb_pos = "Echostar 9"
            elif orbpos == 2412:
                orb_pos = "DirectTV 7S"
            elif orbpos == 2310:
                orb_pos = "Galaxy 27"
            elif orbpos == 2311:
                orb_pos = "Ciel 2"
            elif orbpos == 2120:
                orb_pos = "Echostar 2"
            else:
                orb_pos = str((float(3600 - orbpos)) / 10.0) + "W"
        elif orbpos > 0:
            if orbpos == 192:
                orb_pos = "Astra 1F"
            elif orbpos == 130:
                orb_pos = "Hot Bird 6,7A,8"
            elif orbpos == 235:
                orb_pos = "Astra 1E"
            elif orbpos == 1100:
                orb_pos = "BSat 1A,2A"
            elif orbpos == 1101:
                orb_pos = "N-Sat 110"
            elif orbpos == 1131:
                orb_pos = "KoreaSat 5"
            elif orbpos == 1440:
                orb_pos = "SuperBird 7,C2"
            elif orbpos == 1006:
                orb_pos = "AsiaSat 2"
            elif orbpos == 1030:
                orb_pos = "Express A2"
            elif orbpos == 1056:
                orb_pos = "Asiasat 3S"
            elif orbpos == 1082:
                orb_pos = "NSS 11"
            elif orbpos == 881:
                orb_pos = "ST1"
            elif orbpos == 900:
                orb_pos = "Yamal 201"
            elif orbpos == 917:
                orb_pos = "Mesat"
            elif orbpos == 950:
                orb_pos = "Insat 4B"
            elif orbpos == 951:
                orb_pos = "NSS 6"
            elif orbpos == 765:
                orb_pos = "Telestar"
            elif orbpos == 785:
                orb_pos = "ThaiCom 5"
            elif orbpos == 800:
                orb_pos = "Express"
            elif orbpos == 830:
                orb_pos = "Insat 4A"
            elif orbpos == 850:
                orb_pos = "Intelsat 709"
            elif orbpos == 750:
                orb_pos = "Abs"
            elif orbpos == 720:
                orb_pos = "Intelsat"
            elif orbpos == 705:
                orb_pos = "Eutelsat W5"
            elif orbpos == 685:
                orb_pos = "Intelsat"
            elif orbpos == 620:
                orb_pos = "Intelsat 902"
            elif orbpos == 600:
                orb_pos = "Intelsat 904"
            elif orbpos == 570:
                orb_pos = "Nss"
            elif orbpos == 530:
                orb_pos = "Express AM22"
            elif orbpos == 480:
                orb_pos = "Eutelsat 2F2"
            elif orbpos == 450:
                orb_pos = "Intelsat"
            elif orbpos == 420:
                orb_pos = "Turksat 2A"
            elif orbpos == 400:
                orb_pos = "Express AM1"
            elif orbpos == 390:
                orb_pos = "Hellas Sat 2"
            elif orbpos == 380:
                orb_pos = "Paksat 1"
            elif orbpos == 360:
                orb_pos = "Eutelsat Sesat"
            elif orbpos == 335:
                orb_pos = "Astra 1M"
            elif orbpos == 330:
                orb_pos = "Eurobird 3"
            elif orbpos == 328:
                orb_pos = "Galaxy 11"
            elif orbpos == 315:
                orb_pos = "Astra 5A"
            elif orbpos == 310:
                orb_pos = "Turksat"
            elif orbpos == 305:
                orb_pos = "Arabsat"
            elif orbpos == 285:
                orb_pos = "Eurobird 1"
            elif orbpos == 284:
                orb_pos = "Eurobird/Astra"
            elif orbpos == 282:
                orb_pos = "Eurobird/Astra"
            elif orbpos == 1220:
                orb_pos = "AsiaSat"
            elif orbpos == 1380:
                orb_pos = "Telstar 18"
            elif orbpos == 260:
                orb_pos = "Badr 3/4"
            elif orbpos == 255:
                orb_pos = "Eurobird 2"
            elif orbpos == 215:
                orb_pos = "Eutelsat"
            elif orbpos == 216:
                orb_pos = "Eutelsat W6"
            elif orbpos == 210:
                orb_pos = "AfriStar 1"
            elif orbpos == 160:
                orb_pos = "Eutelsat W2"
            elif orbpos == 100:
                orb_pos = "Eutelsat W1"
            elif orbpos == 90:
                orb_pos = "Eurobird 9"
            elif orbpos == 70:
                orb_pos = "Eutelsat W3A"
            elif orbpos == 50:
                orb_pos = "Sirius 4"
            elif orbpos == 48:
                orb_pos = "Sirius 4"
            elif orbpos == 30:
                orb_pos = "Telecom 2"
            else:
                orb_pos = str((float(orbpos)) / 10.0) + "E"
        return orb_pos

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):

        service = self.source.service
        if service is None:
            return ""
        info = service and service.info()

        if not info:
            return ""

        if self.type == "CryptoInfo":
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
            else:
                return (
                    addspace(self.createCryptoBar(info))
                    + addspace(self.current_source)
                    + self.createCryptoSpecial(info)
                )

        if self.type == "CryptoBar":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            else:
                return ""

        if self.type == "CryptoSeca":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSeca(info)
            else:
                return ""

        if self.type == "CryptoVia":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoVia(info)
            else:
                return ""

        if self.type == "CryptoIrdeto":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoIrdeto(info)
            else:
                return ""

        if self.type == "CryptoNDS":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNDS(info)
            else:
                return ""

        if self.type == "CryptoConax":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoConax(info)
            else:
                return ""

        if self.type == "CryptoCryptoW":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoCryptoW(info)
            else:
                return ""

        if self.type == "CryptoBeta":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBeta(info)
            else:
                return ""

        if self.type == "CryptoNagra":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNagra(info)
            else:
                return ""

        if self.type == "CryptoBiss":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBiss(info)
            else:
                return ""

        if self.type == "CryptoDre":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoDre(info)
            else:
                return ""

        if self.type == "CryptoSpecial":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            else:
                return ""

        if self.type == "ResolutionString":
            return self.createResolution(info)

        if self.type == "VideoCodec":
            return self.createVideoCodec(info)

        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(True)
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)

        feraw = self.feraw
        fedata = self.fedata

        if not feraw or not fedata:
            return ""

        if self.type == "All":
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                return (
                    addspace(self.createProviderName(info))
                    + self.createTransponderInfo(fedata, feraw)
                    + "\n"
                    + addspace(self.createCryptoBar(info))
                    + addspace(self.createCryptoSpecial(info))
                    + "\n"
                    + addspace(self.createPIDInfo(info))
                    + addspace(self.createVideoCodec(info))
                    + self.createResolution(info)
                )
            else:
                return (
                    addspace(self.createProviderName(info))
                    + self.createTransponderInfo(fedata, feraw)
                    + "\n"
                    + addspace(self.createCryptoBar(info))
                    + self.current_source
                    + "\n"
                    + addspace(self.createCryptoSpecial(info))
                    + addspace(self.createVideoCodec(info))
                    + self.createResolution(info)
                )

        if self.type == "ServiceInfo":
            return (
                addspace(self.createProviderName(info))
                + addspace(self.createTunerSystem(fedata))
                + addspace(self.createFrequency(fedata))
                + addspace(self.createPolarization(fedata))
                + addspace(self.createSymbolRate(fedata))
                + addspace(self.createFEC(fedata))
                + addspace(self.createModulation(fedata))
                + addspace(self.createOrbPos(feraw))
                + addspace(self.createVideoCodec(info))
                + self.createResolution(info)
            )

        if self.type == "TransponderInfo2line":
            return (
                addspace(self.createProviderName(info))
                + addspace(self.createTunerSystem(fedata))
                + addspace(self.createTransponderName(feraw))
                + "\n"
                + self.createFrequency(fedata)
                + addspace(" MHz")
                + addspace(self.createPolarization(fedata))
                + addspace(self.createSymbolRate(fedata))
                + self.createModulation(fedata)
                + "-"
                + addspace(self.createFEC(fedata))
            )

        if self.type == "TransponderInfo":
            return self.createTransponderInfo(fedata, feraw)

        if self.type == "TransponderFrequency":
            return self.createFrequency(fedata)

        if self.type == "TransponderSymbolRate":
            return self.createSymbolRate(fedata)

        if self.type == "TransponderPolarization":
            return self.createPolarization(fedata)

        if self.type == "TransponderFEC":
            return self.createFEC(fedata)

        if self.type == "TransponderModulation":
            return self.createModulation(fedata)

        if self.type == "OrbitalPosition":
            return self.createOrbPos(feraw)

        if self.type == "TunerType":
            return self.createTunerType(feraw)

        if self.type == "TunerSystem":
            return self.createTunerSystem(fedata)

        if self.type == "OrbitalPositionOrTunerSystem":
            return self.createOrbPosOrTunerSystem(fedata, feraw)

        if self.type == "PIDInfo":
            return self.createPIDInfo(info)

        return _("invalid type")

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()

        if not info:
            return False

        request_caid = None
        for x in self.ca_table:
            if x[0] == self.type:
                request_caid = x[1]
                request_selected = x[2]
                break

        if request_caid is None:
            return False

        if info.getInfo(iServiceInformation.sIsCrypted) != 1:
            return False

        data = self.ecmdata.getEcmData()

        if data is None:
            return False

        current_caid = data[1]

        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if caid_entry[3] == request_caid:
                if request_selected:
                    if int(current_caid, 16) >= int(caid_entry[0], 16) and int(current_caid, 16) <= int(
                        caid_entry[1], 16
                    ):
                        return True
                else:  # request available
                    try:
                        for caid in available_caids:
                            if caid >= int(caid_entry[0], 16) and caid <= int(caid_entry[1], 16):
                                return True
                    except:
                        pass

        return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
Example #28
0
class PliExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.ca_table = (
            ("CryptoCaidDvnAvailable", "TB", False),
            ("CryptoCaidSmsxAvailable", "SM", False),
            ("CryptoCaidTongfangAvailable", "TF", False),
            ("CryptoCaidSecaAvailable", "S", False),
            ("CryptoCaidViaAvailable", "V", False),
            ("CryptoCaidIrdetoAvailable", "I", False),
            ("CryptoCaidNDSAvailable", "Nd", False),
            ("CryptoCaidConaxAvailable", "Co", False),
            ("CryptoCaidCryptoWAvailable", "Cw", False),
            ("CryptoCaidPowerVUAvailable", "P", False),
            ("CryptoCaidBetaAvailable", "B", False),
            ("CryptoCaidNagraAvailable", "N", False),
            ("CryptoCaidBissAvailable", "Bi", False),
            ("CryptoCaidDre3Available", "D3", False),
            ("CryptoCaidDreAvailable", "D", False),
            ("CryptoCaidBulCrypt1Available", "B1", False),
            ("CryptoCaidBulCrypt2Available", "B2", False),
            ("CryptoCaidVerimatrixAvailable", "Vm", False),
            ("CryptoCaidTandbergAvailable", "T", False),
            ("CryptoCaidDvnSelected", "TB", True),
            ("CryptoCaidSmsxSelected", "SM", True),
            ("CryptoCaidTongfangSelected", "TF", True),
            ("CryptoCaidSecaSelected", "S", True),
            ("CryptoCaidViaSelected", "V", True),
            ("CryptoCaidIrdetoSelected", "I", True),
            ("CryptoCaidNDSSelected", "Nd", True),
            ("CryptoCaidConaxSelected", "Co", True),
            ("CryptoCaidCryptoWSelected", "Cw", True),
            ("CryptoCaidPowerVUSelected", "P", True),
            ("CryptoCaidBetaSelected", "B", True),
            ("CryptoCaidNagraSelected", "N", True),
            ("CryptoCaidBissSelected", "Bi", True),
            ("CryptoCaidDre3Selected", "D3", True),
            ("CryptoCaidDreSelected", "D", True),
            ("CryptoCaidBulCrypt1Selected", "B1", True),
            ("CryptoCaidBulCrypt2Selected", "B2", True),
            ("CryptoCaidVerimatrixSelected", "Vm", True),
            ("CryptoCaidTandbergSelected", "T", True),
        )
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ""
            self.current_caid = "0"
            self.current_provid = "0"
            self.current_ecmpid = "0"

    def createCryptoBar(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        colors = parameters.get("PliExtraInfoColors", (
            0x0000FF00, 0x00FFFF00, 0x007F7F7F,
            0x00FFFFFF))  # "found", "not found", "available", "default" colors

        for caid_entry in caid_data:
            if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                    caid_entry[1], 16):
                color = Hex2strColor(colors[0])  # green
            else:
                color = Hex2strColor(colors[2])  # grey
                try:
                    for caid in available_caids:
                        if int(caid_entry[0], 16) <= caid <= int(
                                caid_entry[1], 16):
                            color = Hex2strColor(colors[1])  # yellow
                except:
                    pass

            if color != Hex2strColor(colors[2]) or caid_entry[4]:
                if res: res += " "
                res += color + caid_entry[3]

        res += Hex2strColor(
            colors[3]
        )  # white (this acts like a color "reset" for following strings
        return res

    def createCryptoSeca(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x100', 16) <= caid <= int('0x1ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'S'
        res += "\c00??????"
        return res

    def createCryptoVia(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x500', 16) <= caid <= int('0x5ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'V'
        res += "\c00??????"
        return res

    def createCryptoIrdeto(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x600', 16) <= caid <= int('0x6ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'I'
        res += "\c00??????"
        return res

    def createCryptoNDS(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x900', 16) <= caid <= int('0x9ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'NDS'
        res += "\c00??????"
        return res

    def createCryptoConax(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0xb00', 16) <= caid <= int('0xbff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'CO'
        res += "\c00??????"
        return res

    def createCryptoCryptoW(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0xd00', 16) <= caid <= int('0xdff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'CW'
        res += "\c00??????"
        return res

    def createCryptoPowerVU(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0xe00', 16) <= caid <= int('0xeff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'P'
        res += "\c00??????"
        return res

    def createCryptoTandberg(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1010', 16) <= int(self.current_caid, 16) <= int(
                '0x1010', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x1010', 16) <= caid <= int('0x1010', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'T'
        res += "\c00??????"
        return res

    def createCryptoBeta(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1700', 16) <= int(self.current_caid, 16) <= int(
                '0x17ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x1700', 16) <= caid <= int('0x17ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'B'
        res += "\c00??????"
        return res

    def createCryptoNagra(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1800', 16) <= int(self.current_caid, 16) <= int(
                '0x18ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x1800', 16) <= caid <= int('0x18ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'N'
        res += "\c00??????"
        return res

    def createCryptoBiss(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x2600', 16) <= int(self.current_caid, 16) <= int(
                '0x26ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x2600', 16) <= caid <= int('0x26ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'BI'
        res += "\c00??????"
        return res

    def createCryptoDre(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int(
                '0x4ae1', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'DC'
        res += "\c00??????"
        return res

    def createCryptoSpecial(self, info):
        caid_system = _("CA System: ")
        caid_name = _("FTA")
        if int(self.current_caid, 16) == 0:
            return caid_system + caid_name
        try:
            for caid_entry in caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                        caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break
            caid_num = "%04x" % (int(self.current_caid, 16))
            caid_num = caid_num.upper()
            return caid_system + caid_name + "@" + caid_num
        except:
            pass
        return ""

    def createCryptoNameCaid(self, info):
        caid_name = "FTA"
        if int(self.current_caid, 16) == 0:
            return caid_name
        try:
            for caid_entry in self.caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(
                        caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break
            return caid_name + ":%04x" % (int(self.current_caid, 16))
        except:
            pass
        return ""

    def createResolution(self, info):
        video_height = 0
        video_width = 0
        video_pol = " "
        video_rate = 0
        fps = 0
        if path.exists("/proc/stb/vmpeg/0/yres"):
            f = open("/proc/stb/vmpeg/0/yres", "r")
            try:
                video_height = int(f.read(), 16)
            except:
                pass
            f.close()
        if path.exists("/proc/stb/vmpeg/0/xres"):
            f = open("/proc/stb/vmpeg/0/xres", "r")
            try:
                video_width = int(f.read(), 16)
            except:
                pass
            f.close()
        if path.exists("/proc/stb/vmpeg/0/progressive"):
            f = open("/proc/stb/vmpeg/0/progressive", "r")
            try:
                video_pol = "p" if int(f.read(), 16) else "i"
            except:
                pass
            f.close()
        fps = (info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000
        if not fps and path.exists("/proc/stb/vmpeg/0/fallback_framerate"):
            fps = (
                int(open("/proc/stb/vmpeg/0/fallback_framerate", "r").read()) +
                0) / 1000
        if not fps and path.exists("/proc/stb/vmpeg/0/framerate"):
            fps = (int(open("/proc/stb/vmpeg/0/framerate", "r").read()) +
                   500) / 1000
        gamma = ("SDR", "HDR", "HDR10", "HLG",
                 "")[info.getInfo(iServiceInformation.sGamma)]
        return str(video_width) + "x" + str(video_height) + video_pol + str(
            fps) + addspace(gamma)

    def createVideoCodec(self, info):
        return codec_data.get(info.getInfo(iServiceInformation.sVideoType),
                              _("N/A"))

    def createServiceRef(self, info):
        return info.getInfoString(iServiceInformation.sServiceref)

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0: vpid = 0
        if apid < 0: apid = 0
        if pcrpid < 0: pcrpid = 0
        if sidpid < 0: sidpid = 0
        if tsid < 0: tsid = 0
        if onid < 0: onid = 0
        return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid,
                                              pcrpid)

    def createTransponderInfo(self, fedata, feraw, info):
        if not feraw:
            refstr = info.getInfoString(iServiceInformation.sServiceref)
            if "%3a//" in refstr.lower():
                return refstr.split(":")[10].replace("%3a",
                                                     ":").replace("%3A", ":")
            return ""
        elif "DVB-T" in feraw.get("tuner_type"):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(
                self.createFrequency(fedata)) + addspace(
                    self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(fedata)) + addspace(
                self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
         + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createMisPls(fedata))

    def createFrequency(self, fedata):
        frequency = fedata.get("frequency")
        if frequency:
            return str(frequency)
        return ""

    def createChannelNumber(self, fedata, feraw):
        return "DVB-T" in feraw.get("tuner_type") and fedata.get(
            "channel") or ""

    def createSymbolRate(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            bandwidth = fedata.get("bandwidth")
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get("symbol_rate")
            if symbolrate:
                return str(symbolrate)
        return ""

    def createPolarization(self, fedata):
        return fedata.get("polarization_abbreviation") or ""

    def createFEC(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            code_rate_lp = fedata.get("code_rate_lp")
            code_rate_hp = fedata.get("code_rate_hp")
            guard_interval = fedata.get('guard_interval')
            if code_rate_lp and code_rate_hp and guard_interval:
                return code_rate_lp + "-" + code_rate_hp + "-" + guard_interval
        else:
            fec = fedata.get("fec_inner")
            if fec:
                return fec
        return ""

    def createModulation(self, fedata):
        if fedata.get("tuner_type") == _("Terrestrial"):
            constellation = fedata.get("constellation")
            if constellation:
                return constellation
        else:
            modulation = fedata.get("modulation")
            if modulation:
                return modulation
        return ""

    def createTunerType(self, feraw):
        return feraw.get("tuner_type") or ""

    def createTunerSystem(self, fedata):
        return fedata.get("system") or ""

    def createOrbPos(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
        elif orbpos > 0:
            return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
        return ""

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not "":
            return orbpos
        return self.createTunerSystem(fedata)

    def createTransponderName(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos is None:  # Not satellite
            return ""
        freq = feraw.get("frequency")
        if freq and freq < 10700000:  # C-band
            if orbpos > 1800:
                orbpos += 1
            else:
                orbpos -= 1

        sat_names = {
            30: 'Rascom/Eutelsat 3E',
            48: 'SES 5',
            70: 'Eutelsat 7E',
            90: 'Eutelsat 9E',
            100: 'Eutelsat 10E',
            130: 'Hot Bird',
            160: 'Eutelsat 16E',
            192: 'Astra 1KR/1L/1M/1N',
            200: 'Arabsat 20E',
            216: 'Eutelsat 21.5E',
            235: 'Astra 3',
            255: 'Eutelsat 25.5E',
            260: 'Badr 4/5/6',
            282: 'Astra 2E/2F/2G',
            305: 'Arabsat 30.5E',
            315: 'Astra 5',
            330: 'Eutelsat 33E',
            360: 'Eutelsat 36E',
            380: 'Paksat',
            390: 'Hellas Sat',
            400: 'Express 40E',
            420: 'Turksat',
            450: 'Intelsat 45E',
            480: 'Afghansat',
            490: 'Yamal 49E',
            530: 'Express 53E',
            570: 'NSS 57E',
            600: 'Intelsat 60E',
            620: 'Intelsat 62E',
            685: 'Intelsat 68.5E',
            705: 'Eutelsat 70.5E',
            720: 'Intelsat 72E',
            750: 'ABS',
            765: 'Apstar',
            785: 'ThaiCom',
            800: 'Express 80E',
            830: 'Insat',
            851: 'Intelsat/Horizons',
            880: 'ST2',
            900: 'Yamal 90E',
            915: 'Mesat',
            950: 'NSS/SES 95E',
            1005: 'AsiaSat 100E',
            1030: 'Express 103E',
            1055: 'Asiasat 105E',
            1082: 'NSS/SES 108E',
            1100: 'BSat/NSAT',
            1105: 'ChinaSat',
            1130: 'KoreaSat',
            1222: 'AsiaSat 122E',
            1380: 'Telstar 18',
            1440: 'SuperBird',
            2310: 'Ciel',
            2390: 'Echostar/Galaxy 121W',
            2410: 'Echostar/DirectTV 119W',
            2500: 'Echostar/DirectTV 110W',
            2630: 'Galaxy 97W',
            2690: 'NIMIQ 91W',
            2780: 'NIMIQ 82W',
            2830: 'Echostar/QuetzSat',
            2880: 'AMC 72W',
            2900: 'Star One',
            2985: 'Echostar 61.5W',
            2990: 'Amazonas',
            3020: 'Intelsat 58W',
            3045: 'Intelsat 55.5W',
            3070: 'Intelsat 53W',
            3100: 'Intelsat 50W',
            3150: 'Intelsat 45W',
            3169: 'Intelsat 43.1W',
            3195: 'SES 40.5W',
            3225: 'NSS/Telstar 37W',
            3255: 'Intelsat 34.5W',
            3285: 'Intelsat 31.5W',
            3300: 'Hispasat',
            3325: 'Intelsat 27.5W',
            3355: 'Intelsat 24.5W',
            3380: 'SES 22W',
            3400: 'NSS 20W',
            3420: 'Intelsat 18W',
            3450: 'Telstar 15W',
            3460: 'Express 14W',
            3475: 'Eutelsat 12.5W',
            3490: 'Express 11W',
            3520: 'Eutelsat 8W',
            3530: 'Nilesat/Eutelsat 7W',
            3550: 'Eutelsat 5W',
            3560: 'Amos',
            3592: 'Thor/Intelsat'
        }

        if orbpos in sat_names:
            return sat_names[orbpos]
        elif orbpos > 1800:
            return str((float(3600 - orbpos)) / 10.0) + "W"
        else:
            return str((float(orbpos)) / 10.0) + "E"

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    def createMisPls(self, fedata):
        tmp = ""
        if fedata.get("is_id") > -1:
            tmp = "MIS %d" % fedata.get("is_id")
        if fedata.get("pls_code") > 0:
            tmp = addspace(tmp) + "%s %d" % (fedata.get("pls_mode"),
                                             fedata.get("pls_code"))
        if fedata.get("t2mi_plp_id") > -1:
            tmp = addspace(tmp) + "T2MI %d PID %d" % (
                fedata.get("t2mi_plp_id"), fedata.get("t2mi_pid"))
        return tmp

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ""
        info = service and service.info()

        if not info:
            return ""

        if self.type == "CryptoInfo":
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)

        if self.type == "CryptoBar":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            else:
                return ""

        if self.type == "CryptoSeca":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSeca(info)
            else:
                return ""

        if self.type == "CryptoVia":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoVia(info)
            else:
                return ""

        if self.type == "CryptoIrdeto":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoIrdeto(info)
            else:
                return ""

        if self.type == "CryptoNDS":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNDS(info)
            else:
                return ""

        if self.type == "CryptoConax":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoConax(info)
            else:
                return ""

        if self.type == "CryptoCryptoW":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoCryptoW(info)
            else:
                return ""

        if self.type == "CryptoBeta":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBeta(info)
            else:
                return ""

        if self.type == "CryptoNagra":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNagra(info)
            else:
                return ""

        if self.type == "CryptoBiss":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBiss(info)
            else:
                return ""

        if self.type == "CryptoDre":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoDre(info)
            else:
                return ""

        if self.type == "CryptoTandberg":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoTandberg(info)
            else:
                return ""

        if self.type == "CryptoSpecial":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            else:
                return ""

        if self.type == "CryptoNameCaid":
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNameCaid(info)
            else:
                return ""

        if self.type == "ResolutionString":
            return self.createResolution(info)

        if self.type == "VideoCodec":
            return self.createVideoCodec(info)

        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(
                    config.usage.infobar_frontend_source.value == "settings")
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)

        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            if not feraw:
                return ""
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata
        if self.type == "All":
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw, info) + addspace(self.createTransponderName(feraw)) + "\n"\
                + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n"\
                + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw, info) + addspace(self.createTransponderName(feraw)) + "\n" \
                + addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
                + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "ServiceInfo":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
            + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createTransponderName(feraw))\
            + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "TransponderInfo2line":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createTransponderName(feraw)) + '\n'\
            + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
            + addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))

        if self.type == "PIDInfo":
            return self.createPIDInfo(info)

        if self.type == "ServiceRef":
            return self.createServiceRef(info)

        if not feraw:
            return ""

        if self.type == "TransponderInfo":
            return self.createTransponderInfo(fedata, feraw, info)

        if self.type == "TransponderFrequency":
            return self.createFrequency(feraw)

        if self.type == "TransponderSymbolRate":
            return self.createSymbolRate(fedata, feraw)

        if self.type == "TransponderPolarization":
            return self.createPolarization(fedata)

        if self.type == "TransponderFEC":
            return self.createFEC(fedata, feraw)

        if self.type == "TransponderModulation":
            return self.createModulation(fedata)

        if self.type == "OrbitalPosition":
            return self.createOrbPos(feraw)

        if self.type == "TunerType":
            return self.createTunerType(feraw)

        if self.type == "TunerSystem":
            return self.createTunerSystem(fedata)

        if self.type == "OrbitalPositionOrTunerSystem":
            return self.createOrbPosOrTunerSystem(fedata, feraw)

        if self.type == "TerrestrialChannelNumber":
            return self.createChannelNumber(fedata, feraw)

        if self.type == "TransponderInfoMisPls":
            return self.createMisPls(fedata)

        return _("invalid type")

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()

        if not info:
            return False

        request_caid = None
        for x in self.ca_table:
            if x[0] == self.type:
                request_caid = x[1]
                request_selected = x[2]
                break

        if request_caid is None:
            return False

        if info.getInfo(iServiceInformation.sIsCrypted) != 1:
            return False

        data = self.ecmdata.getEcmData()

        if data is None:
            return False

        current_caid = data[1]

        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in caid_data:
            if caid_entry[3] == request_caid:
                if request_selected:
                    if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(
                            caid_entry[1], 16):
                        return True
                else:  # request available
                    try:
                        for caid in available_caids:
                            if int(caid_entry[0], 16) <= caid <= int(
                                    caid_entry[1], 16):
                                return True
                    except:
                        pass

        return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
Example #29
0
class PliExtraInfo(Poll, Converter, object):

    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (('0x100',
          '0x1ff',
          'Seca',
          'S',
          True),
         ('0x500',
          '0x5ff',
          'Via',
          'V',
          True),
         ('0x600',
          '0x6ff',
          'Irdeto',
          'I',
          True),
         ('0x900',
          '0x9ff',
          'NDS',
          'Nd',
          True),
         ('0xb00',
          '0xbff',
          'Conax',
          'Co',
          True),
         ('0xd00',
          '0xdff',
          'CryptoW',
          'Cw',
          True),
         ('0xe00',
          '0xeff',
          'PowerVU',
          'P',
          False),
         ('0x1700',
          '0x17ff',
          'Beta',
          'B',
          True),
         ('0x1800',
          '0x18ff',
          'Nagra',
          'N',
          True),
         ('0x2600',
          '0x2600',
          'Biss',
          'Bi',
          False),
         ('0x4ae0',
          '0x4ae1',
          'Dre',
          'D',
          False),
         ('0x4aee',
          '0x4aee',
          'BulCrypt',
          'B1',
          False),
         ('0x5581',
          '0x5581',
          'BulCrypt',
          'B2',
          False))
        self.ca_table = (('CryptoCaidSecaAvailable', 'S', False),
         ('CryptoCaidViaAvailable', 'V', False),
         ('CryptoCaidIrdetoAvailable', 'I', False),
         ('CryptoCaidNDSAvailable', 'Nd', False),
         ('CryptoCaidConaxAvailable', 'Co', False),
         ('CryptoCaidCryptoWAvailable', 'Cw', False),
         ('CryptoCaidPowerVUAvailable', 'P', False),
         ('CryptoCaidBetaAvailable', 'B', False),
         ('CryptoCaidNagraAvailable', 'N', False),
         ('CryptoCaidBissAvailable', 'Bi', False),
         ('CryptoCaidDreAvailable', 'D', False),
         ('CryptoCaidBulCrypt1Available', 'B1', False),
         ('CryptoCaidBulCrypt2Available', 'B2', False),
         ('CryptoCaidSecaSelected', 'S', True),
         ('CryptoCaidViaSelected', 'V', True),
         ('CryptoCaidIrdetoSelected', 'I', True),
         ('CryptoCaidNDSSelected', 'Nd', True),
         ('CryptoCaidConaxSelected', 'Co', True),
         ('CryptoCaidCryptoWSelected', 'Cw', True),
         ('CryptoCaidPowerVUSelected', 'P', True),
         ('CryptoCaidBetaSelected', 'B', True),
         ('CryptoCaidNagraSelected', 'N', True),
         ('CryptoCaidBissSelected', 'Bi', True),
         ('CryptoCaidDreSelected', 'D', True),
         ('CryptoCaidBulCrypt1Selected', 'B1', True),
         ('CryptoCaidBulCrypt2Selected', 'B2', True))
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None
        return

    def getCryptoInfo(self, info):
        if info.getInfo(iServiceInformation.sIsCrypted) == 1:
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ''
            self.current_caid = '0'
            self.current_provid = '0'
            self.current_ecmpid = '0'

    def createCryptoBar(self, info):
        res = ''
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        for caid_entry in self.caid_data:
            if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
                color = '\\c0000??00'
            else:
                color = '\\c007?7?7?'
                try:
                    for caid in available_caids:
                        if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
                            color = '\\c00????00'

                except:
                    pass

            if color != '\\c007?7?7?' or caid_entry[4]:
                if res:
                    res += ' '
                res += color + caid_entry[3]

        res += '\\c00??????'
        return res

    def createCryptoSeca(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x100', 16) <= caid <= int('0x1ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'S'
        res += '\\c00??????'
        return res

    def createCryptoVia(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x500', 16) <= caid <= int('0x5ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'V'
        res += '\\c00??????'
        return res

    def createCryptoIrdeto(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x600', 16) <= caid <= int('0x6ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'I'
        res += '\\c00??????'
        return res

    def createCryptoNDS(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x900', 16) <= caid <= int('0x9ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'NDS'
        res += '\\c00??????'
        return res

    def createCryptoConax(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xb00', 16) <= caid <= int('0xbff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'CO'
        res += '\\c00??????'
        return res

    def createCryptoCryptoW(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xd00', 16) <= caid <= int('0xdff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'CW'
        res += '\\c00??????'
        return res

    def createCryptoPowerVU(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0xe00', 16) <= caid <= int('0xeff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'P'
        res += '\\c00??????'
        return res

    def createCryptoBeta(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1700', 16) <= int(self.current_caid, 16) <= int('0x17ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x1700', 16) <= caid <= int('0x17ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'B'
        res += '\\c00??????'
        return res

    def createCryptoNagra(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x1800', 16) <= int(self.current_caid, 16) <= int('0x18ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x1800', 16) <= caid <= int('0x18ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'N'
        res += '\\c00??????'
        return res

    def createCryptoBiss(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x2600', 16) <= int(self.current_caid, 16) <= int('0x26ff', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x2600', 16) <= caid <= int('0x26ff', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'BI'
        res += '\\c00??????'
        return res

    def createCryptoDre(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int('0x4ae1', 16):
            color = '\\c004c7d3f'
        else:
            color = '\\c009?9?9?'
            try:
                for caid in available_caids:
                    if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
                        color = '\\c00eeee00'

            except:
                pass

        res = color + 'DC'
        res += '\\c00??????'
        return res

    def createCryptoSpecial(self, info):
        caid_name = 'FTA'
        try:
            for caid_entry in self.caid_data:
                if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break

            return caid_name + ':%04x:%04x:%04x' % (int(self.current_caid, 16), int(self.current_provid, 16), info.getInfo(iServiceInformation.sSID))
        except:
            pass

        return ''

    def createResolution(self, info):
        video_height = 0
        video_width = 0
        video_pol = ' '
        video_rate = 0
        if path.exists('/proc/stb/vmpeg/0/yres'):
            f = open('/proc/stb/vmpeg/0/yres', 'r')
            try:
                video_height = int(f.read(), 16)
            except:
                pass

            f.close()
        if path.exists('/proc/stb/vmpeg/0/xres'):
            f = open('/proc/stb/vmpeg/0/xres', 'r')
            try:
                video_width = int(f.read(), 16)
            except:
                pass

            f.close()
        if path.exists('/proc/stb/vmpeg/0/progressive'):
            f = open('/proc/stb/vmpeg/0/progressive', 'r')
            try:
                video_pol = 'p' if int(f.read(), 16) else 'i'
            except:
                pass

            f.close()
        if path.exists('/proc/stb/vmpeg/0/framerate'):
            f = open('/proc/stb/vmpeg/0/framerate', 'r')
            try:
                video_rate = int(f.read())
            except:
                pass

            f.close()
        fps = str((video_rate + 500) / 1000)
        return str(video_width) + 'x' + str(video_height) + video_pol + fps

    def createVideoCodec(self, info):
        return ('MPEG2', 'MPEG4', 'MPEG1', 'MPEG4-II', 'VC1', 'VC1-SM', '')[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0:
            vpid = 0
        if apid < 0:
            apid = 0
        if pcrpid < 0:
            pcrpid = 0
        if sidpid < 0:
            sidpid = 0
        if tsid < 0:
            tsid = 0
        if onid < 0:
            onid = 0
        return '%d-%d:%05d:%04d:%04d:%04d' % (onid,
         tsid,
         sidpid,
         vpid,
         apid,
         pcrpid)

    def createTransponderInfo(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw))

    def createFrequency(self, fedata):
        frequency = fedata.get('frequency')
        if frequency:
            return str(frequency)
        return ''

    def createChannelNumber(self, fedata, feraw):
        return 'DVB-T' in feraw.get('tuner_type') and fedata.get('channel') or ''

    def createSymbolRate(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            bandwidth = fedata.get('bandwidth')
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get('symbol_rate')
            if symbolrate:
                return str(symbolrate)
        return ''

    def createPolarization(self, fedata):
        return fedata.get('polarization_abbreviation') or ''

    def createFEC(self, fedata, feraw):
        if 'DVB-T' in feraw.get('tuner_type'):
            code_rate_lp = fedata.get('code_rate_lp')
            code_rate_hp = fedata.get('code_rate_hp')
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + '-' + code_rate_hp
        else:
            fec = fedata.get('fec_inner')
            if fec:
                return fec
        return ''

    def createModulation(self, fedata):
        if fedata.get('tuner_type') == _('Terrestrial'):
            constellation = fedata.get('constellation')
            if constellation:
                return constellation
        else:
            modulation = fedata.get('modulation')
            if modulation:
                return modulation
        return ''

    def createTunerType(self, feraw):
        return feraw.get('tuner_type') or ''

    def createTunerSystem(self, fedata):
        return fedata.get('system') or ''

    def createOrbPos(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos > 1800:
            return str(float(3600 - orbpos) / 10.0) + '\xc2\xb0 W'
        if orbpos > 0:
            return str(float(orbpos) / 10.0) + '\xc2\xb0 E'
        return ''

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not '':
            return orbpos
        return self.createTunerSystem(fedata)

    def createTransponderName(self, feraw):
        orbpos = feraw.get('orbital_position')
        if orbpos is None:
            return ''
        else:
            freq = feraw.get('frequency')
            if freq and freq < 10700000:
                if orbpos > 1800:
                    orbpos += 1
                else:
                    orbpos -= 1
            sat_names = {30: 'Rascom/Eutelsat 3E',
             48: 'SES 5',
             70: 'Eutelsat 7E',
             90: 'Eutelsat 9E',
             100: 'Eutelsat 10E',
             130: 'Hot Bird',
             160: 'Eutelsat 16E',
             192: 'Astra 1KR/1L/1M/1N',
             200: 'Arabsat 20E',
             216: 'Eutelsat 21.5E',
             235: 'Astra 3',
             255: 'Eutelsat 25.5E',
             260: 'Badr 4/5/6',
             282: 'Astra 2E/2F/2G',
             305: 'Arabsat 30.5E',
             315: 'Astra 5',
             330: 'Eutelsat 33E',
             360: 'Eutelsat 36E',
             380: 'Paksat',
             390: 'Hellas Sat',
             400: 'Express 40E',
             420: 'Turksat',
             450: 'Intelsat 45E',
             480: 'Afghansat',
             490: 'Yamal 49E',
             530: 'Express 53E',
             570: 'NSS 57E',
             600: 'Intelsat 60E',
             620: 'Intelsat 62E',
             685: 'Intelsat 68.5E',
             705: 'Eutelsat 70.5E',
             720: 'Intelsat 72E',
             750: 'ABS',
             765: 'Apstar',
             785: 'ThaiCom',
             800: 'Express 80E',
             830: 'Insat',
             851: 'Intelsat/Horizons',
             880: 'ST2',
             900: 'Yamal 90E',
             915: 'Mesat',
             950: 'NSS/SES 95E',
             1005: 'AsiaSat 100E',
             1030: 'Express 103E',
             1055: 'Asiasat 105E',
             1082: 'NSS/SES 108E',
             1100: 'BSat/NSAT',
             1105: 'ChinaSat',
             1130: 'KoreaSat',
             1222: 'AsiaSat 122E',
             1380: 'Telstar 18',
             1440: 'SuperBird',
             2310: 'Ciel',
             2390: 'Echostar/Galaxy 121W',
             2410: 'Echostar/DirectTV 119W',
             2500: 'Echostar/DirectTV 110W',
             2630: 'Galaxy 97W',
             2690: 'NIMIQ 91W',
             2780: 'NIMIQ 82W',
             2830: 'Echostar/QuetzSat',
             2880: 'AMC 72W',
             2900: 'Star One',
             2985: 'Echostar 61.5W',
             2990: 'Amazonas',
             3020: 'Intelsat 58W',
             3045: 'Intelsat 55.5W',
             3070: 'Intelsat 53W',
             3100: 'Intelsat 50W',
             3150: 'Intelsat 45W',
             3169: 'Intelsat 43.1W',
             3195: 'SES 40.5W',
             3225: 'NSS/Telstar 37W',
             3255: 'Intelsat 34.5W',
             3285: 'Intelsat 31.5W',
             3300: 'Hispasat',
             3325: 'Intelsat 27.5W',
             3355: 'Intelsat 24.5W',
             3380: 'SES 22W',
             3400: 'NSS 20W',
             3420: 'Intelsat 18W',
             3450: 'Telstar 15W',
             3460: 'Express 14W',
             3475: 'Eutelsat 12.5W',
             3490: 'Express 11W',
             3520: 'Eutelsat 8W',
             3530: 'Nilesat/Eutelsat 7W',
             3550: 'Eutelsat 5W',
             3560: 'Amos',
             3592: 'Thor/Intelsat'}
            if orbpos in sat_names:
                return sat_names[orbpos]
            if orbpos > 1800:
                return str(float(3600 - orbpos) / 10.0) + 'W'
            return str(float(orbpos) / 10.0) + 'E'
            return

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ''
        info = service and service.info()
        if not info:
            return ''
        if self.type == 'CryptoInfo':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)
        if self.type == 'CryptoBar':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            else:
                return ''
        if self.type == 'CryptoSeca':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSeca(info)
            else:
                return ''
        if self.type == 'CryptoVia':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoVia(info)
            else:
                return ''
        if self.type == 'CryptoIrdeto':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoIrdeto(info)
            else:
                return ''
        if self.type == 'CryptoNDS':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNDS(info)
            else:
                return ''
        if self.type == 'CryptoConax':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoConax(info)
            else:
                return ''
        if self.type == 'CryptoCryptoW':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoCryptoW(info)
            else:
                return ''
        if self.type == 'CryptoBeta':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBeta(info)
            else:
                return ''
        if self.type == 'CryptoNagra':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNagra(info)
            else:
                return ''
        if self.type == 'CryptoBiss':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBiss(info)
            else:
                return ''
        if self.type == 'CryptoDre':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoDre(info)
            else:
                return ''
        if self.type == 'CryptoSpecial':
            if int(config.usage.show_cryptoinfo.value) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            else:
                return ''
        if self.type == 'ResolutionString':
            return self.createResolution(info)
        elif self.type == 'VideoCodec':
            return self.createVideoCodec(info)
        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == 'settings')
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)
        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            if not feraw:
                return ''
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata
        if self.type == 'All':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw) + addspace(self.createTransponderName(feraw)) + '\n' + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + '\n' + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw) + addspace(self.createTransponderName(feraw)) + '\n' + addspace(self.createCryptoBar(info)) + self.current_source + '\n' + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
        if self.type == 'ServiceInfo':
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createTransponderName(feraw)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
        elif self.type == 'ServiceInfoFreq':
            return addspace(self.createFrequency(feraw)) + ' POL : ' + addspace(self.createPolarization(fedata)) + ' FEC : ' + addspace(self.createFEC(fedata, feraw)) + ' SR : ' + addspace(self.createSymbolRate(fedata, feraw)) + ' MOD : ' + addspace(self.createModulation(fedata))
        if self.type == 'ServiceInfoCrypt':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info))
            else:
                return "'Emu Info'"
        if self.type == 'EmuInfoCrypt':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoBar(info))
            else:
                return "'Emu Info'"
        if self.type == 'EmuInfoCryptSpecial':
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.value) > 0:
                return addspace(self.createCryptoSpecial(info))
            else:
                return "'Emu Info'"
        if self.type == 'TransponderInfo2line':
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createTransponderName(feraw)) + '\n' + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata)) + addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))
        elif self.type == 'ProviderName':
            return self.createProviderName(info)
        elif self.type == 'TransponderName':
            return self.createTransponderName(feraw)
        elif self.type == 'TunerSystem':
            return self.createTunerSystem(fedata)
        elif self.type == 'PIDInfo':
            return self.createPIDInfo(info)
        elif not feraw:
            return ''
        elif self.type == 'TransponderInfo':
            return self.createTransponderInfo(fedata, feraw)
        elif self.type == 'TransponderFrequency':
            return self.createFrequency(feraw)
        elif self.type == 'TransponderSymbolRate':
            return self.createSymbolRate(fedata, feraw)
        elif self.type == 'TransponderPolarization':
            return self.createPolarization(fedata)
        elif self.type == 'TransponderFEC':
            return self.createFEC(fedata, feraw)
        elif self.type == 'TransponderModulation':
            return self.createModulation(fedata)
        elif self.type == 'OrbitalPosition':
            return self.createOrbPos(feraw)
        elif self.type == 'TunerType':
            return self.createTunerType(feraw)
        elif self.type == 'TunerSystem':
            return self.createTunerSystem(fedata)
        elif self.type == 'OrbitalPositionOrTunerSystem':
            return self.createOrbPosOrTunerSystem(fedata, feraw)
        elif self.type == 'TerrestrialChannelNumber':
            return self.createChannelNumber(fedata, feraw)
        else:
            return _('invalid type')

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()
        if not info:
            return False
        else:
            request_caid = None
            for x in self.ca_table:
                if x[0] == self.type:
                    request_caid = x[1]
                    request_selected = x[2]
                    break

            if request_caid is None:
                return False
            if info.getInfo(iServiceInformation.sIsCrypted) != 1:
                return False
            data = self.ecmdata.getEcmData()
            if data is None:
                return False
            current_caid = data[1]
            available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
            for caid_entry in self.caid_data:
                if caid_entry[3] == request_caid:
                    if request_selected:
                        if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(caid_entry[1], 16):
                            return True
                    else:
                        try:
                            for caid in available_caids:
                                if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
                                    return True

                        except:
                            pass

            return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
        return
Example #30
0
class PliExtraInfo(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (("0x100", "0x1ff", "Seca", "S",
                           True), ("0x500", "0x5ff", "Via", "V", True),
                          ("0x600", "0x6ff", "Irdeto", "I",
                           True), ("0x900", "0x9ff", "NDS", "Nd", True),
                          ("0xb00", "0xbff", "Conax", "Co",
                           True), ("0xd00", "0xdff", "CryptoW", "Cw", True),
                          ("0xe00", "0xeff", "PowerVU", "P",
                           False), ("0x1700", "0x17ff", "Beta", "B", True),
                          ("0x1800", "0x18ff", "Nagra", "N",
                           True), ("0x2600", "0x2600", "Biss", "Bi", False),
                          ("0x4ae0", "0x4ae1", "Dre", "D",
                           False), ("0x4aee", "0x4aee", "BulCrypt", "B1",
                                    False), ("0x5581", "0x5581", "BulCrypt",
                                             "B2", False))
        self.ca_table = (
            ("CryptoCaidSecaAvailable", "S", False),
            ("CryptoCaidViaAvailable", "V", False),
            ("CryptoCaidIrdetoAvailable", "I", False),
            ("CryptoCaidNDSAvailable", "Nd", False),
            ("CryptoCaidConaxAvailable", "Co", False),
            ("CryptoCaidCryptoWAvailable", "Cw", False),
            ("CryptoCaidPowerVUAvailable", "P", False),
            ("CryptoCaidBetaAvailable", "B", False),
            ("CryptoCaidNagraAvailable", "N", False),
            ("CryptoCaidBissAvailable", "Bi", False),
            ("CryptoCaidDreAvailable", "D", False),
            ("CryptoCaidBulCrypt1Available", "B1", False),
            ("CryptoCaidBulCrypt2Available", "B2", False),
            ("CryptoCaidSecaSelected", "S", True),
            ("CryptoCaidViaSelected", "V", True),
            ("CryptoCaidIrdetoSelected", "I", True),
            ("CryptoCaidNDSSelected", "Nd", True),
            ("CryptoCaidConaxSelected", "Co", True),
            ("CryptoCaidCryptoWSelected", "Cw", True),
            ("CryptoCaidPowerVUSelected", "P", True),
            ("CryptoCaidBetaSelected", "B", True),
            ("CryptoCaidNagraSelected", "N", True),
            ("CryptoCaidBissSelected", "Bi", True),
            ("CryptoCaidDreSelected", "D", True),
            ("CryptoCaidBulCrypt1Selected", "B1", True),
            ("CryptoCaidBulCrypt2Selected", "B2", True),
        )
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None

    def getCryptoInfo(self, info):
        if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ""
            self.current_caid = "0"
            self.current_provid = "0"
            self.current_ecmpid = "0"

    def createCryptoBar(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(
                    self.current_caid, 16) <= int(caid_entry[1], 16):
                color = "\c0000??00"
            else:
                color = "\c007?7?7?"
                try:
                    for caid in available_caids:
                        if caid >= int(caid_entry[0], 16) and caid <= int(
                                caid_entry[1], 16):
                            color = "\c00????00"
                except:
                    pass

            if color != "\c007?7?7?" or caid_entry[4]:
                if res: res += " "
                res += color + caid_entry[3]

        res += "\c00??????"
        return res

    def createCryptoSeca(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x100', 16) and int(
                self.current_caid, 16) <= int('0x1ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0x100', 16) and caid <= int('0x1ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'S'
        res += "\c00??????"
        return res

    def createCryptoVia(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x500', 16) and int(
                self.current_caid, 16) <= int('0x5ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0x500', 16) and caid <= int('0x5ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'V'
        res += "\c00??????"
        return res

    def createCryptoIrdeto(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x600', 16) and int(
                self.current_caid, 16) <= int('0x6ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0x600', 16) and caid <= int('0x6ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'I'
        res += "\c00??????"
        return res

    def createCryptoNDS(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x900', 16) and int(
                self.current_caid, 16) <= int('0x9ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0x900', 16) and caid <= int('0x9ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'NDS'
        res += "\c00??????"
        return res

    def createCryptoConax(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0xb00', 16) and int(
                self.current_caid, 16) <= int('0xbff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0xb00', 16) and caid <= int('0xbff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'CO'
        res += "\c00??????"
        return res

    def createCryptoCryptoW(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0xd00', 16) and int(
                self.current_caid, 16) <= int('0xdff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0xd00', 16) and caid <= int('0xdff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'CW'
        res += "\c00??????"
        return res

    def createCryptoPowerVU(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0xe00', 16) and int(
                self.current_caid, 16) <= int('0xeff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0xe00', 16) and caid <= int('0xeff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'P'
        res += "\c00??????"
        return res

    def createCryptoBeta(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x1700', 16) and int(
                self.current_caid, 16) <= int('0x17ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0x1700', 16) and caid <= int('0x17ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'B'
        res += "\c00??????"
        return res

    def createCryptoNagra(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x1800', 16) and int(
                self.current_caid, 16) <= int('0x18ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0x1800', 16) and caid <= int('0x18ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'N'
        res += "\c00??????"
        return res

    def createCryptoBiss(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x2600', 16) and int(
                self.current_caid, 16) <= int('0x26ff', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0x2600', 16) and caid <= int('0x26ff', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'BI'
        res += "\c00??????"
        return res

    def createCryptoDre(self, info):
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
        if int(self.current_caid, 16) >= int('0x4ae0', 16) and int(
                self.current_caid, 16) <= int('0x4ae1', 16):
            color = "\c004c7d3f"
        else:
            color = "\c009?9?9?"
            try:
                for caid in available_caids:
                    if caid >= int('0x4ae0', 16) and caid <= int('0x4ae1', 16):
                        color = "\c00eeee00"
            except:
                pass
        res = color + 'DC'
        res += "\c00??????"
        return res

    def createCryptoSpecial(self, info):
        caid_name = "FTA"
        try:
            for caid_entry in self.caid_data:
                if int(self.current_caid,
                       16) >= int(caid_entry[0], 16) and int(
                           self.current_caid, 16) <= int(caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break
            return caid_name + ":%04x:%04x:%04x:%04x" % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(
                    iServiceInformation.sSID), int(self.current_ecmpid, 16))
        except:
            pass
        return ""

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ""
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ("i", "p", "",
                " ")[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        if int(fps) <= 0:
            fps = ""
        return str(xres) + "x" + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return ("MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM",
                "")[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        if vpid < 0: vpid = 0
        if apid < 0: apid = 0
        if pcrpid < 0: pcrpid = 0
        if sidpid < 0: sidpid = 0
        return "Pids:%04d:%04d:%04d:%05d" % (vpid, apid, pcrpid, sidpid)

    def createTransponderInfo(self, fedata, feraw):
        return addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata)) \
         + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) \
         + self.createOrbPos(feraw)

    def createFrequency(self, feraw):
        frequency = feraw.get("frequency")
        if frequency:
            return str(frequency)
        return ""

    def createSymbolRate(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            bandwidth = fedata.get("bandwidth")
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get("symbol_rate")
            if symbolrate:
                return str(symbolrate)
        return ""

    def createPolarization(self, fedata):
        polarization = fedata.get("polarization_abbreviation")
        if polarization:
            return polarization
        return ""

    def createFEC(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            code_rate_lp = fedata.get("code_rate_lp")
            code_rate_hp = fedata.get("code_rate_hp")
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + "-" + code_rate_hp
        else:
            fec = fedata.get("fec_inner")
            if fec:
                return fec
        return ""

    def createModulation(self, fedata):
        if fedata.get("tuner_type") == _("Terrestrial"):
            constellation = fedata.get("constellation")
            if constellation:
                return constellation
        else:
            modulation = fedata.get("modulation")
            if modulation:
                return modulation
        return ""

    def createTunerType(self, feraw):
        tunertype = feraw.get("tuner_type")
        if tunertype:
            return tunertype
        return ""

    def createTunerSystem(self, fedata):
        tunersystem = fedata.get("system")
        if tunersystem:
            return tunersystem
        return ""

    def createOrbPos(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
        elif orbpos > 0:
            return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
        return ""

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not "":
            return orbpos
        return self.createTunerSystem(fedata)

    def createTransponderName(self, feraw):
        orb_pos = ""
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            if orbpos == 3590:
                orb_pos = 'Thor/Intelsat'
            elif orbpos == 3560:
                orb_pos = 'Amos (4'
            elif orbpos == 3550:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3530:
                orb_pos = 'Nilesat/Atlantic Bird'
            elif orbpos == 3520:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3475:
                orb_pos = 'Atlantic Bird'
            elif orbpos == 3460:
                orb_pos = 'Express'
            elif orbpos == 3450:
                orb_pos = 'Telstar'
            elif orbpos == 3420:
                orb_pos = 'Intelsat'
            elif orbpos == 3380:
                orb_pos = 'Nss'
            elif orbpos == 3355:
                orb_pos = 'Intelsat'
            elif orbpos == 3325:
                orb_pos = 'Intelsat'
            elif orbpos == 3300:
                orb_pos = 'Hispasat'
            elif orbpos == 3285:
                orb_pos = 'Intelsat'
            elif orbpos == 3170:
                orb_pos = 'Intelsat'
            elif orbpos == 3150:
                orb_pos = 'Intelsat'
            elif orbpos == 3070:
                orb_pos = 'Intelsat'
            elif orbpos == 3045:
                orb_pos = 'Intelsat'
            elif orbpos == 3020:
                orb_pos = 'Intelsat 9'
            elif orbpos == 2990:
                orb_pos = 'Amazonas'
            elif orbpos == 2900:
                orb_pos = 'Star One'
            elif orbpos == 2880:
                orb_pos = 'AMC 6 (72'
            elif orbpos == 2875:
                orb_pos = 'Echostar 6'
            elif orbpos == 2860:
                orb_pos = 'Horizons'
            elif orbpos == 2810:
                orb_pos = 'AMC5'
            elif orbpos == 2780:
                orb_pos = 'NIMIQ 4'
            elif orbpos == 2690:
                orb_pos = 'NIMIQ 1'
            elif orbpos == 3592:
                orb_pos = 'Thor/Intelsat'
            elif orbpos == 2985:
                orb_pos = 'Echostar 3,12'
            elif orbpos == 2830:
                orb_pos = 'Echostar 8'
            elif orbpos == 2630:
                orb_pos = 'Galaxy 19'
            elif orbpos == 2500:
                orb_pos = 'Echostar 10,11'
            elif orbpos == 2502:
                orb_pos = 'DirectTV 5'
            elif orbpos == 2410:
                orb_pos = 'Echostar 7 Anik F3'
            elif orbpos == 2391:
                orb_pos = 'Galaxy 23'
            elif orbpos == 2390:
                orb_pos = 'Echostar 9'
            elif orbpos == 2412:
                orb_pos = 'DirectTV 7S'
            elif orbpos == 2310:
                orb_pos = 'Galaxy 27'
            elif orbpos == 2311:
                orb_pos = 'Ciel 2'
            elif orbpos == 2120:
                orb_pos = 'Echostar 2'
            else:
                orb_pos = str((float(3600 - orbpos)) / 10.0) + "W"
        elif orbpos > 0:
            if orbpos == 192:
                orb_pos = 'Astra 1F'
            elif orbpos == 130:
                orb_pos = 'Hot Bird 6,7A,8'
            elif orbpos == 235:
                orb_pos = 'Astra 1E'
            elif orbpos == 1100:
                orb_pos = 'BSat 1A,2A'
            elif orbpos == 1101:
                orb_pos = 'N-Sat 110'
            elif orbpos == 1131:
                orb_pos = 'KoreaSat 5'
            elif orbpos == 1440:
                orb_pos = 'SuperBird 7,C2'
            elif orbpos == 1006:
                orb_pos = 'AsiaSat 2'
            elif orbpos == 1030:
                orb_pos = 'Express A2'
            elif orbpos == 1056:
                orb_pos = 'Asiasat 3S'
            elif orbpos == 1082:
                orb_pos = 'NSS 11'
            elif orbpos == 881:
                orb_pos = 'ST1'
            elif orbpos == 900:
                orb_pos = 'Yamal 201'
            elif orbpos == 917:
                orb_pos = 'Mesat'
            elif orbpos == 950:
                orb_pos = 'Insat 4B'
            elif orbpos == 951:
                orb_pos = 'NSS 6'
            elif orbpos == 765:
                orb_pos = 'Telestar'
            elif orbpos == 785:
                orb_pos = 'ThaiCom 5'
            elif orbpos == 800:
                orb_pos = 'Express'
            elif orbpos == 830:
                orb_pos = 'Insat 4A'
            elif orbpos == 850:
                orb_pos = 'Intelsat 709'
            elif orbpos == 750:
                orb_pos = 'Abs'
            elif orbpos == 720:
                orb_pos = 'Intelsat'
            elif orbpos == 705:
                orb_pos = 'Eutelsat W5'
            elif orbpos == 685:
                orb_pos = 'Intelsat'
            elif orbpos == 620:
                orb_pos = 'Intelsat 902'
            elif orbpos == 600:
                orb_pos = 'Intelsat 904'
            elif orbpos == 570:
                orb_pos = 'Nss'
            elif orbpos == 530:
                orb_pos = 'Express AM22'
            elif orbpos == 480:
                orb_pos = 'Eutelsat 2F2'
            elif orbpos == 450:
                orb_pos = 'Intelsat'
            elif orbpos == 420:
                orb_pos = 'Turksat 2A'
            elif orbpos == 400:
                orb_pos = 'Express AM1'
            elif orbpos == 390:
                orb_pos = 'Hellas Sat 2'
            elif orbpos == 380:
                orb_pos = 'Paksat 1'
            elif orbpos == 360:
                orb_pos = 'Eutelsat Sesat'
            elif orbpos == 335:
                orb_pos = 'Astra 1M'
            elif orbpos == 330:
                orb_pos = 'Eurobird 3'
            elif orbpos == 328:
                orb_pos = 'Galaxy 11'
            elif orbpos == 315:
                orb_pos = 'Astra 5A'
            elif orbpos == 310:
                orb_pos = 'Turksat'
            elif orbpos == 305:
                orb_pos = 'Arabsat'
            elif orbpos == 285:
                orb_pos = 'Eurobird 1'
            elif orbpos == 284:
                orb_pos = 'Eurobird/Astra'
            elif orbpos == 282:
                orb_pos = 'Eurobird/Astra'
            elif orbpos == 1220:
                orb_pos = 'AsiaSat'
            elif orbpos == 1380:
                orb_pos = 'Telstar 18'
            elif orbpos == 260:
                orb_pos = 'Badr 3/4'
            elif orbpos == 255:
                orb_pos = 'Eurobird 2'
            elif orbpos == 215:
                orb_pos = 'Eutelsat'
            elif orbpos == 216:
                orb_pos = 'Eutelsat W6'
            elif orbpos == 210:
                orb_pos = 'AfriStar 1'
            elif orbpos == 160:
                orb_pos = 'Eutelsat W2'
            elif orbpos == 100:
                orb_pos = 'Eutelsat W1'
            elif orbpos == 90:
                orb_pos = 'Eurobird 9'
            elif orbpos == 70:
                orb_pos = 'Eutelsat W3A'
            elif orbpos == 50:
                orb_pos = 'Sirius 4'
            elif orbpos == 48:
                orb_pos = 'Sirius 4'
            elif orbpos == 30:
                orb_pos = 'Telecom 2'
            else:
                orb_pos = str((float(orbpos)) / 10.0) + "E"
        return orb_pos

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):

        service = self.source.service
        if service is None:
            return ""
        info = service and service.info()

        if not info:
            return ""

        if self.type == "CryptoInfo":
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)

        if self.type == "CryptoBar":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBar(info)
            else:
                return ""

        if self.type == "CryptoSeca":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSeca(info)
            else:
                return ""

        if self.type == "CryptoVia":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoVia(info)
            else:
                return ""

        if self.type == "CryptoIrdeto":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoIrdeto(info)
            else:
                return ""

        if self.type == "CryptoNDS":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNDS(info)
            else:
                return ""

        if self.type == "CryptoConax":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoConax(info)
            else:
                return ""

        if self.type == "CryptoCryptoW":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoCryptoW(info)
            else:
                return ""

        if self.type == "CryptoBeta":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBeta(info)
            else:
                return ""

        if self.type == "CryptoNagra":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoNagra(info)
            else:
                return ""

        if self.type == "CryptoBiss":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoBiss(info)
            else:
                return ""

        if self.type == "CryptoDre":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoDre(info)
            else:
                return ""

        if self.type == "CryptoSpecial":
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                self.getCryptoInfo(info)
                return self.createCryptoSpecial(info)
            else:
                return ""

        if self.type == "ResolutionString":
            return self.createResolution(info)

        if self.type == "VideoCodec":
            return self.createVideoCodec(info)

        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(True)
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)

        feraw = self.feraw
        fedata = self.fedata

        if not feraw or not fedata:
            return ""

        if self.type == "All":
            self.getCryptoInfo(info)
            if int(config.usage.show_cryptoinfo.getValue()) > 0:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + "\n"\
                + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n"\
                + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + "\n" \
                + addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
                + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "ServiceInfo":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
            + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) \
            + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "TransponderInfo2line":
            return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) +  addspace(self.createTransponderName(feraw)) + '\n'\
            + addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
            + addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))

        if self.type == "TransponderInfo":
            return self.createTransponderInfo(fedata, feraw)

        if self.type == "TransponderFrequency":
            return self.createFrequency(feraw)

        if self.type == "TransponderSymbolRate":
            return self.createSymbolRate(fedata, feraw)

        if self.type == "TransponderPolarization":
            return self.createPolarization(fedata)

        if self.type == "TransponderFEC":
            return self.createFEC(fedata, feraw)

        if self.type == "TransponderModulation":
            return self.createModulation(fedata)

        if self.type == "OrbitalPosition":
            return self.createOrbPos(feraw)

        if self.type == "TunerType":
            return self.createTunerType(feraw)

        if self.type == "TunerSystem":
            return self.createTunerSystem(fedata)

        if self.type == "OrbitalPositionOrTunerSystem":
            return self.createOrbPosOrTunerSystem(fedata, feraw)

        if self.type == "PIDInfo":
            return self.createPIDInfo(info)

        return _("invalid type")

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()

        if not info:
            return False

        request_caid = None
        for x in self.ca_table:
            if x[0] == self.type:
                request_caid = x[1]
                request_selected = x[2]
                break

        if request_caid is None:
            return False

        if info.getInfo(iServiceInformation.sIsCrypted) != 1:
            return False

        data = self.ecmdata.getEcmData()

        if data is None:
            return False

        current_caid = data[1]

        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if caid_entry[3] == request_caid:
                if (request_selected):
                    if int(current_caid, 16) >= int(caid_entry[0], 16) and int(
                            current_caid, 16) <= int(caid_entry[1], 16):
                        return True
                else:  # request available
                    try:
                        for caid in available_caids:
                            if caid >= int(caid_entry[0], 16) and caid <= int(
                                    caid_entry[1], 16):
                                return True
                    except:
                        pass

        return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)
Example #31
0
class pliExpertInfo(Poll, Converter, object):
    SMART_LABEL = 0
    SMART_INFO_H = 1
    SMART_INFO_V = 2
    SERVICE_INFO = 3
    CRYPTO_INFO = 4
    FREQUENCY_INFO = 5

    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = {'ShowMe': self.SMART_LABEL,
         'ExpertInfo': self.SMART_INFO_H,
         'ExpertInfoVertical': self.SMART_INFO_V,
         'ServiceInfo': self.SERVICE_INFO,
         'CryptoInfo': self.CRYPTO_INFO,
         'FrequencyInfo': self.FREQUENCY_INFO}[type]
        self.poll_interval = 1000
        self.poll_enabled = True
        self.idnames = (('0x100', '0x1FF', 'Seca', 'S'),
         ('0x500', '0x5FF', 'Via', 'V'),
         ('0x600', '0x6FF', 'Irdeto', 'I'),
         ('0x900', '0x9FF', 'NDS', 'Nd'),
         ('0xB00', '0xBFF', 'Conax', 'Co'),
         ('0xD00', '0xDFF', 'CryptoW', 'Cw'),
         ('0x1700', '0x17FF', 'Beta', 'B'),
         ('0x1800', '0x18FF', 'Nagra', 'N'))
        self.ecmdata = GetEcmInfo()

    @cached
    def getText(self):
        service = self.source.service
        try:
            info = service and service.info()
        except:
            try:
                info = eServiceCenter.getInstance().info(service)
            except:
                pass

        if not info:
            return ''
        else:
            Ret_Text = ''
            Sec_Text = ''
            Res_Text = ''
            showCryptoInfo = False
            if self.type == self.SMART_INFO_H or self.type == self.SERVICE_INFO or self.type == self.CRYPTO_INFO or self.type == self.FREQUENCY_INFO:
                sep = '  '
                sep2 = ' - '
            elif self.type == self.SMART_INFO_V:
                sep = '\n'
                sep2 = '\n'
            else:
                return ''
            if self.type == self.FREQUENCY_INFO:
                try:
                    feinfo = service and service.frontendInfo()
                    prvd = info.getInfoString(iServiceInformation.sProvider)
                    Ret_Text = self.short(prvd)
                    frontendDataOrg = feinfo and feinfo.getAll(True)
                except:
                    try:
                        frontendDataOrg = info.getInfoObject(service, iServiceInformation.sTransponderData)
                        prvd = info.getInfoString(service, iServiceInformation.sProvider)
                    except:
                        pass

                if frontendDataOrg is not None:
                    frontendData = ConvertToHumanReadable(frontendDataOrg)
                    if frontendDataOrg.get('tuner_type') == 'DVB-S' or frontendDataOrg.get('tuner_type') == 'DVB-C':
                        frequency = str(frontendData.get('frequency') / 1000) + ' MHz'
                        symbolrate = str(frontendData.get('symbol_rate') / 1000)
                        fec_inner = frontendData.get('fec_inner')
                        if frontendDataOrg.get('tuner_type') == 'DVB-S':
                            Ret_Text += sep + frontendData.get('system')
                            orbital_pos = int(frontendDataOrg['orbital_position'])
                            if orbital_pos > 1800:
                                if orbital_pos == 3590:
                                    orb_pos = 'Thor/Intelsat'
                                elif orbital_pos == 3560:
                                    orb_pos = 'Amos (4'
                                elif orbital_pos == 3550:
                                    orb_pos = 'Atlantic Bird'
                                elif orbital_pos == 3530:
                                    orb_pos = 'Nilesat/Atlantic Bird'
                                elif orbital_pos == 3520:
                                    orb_pos = 'Atlantic Bird'
                                elif orbital_pos == 3475:
                                    orb_pos = 'Atlantic Bird'
                                elif orbital_pos == 3460:
                                    orb_pos = 'Express'
                                elif orbital_pos == 3450:
                                    orb_pos = 'Telstar'
                                elif orbital_pos == 3420:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3380:
                                    orb_pos = 'Nss'
                                elif orbital_pos == 3355:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3325:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3300:
                                    orb_pos = 'Hispasat'
                                elif orbital_pos == 3285:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3170:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3150:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3070:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3045:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 3020:
                                    orb_pos = 'Intelsat 9'
                                elif orbital_pos == 2990:
                                    orb_pos = 'Amazonas'
                                elif orbital_pos == 2900:
                                    orb_pos = 'Star One'
                                elif orbital_pos == 2880:
                                    orb_pos = 'AMC 6 (72'
                                elif orbital_pos == 2875:
                                    orb_pos = 'Echostar 6'
                                elif orbital_pos == 2860:
                                    orb_pos = 'Horizons'
                                elif orbital_pos == 2810:
                                    orb_pos = 'AMC5'
                                elif orbital_pos == 2780:
                                    orb_pos = 'NIMIQ 4'
                                elif orbital_pos == 2690:
                                    orb_pos = 'NIMIQ 1'
                                elif orbital_pos == 3592:
                                    orb_pos = 'Thor/Intelsat'
                                elif orbital_pos == 2985:
                                    orb_pos = 'Echostar 3,12'
                                elif orbital_pos == 2830:
                                    orb_pos = 'Echostar 8'
                                elif orbital_pos == 2630:
                                    orb_pos = 'Galaxy 19'
                                elif orbital_pos == 2500:
                                    orb_pos = 'Echostar 10,11'
                                elif orbital_pos == 2502:
                                    orb_pos = 'DirectTV 5'
                                elif orbital_pos == 2410:
                                    orb_pos = 'Echostar 7 Anik F3'
                                elif orbital_pos == 2391:
                                    orb_pos = 'Galaxy 23'
                                elif orbital_pos == 2390:
                                    orb_pos = 'Echostar 9'
                                elif orbital_pos == 2412:
                                    orb_pos = 'DirectTV 7S'
                                elif orbital_pos == 2310:
                                    orb_pos = 'Galaxy 27'
                                elif orbital_pos == 2311:
                                    orb_pos = 'Ciel 2'
                                elif orbital_pos == 2120:
                                    orb_pos = 'Echostar 2'
                                else:
                                    orb_pos = str(float(3600 - orbital_pos) / 10.0) + 'W'
                            elif orbital_pos > 0:
                                if orbital_pos == 192:
                                    orb_pos = 'Astra 1F'
                                elif orbital_pos == 130:
                                    orb_pos = 'Hot Bird 6,7A,8'
                                elif orbital_pos == 235:
                                    orb_pos = 'Astra 1E'
                                elif orbital_pos == 1100:
                                    orb_pos = 'BSat 1A,2A'
                                elif orbital_pos == 1101:
                                    orb_pos = 'N-Sat 110'
                                elif orbital_pos == 1131:
                                    orb_pos = 'KoreaSat 5'
                                elif orbital_pos == 1440:
                                    orb_pos = 'SuperBird 7,C2'
                                elif orbital_pos == 1006:
                                    orb_pos = 'AsiaSat 2'
                                elif orbital_pos == 1030:
                                    orb_pos = 'Express A2'
                                elif orbital_pos == 1056:
                                    orb_pos = 'Asiasat 3S'
                                elif orbital_pos == 1082:
                                    orb_pos = 'NSS 11'
                                elif orbital_pos == 881:
                                    orb_pos = 'ST1'
                                elif orbital_pos == 900:
                                    orb_pos = 'Yamal 201'
                                elif orbital_pos == 917:
                                    orb_pos = 'Mesat'
                                elif orbital_pos == 950:
                                    orb_pos = 'Insat 4B'
                                elif orbital_pos == 951:
                                    orb_pos = 'NSS 6'
                                elif orbital_pos == 765:
                                    orb_pos = 'Telestar'
                                elif orbital_pos == 785:
                                    orb_pos = 'ThaiCom 5'
                                elif orbital_pos == 800:
                                    orb_pos = 'Express'
                                elif orbital_pos == 830:
                                    orb_pos = 'Insat 4A'
                                elif orbital_pos == 850:
                                    orb_pos = 'Intelsat 709'
                                elif orbital_pos == 750:
                                    orb_pos = 'Abs'
                                elif orbital_pos == 720:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 705:
                                    orb_pos = 'Eutelsat W5'
                                elif orbital_pos == 685:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 620:
                                    orb_pos = 'Intelsat 902'
                                elif orbital_pos == 600:
                                    orb_pos = 'Intelsat 904'
                                elif orbital_pos == 570:
                                    orb_pos = 'Nss'
                                elif orbital_pos == 530:
                                    orb_pos = 'Express AM22'
                                elif orbital_pos == 480:
                                    orb_pos = 'Eutelsat 2F2'
                                elif orbital_pos == 450:
                                    orb_pos = 'Intelsat'
                                elif orbital_pos == 420:
                                    orb_pos = 'Turksat 2A'
                                elif orbital_pos == 400:
                                    orb_pos = 'Express AM1'
                                elif orbital_pos == 390:
                                    orb_pos = 'Hellas Sat 2'
                                elif orbital_pos == 380:
                                    orb_pos = 'Paksat 1'
                                elif orbital_pos == 360:
                                    orb_pos = 'Eutelsat Sesat'
                                elif orbital_pos == 335:
                                    orb_pos = 'Astra 1M'
                                elif orbital_pos == 330:
                                    orb_pos = 'Eurobird 3'
                                elif orbital_pos == 328:
                                    orb_pos = 'Galaxy 11'
                                elif orbital_pos == 315:
                                    orb_pos = 'Astra 5A'
                                elif orbital_pos == 310:
                                    orb_pos = 'Turksat'
                                elif orbital_pos == 305:
                                    orb_pos = 'Arabsat'
                                elif orbital_pos == 285:
                                    orb_pos = 'Eurobird 1'
                                elif orbital_pos == 284:
                                    orb_pos = 'Eurobird/Astra'
                                elif orbital_pos == 282:
                                    orb_pos = 'Eurobird/Astra'
                                elif orbital_pos == 1220:
                                    orb_pos = 'AsiaSat'
                                elif orbital_pos == 1380:
                                    orb_pos = 'Telstar 18'
                                elif orbital_pos == 260:
                                    orb_pos = 'Badr 3/4'
                                elif orbital_pos == 255:
                                    orb_pos = 'Eurobird 2'
                                elif orbital_pos == 215:
                                    orb_pos = 'Eutelsat'
                                elif orbital_pos == 216:
                                    orb_pos = 'Eutelsat W6'
                                elif orbital_pos == 210:
                                    orb_pos = 'AfriStar 1'
                                elif orbital_pos == 160:
                                    orb_pos = 'Eutelsat W2'
                                elif orbital_pos == 100:
                                    orb_pos = 'Eutelsat W1'
                                elif orbital_pos == 90:
                                    orb_pos = 'Eurobird 9'
                                elif orbital_pos == 70:
                                    orb_pos = 'Eutelsat W3A'
                                elif orbital_pos == 50:
                                    orb_pos = 'Sirius 4'
                                elif orbital_pos == 48:
                                    orb_pos = 'Sirius 4'
                                elif orbital_pos == 30:
                                    orb_pos = 'Telecom 2'
                                else:
                                    orb_pos = str(float(orbital_pos) / 10.0) + 'E'
                            Ret_Text += sep + orb_pos + '\n'
                            Ret_Text += frequency + sep + frontendData.get('polarization_abbreviation')
                            Ret_Text += sep + symbolrate
                            Ret_Text += sep + frontendData.get('modulation') + '-' + fec_inner
                        else:
                            Ret_Text += sep + 'DVB-C ' + frequency + ' MHz' + sep + fec_inner + sep + symbolrate
                    elif frontendData.get('tuner_type') == 'DVB-T':
                        frequency = str(frontendData.get('frequency') / 1000) + ' MHz'
                        Ret_Text = 'Frequency: ' + frequency
            if self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.SERVICE_INFO:
                xresol = info.getInfo(iServiceInformation.sVideoWidth)
                yresol = info.getInfo(iServiceInformation.sVideoHeight)
                feinfo = service and service.frontendInfo()
                prvd = info.getInfoString(iServiceInformation.sProvider)
                Ret_Text = self.short(prvd)
                frontendDataOrg = feinfo and feinfo.getAll(True)
                if frontendDataOrg is not None:
                    frontendData = ConvertToHumanReadable(frontendDataOrg)
                    if frontendDataOrg.get('tuner_type') == 'DVB-S' or frontendDataOrg.get('tuner_type') == 'DVB-C':
                        frequency = str(frontendData.get('frequency') / 1000)
                        symbolrate = str(frontendData.get('symbol_rate') / 1000)
                        fec_inner = frontendData.get('fec_inner')
                        if frontendDataOrg.get('tuner_type') == 'DVB-S':
                            Ret_Text += sep + frontendData.get('system')
                            Ret_Text += sep + frequency + frontendData.get('polarization_abbreviation')
                            Ret_Text += sep + symbolrate
                            Ret_Text += sep + fec_inner + ' ' + frontendData.get('modulation')
                            orbital_pos = int(frontendDataOrg['orbital_position'])
                            if orbital_pos > 1800:
                                orb_pos = str(float(3600 - orbital_pos) / 10.0) + 'W'
                            elif orbital_pos > 0:
                                orb_pos = str(float(orbital_pos) / 10.0) + 'E'
                            Ret_Text += sep + orb_pos
                        else:
                            Ret_Text += sep + 'DVB-C ' + frequency + ' MHz' + sep + fec_inner + sep + symbolrate
                    elif frontendDataOrg.get('tuner_type') == 'DVB-T':
                        frequency = str(frontendData.get('frequency') / 1000)
                        Ret_Text += sep + 'DVB-T' + sep + 'Frequency:' + sep + frequency + ' MHz'
                if feinfo is not None and xresol > 0:
                    Res_Text += ('MPEG2 ', 'MPEG4 ', 'MPEG1 ', 'MPEG4-II ', 'VC1 ', 'VC1-SM ', '')[info.getInfo(iServiceInformation.sVideoType)]
                    Res_Text += str(xresol) + 'x' + str(yresol)
                    Res_Text += ('i', 'p', '')[info.getInfo(iServiceInformation.sProgressive)]
                    Res_Text += str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
            if self.type == self.SMART_INFO_H or self.type == self.SMART_INFO_V or self.type == self.CRYPTO_INFO:
                decCI = '0'
                Sec_Text = ''
                if info.getInfo(iServiceInformation.sIsCrypted) == 1:
                    data = self.ecmdata.getEcmData()
                    if not config.usage.show_cryptoinfo.value:
                        showCryptoInfo = True
                        Sec_Text = data[0] + '\n'
                    decCI = data[1]
                    provid = data[2]
                    pid = data[3]
                    if decCI != '0':
                        decCIfull = '%04x' % int(decCI, 16)
                        for idline in self.idnames:
                            if int(decCI, 16) >= int(idline[0], 16) and int(decCI, 16) <= int(idline[1], 16):
                                decCIfull = idline[2] + ':' + decCIfull
                                break

                        Sec_Text += decCIfull
                        if provid != '0':
                            Sec_Text += ':%04x' % int(provid, 16)
                        else:
                            Sec_Text += ':'
                        if pid != '0':
                            Sec_Text += ':%04x:%04x' % (info.getInfo(iServiceInformation.sSID), int(pid, 16))
                elif not config.usage.show_cryptoinfo.value:
                    showCryptoInfo = True
                    Sec_Text = 'FTA'
                res = ''
                searchIDs = info.getInfoObject(iServiceInformation.sCAIDs)
                for idline in self.idnames:
                    if int(decCI, 16) >= int(idline[0], 16) and int(decCI, 16) <= int(idline[1], 16):
                        color = '\\c0000??00'
                    else:
                        color = '\\c007?7?7?'
                        try:
                            for oneID in searchIDs:
                                if oneID >= int(idline[0], 16) and oneID <= int(idline[1], 16):
                                    color = '\\c00????00'

                        except:
                            pass

                    res += color + idline[3] + ' '

                if self.type != self.CRYPTO_INFO:
                    Ret_Text += '\n'
                Ret_Text += res + '\\c00?????? ' + Sec_Text
            if Res_Text != '':
                if showCryptoInfo:
                    Ret_Text += sep + Res_Text
                else:
                    Ret_Text += '\n' + Res_Text
            return Ret_Text

    text = property(getText)

    def changed(self, what):
        Converter.changed(self, what)

    def short(self, langTxt):
        if self.type == self.SMART_INFO_V and len(langTxt) > 23:
            retT = langTxt[:20] + '...'
            return retT
        else:
            return langTxt
Example #32
0
class PliExtraInfo(Poll, Converter, object):
	def __init__(self, type):
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = type
		self.poll_interval = 1000
		self.poll_enabled = True
		self.caid_data = (
			( "0x100",  "0x1ff", "Seca",     "S",  True  ),
			( "0x500",  "0x5ff", "Via",      "V",  True  ),
			( "0x600",  "0x6ff", "Irdeto",   "I",  True  ),
			( "0x900",  "0x9ff", "NDS",      "Nd", True  ),
			( "0xb00",  "0xbff", "Conax",    "Co", True  ),
			( "0xd00",  "0xdff", "CryptoW",  "Cw", True  ),
			( "0xe00",  "0xeff", "PowerVU",  "P",  False ),
			("0x1700", "0x17ff", "Beta",     "B",  True  ),
			("0x1800", "0x18ff", "Nagra",    "N",  True  ),
			("0x2600", "0x2600", "Biss",     "Bi", False ),
			("0x4ae0", "0x4ae1", "Dre",      "D",  False ),
			("0x4aee", "0x4aee", "BulCrypt", "B1", False ),
			("0x5581", "0x5581", "BulCrypt", "B2", False )
		)
		self.ca_table = (
			("CryptoCaidSecaAvailable",	"S",	False),
			("CryptoCaidViaAvailable",	"V",	False),
			("CryptoCaidIrdetoAvailable",	"I",	False),
			("CryptoCaidNDSAvailable",	"Nd",	False),
			("CryptoCaidConaxAvailable",	"Co",	False),
			("CryptoCaidCryptoWAvailable",	"Cw",	False),
			("CryptoCaidPowerVUAvailable",	"P",	False),
			("CryptoCaidBetaAvailable",	"B",	False),
			("CryptoCaidNagraAvailable",	"N",	False),
			("CryptoCaidBissAvailable",	"Bi",	False),
			("CryptoCaidDreAvailable",	"D",	False),
			("CryptoCaidBulCrypt1Available","B1",	False),
			("CryptoCaidBulCrypt2Available","B2",	False),
			("CryptoCaidSecaSelected",	"S",	True),
			("CryptoCaidViaSelected",	"V",	True),
			("CryptoCaidIrdetoSelected",	"I",	True),
			("CryptoCaidNDSSelected",	"Nd",	True),
			("CryptoCaidConaxSelected",	"Co",	True),
			("CryptoCaidCryptoWSelected",	"Cw",	True),
			("CryptoCaidPowerVUSelected",	"P",	True),
			("CryptoCaidBetaSelected",	"B",	True),
			("CryptoCaidNagraSelected",	"N",	True),
			("CryptoCaidBissSelected",	"Bi",	True),
			("CryptoCaidDreSelected",	"D",	True),
			("CryptoCaidBulCrypt1Selected",	"B1",	True),
			("CryptoCaidBulCrypt2Selected",	"B2",	True),
		)
		self.ecmdata = GetEcmInfo()
		self.feraw = self.fedata = self.updateFEdata = None

	def getCryptoInfo(self, info):
		if info.getInfo(iServiceInformation.sIsCrypted) == 1:
			data = self.ecmdata.getEcmData()
			self.current_source = data[0]
			self.current_caid = data[1]
			self.current_provid = data[2]
			self.current_ecmpid = data[3]
		else:
			self.current_source = ""
			self.current_caid = "0"
			self.current_provid = "0"
			self.current_ecmpid = "0"

	def createCryptoBar(self, info):
		res = ""
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
				color="\c0000??00"
			else:
				color = "\c007?7?7?"
				try:
					for caid in available_caids:
						if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
							color="\c00????00"
				except:
					pass

			if color != "\c007?7?7?" or caid_entry[4]:
				if res: res += " "
				res += color + caid_entry[3]

		res += "\c00??????"
		return res

	def createCryptoSeca(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x100', 16) <= int(self.current_caid, 16) <= int('0x1ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x100', 16) <= caid <= int('0x1ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'S'
		res += "\c00??????"
		return res

	def createCryptoVia(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x500', 16) <= int(self.current_caid, 16) <= int('0x5ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x500', 16) <= caid <= int('0x5ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'V'
		res += "\c00??????"
		return res

	def createCryptoIrdeto(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x600', 16) <= int(self.current_caid, 16) <= int('0x6ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x600', 16) <= caid <= int('0x6ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'I'
		res += "\c00??????"
		return res

	def createCryptoNDS(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x900', 16) <= int(self.current_caid, 16) <= int('0x9ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x900', 16) <= caid <= int('0x9ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'NDS'
		res += "\c00??????"
		return res

	def createCryptoConax(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xb00', 16) <= int(self.current_caid, 16) <= int('0xbff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xb00', 16) <= caid <= int('0xbff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'CO'
		res += "\c00??????"
		return res

	def createCryptoCryptoW(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xd00', 16) <= int(self.current_caid, 16) <= int('0xdff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xd00', 16) <= caid <= int('0xdff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'CW'
		res += "\c00??????"
		return res

	def createCryptoPowerVU(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0xe00', 16) <= int(self.current_caid, 16) <= int('0xeff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0xe00', 16) <= caid <= int('0xeff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'P'
		res += "\c00??????"
		return res

	def createCryptoBeta(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1700', 16) <= int(self.current_caid, 16) <= int('0x17ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1700', 16) <= caid <= int('0x17ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'B'
		res += "\c00??????"
		return res

	def createCryptoNagra(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x1800', 16) <= int(self.current_caid, 16) <= int('0x18ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x1800', 16) <= caid <= int('0x18ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'N'
		res += "\c00??????"
		return res

	def createCryptoBiss(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x2600', 16) <= int(self.current_caid, 16) <= int('0x26ff', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x2600', 16) <= caid <= int('0x26ff', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'BI'
		res += "\c00??????"
		return res

	def createCryptoDre(self, info):
		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)
		if int('0x4ae0', 16) <= int(self.current_caid, 16) <= int('0x4ae1', 16):
			color="\c004c7d3f"
		else:
			color = "\c009?9?9?"
			try:
				for caid in available_caids:
					if int('0x4ae0', 16) <= caid <= int('0x4ae1', 16):
						color="\c00eeee00"
			except:
				pass
		res = color + 'DC'
		res += "\c00??????"
		return res

	def createCryptoSpecial(self, info):
		caid_name = "FTA"
		try:
			for caid_entry in self.caid_data:
				if int(caid_entry[0], 16) <= int(self.current_caid, 16) <= int(caid_entry[1], 16):
					caid_name = caid_entry[2]
					break
			return caid_name + ":%04x:%04x:%04x:%04x" % (int(self.current_caid,16), int(self.current_provid,16), info.getInfo(iServiceInformation.sSID), int(self.current_ecmpid,16))
		except:
			pass
		return ""

	def createResolution(self, info):
		xres = info.getInfo(iServiceInformation.sVideoWidth)
		if xres == -1:
			return ""
		yres = info.getInfo(iServiceInformation.sVideoHeight)
		mode = ("i", "p", "", " ")[info.getInfo(iServiceInformation.sProgressive)]
		fps  = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
		if int(fps) <= 0:
			fps = ""
		return str(xres) + "x" + str(yres) + mode + fps

	def createVideoCodec(self, info):
		return ("MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM", "")[info.getInfo(iServiceInformation.sVideoType)]

	def createPIDInfo(self, info):
		vpid = info.getInfo(iServiceInformation.sVideoPID)
		apid = info.getInfo(iServiceInformation.sAudioPID)
		pcrpid = info.getInfo(iServiceInformation.sPCRPID)
		sidpid = info.getInfo(iServiceInformation.sSID)
		tsid = info.getInfo(iServiceInformation.sTSID)
		onid = info.getInfo(iServiceInformation.sONID)
		if vpid < 0 : vpid = 0
		if apid < 0 : apid = 0
		if pcrpid < 0 : pcrpid = 0
		if sidpid < 0 : sidpid = 0
		if tsid < 0 : tsid = 0
		if onid < 0 : onid = 0
		return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid, pcrpid)

	def createTransponderInfo(self, fedata, feraw):
		if not feraw or not fedata:
			return ""
		if "DVB-T" in feraw.get("tuner_type"):
			tmp = addspace(self.createChannelNumber(fedata, feraw)) + self.createFrequency(fedata) + "/" + self.createPolarization(fedata)
		else:
			tmp = addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))
		return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
			+ addspace(self.createModulation(fedata)) + self.createOrbPos(feraw)

	def createFrequency(self, feraw):
		frequency = feraw.get("frequency")
		if frequency:
			return str(frequency)
		return ""

	def createChannelNumber(self, fedata, feraw):
		channel = channelnumbers.getChannelNumber(feraw.get("frequency"), feraw.get("tuner_number"))
		if channel:
			return _("CH") + "%s" % channel
		return ""

	def createSymbolRate(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			bandwidth = fedata.get("bandwidth")
			if bandwidth:
				return bandwidth
		else:
			symbolrate = fedata.get("symbol_rate")
			if symbolrate:
				return str(symbolrate)
		return ""

	def createPolarization(self, fedata):
		polarization = fedata.get("polarization_abbreviation")
		if polarization:
			return polarization
		return ""

	def createFEC(self, fedata, feraw):
		if "DVB-T" in feraw.get("tuner_type"):
			code_rate_lp = fedata.get("code_rate_lp")
			code_rate_hp = fedata.get("code_rate_hp")
			if code_rate_lp and code_rate_hp:
				return code_rate_lp + "-" + code_rate_hp
		else:
			fec = fedata.get("fec_inner")
			if fec:
				return fec
		return ""

	def createModulation(self, fedata):
		if fedata.get("tuner_type") == _("Terrestrial"):
			constellation = fedata.get("constellation")
			if constellation:
				return constellation
		else:
			modulation = fedata.get("modulation")
			if modulation:
				return modulation
		return ""

	def createTunerType(self, feraw):
		tunertype = feraw.get("tuner_type")
		if tunertype:
			return tunertype
		return ""

	def createTunerSystem(self, fedata):
		tunersystem = fedata.get("system")
		if tunersystem:
			return tunersystem
		return ""

	def createOrbPos(self, feraw):
		orbpos = feraw.get("orbital_position")
		if orbpos > 1800:
			return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
		elif orbpos > 0:
			return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
		return ""

	def createOrbPosOrTunerSystem(self, fedata,feraw):
		orbpos = self.createOrbPos(feraw)
		if orbpos is not "":
			return orbpos
		return self.createTunerSystem(fedata)

	def createTransponderName(self,feraw):
		orb_pos = ""
		orbpos = feraw.get("orbital_position")
		if orbpos > 1800:
			if orbpos == 3590:
				orb_pos = 'Thor/Intelsat'
			elif orbpos == 3560:
				orb_pos = 'Amos (4'
			elif orbpos == 3550:
				orb_pos = 'Atlantic Bird'
			elif orbpos == 3530:
				orb_pos = 'Nilesat/Atlantic Bird'
			elif orbpos == 3520:
				orb_pos = 'Atlantic Bird'
			elif orbpos == 3475:
				orb_pos = 'Atlantic Bird'
			elif orbpos == 3460:
				orb_pos = 'Express'
			elif orbpos == 3450:
				orb_pos = 'Telstar'
			elif orbpos == 3420:
				orb_pos = 'Intelsat'
			elif orbpos == 3380:
				orb_pos = 'Nss'
			elif orbpos == 3355:
				orb_pos = 'Intelsat'
			elif orbpos == 3325:
				orb_pos = 'Intelsat'
			elif orbpos == 3300:
				orb_pos = 'Hispasat'
			elif orbpos == 3285:
				orb_pos = 'Intelsat'
			elif orbpos == 3170:
				orb_pos = 'Intelsat'
			elif orbpos == 3150:
				orb_pos = 'Intelsat'
			elif orbpos == 3070:
				orb_pos = 'Intelsat'
			elif orbpos == 3045:
				orb_pos = 'Intelsat'
			elif orbpos == 3020:
				orb_pos = 'Intelsat 9'
			elif orbpos == 2990:
				orb_pos = 'Amazonas'
			elif orbpos == 2900:
				orb_pos = 'Star One'
			elif orbpos == 2880:
				orb_pos = 'AMC 6 (72'
			elif orbpos == 2875:
				orb_pos = 'Echostar 6'
			elif orbpos == 2860:
				orb_pos = 'Horizons'
			elif orbpos == 2810:
				orb_pos = 'AMC5'
			elif orbpos == 2780:
				orb_pos = 'NIMIQ 4'
			elif orbpos == 2690:
				orb_pos = 'NIMIQ 1'
			elif orbpos == 3592:
				orb_pos = 'Thor/Intelsat'
			elif orbpos == 2985:
				orb_pos = 'Echostar 3,12'
			elif orbpos == 2830:
				orb_pos = 'Echostar 8'
			elif orbpos == 2630:
				orb_pos = 'Galaxy 19'
			elif orbpos == 2500:
				orb_pos = 'Echostar 10,11'
			elif orbpos == 2502:
				orb_pos = 'DirectTV 5'
			elif orbpos == 2410:
				orb_pos = 'Echostar 7 Anik F3'
			elif orbpos == 2391:
				orb_pos = 'Galaxy 23'
			elif orbpos == 2390:
				orb_pos = 'Echostar 9'
			elif orbpos == 2412:
				orb_pos = 'DirectTV 7S'
			elif orbpos == 2310:
				orb_pos = 'Galaxy 27'
			elif orbpos == 2311:
				orb_pos = 'Ciel 2'
			elif orbpos == 2120:
				orb_pos = 'Echostar 2'
			else:
				orb_pos = str((float(3600 - orbpos)) / 10.0) + "W"
		elif orbpos > 0:
			if orbpos == 192:
				orb_pos = 'Astra 1F'
			elif orbpos == 130:
				orb_pos = 'Hot Bird 6,7A,8'
			elif orbpos == 235:
				orb_pos = 'Astra 1E'
			elif orbpos == 1100:
				orb_pos = 'BSat 1A,2A'
			elif orbpos == 1101:
				orb_pos = 'N-Sat 110'
			elif orbpos == 1131:
				orb_pos = 'KoreaSat 5'
			elif orbpos == 1440:
				orb_pos = 'SuperBird 7,C2'
			elif orbpos == 1006:
				orb_pos = 'AsiaSat 2'
			elif orbpos == 1030:
				orb_pos = 'Express A2'
			elif orbpos == 1056:
				orb_pos = 'Asiasat 3S'
			elif orbpos == 1082:
				orb_pos = 'NSS 11'
			elif orbpos == 881:
				orb_pos = 'ST1'
			elif orbpos == 900:
				orb_pos = 'Yamal 201'
			elif orbpos == 917:
				orb_pos = 'Mesat'
			elif orbpos == 950:
				orb_pos = 'Insat 4B'
			elif orbpos == 951:
				orb_pos = 'NSS 6'
			elif orbpos == 765:
				orb_pos = 'Telestar'
			elif orbpos == 785:
				orb_pos = 'ThaiCom 5'
			elif orbpos == 800:
				orb_pos = 'Express'
			elif orbpos == 830:
				orb_pos = 'Insat 4A'
			elif orbpos == 850:
				orb_pos = 'Intelsat 709'
			elif orbpos == 750:
				orb_pos = 'Abs'
			elif orbpos == 720:
				orb_pos = 'Intelsat'
			elif orbpos == 705:
				orb_pos = 'Eutelsat W5'
			elif orbpos == 685:
				orb_pos = 'Intelsat'
			elif orbpos == 620:
				orb_pos = 'Intelsat 902'
			elif orbpos == 600:
				orb_pos = 'Intelsat 904'
			elif orbpos == 570:
				orb_pos = 'Nss'
			elif orbpos == 530:
				orb_pos = 'Express AM22'
			elif orbpos == 480:
				orb_pos = 'Eutelsat 2F2'
			elif orbpos == 450:
				orb_pos = 'Intelsat'
			elif orbpos == 420:
				orb_pos = 'Turksat 2A'
			elif orbpos == 400:
				orb_pos = 'Express AM1'
			elif orbpos == 390:
				orb_pos = 'Hellas Sat 2'
			elif orbpos == 380:
				orb_pos = 'Paksat 1'
			elif orbpos == 360:
				orb_pos = 'Eutelsat Sesat'
			elif orbpos == 335:
				orb_pos = 'Astra 1M'
			elif orbpos == 330:
				orb_pos = 'Eurobird 3'
			elif orbpos == 328:
				orb_pos = 'Galaxy 11'
			elif orbpos == 315:
				orb_pos = 'Astra 5A'
			elif orbpos == 310:
				orb_pos = 'Turksat'
			elif orbpos == 305:
				orb_pos = 'Arabsat'
			elif orbpos == 285:
				orb_pos = 'Eurobird 1'
			elif orbpos == 284:
				orb_pos = 'Eurobird/Astra'
			elif orbpos == 282:
				orb_pos = 'Eurobird/Astra'
			elif orbpos == 1220:
				orb_pos = 'AsiaSat'
			elif orbpos == 1380:
				orb_pos = 'Telstar 18'
			elif orbpos == 260:
				orb_pos = 'Badr 3/4'
			elif orbpos == 255:
				orb_pos = 'Eurobird 2'
			elif orbpos == 215:
				orb_pos = 'Eutelsat'
			elif orbpos == 216:
				orb_pos = 'Eutelsat W6'
			elif orbpos == 210:
				orb_pos = 'AfriStar 1'
			elif orbpos == 160:
				orb_pos = 'Eutelsat W2'
			elif orbpos == 100:
				orb_pos = 'Eutelsat W1'
			elif orbpos == 90:
				orb_pos = 'Eurobird 9'
			elif orbpos == 70:
				orb_pos = 'Eutelsat W3A'
			elif orbpos == 50:
				orb_pos = 'Sirius 4'
			elif orbpos == 48:
				orb_pos = 'Sirius 4'
			elif orbpos == 30:
				orb_pos = 'Telecom 2'
			else:
				orb_pos = str((float(orbpos)) / 10.0) + "E"
		return orb_pos

	def createProviderName(self,info):
		return info.getInfoString(iServiceInformation.sProvider)

	@cached
	def getText(self):

		service = self.source.service
		if service is None:
			return ""
		info = service and service.info()

		if not info:
			return ""

		if self.type == "CryptoInfo":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				return addspace(self.createCryptoBar(info)) + self.createCryptoSpecial(info)
			else:
				return addspace(self.createCryptoBar(info)) + addspace(self.current_source) + self.createCryptoSpecial(info)

		if self.type == "CryptoBar":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBar(info)
			else:
				return ""

		if self.type == "CryptoSeca":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoSeca(info)
			else:
				return ""

		if self.type == "CryptoVia":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoVia(info)
			else:
				return ""

		if self.type == "CryptoIrdeto":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoIrdeto(info)
			else:
				return ""

		if self.type == "CryptoNDS":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNDS(info)
			else:
				return ""

		if self.type == "CryptoConax":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoConax(info)
			else:
				return ""

		if self.type == "CryptoCryptoW":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoCryptoW(info)
			else:
				return ""

		if self.type == "CryptoBeta":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBeta(info)
			else:
				return ""

		if self.type == "CryptoNagra":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoNagra(info)
			else:
				return ""

		if self.type == "CryptoBiss":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoBiss(info)
			else:
				return ""

		if self.type == "CryptoDre":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoDre(info)
			else:
				return ""

		if self.type == "CryptoSpecial":
			if int(config.usage.show_cryptoinfo.value) > 0:
				self.getCryptoInfo(info)
				return self.createCryptoSpecial(info)
			else:
				return ""

		if self.type == "ResolutionString":
			return self.createResolution(info)

		if self.type == "VideoCodec":
			return self.createVideoCodec(info)

		if self.updateFEdata:
			feinfo = service.frontendInfo()
			if feinfo:
				self.feraw = feinfo.getAll(config.usage.infobar_frontend_source.value == "settings")
				if self.feraw:
					self.fedata = ConvertToHumanReadable(self.feraw)

		feraw = self.feraw
		fedata = self.fedata

		if not feraw or not fedata:
			return ""

		if self.type == "All":
			self.getCryptoInfo(info)
			if int(config.usage.show_cryptoinfo.value) > 0:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n"\
				+ addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n"\
				+ addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
			else:
				return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata,feraw) + addspace(self.createTransponderName(feraw)) + "\n" \
				+ addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
				+ addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "ServiceInfo":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
			+ addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw)) + addspace(self.createTransponderName(feraw))\
			+ addspace(self.createVideoCodec(info)) + self.createResolution(info)

		if self.type == "TransponderInfo2line":
			return addspace(self.createProviderName(info)) + addspace(self.createTunerSystem(fedata)) + addspace(self.createTransponderName(feraw)) + '\n'\
			+ addspace(self.createFrequency(fedata)) + addspace(self.createPolarization(fedata))\
			+ addspace(self.createSymbolRate(fedata, feraw)) + self.createModulation(fedata) + '-' + addspace(self.createFEC(fedata, feraw))

		if self.type == "TransponderInfo":
			return self.createTransponderInfo(fedata,feraw)

		if self.type == "TransponderFrequency":
			return self.createFrequency(feraw)

		if self.type == "TransponderSymbolRate":
			return self.createSymbolRate(fedata, feraw)

		if self.type == "TransponderPolarization":
			return self.createPolarization(fedata)

		if self.type == "TransponderFEC":
			return self.createFEC(fedata, feraw)

		if self.type == "TransponderModulation":
			return self.createModulation(fedata)

		if self.type == "OrbitalPosition":
			return self.createOrbPos(feraw)

		if self.type == "TunerType":
			return self.createTunerType(feraw)

		if self.type == "TunerSystem":
			return self.createTunerSystem(fedata)

		if self.type == "OrbitalPositionOrTunerSystem":
			return self.createOrbPosOrTunerSystem(fedata,feraw)

		if self.type == "PIDInfo":
			return self.createPIDInfo(info)

		if self.type == "TerrestrialChannelNumber":
			return self.createChannelNumber(fedata, feraw)

		return _("invalid type")

	text = property(getText)

	@cached
	def getBool(self):
		service = self.source.service
		info = service and service.info()

		if not info:
			return False

		request_caid = None
		for x in self.ca_table:
			if x[0] == self.type:
				request_caid = x[1]
				request_selected = x[2]
				break

		if request_caid is None:
			return False

		if info.getInfo(iServiceInformation.sIsCrypted) != 1:
			return False

		data = self.ecmdata.getEcmData()

		if data is None:
			return False

		current_caid	= data[1]

		available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

		for caid_entry in self.caid_data:
			if caid_entry[3] == request_caid:
				if request_selected:
					if int(caid_entry[0], 16) <= int(current_caid, 16) <= int(caid_entry[1], 16):
						return True
				else: # request available
					try:
						for caid in available_caids:
							if int(caid_entry[0], 16) <= caid <= int(caid_entry[1], 16):
								return True
					except:
						pass

		return False

	boolean = property(getBool)

	def changed(self, what):
		if what[0] == self.CHANGED_SPECIFIC:
			self.updateFEdata = False
			if what[1] == iPlayableService.evNewProgramInfo:
				self.updateFEdata = True
			if what[1] == iPlayableService.evEnd:
				self.feraw = self.fedata = None
			Converter.changed(self, what)
		elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
			self.updateFEdata = False
			Converter.changed(self, what)
class PliExtraInfo2(Poll, Converter, object):
    def __init__(self, type):
        Converter.__init__(self, type)
        Poll.__init__(self)
        self.type = type
        self.poll_interval = 1000
        self.poll_enabled = True
        self.caid_data = (("0x100", "0x1ff", "Seca", "S",
                           False), ("0x500", "0x5ff", "Viaccess", "V", False),
                          ("0x600", "0x6ff", "Irdeto", "I",
                           False), ("0x900", "0x9ff", "NDS-Videoguard", "Nd",
                                    False), ("0xb00", "0xbff", "Conax", "Co",
                                             False), ("0xd00", "0xdff",
                                                      "CryptoW", "Cw", False),
                          ("0xe00", "0xeff", "PowerVu", "P",
                           False), ("0x0C00", "0x0C00", "NTL (RAS)", "Ras",
                                    False), ("0x1010", "0x1010", "Tandberg TV",
                                             "Tb", False),
                          ("0x1700", "0x17ff", "Beta", "B",
                           False), ("0x1800", "0x18ff", "Nagravision", "N",
                                    False), ("0x2600", "0x2600", "BISS", "Bi",
                                             False), ("0x2888", "0x2888",
                                                      "Unknown", "Unk", False),
                          ("0x4700", "0x47FF", "General Instrument (Motorola)",
                           "GI", False), ("0x4a00", "0x4a02", "Tongfang", "Tf",
                                          False), ("0x4a67", "0x4a67", "@Sky",
                                                   "Sk", False),
                          ("0x4ac1", "0x4acf", "Latens Systems Ltd", "LtS",
                           False), ("0x4ad0", "0x4ad1", "XCrypt Inc.", "Xc",
                                    False), ("0x4ad2", "0x4ad3", "Beijing DVT",
                                             "Bd", False),
                          ("0x4ae0", "0x4ae1", "DRE-Crypt", "D",
                           False), ("0x4aea", "0x4aea", "CryptoGuard AB", "CG",
                                    False), ("0x4aee", "0x4aee", "BulCrypt",
                                             "B1", False),
                          ("0x4af0", "0x4af0", "Beijing ABVT", "BABVT",
                           False), ("0x4af1", "0x4af1", "China DTV 1", "CDTV",
                                    False), ("0x4af1", "0x4af2", "China DTV 2",
                                             "CDTV", False),
                          ("0x4af4", "0x4af4", "Marlin", "Md",
                           False), ("0x5160", "0x5160", "Unknown", "Unk1",
                                    False), ("0x5581", "0x5581", "BulCrypt",
                                             "B2", False),
                          ("0x5604", "0x5604", "Verimatrix", "Vx",
                           False), ("0x7fff", "0x7fff", "Unknown", "Unk2",
                                    False), ("0xfffe", "0xfffe", "Free to Air",
                                             "FTA", False))
        self.ca_table = (
            ("CryptoCaidSecaAvailable", "S", False),
            ("CryptoCaidViaccessAvailable", "V", False),
            ("CryptoCaidIrdetoAvailable", "I", False),
            ("CryptoCaidNDSAvailable", "Nd", False),
            ("CryptoCaidConaxAvailable", "Co", False),
            ("CryptoCaidCryptoWAvailable", "Cw", False),
            ("CryptoCaidPowerVuAvailable", "P", False),
            ("CryptoCaidBetaAvailable", "B", False),
            ("CryptoCaidNagravisionAvailable", "N", False),
            ("CryptoCaidBISSAvailable", "Bi", False),
            ("CryptoCaidDreAvailable", "D", False),
            ("CryptoCaidCryptoGuard ABAvailable", "CG", False),
            ("CryptoCaidBulCrypt1Available", "B1", False),
            ("CryptoCaidBulCrypt2Available", "B2", False),
            ("CryptoCaid@SkyAvailable", "Sk", False),
            ("CryptoCaidLatens Systems LtdAvailable", "LtS", False),
            ("CryptoCaidXCrypt Inc.Available", "Xc", False),
            ("CryptoCaidBeijing DVTAvailable", "Bd", False),
            ("CryptoCaidNTL (RAS)Available", "Ras", False),
            ("CryptoCaidUnknownAvailabable", "Unk", False),
            ("CryptoCaidUnknownAvailabable", "Unk1", False),
            ("CryptoCaidUnknownAvailabable", "Unk2", False),
            ("CryptoCaidFree to AirAvailable", "FTA", False),
            ("CryptoCaidTongfangAvailable", "Tf", False),
            ("CryptoCaidMarlinAvailable", "Md", False),
            ("CryptoCaidVerimatrixAvailable", "Vx", False),
            ("CryptoCaidBeijing ABVTAvailable", "BABVT", False),
            ("CryptoCaidChina DTV 1Available", "CDTV", False),
            ("CryptoCaidChina DTV 2Available", "CDTV", False),
            ("CryptoCaidGeneral Instrument (Motorola)Available", "GI", False),
            ("CryptoCaidTandberg TVAvailable", "Tb", False),
            ("CryptoCaidSecaSelected", "S", True),
            ("CryptoCaidViaccessSelected", "V", True),
            ("CryptoCaidIrdetoSelected", "I", True),
            ("CryptoCaidNDS-VideoguardSelected", "Nd", True),
            ("CryptoCaidConaxSelected", "Co", True),
            ("CryptoCaidCryptoWSelected", "Cw", True),
            ("CryptoCaidPowerVuSelected", "P", True),
            ("CryptoCaidBetaSelected", "B", True),
            ("CryptoCaidNagravisionSelected", "N", True),
            ("CryptoCaidBISSSelected", "Bi", True),
            ("CryptoCaidDRE-CryptSelected", "D", True),
            ("CryptoCaidCryptoGuard ABSelected", "CG", True),
            ("CryptoCaidBulCrypt1Selected", "B1", True),
            ("CryptoCaidBulCrypt2Selected", "B2", True),
            ("CryptoCaid@SkySelected", "Sk", True),
            ("CryptoCaidLatens Systems LtdSelected", "LtS", True),
            ("CryptoCaidXCrypt Inc.Selected", "Xc", True),
            ("CryptoCaidBeijing DVTSelected", "Bd", True),
            ("CryptoCaidNTL (RAS)Selected", "Ras", True),
            ("CryptoCaidUnknownSelected", "Unk", True),
            ("CryptoCaidUnknownSelected", "Unk1", True),
            ("CryptoCaidUnknownSelected", "Unk2", True),
            ("CryptoCaidFree to AirSelected", "FTA", True),
            ("CryptoCaidTongfangSelected", "Tf", True),
            ("CryptoCaidMarlinSelected", "Md", True),
            ("CryptoCaidVerimatrixSelected", "Vx", True),
            ("CryptoCaidBeijing ABVTSelected", "BABVT", True),
            ("CryptoCaidChina DTV 1Selected", "CDTV", True),
            ("CryptoCaidChina DTV 2Selected", "CDTV", True),
            ("CryptoCaidGeneral Instrument (Motorola)Selected", "GI", True),
            ("CryptoCaidTandberg TVSelected", "Tb", True),
        )
        self.ecmdata = GetEcmInfo()
        self.feraw = self.fedata = self.updateFEdata = None

    def getCryptoInfo(self, info):
        if (info.getInfo(iServiceInformation.sIsCrypted) == 1):
            data = self.ecmdata.getEcmData()
            self.current_source = data[0]
            self.current_caid = data[1]
            self.current_provid = data[2]
            self.current_ecmpid = data[3]
        else:
            self.current_source = ""
            self.current_caid = "fffe"
            self.current_provid = "0"
            self.current_ecmpid = "0"

    def createCryptoBar(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(
                    self.current_caid, 16) <= int(caid_entry[1], 16):
                color = "\c0000??00"
            else:
                color = "\c007?7?7?"
                try:
                    for caid in available_caids:
                        if caid >= int(caid_entry[0], 16) and caid <= int(
                                caid_entry[1], 16):
                            color = "\c00????00"
                except:
                    pass

            if color != "\c007?7?7?" or caid_entry[4]:
                if res: res += ", "
                res += color + caid_entry[2]

        res += "\c00??????"
        return res

    def createCryptoID(self, info):
        res = ""
        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if int(self.current_caid, 16) >= int(caid_entry[0], 16) and int(
                    self.current_caid, 16) <= int(caid_entry[1], 16):
                color = "\c0000??00"
            else:
                color = "\c007?7?7?"
                try:
                    for caid in available_caids:
                        if caid >= int(caid_entry[0], 16) and caid <= int(
                                caid_entry[1], 16):
                            color = "\c00????00"
                except:
                    pass

            if color != "\c007?7?7?" or caid_entry[4]:
                if res: res += ", "
                res += color + "%04x" % (int(self.current_caid, 16))

        res += "\c00??????"
        return res

    def createCryptoSpecial(self, info):
        caid_name = "FTA"
        try:
            for caid_entry in self.caid_data:
                if int(self.current_caid,
                       16) >= int(caid_entry[0], 16) and int(
                           self.current_caid, 16) <= int(caid_entry[1], 16):
                    caid_name = caid_entry[2]
                    break
            return caid_name + ":%04x:%04x:%04x:%04x" % (
                int(self.current_caid, 16), int(self.current_provid, 16),
                info.getInfo(
                    iServiceInformation.sSID), int(self.current_ecmpid, 16))
        except:
            pass
        return ""

    def createResolution(self, info):
        xres = info.getInfo(iServiceInformation.sVideoWidth)
        if xres == -1:
            return ""
        yres = info.getInfo(iServiceInformation.sVideoHeight)
        mode = ("i", "p", " ")[info.getInfo(iServiceInformation.sProgressive)]
        fps = str((info.getInfo(iServiceInformation.sFrameRate) + 500) / 1000)
        return str(xres) + "x" + str(yres) + mode + fps

    def createVideoCodec(self, info):
        return ("MPEG2", "MPEG4", "MPEG1", "MPEG4-II", "VC1", "VC1-SM", "HEVC",
                "")[info.getInfo(iServiceInformation.sVideoType)]

    def createPIDInfo(self, info):
        vpid = info.getInfo(iServiceInformation.sVideoPID)
        apid = info.getInfo(iServiceInformation.sAudioPID)
        pcrpid = info.getInfo(iServiceInformation.sPCRPID)
        sidpid = info.getInfo(iServiceInformation.sSID)
        tsid = info.getInfo(iServiceInformation.sTSID)
        onid = info.getInfo(iServiceInformation.sONID)
        if vpid < 0: vpid = 0
        if apid < 0: apid = 0
        if pcrpid < 0: pcrpid = 0
        if sidpid < 0: sidpid = 0
        if tsid < 0: tsid = 0
        if onid < 0: onid = 0
        return "%d-%d:%05d:%04d:%04d:%04d" % (onid, tsid, sidpid, vpid, apid,
                                              pcrpid)

    def createTransponderInfo(self, fedata, feraw):
        if not feraw:
            return ""
        elif "DVB-T" in feraw.get("tuner_type"):
            tmp = addspace(self.createChannelNumber(fedata, feraw)) + addspace(
                self.createFrequency(feraw)) + addspace(
                    self.createPolarization(fedata))
        else:
            tmp = addspace(self.createFrequency(feraw)) + addspace(
                self.createPolarization(fedata))
        return addspace(self.createTunerSystem(fedata)) + tmp + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) \
         + addspace(self.createModulation(fedata)) + addspace(self.createOrbPos(feraw))

    def createFrequency(self, feraw):
        frequency = feraw.get("frequency")
        if frequency:
            if "DVB-T" in feraw.get("tuner_type"):
                return str(int(frequency / 1000000. + 0.5))
            else:
                return str(int(frequency / 1000 + 0.5))
        return ""

    def createChannelNumber(self, fedata, feraw):
        return "DVB-T" in feraw.get("tuner_type") and fedata.get(
            "channel") or ""

    def createSymbolRate(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            bandwidth = fedata.get("bandwidth")
            if bandwidth:
                return bandwidth
        else:
            symbolrate = fedata.get("symbol_rate")
            if symbolrate:
                return str(symbolrate / 1000)
        return ""

    def createPolarization(self, fedata):
        return fedata.get("polarization_abbreviation") or ""

    def createFEC(self, fedata, feraw):
        if "DVB-T" in feraw.get("tuner_type"):
            code_rate_lp = fedata.get("code_rate_lp")
            code_rate_hp = fedata.get("code_rate_hp")
            if code_rate_lp and code_rate_hp:
                return code_rate_lp + "-" + code_rate_hp
        else:
            fec = fedata.get("fec_inner")
            if fec:
                return fec
        return ""

    def createModulation(self, fedata):
        if fedata.get("tuner_type") == _("Terrestrial"):
            constellation = fedata.get("constellation")
            if constellation:
                return constellation
        else:
            modulation = fedata.get("modulation")
            if modulation:
                return modulation
        return ""

    def createTunerType(self, feraw):
        return feraw.get("tuner_type") or ""

    def createTunerSystem(self, fedata):
        return fedata.get("system") or ""

    def createOrbPos(self, feraw):
        orbpos = feraw.get("orbital_position")
        if orbpos > 1800:
            return str((float(3600 - orbpos)) / 10.0) + "\xc2\xb0 W"
        elif orbpos > 0:
            return str((float(orbpos)) / 10.0) + "\xc2\xb0 E"
        return ""

    def createOrbPosOrTunerSystem(self, fedata, feraw):
        orbpos = self.createOrbPos(feraw)
        if orbpos is not "":
            return orbpos
        return self.createTunerSystem(fedata)

    def createProviderName(self, info):
        return info.getInfoString(iServiceInformation.sProvider)

    @cached
    def getText(self):
        service = self.source.service
        if service is None:
            return ""
        info = service and service.info()

        if not info:
            return ""

        if self.type == "CryptoInfo":
            self.getCryptoInfo(info)
            if config.usage.show_cryptoinfo.value:
                return addspace(self.createCryptoBar(
                    info)) + self.createCryptoSpecial(info)
            else:
                return addspace(self.createCryptoBar(info)) + addspace(
                    self.current_source) + self.createCryptoSpecial(info)

        if self.type == "CryptoID":
            self.getCryptoInfo(info)
            return self.createCryptoID(info)

        if self.type == "CryptoBar":
            self.getCryptoInfo(info)
            return self.createCryptoBar(info)

        if self.type == "CryptoSpecial":
            self.getCryptoInfo(info)
            return self.createCryptoSpecial(info)

        if self.type == "ResolutionString":
            return self.createResolution(info)

        if self.type == "VideoCodec":
            return self.createVideoCodec(info)

        if self.updateFEdata:
            feinfo = service.frontendInfo()
            if feinfo:
                self.feraw = feinfo.getAll(
                    config.usage.infobar_frontend_source.value == "settings")
                if self.feraw:
                    self.fedata = ConvertToHumanReadable(self.feraw)

        feraw = self.feraw
        if not feraw:
            feraw = info.getInfoObject(iServiceInformation.sTransponderData)
            fedata = ConvertToHumanReadable(feraw)
        else:
            fedata = self.fedata

        if self.type == "All":
            self.getCryptoInfo(info)
            if config.usage.show_cryptoinfo.value:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw) + "\n" \
                + addspace(self.createCryptoBar(info)) + addspace(self.createCryptoSpecial(info)) + "\n" \
                + addspace(self.createPIDInfo(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)
            else:
                return addspace(self.createProviderName(info)) + self.createTransponderInfo(fedata, feraw) + "\n" \
                + addspace(self.createCryptoBar(info)) + self.current_source + "\n" \
                + addspace(self.createCryptoSpecial(info)) + addspace(self.createVideoCodec(info)) + self.createResolution(info)

        if self.type == "PIDInfo":
            return self.createPIDInfo(info)

        if not feraw:
            return ""

        if self.type == "ServiceInfo":
            return addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
            + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata))

        if self.type == "ServiceInfo2":
            return addspace(self.createTunerSystem(fedata)) + addspace(self.createFrequency(feraw)) + addspace(self.createPolarization(fedata)) \
            + addspace(self.createSymbolRate(fedata, feraw)) + addspace(self.createFEC(fedata, feraw)) + addspace(self.createModulation(fedata))

        if self.type == "ProviderInfo":
            if self.createProviderName(info) == "":
                return "-"
            else:
                return self.createProviderName(info)

        if self.type == "TransponderInfo":
            return self.createTransponderInfo(fedata, feraw)

        if self.type == "TransponderFrequency":
            return self.createFrequency(feraw)

        if self.type == "TransponderSymbolRate":
            return self.createSymbolRate(fedata, feraw)

        if self.type == "TransponderPolarization":
            return self.createPolarization(fedata)

        if self.type == "TransponderFEC":
            return self.createFEC(fedata, feraw)

        if self.type == "TransponderModulation":
            return self.createModulation(fedata)

        if self.type == "OrbitalPosition":
            return self.createOrbPos(feraw)

        if self.type == "TunerType":
            return self.createTunerType(feraw)

        if self.type == "TunerSystem":
            return self.createTunerSystem(fedata)

        if self.type == "OrbitalPositionOrTunerSystem":
            return self.createOrbPosOrTunerSystem(fedata, feraw)

        if self.type == "TerrestrialChannelNumber":
            return self.createChannelNumber(fedata, feraw)

        return _("invalid type")

    text = property(getText)

    @cached
    def getBool(self):
        service = self.source.service
        info = service and service.info()

        if not info:
            return False

        request_caid = None
        for x in self.ca_table:
            if x[0] == self.type:
                request_caid = x[1]
                request_selected = x[2]
                break

        if request_caid is None:
            return False

        if info.getInfo(iServiceInformation.sIsCrypted) != 1:
            return False

        data = self.ecmdata.getEcmData()

        if data is None:
            return False

        current_caid = data[1]

        available_caids = info.getInfoObject(iServiceInformation.sCAIDs)

        for caid_entry in self.caid_data:
            if caid_entry[3] == request_caid:
                if (request_selected):
                    if int(current_caid, 16) >= int(caid_entry[0], 16) and int(
                            current_caid, 16) <= int(caid_entry[1], 16):
                        return True
                else:  # request available
                    try:
                        for caid in available_caids:
                            if caid >= int(caid_entry[0], 16) and caid <= int(
                                    caid_entry[1], 16):
                                return True
                    except:
                        pass

        return False

    boolean = property(getBool)

    def changed(self, what):
        if what[0] == self.CHANGED_SPECIFIC:
            self.updateFEdata = False
            if what[1] == iPlayableService.evNewProgramInfo:
                self.updateFEdata = True
            if what[1] == iPlayableService.evEnd:
                self.feraw = self.fedata = None
            Converter.changed(self, what)
        elif what[0] == self.CHANGED_POLL and self.updateFEdata is not None:
            self.updateFEdata = False
            Converter.changed(self, what)