[Vbrowser] imported.
[vuplus_dvbapp] / lib / python / Plugins / Extensions / Vbrowser / plugin.py
diff --git a/lib/python/Plugins/Extensions/Vbrowser/plugin.py b/lib/python/Plugins/Extensions/Vbrowser/plugin.py
new file mode 100644 (file)
index 0000000..c1cd05b
--- /dev/null
@@ -0,0 +1,396 @@
+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