1 from Screen import Screen
2 from Screens.Setup import getConfigMenuItem
3 from Components.ServiceEventTracker import ServiceEventTracker
4 from Components.ActionMap import NumberActionMap
5 from Components.ConfigList import ConfigListScreen
6 from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
7 from Components.config import config, ConfigSubsection, getConfigListEntry, ConfigNothing, ConfigSelection, ConfigOnOff
8 from Components.Label import Label
9 from Components.MultiContent import MultiContentEntryText
10 from Components.Sources.List import List
11 from Components.Sources.Boolean import Boolean
12 from Components.SystemInfo import SystemInfo
14 from enigma import iPlayableService, eTimer, eSize
16 from Tools.ISO639 import LanguageCodes
17 from Tools.BoundFunction import boundFunction
18 FOCUS_CONFIG, FOCUS_STREAMS = range(2)
19 [PAGE_AUDIO, PAGE_SUBTITLES] = ["audio", "subtitles"]
21 class AudioSelection(Screen, ConfigListScreen):
22 def __init__(self, session, infobar=None, page=PAGE_AUDIO):
23 Screen.__init__(self, session)
25 self["streams"] = List([])
26 self["key_red"] = Boolean(False)
27 self["key_green"] = Boolean(False)
28 self["key_yellow"] = Boolean(True)
29 self["key_blue"] = Boolean(False)
31 ConfigListScreen.__init__(self, [])
32 self.infobar = infobar or self.session.infobar
34 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
36 iPlayableService.evUpdatedInfo: self.__updatedInfo
38 self.cached_subtitle_checked = False
39 self.__selected_subtitle = None
41 self["actions"] = NumberActionMap(["ColorActions", "SetupActions", "DirectionActions"],
44 "green": self.keyGreen,
45 "yellow": self.keyYellow,
48 "cancel": self.cancel,
51 "1": self.keyNumberGlobal,
52 "2": self.keyNumberGlobal,
53 "3": self.keyNumberGlobal,
54 "4": self.keyNumberGlobal,
55 "5": self.keyNumberGlobal,
56 "6": self.keyNumberGlobal,
57 "7": self.keyNumberGlobal,
58 "8": self.keyNumberGlobal,
59 "9": self.keyNumberGlobal,
62 self.settings = ConfigSubsection()
63 choicelist = [(PAGE_AUDIO,_("audio tracks")), (PAGE_SUBTITLES,_("Subtitles"))]
64 self.settings.menupage = ConfigSelection(choices = choicelist, default=page)
65 self.onLayoutFinish.append(self.__layoutFinished)
67 def __layoutFinished(self):
68 self["config"].instance.setSelectionEnable(False)
69 self.focus = FOCUS_STREAMS
70 self.settings.menupage.addNotifier(self.fillList)
72 def fillList(self, arg=None):
77 if self.settings.menupage.getValue() == PAGE_AUDIO:
78 self.setTitle(_("Select audio track"))
79 service = self.session.nav.getCurrentService()
80 self.audioTracks = audio = service and service.audioTracks()
81 n = audio and audio.getNumberOfTracks() or 0
82 if SystemInfo["CanDownmixAC3"]:
83 self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value)
84 self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False)
85 conflist.append(getConfigListEntry(_("Dolby Digital / DTS downmix"), self.settings.downmix))
86 self["key_red"].setBoolean(True)
89 self.audioChannel = service.audioChannel()
91 choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))]
92 self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel()))
93 self.settings.channelmode.addNotifier(self.changeMode, initial_call = False)
94 conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode))
95 self["key_green"].setBoolean(True)
97 conflist.append(('',))
98 self["key_green"].setBoolean(False)
99 selectedAudio = self.audioTracks.getCurrentTrack()
102 i = audio.getTrackInfo(x)
103 languages = i.getLanguage().split('/')
104 description = i.getDescription() or _("<unknown>")
108 if selectedAudio == x:
109 selected = _("Running")
113 for lang in languages:
116 if LanguageCodes.has_key(lang):
117 language += LanguageCodes[lang][0]
124 streams.append((x, "", number, description, language, selected))
128 conflist.append(('',))
129 self["key_green"].setBoolean(False)
131 elif self.settings.menupage.getValue() == PAGE_SUBTITLES:
132 self.setTitle(_("Subtitle selection"))
133 conflist.append(('',))
134 self["key_red"].setBoolean(False)
135 if self.infobar.selected_subtitle:
136 conflist.append(getConfigListEntry(_("Subtitle Quickmenu"), ConfigNothing()))
137 self["key_green"].setBoolean(True)
139 conflist.append(('',))
140 self["key_green"].setBoolean(False)
142 if self.subtitlesEnabled():
143 sel = self.infobar.selected_subtitle
149 subtitlelist = self.getSubtitleList()
151 if len(subtitlelist):
152 for x in subtitlelist:
155 language = _("<unknown>")
159 selected = _("Running")
163 if LanguageCodes.has_key(x[4]):
164 language = LanguageCodes[x[4]][0]
170 number = "%x" % (x[1])
174 number = "%x%02x" % (x[3],x[2])
177 types = (_("<unknown>"), "UTF-8 text", "SSA", "AAS", ".SRT file", "VOB", "PGS (unsupported)")
178 description = types[x[2]]
180 streams.append((x, "", number, description, language, selected))
186 conflist.append(getConfigListEntry(_("Menu"), self.settings.menupage))
188 from Components.PluginComponent import plugins
189 from Plugins.Plugin import PluginDescriptor
191 if hasattr(self.infobar, "runPlugin"):
193 def __init__(self, fnc, *args):
196 def __call__(self, *args, **kwargs):
199 Plugins = [ (p.name, PluginCaller(self.infobar.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ]
202 self["key_blue"].setBoolean(True)
203 conflist.append(getConfigListEntry(Plugins[0][0], ConfigNothing()))
204 self.plugincallfunc = Plugins[0][1]
206 print "plugin(s) installed but not displayed in the dialog box:", Plugins[1:]
208 self["config"].list = conflist
209 self["config"].l.setList(conflist)
211 self["streams"].list = streams
212 self["streams"].setIndex(selectedidx)
214 def __updatedInfo(self):
217 def getSubtitleList(self):
218 s = self.infobar and self.infobar.getCurrentServiceSubtitle()
219 l = s and s.getSubtitleList() or [ ]
222 def subtitlesEnabled(self):
223 return self.infobar.subtitles_enabled
225 def enableSubtitle(self, subtitles):
226 if self.infobar.selected_subtitle != subtitles:
227 self.infobar.subtitles_enabled = False
228 self.infobar.selected_subtitle = subtitles
230 self.infobar.subtitles_enabled = True
232 def changeAC3Downmix(self, downmix):
233 if downmix.getValue() == True:
234 config.av.downmix_ac3.value = True
236 config.av.downmix_ac3.value = False
237 config.av.downmix_ac3.save()
239 def changeMode(self, mode):
240 if mode is not None and self.audioChannel:
241 self.audioChannel.selectChannel(int(mode.getValue()))
243 def changeAudio(self, audio):
245 if isinstance(track, int):
246 if self.session.nav.getCurrentService().audioTracks().getNumberOfTracks() > track:
247 self.audioTracks.selectTrack(track)
250 if self.focus == FOCUS_CONFIG:
251 ConfigListScreen.keyLeft(self)
252 elif self.focus == FOCUS_STREAMS:
253 self["streams"].setIndex(0)
255 def keyRight(self, config = False):
256 if config or self.focus == FOCUS_CONFIG:
257 if self["config"].getCurrentIndex() < 3:
258 if self["config"].getCurrentIndex() == 1 and self.settings.menupage.getValue() == PAGE_SUBTITLES and self.infobar.selected_subtitle:
259 self.session.open(QuickSubtitlesConfigMenu, self.infobar)
261 ConfigListScreen.keyRight(self)
262 elif hasattr(self, "plugincallfunc"):
263 self.plugincallfunc()
264 if self.focus == FOCUS_STREAMS and self["streams"].count() and config == False:
265 self["streams"].setIndex(self["streams"].count()-1)
268 if self["key_red"].getBoolean():
272 if self["key_green"].getBoolean():
276 if self["key_yellow"].getBoolean():
280 if self["key_blue"].getBoolean():
283 def colorkey(self, idx):
284 self["config"].setCurrentIndex(idx)
288 if self.focus == FOCUS_CONFIG:
289 self["config"].instance.moveSelection(self["config"].instance.moveUp)
290 elif self.focus == FOCUS_STREAMS:
291 if self["streams"].getIndex() == 0:
292 self["config"].instance.setSelectionEnable(True)
293 self["streams"].style = "notselected"
294 self["config"].setCurrentIndex(len(self["config"].getList())-1)
295 self.focus = FOCUS_CONFIG
297 self["streams"].selectPrevious()
300 if self.focus == FOCUS_CONFIG:
301 if self["config"].getCurrentIndex() < len(self["config"].getList())-1:
302 self["config"].instance.moveSelection(self["config"].instance.moveDown)
304 self["config"].instance.setSelectionEnable(False)
305 self["streams"].style = "default"
306 self.focus = FOCUS_STREAMS
307 elif self.focus == FOCUS_STREAMS:
308 self["streams"].selectNext()
310 def keyNumberGlobal(self, number):
311 if number <= len(self["streams"].list):
312 self["streams"].setIndex(number-1)
316 if self.focus == FOCUS_STREAMS and self["streams"].list:
317 cur = self["streams"].getCurrent()
318 if self.settings.menupage.getValue() == PAGE_AUDIO and cur[0] is not None:
319 self.changeAudio(cur[0])
321 if self.settings.menupage.getValue() == PAGE_SUBTITLES and cur[0] is not None:
322 if self.infobar.selected_subtitle == cur[0]:
323 self.enableSubtitle(None)
324 selectedidx = self["streams"].getIndex()
326 self["streams"].setIndex(selectedidx)
328 self.enableSubtitle(cur[0])
331 elif self.focus == FOCUS_CONFIG:
337 class SubtitleSelection(AudioSelection):
338 def __init__(self, session, infobar=None):
339 AudioSelection.__init__(self, session, infobar, page=PAGE_SUBTITLES)
340 self.skinName = ["AudioSelection"]
342 class QuickSubtitlesConfigMenu(ConfigListScreen, Screen):
344 <screen position="50,80" size="480,425" title="Subtitle settings">
345 <widget name="config" position="5,5" size="470,395" scrollbarMode="showOnDemand" />
346 <widget name="videofps" position="5,405" size="470,25" zPosition="10" font="Regular;20" backgroundColor="#25062748" transparent="1" />
349 def __init__(self, session, infobar):
350 Screen.__init__(self, session)
351 self.skin = QuickSubtitlesConfigMenu.skin
352 self.infobar = infobar or self.session.infobar
355 self.wait.timeout.get().append(self.resyncSubtitles)
357 self["videofps"] = Label("")
359 sub = self.infobar.selected_subtitle
360 if sub[0] == 0: # dvb
362 getConfigMenuItem("config.subtitles.subtitle_fontcolor"),
363 getConfigMenuItem("config.subtitles.dvb_subtitles_centered"),
364 getConfigMenuItem("config.subtitles.subtitle_bgopacity"),
365 getConfigMenuItem("config.subtitles.subtitle_original_position"),
366 getConfigMenuItem("config.subtitles.subtitle_position"),
367 getConfigMenuItem("config.subtitles.subtitle_bad_timing_delay"),
368 getConfigMenuItem("config.subtitles.subtitle_noPTSrecordingdelay"),
370 elif sub[0] == 1: # teletext
372 getConfigMenuItem("config.subtitles.subtitle_fontcolor"),
373 getConfigMenuItem("config.subtitles.subtitle_fontsize"),
374 getConfigMenuItem("config.subtitles.subtitle_opacity"),
375 getConfigMenuItem("config.subtitles.subtitle_bgcolor"),
376 getConfigMenuItem("config.subtitles.subtitle_bgopacity"),
377 getConfigMenuItem("config.subtitles.subtitle_edgestyle"),
378 getConfigMenuItem("config.subtitles.subtitle_edgestyle_level"),
379 getConfigMenuItem("config.subtitles.subtitle_original_position"),
380 getConfigMenuItem("config.subtitles.subtitle_alignment"),
381 getConfigMenuItem("config.subtitles.subtitle_position"),
382 getConfigMenuItem("config.subtitles.subtitle_rewrap"),
383 getConfigMenuItem("config.subtitles.subtitle_bad_timing_delay"),
384 getConfigMenuItem("config.subtitles.subtitle_noPTSrecordingdelay"),
388 getConfigMenuItem("config.subtitles.subtitle_fontcolor"),
389 getConfigMenuItem("config.subtitles.subtitle_fontsize"),
390 getConfigMenuItem("config.subtitles.subtitle_opacity"),
391 getConfigMenuItem("config.subtitles.subtitle_bgcolor"),
392 getConfigMenuItem("config.subtitles.subtitle_bgopacity"),
393 getConfigMenuItem("config.subtitles.subtitle_edgestyle"),
394 getConfigMenuItem("config.subtitles.subtitle_edgestyle_level"),
395 getConfigMenuItem("config.subtitles.subtitle_original_position"),
396 getConfigMenuItem("config.subtitles.subtitle_alignment"),
397 getConfigMenuItem("config.subtitles.subtitle_position"),
398 getConfigMenuItem("config.subtitles.pango_subtitle_fontswitch"),
399 getConfigMenuItem("config.subtitles.colourise_dialogs"),
400 getConfigMenuItem("config.subtitles.subtitle_rewrap"),
401 getConfigMenuItem("config.subtitles.pango_subtitles_delay"),
402 getConfigMenuItem("config.subtitles.pango_subtitles_fps"),
404 self["videofps"].setText(_("Video: %s fps") % (self.getFps().rstrip(".000")))
406 ConfigListScreen.__init__(self, menu, self.session, on_change = self.changedEntry)
408 self["actions"] = NumberActionMap(["SetupActions"],
410 "cancel": self.cancel,
414 self.onLayoutFinish.append(self.layoutFinished)
416 def layoutFinished(self):
417 if not self["videofps"].text:
418 self.instance.resize(eSize(self.instance.size().width(), self["config"].l.getItemSize().height()*len(self["config"].getList()) + 10))
420 def changedEntry(self):
421 if self["config"].getCurrent() in [getConfigMenuItem("config.subtitles.pango_subtitles_delay"),getConfigMenuItem("config.subtitles.pango_subtitles_fps")]:
422 self.wait.start(500, True)
424 def resyncSubtitles(self):
425 self.infobar.setSeekState(self.infobar.SEEK_STATE_PAUSE)
426 self.infobar.setSeekState(self.infobar.SEEK_STATE_PLAY)
429 from enigma import iServiceInformation
430 service = self.session.nav.getCurrentService()
431 info = service and service.info()
434 fps = info.getInfo(iServiceInformation.sFrameRate)
436 return "%6.3f" % (fps/1000.)
443 config.subtitles.save()