1 from Plugins.Plugin import PluginDescriptor
2 from Screens.Screen import Screen
3 from Screens.InfoBar import InfoBar
4 from Screens.ChoiceBox import ChoiceBox
5 from Screens.HelpMenu import HelpableScreen
6 from Screens.MessageBox import MessageBox
7 from Screens.VirtualKeyBoard import VirtualKeyBoard
8 from Components.config import config
9 from Components.ActionMap import ActionMap
10 from Components.Language import language
11 from Components.ServiceEventTracker import ServiceEventTracker
12 from Components.VolumeControl import VolumeControl
14 from enigma import eTimer, fbClass, eRCInput, iServiceInformation, iPlayableService
16 import os, struct, vbcfg
18 from __init__ import _
19 from hbbtv import HbbTVWindow
20 from browser import Browser
21 from youtube import YoutubeTVWindow, YoutubeTVSettings
22 from vbipc import VBController, VBServerThread, VBHandlers
24 strIsEmpty = lambda x: x is None or len(x) == 0
26 vbcfg.SOCKETFILE = '/tmp/.browser.support'
27 vbcfg.CONTROLFILE = '/tmp/.browser.controller'
37 'CONTROL_OUT_OF_MEMORY',
43 'CONTROL_VOLUME_DOWN',
52 'OOIF_GET_CURRENT_CHANNEL',
53 'OOIF_BROADCAST_PLAY',
54 'OOIF_BROADCAST_STOP',
55 'OOIF_BROADCAST_CHECK',
56 'CONTROL_RELOAD_KEYMAP',
60 class VBHandler(VBHandlers):
61 def __init__(self, session):
62 self._session = session
63 self.current_title = None
66 self.videobackend_activate = False
67 self.onSetTitleCB = []
69 VBHandlers.__init__(self, _OPCODE_LIST, '_CB_')
71 def set_volume(self, volume):
72 if self.max_volume < 0:
73 self.max_volume = VolumeControl.instance.volctrl.getVolume()
75 self.max_volume += volume
76 if self.max_volume > 100:
78 elif self.max_volume < 0:
81 if self.soft_volume > 0:
82 v = int((self.max_volume * self.soft_volume) / 100)
83 VolumeControl.instance.volctrl.setVolume(v, v)
85 VolumeControl.instance.volctrl.setVolume(self.max_volume, self.max_volume)
87 def close_vkb(self, data=""):
88 fbClass.getInstance().lock()
89 eRCInput.getInstance().lock()
93 VBController.command("BROWSER_VKB_CLOSE", data)
95 def _CB_CONTROL_EXIT(self, result, packet):
97 for x in self.onCloseCB:
101 if x in self.onCloseCB:
102 self.onCloseCB.remove(x)
103 if self.videobackend_activate is False:
104 if vbcfg.g_service is not None:
105 self._session.nav.playService(vbcfg.g_service)
108 def _CB_CONTROL_TITLE(self, result, packet):
109 if packet.startswith('file://') or packet.startswith('http://'):
111 for x in self.onSetTitleCB:
114 self.current_title = packet
116 if x in self.onSetTitleCB:
117 self.onSetTitleCB.remove(x)
120 def _CB_CONTROL_OK(self, result, packet):
121 if vbcfg.g_browser and packet.startswith('stop'):
122 vbcfg.g_browser.keyOK()
125 def _CB_CONTROL_OUT_OF_MEMORY(self, result, packet):
126 vbcfg.need_restart = True;
129 def _CB_CONTROL_INVALIDATE(self, result, packet):
131 from enigma import getDesktop
132 getDesktop(0).paint()
135 def _CB_CONTROL_GET_FBSIZE(self, result, packet):
136 from enigma import getDesktop
137 desktop_size = getDesktop(0).size()
138 data = "%dx%d" % (desktop_size.width(), desktop_size.height())
141 def _CB_CONTROL_SET_VOLUME(self, result, packet):
142 if self.max_volume < 0:
143 self.max_volume = VolumeControl.instance.volctrl.getVolume()
144 self.soft_volume = int(packet)
147 if self.soft_volume > 0 and self.max_volume > 0:
148 v = int((self.max_volume * self.soft_volume) / 100)
149 VolumeControl.instance.volctrl.setVolume(v, v)
152 def _CB_CONTROL_VOLUME_UP(self, result, packet):
156 def _CB_CONTROL_VOLUME_DOWN(self, result, packet):
160 def _CB_BROWSER_MENU_OPEN(self, result, packet):
161 if vbcfg.g_browser and vbcfg.g_browser.is_browser_opened:
162 vbcfg.setPosition(vbcfg.g_position)
163 fbClass.getInstance().unlock()
164 eRCInput.getInstance().unlock()
166 vbcfg.g_browser.toggle_browser(packet, self.current_title)
169 def _CB_BROWSER_VKB_OPEN(self, result, packet):
170 if vbcfg.g_browser and vbcfg.g_browser.is_browser_opened:
171 vbcfg.setPosition(vbcfg.g_position)
172 fbClass.getInstance().unlock()
173 eRCInput.getInstance().unlock()
175 if strIsEmpty(packet):
177 self._session.openWithCallback(self.close_vkb, VirtualKeyBoard, title=("Please enter URL here"), text=str(packet))
180 def _CB_OOIF_GET_CURRENT_CHANNEL(self, result, packet):
181 if (vbcfg.g_channel_info):
183 data = struct.pack('iiii', vbcfg.g_channel_info[0], vbcfg.g_channel_info[1], vbcfg.g_channel_info[2], len(vbcfg.g_channel_info[3])) + vbcfg.g_channel_info[3]
184 except Exception, err:
191 def _CB_OOIF_BROADCAST_PLAY(self, result, packet):
192 if vbcfg.g_service is not None:
193 self._session.nav.playService(vbcfg.g_service)
194 self.videobackend_activate = False
197 def _CB_OOIF_BROADCAST_STOP(self, result, packet):
198 vbcfg.g_service = self._session.nav.getCurrentlyPlayingServiceReference()
199 self._session.nav.stopService()
200 self.videobackend_activate = True
203 def _CB_OOIF_BROADCAST_CHECK(self, result, packet):
204 if self._session.nav.getCurrentService() is None:
208 class VBMain(Screen):
209 skin = """<screen name="VBMAIN" position="0,0" size="0,0" backgroundColor="transparent" flags="wfNoBorder" title=" "></screen>"""
210 def __init__(self, session):
211 Screen.__init__(self, session)
213 self.vbcallback = None
214 self.vbhandler = VBHandler(session)
215 self.vbserver = VBServerThread()
216 self.vbserver.open(1)
217 self.vbserver.start()
220 self.restart_browser()
221 vbcfg.LOG("browser start")
223 self._timer_infobar = eTimer()
224 self._timer_infobar.callback.append(self._cb_register_infobar)
225 self._timer_infobar.start(1000)
227 self._event = ServiceEventTracker(screen=self, eventmap={
228 iPlayableService.evHBBTVInfo: self._cb_ait_detected,
229 iPlayableService.evUpdatedInfo: self._cb_info_updated
231 self._applicationList = None
232 self._app_info = None
235 from Screens.InfoBarGenerics import gHbbtvApplication
236 self.m_vuplus = gHbbtvApplication.getUseAit()
238 self.m_vuplus = False
240 def _cb_register_infobar(self):
242 self._timer_infobar.stop()
243 if self._cb_hbbtv_activated not in InfoBar.instance.onHBBTVActivation:
244 InfoBar.instance.onHBBTVActivation.append(self._cb_hbbtv_activated)
245 vbcfg.DEBUG("registred HbbTV in InfoBar")
247 def _cb_hbbtv_activated(self, url=None, app_info=None):
248 if not self.check_browser():
249 message = _("HbbTV Browser was not running.\nPlease running browser before start HbbTV Application.")
250 self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
252 self.start_hbbtv_application(url, app_info)
254 def _cb_ait_detected(self):
255 vbcfg.g_channel_info = None
256 self._applicationList = None
257 self._app_info = self.get_autostart_application()
258 vbcfg.DEBUG("detected AIT")
260 def _cb_info_updated(self):
261 vbcfg.g_service = self.session.nav.getCurrentlyPlayingServiceReference()
262 vbcfg.DEBUG("updated channel info")
264 def start_hbbtv_application(self, url, app_info):
265 if vbcfg.need_restart:
266 self.restart_browser()
268 vbcfg.need_restart = False
271 app_info = self._app_info
272 self.session.open(HbbTVWindow, url, app_info)
274 def menu_toggle_browser(self, callback=None):
276 self.vbcallback = callback
277 if self.check_browser():
278 mode.append((_('Stop'), 'Stop'))
280 mode.append((_('Start'), 'Start'))
281 self.session.openWithCallback(self.toggle_browser, ChoiceBox, title=_("Please choose one."), list=mode)
283 def toggle_browser(self, selected):
284 if selected is not None:
290 if not self.check_browser():
295 except Exception, ErrMsg:
296 vbcfg.ERR("toggle browser: %s" % ErrMsg)
298 def menu_hbbtv_applications(self):
300 if self._applicationList is not None:
301 for x in self._applicationList:
302 applications.append((x["name"], x))
304 applications.append((_("No detected HbbTV applications."), None))
305 self.session.openWithCallback(self.start_application_selected, ChoiceBox, title=_("Please choose an HbbTV application."), list=applications)
307 def start_application_selected(self, selected):
308 vbcfg.DEBUG(selected)
310 if selected[1] is not None:
311 self._cb_hbbtv_activated(selected[1]["url"], selected[1])
312 except Exception, ErrMsg:
315 def get_autostart_application(self):
316 if self._applicationList is None:
317 service = self.session.nav.getCurrentService()
318 info = service and service.info()
320 sid = info.getInfo(iServiceInformation.sSID)
321 onid = info.getInfo(iServiceInformation.sONID)
322 tsid = info.getInfo(iServiceInformation.sTSID)
323 name = info.getName()
324 vbcfg.g_channel_info = (sid, onid, tsid, name)
326 pmtid = info.getInfo(iServiceInformation.sPMTPID)
327 demux = info.getInfoString(iServiceInformation.sLiveStreamDemuxId)
328 vbcfg.DEBUG("demux = %s, pmtid = 0x%x, sid = 0x%x" % (demux, pmtid, sid))
330 from aitreader import eAITSectionReader
331 reader = eAITSectionReader(demux, pmtid, sid)
332 if reader.doOpen(info, self.m_vuplus):
333 reader.doParseApplications()
339 self._applicationList = reader.getApplicationList()
343 if self._applicationList is not None:
344 for app in self._applicationList:
345 if app["control"] in (1, -1):
349 def start_browser(self):
350 if not self.check_browser():
351 os.system("%s/%s start"%(vbcfg.APPROOT, vbcfg.APP_RUN))
354 def stop_browser(self):
355 VBController.command('CONTROL_EXIT')
358 os.system("%s/%s stop"%(vbcfg.APPROOT, vbcfg.APP_RUN))
363 def check_browser(self):
365 ret = os.popen('%s/%s check'%(vbcfg.APPROOT, vbcfg.APP_RUN)).read()
366 return ret.strip() != "0"
367 except Exception, ErrMsg:
368 vbcfg.ERR("check browser running: %s" % ErrMsg)
371 def restart_browser(self):
373 os.system("%s/%s restart"%(vbcfg.APPROOT, vbcfg.APP_RUN))
378 def HelpableScreen__init__(self):
379 if isinstance(self, HelpableScreen):
380 HelpableScreen.showManual = showManual
382 self["helpActions"] = ActionMap(["HelpbuttonActions"], {
383 "help_b" : self.showHelp,
384 "help_l" : self.showManual,
387 def showManual(self):
388 if not os.path.exists(vbcfg.MANUALROOT):
391 url = 'file://' + vbcfg.MANUALROOT + '/main.html'
392 lang = language.getLanguage()
393 if os.path.exists(vbcfg.MANUALROOT + '/' + lang):
394 url = 'file://' + vbcfg.MANUALROOT + '/' + lang + '/main.html'
396 vbcfg.g_browser = self.session.open(Browser, url)
398 def auto_start_main(reason, **kwargs):
401 if vbcfg.g_main.vbserver is not None:
402 vbcfg.g_main.vbserver.kill()
405 def session_start_main(session, reason, **kwargs):
406 vbcfg.g_main = session.open(VBMain)
407 HelpableScreen.__init__ = HelpableScreen__init__
408 HelpableScreen.session = session
410 def start_youtubetv_main(session, **kwargs):
411 def _cb_youtubetv_close(ret):
413 vbcfg.g_service = session.nav.getCurrentlyPlayingServiceReference()
414 if vbcfg.g_service is not None:
415 session.nav.stopService()
416 vbcfg.g_browser = session.open(Browser, vbcfg.g_youtubetv_cfg.uri.value, True)
418 if config.plugins.youtubetv.showhelp.value == True:
419 _cb_youtubetv_close(True)
421 session.openWithCallback(_cb_youtubetv_close, YoutubeTVWindow)
424 def menu_start_youtube(menuid, **kwargs):
425 if menuid == "mainmenu":
426 return [(_("YouTube TV"), start_youtubetv_main, "youtube_tv", 46)]
429 def plugin_setting_youtube(session, **kwargs):
430 session.open(YoutubeTVSettings)
432 def plugin_start_browser(session, **kwargs):
433 vbcfg.g_browser = session.open(Browser)
435 def extension_toggle_browser(session, **kwargs):
436 if vbcfg.g_main is not None:
437 vbcfg.g_main.menu_toggle_browser()
439 def extension_start_application(session, **kwargs):
440 if vbcfg.g_main is not None:
441 vbcfg.g_main.menu_hbbtv_applications()
443 def Plugins(**kwargs):
445 l.append(PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=auto_start_main))
446 l.append(PluginDescriptor(where=PluginDescriptor.WHERE_SESSIONSTART, needsRestart=True, fnc=session_start_main, weight=-10))
447 l.append(PluginDescriptor(name=_("YouTube TV"), where=PluginDescriptor.WHERE_MENU, fnc=menu_start_youtube))
448 l.append(PluginDescriptor(name=_("YouTube TV Settings"), where=PluginDescriptor.WHERE_PLUGINMENU, fnc=plugin_setting_youtube))
449 l.append(PluginDescriptor(name=_("Browser Start/Stop"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=extension_toggle_browser))
450 l.append(PluginDescriptor(name=_("HbbTV Applications"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=extension_start_application))
451 l.append(PluginDescriptor(name=_("Opera Web Browser"), description=_("start opera web browser"), where=PluginDescriptor.WHERE_PLUGINMENU, needsRestart=True, fnc=plugin_start_browser))