--- /dev/null
+from Plugins.Plugin import PluginDescriptor
+from Screens.Screen import Screen
+from Screens.InfoBar import InfoBar
+from Screens.ChoiceBox import ChoiceBox
+from Screens.HelpMenu import HelpableScreen
+from Screens.MessageBox import MessageBox
+from Screens.VirtualKeyBoard import VirtualKeyBoard
+from Components.config import config
+from Components.ActionMap import ActionMap
+from Components.Language import language
+from Components.ServiceEventTracker import ServiceEventTracker
+
+from enigma import eTimer, fbClass, eRCInput, iServiceInformation, iPlayableService
+
+import os, struct, vbcfg
+
+from __init__ import _
+from hbbtv import HbbTVWindow
+from browser import Browser
+from youtube import YoutubeTVWindow, YoutubeTVSettings
+from vbipc import VBController, VBServerThread, VBHandlers
+
+strIsEmpty = lambda x: x is None or len(x) == 0
+
+vbcfg.SOCKETFILE = '/tmp/vbrowser.support'
+vbcfg.CONTROLFILE = '/tmp/vbrowser.controller'
+_OPCODE_LIST = [
+ 'CONTROL_BACK',
+ 'CONTROL_FORWARD',
+ 'CONTROL_STOP',
+ 'CONTROL_RELOAD',
+ 'CONTROL_OPENURL',
+ 'CONTROL_EXIT',
+ 'CONTROL_TITLE',
+ 'CONTROL_OK',
+ 'CONTROL_OUT_OF_MEMORY',
+ 'HBBTV_LOADAIT',
+ 'HBBTV_OPENURL',
+ 'YOUTUBETV_OPENURL',
+ 'BROWSER_OPENURL',
+ 'BROWSER_MENU_OPEN',
+ 'BROWSER_MENU_CLOSE',
+ 'BROWSER_VKB_OPEN',
+ 'BROWSER_VKB_CLOSE',
+ 'OOIF_GET_CURRENT_CHANNEL',
+ 'OOIF_GET_VOLUME',
+ 'OOIF_BROADCAST_PLAY',
+ 'OOIF_BROADCAST_STOP',
+ 'OOIF_BROADCAST_CHECK',
+ 'OPCODE_END'
+ ]
+
+class VBHandler(VBHandlers):
+ def __init__(self, session):
+ self._session = session
+ self.current_title = None
+ self.videobackend_activate = False
+ self.onSetTitleCB = []
+ self.onCloseCB = []
+ VBHandlers.__init__(self, _OPCODE_LIST, '_CB_')
+
+ def close_vkb(self, data=""):
+ fbClass.getInstance().lock()
+ eRCInput.getInstance().lock()
+
+ if strIsEmpty(data):
+ data = ""
+ VBController.command("BROWSER_VKB_CLOSE", data)
+
+ def _CB_CONTROL_EXIT(self, result, packet):
+ if self.onCloseCB:
+ for x in self.onCloseCB:
+ try:
+ x()
+ except Exception:
+ if x in self.onCloseCB:
+ self.onCloseCB.remove(x)
+ if self.videobackend_activate is False:
+ if vbcfg.g_service is not None:
+ self._session.nav.playService(vbcfg.g_service)
+ return (True, None)
+
+ def _CB_CONTROL_TITLE(self, result, packet):
+ if packet.startswith('file://') or packet.startswith('http://'):
+ return (True, None)
+ for x in self.onSetTitleCB:
+ try:
+ x(packet)
+ self.current_title = packet
+ except Exception:
+ if x in self.onSetTitleCB:
+ self.onSetTitleCB.remove(x)
+ return (True, None)
+
+ def _CB_CONTROL_OK(self, result, packet):
+ if vbcfg.g_browser and packet.startswith('stop'):
+ vbcfg.g_browser.keyOK()
+ return (True, None)
+
+ def _CB_CONTROL_OUT_OF_MEMORY(self, result, packet):
+ vbcfg.need_restart = True;
+ return (True, None)
+
+ def _CB_BROWSER_MENU_OPEN(self, result, packet):
+ if vbcfg.g_browser and vbcfg.g_browser.is_browser_opened:
+ vbcfg.setPosition(vbcfg.g_position)
+ fbClass.getInstance().unlock()
+ eRCInput.getInstance().unlock()
+
+ vbcfg.g_browser.toggle_browser(packet, self.current_title)
+ return (True, None)
+
+ def _CB_BROWSER_VKB_OPEN(self, result, packet):
+ if vbcfg.g_browser and vbcfg.g_browser.is_browser_opened:
+ vbcfg.setPosition(vbcfg.g_position)
+ fbClass.getInstance().unlock()
+ eRCInput.getInstance().unlock()
+
+ if strIsEmpty(packet):
+ packet = ""
+ self._session.openWithCallback(self.close_vkb, VirtualKeyBoard, title=("Please enter URL here"), text=str(packet))
+ return (True, None)
+
+ def _CB_OOIF_GET_CURRENT_CHANNEL(self, result, packet):
+ if (vbcfg.g_channel_info):
+ try:
+ data = struct.pack('iiii', vbcfg.g_channel_info[1], vbcfg.g_channel_info[2], vbcfg.g_channel_info[0], len(vbcfg.g_channel_info[3])) + vbcfg.g_channel_info[3]
+ except Exception, err:
+ vbcfg.ERR(err)
+ return (False, None)
+ else:
+ return (False, None)
+ return (True, data)
+
+ def _CB_OOIF_BROADCAST_PLAY(self, result, packet):
+ if vbcfg.g_service is not None:
+ self._session.nav.playService(vbcfg.g_service)
+ self.videobackend_activate = False
+ return (True, None)
+
+ def _CB_OOIF_BROADCAST_STOP(self, result, packet):
+ vbcfg.g_service = self._session.nav.getCurrentlyPlayingServiceReference()
+ self._session.nav.stopService()
+ self.videobackend_activate = True
+ return (True, None)
+
+ def _CB_OOIF_BROADCAST_CHECK(self, result, packet):
+ if self._session.nav.getCurrentService() is None:
+ return (False, None)
+ return (True, None)
+
+class VBMain(Screen):
+ skin = """<screen name="VBMAIN" position="0,0" size="0,0" backgroundColor="transparent" flags="wfNoBorder" title=" "></screen>"""
+ def __init__(self, session):
+ Screen.__init__(self, session)
+
+ self.vbcallback = None
+ self.vbhandler = VBHandler(session)
+ self.vbserver = VBServerThread()
+ self.vbserver.open(1)
+ self.vbserver.start()
+
+ # comment for dev
+ self.restart_vbrowser()
+ vbcfg.LOG("vbrowser start")
+
+ self._timer_infobar = eTimer()
+ self._timer_infobar.callback.append(self._cb_register_infobar)
+ self._timer_infobar.start(1000)
+
+ self._event = ServiceEventTracker(screen=self, eventmap={
+ iPlayableService.evHBBTVInfo: self._cb_ait_detected,
+ iPlayableService.evUpdatedInfo: self._cb_info_updated
+ })
+ self._applicationList = None
+ self._app_info = None
+
+ try:
+ from Screens.InfoBarGenerics import gHbbtvApplication
+ self.m_vuplus = gHbbtvApplication.getUseAit()
+ except:
+ self.m_vuplus = False
+
+ def _cb_register_infobar(self):
+ if InfoBar.instance:
+ self._timer_infobar.stop()
+ if self._cb_hbbtv_activated not in InfoBar.instance.onHBBTVActivation:
+ InfoBar.instance.onHBBTVActivation.append(self._cb_hbbtv_activated)
+ vbcfg.DEBUG("registred HbbTV in InfoBar")
+
+ def _cb_hbbtv_activated(self, url=None, app_info=None):
+ if not self.check_vbrowser():
+ message = _("HbbTV Browser was not running.\nPlease running browser before start HbbTV Application.")
+ self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
+ return
+ self.start_hbbtv_application(url, app_info)
+
+ def _cb_ait_detected(self):
+ vbcfg.g_channel_info = None
+ self._applicationList = None
+ self._app_info = self.get_autostart_application()
+ vbcfg.DEBUG("detected AIT")
+
+ def _cb_info_updated(self):
+ vbcfg.g_service = self.session.nav.getCurrentlyPlayingServiceReference()
+ vbcfg.DEBUG("updated channel info")
+
+ def start_hbbtv_application(self, url, app_info):
+ if vbcfg.need_restart:
+ self.restart_vbrowser()
+ os.time.sleep(2)
+ vbcfg.need_restart = False
+
+ if not app_info:
+ app_info = self._app_info
+ self.session.open(HbbTVWindow, url, app_info)
+
+ def menu_toggle_vbrowser(self, callback=None):
+ mode = []
+ self.vbcallback = callback
+ if self.check_vbrowser():
+ mode.append((_('Stop'), 'Stop'))
+ else:
+ mode.append((_('Start'), 'Start'))
+ self.session.openWithCallback(self.toggle_vbrowser, ChoiceBox, title=_("Please choose one."), list=mode)
+
+ def toggle_vbrowser(self, selected):
+ if selected is not None:
+ if self.vbcallback:
+ self.vbcallback()
+ try:
+ mode = selected[1]
+ if mode == 'Start':
+ if not self.check_vbrowser():
+ self.start_vbrowser()
+ elif mode == 'Stop':
+ self.stop_vbrowser()
+
+ except Exception, ErrMsg:
+ vbcfg.ERR("toggle vbrowser: %s" % ErrMsg)
+
+ def menu_hbbtv_applications(self):
+ applications = []
+ if self._applicationList is not None:
+ for x in self._applicationList:
+ applications.append((x["name"], x))
+ else:
+ applications.append((_("No detected HbbTV applications."), None))
+ self.session.openWithCallback(self.start_application_selected, ChoiceBox, title=_("Please choose an HbbTV application."), list=applications)
+
+ def start_application_selected(self, selected):
+ vbcfg.DEBUG(selected)
+ try:
+ if selected[1] is not None:
+ self._cb_hbbtv_activated(selected[1]["url"], selected[1])
+ except Exception, ErrMsg:
+ vbcfg.ERR(ErrMsg)
+
+ def get_autostart_application(self):
+ if self._applicationList is None:
+ service = self.session.nav.getCurrentService()
+ info = service and service.info()
+ if info is not None:
+ sid = info.getInfo(iServiceInformation.sSID)
+ onid = info.getInfo(iServiceInformation.sONID)
+ tsid = info.getInfo(iServiceInformation.sTSID)
+ name = info.getName()
+ vbcfg.g_channel_info = (sid, onid, tsid, name)
+
+ pmtid = info.getInfo(iServiceInformation.sPMTPID)
+ demux = info.getInfoString(iServiceInformation.sLiveStreamDemuxId)
+ vbcfg.DEBUG("demux = %s, pmtid = 0x%x, sid = 0x%x" % (demux, pmtid, sid))
+
+ from aitreader import eAITSectionReader
+ reader = eAITSectionReader(demux, pmtid, sid)
+ if reader.doOpen(info, self.m_vuplus):
+ reader.doParseApplications()
+ reader.doDump()
+ else:
+ vbcfg.ERR("no AIT")
+
+ try:
+ self._applicationList = reader.getApplicationList()
+ except:
+ pass
+
+ if self._applicationList is not None:
+ for app in self._applicationList:
+ if app["control"] in (1, -1):
+ return app
+ return None
+
+ def start_vbrowser(self):
+ if not self.check_vbrowser():
+ os.system("%s/%s start"%(vbcfg.APPROOT, vbcfg.APP_RUN))
+ return True
+
+ def stop_vbrowser(self):
+ VBController.command('CONTROL_EXIT')
+ return True
+ try:
+ os.system("%s/%s stop"%(vbcfg.APPROOT, vbcfg.APP_RUN))
+ except:
+ pass
+ return True
+
+ def check_vbrowser(self):
+ try:
+ ret = os.popen('%s/%s check'%(vbcfg.APPROOT, vbcfg.APP_RUN)).read()
+ return ret.strip() != "0"
+ except Exception, ErrMsg:
+ vbcfg.ERR("check vbrowser running: %s" % ErrMsg)
+ return False
+
+ def restart_vbrowser(self):
+ try:
+ os.system("%s/%s restart"%(vbcfg.APPROOT, vbcfg.APP_RUN))
+ except:
+ pass
+ return True
+
+def HelpableScreen__init__(self):
+ if isinstance(self, HelpableScreen):
+ HelpableScreen.showManual = showManual
+
+ self["helpActions"] = ActionMap(["HelpbuttonActions"], {
+ "help_b" : self.showHelp,
+ "help_l" : self.showManual,
+ }, -2)
+
+def showManual(self):
+ if not os.path.exists(vbcfg.MANUALROOT):
+ return
+
+ url = 'file://' + vbcfg.MANUALROOT + '/main.html'
+ lang = language.getLanguage()
+ if os.path.exists(vbcfg.MANUALROOT + '/' + lang):
+ url = 'file://' + vbcfg.MANUALROOT + '/' + lang + '/main.html'
+
+ vbcfg.g_browser = self.session.open(Browser, url)
+
+def auto_start_main(reason, **kwargs):
+ if reason:
+ try:
+ if vbcfg.g_main.vbserver is not None:
+ vbcfg.g_main.vbserver.kill()
+ except: pass
+
+def session_start_main(session, reason, **kwargs):
+ vbcfg.g_main = session.open(VBMain)
+ HelpableScreen.__init__ = HelpableScreen__init__
+ HelpableScreen.session = session
+
+def start_youtubetv_main(session, **kwargs):
+ def _cb_youtubetv_close(ret):
+ if ret:
+ vbcfg.g_service = session.nav.getCurrentlyPlayingServiceReference()
+ if vbcfg.g_service is not None:
+ session.nav.stopService()
+ vbcfg.g_browser = session.open(Browser, vbcfg.g_youtubetv_cfg.uri.value, True)
+
+ if config.plugins.youtubetv.showhelp.value == True:
+ _cb_youtubetv_close(True)
+ else:
+ session.openWithCallback(_cb_youtubetv_close, YoutubeTVWindow)
+
+
+def menu_start_youtube(menuid, **kwargs):
+ if menuid == "mainmenu":
+ return [(_("YouTube TV"), start_youtubetv_main, "youtube_tv", 46)]
+ return []
+
+def plugin_setting_youtube(session, **kwargs):
+ session.open(YoutubeTVSettings)
+
+def plugin_start_browser(session, **kwargs):
+ vbcfg.g_browser = session.open(Browser)
+
+def extension_toggle_browser(session, **kwargs):
+ if vbcfg.g_main is not None:
+ vbcfg.g_main.menu_toggle_vbrowser()
+
+def extension_start_application(session, **kwargs):
+ if vbcfg.g_main is not None:
+ vbcfg.g_main.menu_hbbtv_applications()
+
+def Plugins(**kwargs):
+ l = []
+ l.append(PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=auto_start_main))
+ l.append(PluginDescriptor(where=PluginDescriptor.WHERE_SESSIONSTART, needsRestart=True, fnc=session_start_main, weight=-10))
+ l.append(PluginDescriptor(name=_("YouTube TV"), where=PluginDescriptor.WHERE_MENU, fnc=menu_start_youtube))
+ l.append(PluginDescriptor(name=_("YouTube TV Settings"), where=PluginDescriptor.WHERE_PLUGINMENU, fnc=plugin_setting_youtube))
+ l.append(PluginDescriptor(name=_("Browser Start/Stop"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=extension_toggle_browser))
+ l.append(PluginDescriptor(name=_("HbbTV Applications"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=extension_start_application))
+ l.append(PluginDescriptor(name=_("Vuplus Web Browser"), description=_("start vuplus web browser"), where=PluginDescriptor.WHERE_PLUGINMENU, needsRestart=True, fnc=plugin_start_browser))
+ return l