aboutsummaryrefslogtreecommitdiff
path: root/lib/python/Components/Converter/ServiceInfo.py
blob: 7118025440dac20f2593845adfd0412db7087314 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from Components.Converter.Converter import Converter
from enigma import iServiceInformation, iPlayableService
from Components.Element import cached

class ServiceInfo(Converter, object):
	HAS_TELETEXT = 0
	IS_MULTICHANNEL = 1
	IS_CRYPTED = 2
	IS_WIDESCREEN = 3
	SUBSERVICES_AVAILABLE = 4
	XRES = 5
	YRES = 6

	def __init__(self, type):
		Converter.__init__(self, type)
		self.type = {
				"HasTelext": self.HAS_TELETEXT,
				"IsMultichannel": self.IS_MULTICHANNEL,
				"IsCrypted": self.IS_CRYPTED,
				"IsWidescreen": self.IS_WIDESCREEN,
				"SubservicesAvailable": self.SUBSERVICES_AVAILABLE,
				"VideoWidth": self.XRES,
				"VideoHeight": self.YRES,
			}[type]

		self.interesting_events = {
				self.HAS_TELETEXT: [iPlayableService.evUpdatedInfo],
				self.IS_MULTICHANNEL: [iPlayableService.evUpdatedInfo],
				self.IS_CRYPTED: [iPlayableService.evUpdatedInfo],
				self.IS_WIDESCREEN: [iPlayableService.evVideoSizeChanged],
				self.SUBSERVICES_AVAILABLE: [iPlayableService.evUpdatedEventInfo],
				self.XRES: [iPlayableService.evVideoSizeChanged],
				self.YRES: [iPlayableService.evVideoSizeChanged],
			}[self.type]

	def getServiceInfoString(self, info, what):
		v = info.getInfo(what)
		if v == -1:
			return "N/A"
		if v == -2:
			return info.getInfoString(what)
		return "%d" % v

	@cached
	def getBoolean(self):
		service = self.source.service
		info = service and service.info()
		if not info:
			return False
		
		if self.type == self.HAS_TELETEXT:
			tpid = info.getInfo(iServiceInformation.sTXTPID)
			return tpid != -1
		elif self.type == self.IS_MULTICHANNEL:
			# FIXME. but currently iAudioTrackInfo doesn't provide more information.
			audio = service.audioTracks()
			if audio:
				n = audio.getNumberOfTracks()
				for x in range(n):
					i = audio.getTrackInfo(x)
					description = i.getDescription();
					if description.find("AC3") != -1 or description.find("DTS") != -1:
						return True
			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]
		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)
		if self.type == self.YRES:
			return self.getServiceInfoString(info, iServiceInformation.sVideoHeight)
		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)