1 from Components.Converter.Converter import Converter
2 from enigma import iServiceInformation, iPlayableService
3 from Components.Element import cached
5 class ServiceInfo(Converter, object):
10 SUBSERVICES_AVAILABLE = 4
25 def __init__(self, type):
26 Converter.__init__(self, type)
27 self.type, self.interesting_events = {
28 "HasTelext": (self.HAS_TELETEXT, (iPlayableService.evUpdatedInfo,)),
29 "IsMultichannel": (self.IS_MULTICHANNEL, (iPlayableService.evUpdatedInfo,)),
30 "IsCrypted": (self.IS_CRYPTED, (iPlayableService.evUpdatedInfo,)),
31 "IsWidescreen": (self.IS_WIDESCREEN, (iPlayableService.evVideoSizeChanged,)),
32 "SubservicesAvailable": (self.SUBSERVICES_AVAILABLE, (iPlayableService.evUpdatedEventInfo,)),
33 "VideoWidth": (self.XRES, (iPlayableService.evVideoSizeChanged,)),
34 "VideoHeight": (self.YRES, (iPlayableService.evVideoSizeChanged,)),
35 "AudioPid": (self.APID, (iPlayableService.evUpdatedInfo,)),
36 "VideoPid": (self.VPID, (iPlayableService.evUpdatedInfo,)),
37 "PcrPid": (self.PCRPID, (iPlayableService.evUpdatedInfo,)),
38 "PmtPid": (self.PMTPID, (iPlayableService.evUpdatedInfo,)),
39 "TxtPid": (self.TXTPID, (iPlayableService.evUpdatedInfo,)),
40 "TsId": (self.TSID, (iPlayableService.evUpdatedInfo,)),
41 "OnId": (self.ONID, (iPlayableService.evUpdatedInfo,)),
42 "Sid": (self.SID, (iPlayableService.evUpdatedInfo,)),
43 "Framerate": (self.FRAMERATE, (iPlayableService.evVideoSizeChanged,iPlayableService.evUpdatedInfo,)),
44 "TransferBPS": (self.TRANSFERBPS, (iPlayableService.evUpdatedInfo,)),
45 "HasHBBTV": (self.HAS_HBBTV, (iPlayableService.evUpdatedInfo,iPlayableService.evHBBTVInfo,)),
48 def getServiceInfoString(self, info, what, convert = lambda x: "%d" % x):
49 v = info.getInfo(what)
53 return info.getInfoString(what)
58 service = self.source.service
59 info = service and service.info()
63 if self.type == self.HAS_TELETEXT:
64 tpid = info.getInfo(iServiceInformation.sTXTPID)
66 elif self.type == self.IS_MULTICHANNEL:
67 # FIXME. but currently iAudioTrackInfo doesn't provide more information.
68 audio = service.audioTracks()
70 n = audio.getNumberOfTracks()
73 i = audio.getTrackInfo(idx)
74 description = i.getDescription();
75 if "AC3" in description or "DTS" in description or "Dolby Digital" in description:
79 elif self.type == self.IS_CRYPTED:
80 return info.getInfo(iServiceInformation.sIsCrypted) == 1
81 elif self.type == self.IS_WIDESCREEN:
82 return info.getInfo(iServiceInformation.sAspect) in (3, 4, 7, 8, 0xB, 0xC, 0xF, 0x10)
83 elif self.type == self.SUBSERVICES_AVAILABLE:
84 subservices = service.subServices()
85 return subservices and subservices.getNumberOfSubservices() > 0
86 elif self.type == self.HAS_HBBTV:
87 return info.getInfoString(iServiceInformation.sHBBTVUrl) != ""
90 boolean = property(getBoolean)
94 service = self.source.service
95 info = service and service.info()
99 if self.type == self.XRES:
100 return self.getServiceInfoString(info, iServiceInformation.sVideoWidth)
101 elif self.type == self.YRES:
102 return self.getServiceInfoString(info, iServiceInformation.sVideoHeight)
103 elif self.type == self.APID:
104 return self.getServiceInfoString(info, iServiceInformation.sAudioPID)
105 elif self.type == self.VPID:
106 return self.getServiceInfoString(info, iServiceInformation.sVideoPID)
107 elif self.type == self.PCRPID:
108 return self.getServiceInfoString(info, iServiceInformation.sPCRPID)
109 elif self.type == self.PMTPID:
110 return self.getServiceInfoString(info, iServiceInformation.sPMTPID)
111 elif self.type == self.TXTPID:
112 return self.getServiceInfoString(info, iServiceInformation.sTXTPID)
113 elif self.type == self.TSID:
114 return self.getServiceInfoString(info, iServiceInformation.sTSID)
115 elif self.type == self.ONID:
116 return self.getServiceInfoString(info, iServiceInformation.sONID)
117 elif self.type == self.SID:
118 return self.getServiceInfoString(info, iServiceInformation.sSID)
119 elif self.type == self.FRAMERATE:
120 return self.getServiceInfoString(info, iServiceInformation.sFrameRate, lambda x: "%d fps" % ((x+500)/1000))
121 elif self.type == self.TRANSFERBPS:
122 return self.getServiceInfoString(info, iServiceInformation.sTransferBPS, lambda x: "%d kB/s" % (x/1024))
125 text = property(getText)
129 service = self.source.service
130 info = service and service.info()
134 if self.type == self.XRES:
135 return info.getInfo(iServiceInformation.sVideoWidth)
136 if self.type == self.YRES:
137 return info.getInfo(iServiceInformation.sVideoHeight)
138 if self.type == self.FRAMERATE:
139 return info.getInfo(iServiceInformation.sFrameRate)
143 value = property(getValue)
145 def changed(self, what):
146 if what[0] != self.CHANGED_SPECIFIC or what[1] in self.interesting_events:
147 Converter.changed(self, what)