X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/77bb53beb46f6984e1529c4f703523c146956d0f..019ba406ed5ba46782951d501ed2d4c0a96e6096:/lib/python/Components/Converter/ServiceInfo.py diff --git a/lib/python/Components/Converter/ServiceInfo.py b/lib/python/Components/Converter/ServiceInfo.py index 413aa191..f0773bf1 100644 --- a/lib/python/Components/Converter/ServiceInfo.py +++ b/lib/python/Components/Converter/ServiceInfo.py @@ -1,5 +1,6 @@ from Components.Converter.Converter import Converter from enigma import iServiceInformation, iPlayableService +from Components.Element import cached class ServiceInfo(Converter, object): HAS_TELETEXT = 0 @@ -7,31 +8,47 @@ class ServiceInfo(Converter, object): IS_CRYPTED = 2 IS_WIDESCREEN = 3 SUBSERVICES_AVAILABLE = 4 + XRES = 5 + YRES = 6 + APID = 7 + VPID = 8 + PCRPID = 9 + PMTPID = 10 + TXTPID = 11 + TSID = 12 + ONID = 13 + SID = 14 + - def __init__(self, type, *args, **kwargs): - Converter.__init__(self) - self.type = { - "HasTelext": self.HAS_TELETEXT, - "IsMultichannel": self.IS_MULTICHANNEL, - "IsCrypted": self.IS_CRYPTED, - "IsWidescreen": self.IS_WIDESCREEN, - "SubservicesAvailable": self.SUBSERVICES_AVAILABLE, + def __init__(self, type): + Converter.__init__(self, type) + self.type, self.interesting_events = { + "HasTelext": (self.HAS_TELETEXT, (iPlayableService.evUpdatedInfo,)), + "IsMultichannel": (self.IS_MULTICHANNEL, (iPlayableService.evUpdatedInfo,)), + "IsCrypted": (self.IS_CRYPTED, (iPlayableService.evUpdatedInfo,)), + "IsWidescreen": (self.IS_WIDESCREEN, (iPlayableService.evVideoSizeChanged,)), + "SubservicesAvailable": (self.SUBSERVICES_AVAILABLE, (iPlayableService.evUpdatedEventInfo,)), + "VideoWidth": (self.XRES, (iPlayableService.evVideoSizeChanged,)), + "VideoHeight": (self.YRES, (iPlayableService.evVideoSizeChanged,)), + "AudioPid": (self.APID, (iPlayableService.evUpdatedInfo,)), + "VideoPid": (self.VPID, (iPlayableService.evUpdatedInfo,)), + "PcrPid": (self.PCRPID, (iPlayableService.evUpdatedInfo,)), + "PmtPid": (self.PMTPID, (iPlayableService.evUpdatedInfo,)), + "TxtPid": (self.TXTPID, (iPlayableService.evUpdatedInfo,)), + "TsId": (self.TSID, (iPlayableService.evUpdatedInfo,)), + "OnId": (self.ONID, (iPlayableService.evUpdatedInfo,)), + "Sid": (self.SID, (iPlayableService.evUpdatedInfo,)), }[type] - self.interesting_events = { - self.HAS_TELETEXT: [iPlayableService.evEnd, iPlayableService.evUpdatedInfo], - self.IS_MULTICHANNEL: [iPlayableService.evUpdatedInfo, iPlayableService.evEnd], - self.IS_CRYPTED: [iPlayableService.evUpdatedInfo, iPlayableService.evEnd], - self.IS_WIDESCREEN: [iPlayableService.evUpdatedEventInfo, iPlayableService.evEnd], - self.SUBSERVICES_AVAILABLE: [iPlayableService.evUpdatedEventInfo, iPlayableService.evEnd] - }[self.type] - - def getServiceInfoValue(self, info, what): + def getServiceInfoString(self, info, what): v = info.getInfo(what) - if v != -2: + if v == -1: return "N/A" - return info.getInfoString(what) + if v == -2: + return info.getInfoString(what) + return "%d" % v + @cached def getBoolean(self): service = self.source.service info = service and service.info() @@ -46,18 +63,71 @@ class ServiceInfo(Converter, object): audio = service.audioTracks() if audio: n = audio.getNumberOfTracks() - for x in range(n): - i = audio.getTrackInfo(x) + idx = 0 + while idx < n: + i = audio.getTrackInfo(idx) description = i.getDescription(); - if description.find("AC3") != -1 or description.find("DTS") != -1: + if "AC3" in description or "DTS" in description: return True + idx += 1 return False elif self.type == self.IS_CRYPTED: return info.getInfo(iServiceInformation.sIsCrypted) == 1 elif self.type == self.IS_WIDESCREEN: - return info.getInfo(iServiceInformation.sAspect) in [3, 4, 7, 8, 0xB, 0xC, 0xF, 0x10] + return info.getInfo(iServiceInformation.sAspect) in (3, 4, 7, 8, 0xB, 0xC, 0xF, 0x10) elif self.type == self.SUBSERVICES_AVAILABLE: subservices = service.subServices() return subservices and subservices.getNumberOfSubservices() > 0 boolean = property(getBoolean) + + @cached + def getText(self): + service = self.source.service + info = service and service.info() + if not info: + return "" + + if self.type == self.XRES: + return self.getServiceInfoString(info, iServiceInformation.sVideoWidth) + elif self.type == self.YRES: + return self.getServiceInfoString(info, iServiceInformation.sVideoHeight) + elif self.type == self.APID: + return self.getServiceInfoString(info, iServiceInformation.sAudioPID) + elif self.type == self.VPID: + return self.getServiceInfoString(info, iServiceInformation.sVideoPID) + elif self.type == self.PCRPID: + return self.getServiceInfoString(info, iServiceInformation.sPCRPID) + elif self.type == self.PMTPID: + return self.getServiceInfoString(info, iServiceInformation.sPMTPID) + elif self.type == self.TXTPID: + return self.getServiceInfoString(info, iServiceInformation.sTXTPID) + elif self.type == self.TSID: + return self.getServiceInfoString(info, iServiceInformation.sTSID) + elif self.type == self.ONID: + return self.getServiceInfoString(info, iServiceInformation.sONID) + elif self.type == self.SID: + return self.getServiceInfoString(info, iServiceInformation.sSID) + return "" + + text = property(getText) + + @cached + def getValue(self): + service = self.source.service + info = service and service.info() + if not info: + return -1 + + if self.type == self.XRES: + return info.getInfo(iServiceInformation.sVideoWidth) + if self.type == self.YRES: + return info.getInfo(iServiceInformation.sVideoHeight) + + return -1 + + value = property(getValue) + + def changed(self, what): + if what[0] != self.CHANGED_SPECIFIC or what[1] in self.interesting_events: + Converter.changed(self, what)