- add opera browser.(with hbbtv)
[vuplus_dvbapp] / lib / python / Components / Converter / ServiceInfo.py
1 from Components.Converter.Converter import Converter
2 from enigma import iServiceInformation, iPlayableService
3 from Components.Element import cached
4
5 class ServiceInfo(Converter, object):
6         HAS_TELETEXT = 0
7         IS_MULTICHANNEL = 1
8         IS_CRYPTED = 2
9         IS_WIDESCREEN = 3
10         SUBSERVICES_AVAILABLE = 4
11         XRES = 5
12         YRES = 6
13         APID = 7
14         VPID = 8
15         PCRPID = 9
16         PMTPID = 10
17         TXTPID = 11
18         TSID = 12
19         ONID = 13
20         SID = 14
21         FRAMERATE = 15
22         TRANSFERBPS = 16
23         HAS_HBBTV = 17  
24
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,)),
46                         }[type]
47
48         def getServiceInfoString(self, info, what, convert = lambda x: "%d" % x):
49                 v = info.getInfo(what)
50                 if v == -1:
51                         return "N/A"
52                 if v == -2:
53                         return info.getInfoString(what)
54                 return convert(v)
55
56         @cached
57         def getBoolean(self):
58                 service = self.source.service
59                 info = service and service.info()
60                 if not info:
61                         return False
62                 
63                 if self.type == self.HAS_TELETEXT:
64                         tpid = info.getInfo(iServiceInformation.sTXTPID)
65                         return tpid != -1
66                 elif self.type == self.IS_MULTICHANNEL:
67                         # FIXME. but currently iAudioTrackInfo doesn't provide more information.
68                         audio = service.audioTracks()
69                         if audio:
70                                 n = audio.getNumberOfTracks()
71                                 idx = 0
72                                 while idx < n:
73                                         i = audio.getTrackInfo(idx)
74                                         description = i.getDescription();
75                                         if "AC3" in description or "DTS" in description or "Dolby Digital" in description:
76                                                 return True
77                                         idx += 1
78                         return False
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) != ""
88
89
90         boolean = property(getBoolean)
91         
92         @cached
93         def getText(self):
94                 service = self.source.service
95                 info = service and service.info()
96                 if not info:
97                         return ""
98
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))
123                 return ""
124
125         text = property(getText)
126
127         @cached
128         def getValue(self):
129                 service = self.source.service
130                 info = service and service.info()
131                 if not info:
132                         return -1
133
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)
140
141                 return -1
142
143         value = property(getValue)
144
145         def changed(self, what):
146                 if what[0] != self.CHANGED_SPECIFIC or what[1] in self.interesting_events:
147                         Converter.changed(self, what)