Merge commit 'origin/master' into tmbinc/FixTimingBugs
[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
14         def __init__(self, type):
15                 Converter.__init__(self, type)
16                 self.type, self.interesting_events = {
17                                 "HasTelext": (self.HAS_TELETEXT, (iPlayableService.evUpdatedInfo,)),
18                                 "IsMultichannel": (self.IS_MULTICHANNEL, (iPlayableService.evUpdatedInfo,)),
19                                 "IsCrypted": (self.IS_CRYPTED, (iPlayableService.evUpdatedInfo,)),
20                                 "IsWidescreen": (self.IS_WIDESCREEN, (iPlayableService.evVideoSizeChanged,)),
21                                 "SubservicesAvailable": (self.SUBSERVICES_AVAILABLE, (iPlayableService.evUpdatedEventInfo,)),
22                                 "VideoWidth": (self.XRES, (iPlayableService.evVideoSizeChanged,)),
23                                 "VideoHeight": (self.YRES, (iPlayableService.evVideoSizeChanged,)),
24                         }[type]
25
26         def getServiceInfoString(self, info, what):
27                 v = info.getInfo(what)
28                 if v == -1:
29                         return "N/A"
30                 if v == -2:
31                         return info.getInfoString(what)
32                 return "%d" % v
33
34         @cached
35         def getBoolean(self):
36                 service = self.source.service
37                 info = service and service.info()
38                 if not info:
39                         return False
40                 
41                 if self.type == self.HAS_TELETEXT:
42                         tpid = info.getInfo(iServiceInformation.sTXTPID)
43                         return tpid != -1
44                 elif self.type == self.IS_MULTICHANNEL:
45                         # FIXME. but currently iAudioTrackInfo doesn't provide more information.
46                         audio = service.audioTracks()
47                         if audio:
48                                 n = audio.getNumberOfTracks()
49                                 idx = 0
50                                 while idx < n:
51                                         i = audio.getTrackInfo(idx)
52                                         description = i.getDescription();
53                                         if "AC3" in description or "DTS" in description:
54                                                 return True
55                                         idx += 1
56                         return False
57                 elif self.type == self.IS_CRYPTED:
58                         return info.getInfo(iServiceInformation.sIsCrypted) == 1
59                 elif self.type == self.IS_WIDESCREEN:
60                         return info.getInfo(iServiceInformation.sAspect) in (3, 4, 7, 8, 0xB, 0xC, 0xF, 0x10)
61                 elif self.type == self.SUBSERVICES_AVAILABLE:
62                         subservices = service.subServices()
63                         return subservices and subservices.getNumberOfSubservices() > 0
64
65         boolean = property(getBoolean)
66         
67         @cached
68         def getText(self):
69                 service = self.source.service
70                 info = service and service.info()
71                 if not info:
72                         return ""
73
74                 if self.type == self.XRES:
75                         return self.getServiceInfoString(info, iServiceInformation.sVideoWidth)
76                 if self.type == self.YRES:
77                         return self.getServiceInfoString(info, iServiceInformation.sVideoHeight)
78                 return ""
79
80         text = property(getText)
81
82         @cached
83         def getValue(self):
84                 service = self.source.service
85                 info = service and service.info()
86                 if not info:
87                         return -1
88
89                 if self.type == self.XRES:
90                         return info.getInfo(iServiceInformation.sVideoWidth)
91                 if self.type == self.YRES:
92                         return info.getInfo(iServiceInformation.sVideoHeight)
93
94                 return -1
95
96         value = property(getValue)
97
98         def changed(self, what):
99                 if what[0] != self.CHANGED_SPECIFIC or what[1] in self.interesting_events:
100                         Converter.changed(self, what)