b488258b11a822926cb351cc6c9cbb7cf6a213cb
[enigma2.git] / lib / python / Components / Converter / ServicePosition.py
1 from Converter import Converter
2 from Poll import Poll
3 from enigma import iPlayableService
4 from Components.Element import cached
5
6 class ServicePosition(Converter, Poll, object):
7         TYPE_LENGTH = 0
8         TYPE_POSITION = 1
9         TYPE_REMAINING = 2
10         TYPE_GAUGE = 3
11
12         def __init__(self, type):
13                 Poll.__init__(self)
14                 Converter.__init__(self, type)
15
16                 args = type.split(',')
17                 type = args.pop(0)
18
19                 self.negate = 'Negate' in args
20                 self.detailed = 'Detailed' in args
21                 self.showHours = 'ShowHours' in args
22
23                 if self.detailed:
24                         self.poll_interval = 100
25                 else:
26                         self.poll_interval = 500
27
28                 if type == "Length":
29                         self.type = self.TYPE_LENGTH
30                 elif type == "Position":
31                         self.type = self.TYPE_POSITION
32                 elif type == "Remaining":
33                         self.type = self.TYPE_REMAINING
34                 elif type == "Gauge":
35                         self.type = self.TYPE_GAUGE
36                 else:
37                         raise "type must be {Length|Position|Remaining|Gauge} with optional arguments {Negate|Detailed|ShowHours}"
38
39                 self.poll_enabled = self.type != self.TYPE_LENGTH
40
41         def getSeek(self):
42                 s = self.source.service
43                 return s and s.seek()
44
45         @cached
46         def getPosition(self):
47                 seek = self.getSeek()
48                 if seek is None:
49                         return None
50                 pos = seek.getPlayPosition()
51                 if pos[0]:
52                         return 0
53                 return pos[1]
54
55         @cached
56         def getLength(self):
57                 seek = self.getSeek()
58                 if seek is None:
59                         return None
60                 length = seek.getLength()
61                 if length[0]:
62                         return 0
63                 return length[1]
64
65         @cached
66         def getCutlist(self):
67                 service = self.source.service
68                 cue = service and service.cueSheet()
69                 return cue and cue.getCutList()
70
71         @cached
72         def getText(self):
73                 seek = self.getSeek()
74                 if seek is None:
75                         return ""
76                 else:
77                         if self.type == self.TYPE_LENGTH:
78                                 l = self.length
79                         elif self.type == self.TYPE_POSITION:
80                                 l = self.position
81                         elif self.type == self.TYPE_REMAINING:
82                                 l = self.length - self.position
83
84                         if not self.detailed:
85                                 l /= 90000
86
87                         if self.negate: l = -l
88
89                         if l > 0:
90                                 sign = ""
91                         else:
92                                 l = -l
93                                 sign = "-"
94
95                         if not self.detailed:
96                                 if self.showHours:
97                                         return sign + "%d:%02d:%02d" % (l/3600, l%3600/60, l%60)
98                                 else:
99                                         return sign + "%d:%02d" % (l/60, l%60)
100                         else:
101                                 if self.showHours:
102                                         return sign + "%d:%02d:%02d:%03d" % ((l/3600/90000), (l/90000)%3600/60, (l/90000)%60, (l%90000)/90)
103                                 else:
104                                         return sign + "%d:%02d:%03d" % ((l/60/90000), (l/90000)%60, (l%90000)/90)
105
106         # range/value are for the Progress renderer
107         range = 10000
108
109         @cached
110         def getValue(self):
111                 pos = self.position
112                 len = self.length
113                 if pos is None or len is None or len <= 0:
114                         return None
115                 return pos * 10000 / len
116
117         position = property(getPosition)
118         length = property(getLength)
119         cutlist = property(getCutlist)
120         text = property(getText)
121         value = property(getValue)
122
123         def changed(self, what):
124                 cutlist_refresh = what[0] != self.CHANGED_SPECIFIC or what[1] in [iPlayableService.evCuesheetChanged]
125                 time_refresh = what[0] == self.CHANGED_POLL or what[0] == self.CHANGED_SPECIFIC and what[1] in [iPlayableService.evCuesheetChanged]
126
127                 if cutlist_refresh:
128                         if self.type == self.TYPE_GAUGE:
129                                 self.downstream_elements.cutlist_changed()
130
131                 if time_refresh:
132                         self.downstream_elements.changed(what)