1 from Plugins.Plugin import PluginDescriptor
3 import time, os, socket, thread, socket, copy
4 from socket import gaierror, error
5 from os import path as os_path, remove as os_remove
8 import gdata.youtube.service
9 from gdata.service import BadAuthentication
11 from twisted.web import client
12 from twisted.internet import reactor
14 from urlparse import parse_qs
15 from urllib import quote, unquote_plus, unquote
16 from urllib2 import Request, URLError, urlopen as urlopen2
17 from httplib import HTTPConnection, CannotSendRequest, BadStatusLine, HTTPException
19 from Components.Button import Button
20 from Components.Label import Label
21 from Components.Pixmap import Pixmap
22 from Components.Language import language
23 from Components.Sources.List import List
24 from Components.ConfigList import ConfigListScreen
25 from Components.Sources.StaticText import StaticText
26 from Components.ActionMap import NumberActionMap, ActionMap
27 from Components.ServiceEventTracker import ServiceEventTracker
28 from Components.config import config, ConfigSelection, getConfigListEntry, ConfigSlider
30 from Screens.Screen import Screen
31 from Screens.ChoiceBox import ChoiceBox
32 from Screens.MessageBox import MessageBox
33 from Screens.DefaultWizard import DefaultWizard
34 from Screens.InfoBarGenerics import InfoBarNotifications
36 from enigma import eTimer, eServiceReference, iPlayableService, fbClass, eRCInput, eConsoleAppContainer, getDesktop
38 HTTPConnection.debuglevel = 1
41 print "prepared cmd:", cmd
45 def change_galpha(set_const, set_value):
46 op = "/proc/stb/fb/alpha_op"
47 val = "/proc/stb/fb/alpha_value"
49 if os.path.exists(op) and set_const and alpha_value < 255:
50 excute_cmd("echo \"const\" > %s" % (op))
52 excute_cmd("echo \"copypsrc\" > %s" % (op))
54 if os.path.exists(val) and set_value:
55 excute_cmd("echo \"%s\" > %s" % (str(hex(alpha_value)), val))
57 def enable_rc_mouse(mode): #mode=[0|1]|[False|True]
58 mouse_cond = "/proc/stb/fp/mouse"
59 if os.path.exists(mouse_cond):
60 excute_cmd("echo %d > %s" % (mode, mouse_cond))
62 def is_process_running(pname):
63 if pname is None or len(pname) == 0:
66 cmd = "/bin/ps -ef | grep %s | grep -v grep | awk \'{print $5}\'"%(pname)
67 for line in os.popen(cmd).readlines():
72 def wb_lock(alpha_on=True):
76 change_galpha(set_const=False, set_value=False)
77 fbClass.getInstance().unlock()
79 def wb_unlock(alpha_on=True):
82 change_galpha(set_const=True, set_value=False)
83 fbClass.getInstance().lock()
90 class VuPlayer(Screen, InfoBarNotifications):
91 size = getDesktop(0).size()
92 position_params = size.width() > 750 and (620) or (480)
94 <screen name="VuPlayer" flags="wfNoBorder" position="center,%d" size="455,53" title="VuPlayer" backgroundColor="transparent">
95 <ePixmap pixmap="Vu_HD/mp_wb_background.png" position="0,0" zPosition="-1" size="455,53" />
96 <ePixmap pixmap="Vu_HD/icons/mp_wb_buttons.png" position="40,23" size="30,13" alphatest="on" />
98 <widget source="session.CurrentService" render="PositionGauge" position="80,25" size="220,10" zPosition="2" pointer="skin_default/position_pointer.png:540,0" transparent="1" foregroundColor="#20224f">
99 <convert type="ServicePosition">Gauge</convert>
102 <widget source="session.CurrentService" render="Label" position="310,20" size="50,20" font="Regular;18" halign="center" valign="center" backgroundColor="#4e5a74" transparent="1" >
103 <convert type="ServicePosition">Position</convert>
105 <widget name="sidebar" position="362,20" size="10,20" font="Regular;18" halign="center" valign="center" backgroundColor="#4e5a74" transparent="1" />
106 <widget source="session.CurrentService" render="Label" position="374,20" size="50,20" font="Regular;18" halign="center" valign="center" backgroundColor="#4e5a74" transparent="1" >
107 <convert type="ServicePosition">Length</convert>
110 """ % position_params
116 def __init__(self, session, service, lastservice):
117 Screen.__init__(self, session)
118 InfoBarNotifications.__init__(self)
120 self.session = session
121 self.service = service
122 self.lastservice = lastservice
123 self["actions"] = ActionMap(["OkCancelActions", "InfobarSeekActions", "MediaPlayerActions", "MovieSelectionActions"],
125 "ok": self.doInfoAction,
126 "cancel": self.doExit,
128 "playpauseService": self.playpauseService,
130 self["sidebar"] = Label(_("/"))
132 self.__event_tracker = ServiceEventTracker(screen = self, eventmap =
134 iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
135 iPlayableService.evStart: self.__serviceStarted,
136 iPlayableService.evEOF: self.__evEOF,
139 self.hidetimer = eTimer()
140 self.hidetimer.timeout.get().append(self.doInfoAction)
142 self.state = self.PLAYER_PLAYING
143 self.lastseekstate = self.PLAYER_PLAYING
144 self.__seekableStatusChanged()
146 self.onClose.append(self.__onClose)
150 self.session.nav.stopService()
152 def __seekableStatusChanged(self):
153 service = self.session.nav.getCurrentService()
154 if service is not None:
155 seek = service.seek()
156 if seek is None or not seek.isCurrentlySeekable():
157 self.setSeekState(self.PLAYER_PLAYING)
159 def __serviceStarted(self):
160 self.state = self.PLAYER_PLAYING
161 self.__seekableStatusChanged()
166 def __setHideTimer(self):
167 self.hidetimer.start(5000)
170 list = ((_("Yes"), "y"), (_("No, but play video again"), "n"),)
171 self.session.openWithCallback(self.cbDoExit, ChoiceBox, title=_("Stop playing this movie?"), list = list)
173 def cbDoExit(self, answer):
174 answer = answer and answer[1]
179 if self.state != self.PLAYER_IDLE:
180 self.session.nav.stopService()
181 self.state = self.PLAYER_IDLE
184 def setSeekState(self, wantstate):
185 service = self.session.nav.getCurrentService()
187 print "No Service found"
190 pauseable = service.pause()
191 if pauseable is not None:
192 if wantstate == self.PLAYER_PAUSED:
194 self.state = self.PLAYER_PAUSED
196 self.hidetimer.stop()
198 elif wantstate == self.PLAYER_PLAYING:
200 self.state = self.PLAYER_PLAYING
202 self.__setHideTimer()
204 self.state = self.PLAYER_PLAYING
206 def doInfoAction(self):
209 self.hidetimer.stop()
212 if self.state == self.PLAYER_PLAYING:
213 self.__setHideTimer()
216 if self.state == self.PLAYER_PAUSED:
218 self.__setHideTimer()
219 self.state = self.PLAYER_PLAYING
220 self.session.nav.playService(self.service)
222 self.__setHideTimer()
224 def playpauseService(self):
225 if self.state == self.PLAYER_PLAYING:
226 self.setSeekState(self.PLAYER_PAUSED)
227 elif self.state == self.PLAYER_PAUSED:
228 self.setSeekState(self.PLAYER_PLAYING)
230 VIDEO_FMT_PRIORITY_MAP = {
231 '38' : 1, #MP4 Original (HD)
232 '37' : 2, #MP4 1080p (HD)
233 '22' : 3, #MP4 720p (HD)
239 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100627 Firefox/3.6.6',
240 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
241 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
242 'Accept-Language': 'en-us,en;q=0.5',
245 class VuPlayerLauncher:
246 def getVideoUrl(self, video_id):
249 if video_id is None or video_id == "":
252 # Getting video webpage
253 watch_url = 'http://www.youtube.com/watch?v=%s&gl=US&hl=en' % video_id
254 watchrequest = Request(watch_url, None, std_headers)
256 #print "trying to find out if a HD Stream is available",watch_url
257 watchvideopage = urlopen2(watchrequest).read()
258 except (URLError, HTTPException, socket.error), err:
259 print "Error: Unable to retrieve watchpage - Error code: ", str(err)
263 for el in ['&el=embedded', '&el=detailpage', '&el=vevo', '']:
264 info_url = ('http://www.youtube.com/get_video_info?&video_id=%s%s&ps=default&eurl=&gl=US&hl=en' % (video_id, el))
265 request = Request(info_url, None, std_headers)
267 infopage = urlopen2(request).read()
268 videoinfo = parse_qs(infopage)
269 if ('url_encoded_fmt_stream_map' or 'fmt_url_map') in videoinfo:
271 except (URLError, HTTPException, socket.error), err:
272 print "Error: unable to download video infopage",str(err)
275 if ('url_encoded_fmt_stream_map' or 'fmt_url_map') not in videoinfo:
276 if 'reason' not in videoinfo:
277 print 'Error: unable to extract "fmt_url_map" or "url_encoded_fmt_stream_map" parameter for unknown reason'
279 reason = unquote_plus(videoinfo['reason'][0])
280 print 'Error: YouTube said: %s' % reason.decode('utf-8')
285 if videoinfo.has_key('url_encoded_fmt_stream_map'):
286 tmp_fmtUrlDATA = videoinfo['url_encoded_fmt_stream_map'][0].split(',url=')
288 tmp_fmtUrlDATA = videoinfo['fmt_url_map'][0].split(',')
289 for fmtstring in tmp_fmtUrlDATA:
290 if videoinfo.has_key('url_encoded_fmt_stream_map'):
291 (fmturl, fmtid) = fmtstring.split('&itag=')
292 if fmturl.find("url=") !=-1:
293 fmturl = fmturl.replace("url=","")
295 (fmtid,fmturl) = fmtstring.split('|')
296 if VIDEO_FMT_PRIORITY_MAP.has_key(fmtid):
297 video_fmt_map[VIDEO_FMT_PRIORITY_MAP[fmtid]] = { 'fmtid': fmtid, 'fmturl': unquote_plus(fmturl) }
298 fmt_infomap[int(fmtid)] = unquote_plus(fmturl)
299 print "got",sorted(fmt_infomap.iterkeys())
300 if video_fmt_map and len(video_fmt_map):
301 video_url = video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmturl'].split(';')[0]
302 #print "found best available video format:",video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmtid']
303 #print "found best available video url:",video_url
306 def run(self, tubeid, session, service):
308 myurl = self.getVideoUrl(tubeid)
309 print "Playing URL", myurl
311 session.open(MessageBox, _("Sorry, video is not available!"), MessageBox.TYPE_INFO)
313 myreference = eServiceReference(4097, 0, myurl)
314 session.open(VuPlayer, myreference, service)
315 except Exception, msg:
317 print "Error >>", msg
319 class VuPlayerService:
320 def __init__(self, session):
322 self.socket_timeout = 0
323 self.max_buffer_size = 1024
324 self.uds_file = "/tmp/vuplus.tmp"
325 self.session = session
327 os.remove(self.uds_file)
331 def start(self, timeout = 1):
332 self.socket_timeout = timeout
333 thread.start_new_thread(self.run, (True,))
341 def run(self, e = True):
344 print "VuPlayerService start!!"
346 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
347 self.sock.settimeout(self.socket_timeout)
348 self.sock.bind(self.uds_file)
352 conn, addr = self.sock.accept()
353 self.parseHandle(conn, addr)
354 except socket.timeout:
355 #print "[socket timeout]"
357 print "VuPlayerService stop!!"
359 def parseHandle(self, conn, addr):
360 # [http://www.youtube.com/watch?v=BpThu778qB4&feature=related]
361 data = conn.recv(self.max_buffer_size)
362 print "[%s]" % (data)
363 enable_rc_mouse(False)
364 if data.startswith("http://www.youtube.com"):
365 print "youtube start!!"
366 tmp = data.split("?")
367 print tmp # ['http://www.youtube.com/watch', 'v=BpThu778qB4&feature=related']
368 service = self.session.nav.getCurrentlyPlayingServiceReference()
369 if len(tmp) == 2 and tmp[0] == "http://www.youtube.com/watch":
370 tmp = tmp[1].split("&")
371 print tmp # ['v=BpThu778qB4', 'feature=related']
373 tmp = tmp[0].split("=")
374 print tmp # ['v', 'BpThu778qB4']
375 if len(tmp) == 2 and tmp[0] == "v":
377 player = VuPlayerLauncher()
378 player.run(tmp[1], self.session, service)
381 self.session.nav.playService(service)
384 data = "nok$parsing fail"
386 data = "nok$parsing fail"
388 data = "nok$parsing fail"
389 self.sendResponse(conn, data)
390 elif data.startswith("vk://open"):
391 print "virtual keyboard start!!"
392 from Screens.VirtualKeyBoard import VirtualKeyBoard
395 self.session.openWithCallback(self.cbOpenKeyboard, VirtualKeyBoard, title = (_("Enter your input data")), text = "")
397 def cbOpenKeyboard(self, data = None):
398 print "virtual keyboard callback!!"
400 self.sendResponse(self.vk_conn, data)
402 def sendResponse(self, conn, data):
403 if data is None or len(data) == 0:
405 enable_rc_mouse(True)
409 class BrowserLauncher(ConfigListScreen, Screen):
410 size = getDesktop(0).size()
411 position_params = size.width() > 750 and (309,498, 0,150, 0,455) or (618,320, 312,5, 0,180)
413 <screen name="BrowserLauncher" position="center,center" size="%d,%d" title="Web Browser">
414 <ePixmap pixmap="Vu_HD/buttons/red.png" position="4,0" size="40,40" alphatest="on" />
415 <ePixmap pixmap="Vu_HD/buttons/green.png" position="154,0" size="40,40" alphatest="on" />
417 <widget source="key_red" render="Label" position="30,0" zPosition="1" size="125,30" font="Regular;20" halign="center" valign="center" transparent="1" />
418 <widget source="key_green" render="Label" position="180,0" zPosition="1" size="125,30" font="Regular;20" halign="center" valign="center" transparent="1" />
420 <widget name="config" position="0,50" size="309,100" scrollbarMode="showOnDemand" />
421 <ePixmap pixmap="Vu_HD/rc_wb_desc.png" position="%d,%d" size="309,296" alphatest="on" />
422 <widget name="info" position="%d,%d" size="309,50" font="Regular;18" halign="center" foregroundColor="blue" transparent="1" />
424 """ % position_params
426 def __init__(self, session):
427 Screen.__init__(self, session)
428 self.session = session
430 ConfigListScreen.__init__(self, self.list)
432 self.browser_root = "/usr/bin"
433 self.browser_name = "arora"
435 from Tools.Directories import resolveFilename, SCOPE_PLUGINS
436 self.conf_file = resolveFilename(SCOPE_PLUGINS, "Extensions/WebBrowser/settings.conf")
437 self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", ],
438 { "red": self.keyCancel,
440 "cancel": self.keyExit,
442 self.info = Label(_("If you want to quit the Browser,\nPress RED -> EXIT."))
443 self["info"] = self.info
444 self["key_red"] = StaticText(_("Exit"))
445 self["key_green"] = StaticText(_("Start"))
449 self.conf_keyboard = ""
450 self.conf_keymap = ""
452 self.usb_mouse = None
453 self.usb_keyboard = None
455 self.rc_keyboard = None
461 self.vu_service = VuPlayerService(self.session)
462 self.vu_service.start(timeout=5)
464 self.exit_wait_cond = False
465 self.timer_exit_cond = eTimer()
466 self.timer_exit_cond.callback.append(self.resetExitCond)
468 self.test_cond = True
469 self.current_lang_idx = language.getActiveLanguageIndex()
475 change_galpha(set_const=False, set_value=False)
477 self.vu_service.stop()
478 excute_cmd("killall -15 %s"%(self.browser_name))
479 excute_cmd("echo 60 > /proc/sys/vm/swappiness")
480 enable_rc_mouse(False) #rc-mouse off
481 language.activateLanguageIndex(self.current_lang_idx)
482 fbClass.getInstance().unlock()
483 #eRCInput.getInstance().unlock()
487 if self.exit_wait_cond:
489 if is_process_running(self.browser_name) == False:
493 if is_process_running(self.browser_name) == False:
494 ConfigListScreen.keyLeft(self)
496 alpha_value = self.alpha.value
500 if is_process_running(self.browser_name) == False:
501 ConfigListScreen.keyRight(self)
502 alpha_value = self.alpha.value
506 if is_process_running(self.browser_name) == False:
508 self.exit_wait_cond = True
509 self.timer_exit_cond.start(5000)
511 # mouse:keyboard:alpha_value
512 def saveConfig(self):
513 if is_process_running(self.browser_name) == False:
514 command = "echo \"%s:%s:%d:%s\" > %s"%(self.mouse.value, self.keyboard.value, int(self.alpha.value), self.langs.value, self.conf_file)
517 # mouse:keyboard:alpha_value
518 def loadConfig(self):
519 if os.path.exists(self.conf_file) == False:
521 config_list = open(self.conf_file).readline().strip().split(':')
522 if len(config_list) == 3:
523 self.conf_mouse = config_list[0]
524 self.conf_keyboard = config_list[1]
525 self.conf_alpha = config_list[2]
526 elif len(config_list) == 4:
527 self.conf_mouse = config_list[0]
528 self.conf_keyboard = config_list[1]
529 self.conf_alpha = config_list[2]
530 self.conf_keymap = config_list[3]
531 print "load config : ", config_list
533 def resetExitCond(self):
534 self.timer_exit_cond.stop()
535 self.exit_wait_cond = False
537 def makeConfig(self):
539 self.devices_string = ""
540 self.devices = eConsoleAppContainer()
541 self.devices.dataAvail.append(self.callbackDevicesDataAvail)
542 self.devices.appClosed.append(self.callbakcDevicesAppClose)
543 self.devices.execute(_("cat /proc/bus/input/devices"))
545 def callbackDevicesDataAvail(self, ret_data):
546 self.devices_string = self.devices_string + ret_data
548 def callbakcDevicesAppClose(self, retval):
550 self.mouse_list = None
551 self.keyboard_list = None
553 self.makeHandlerList(self.devices_string)
555 if self.conf_mouse == "" or self.getHandlerName(self.conf_mouse) is None:
556 self.conf_mouse = self.mouse_list[0][0]
557 self.mouse = ConfigSelection(default = self.conf_mouse, choices = self.mouse_list)
558 self.list.append(getConfigListEntry(_('Mouse'), self.mouse))
560 if self.conf_keyboard == "" or self.getHandlerName(self.conf_keyboard) is None:
561 self.conf_keyboard = self.keyboard_list[0][0]
562 self.keyboard = ConfigSelection(default = self.conf_keyboard, choices = self.keyboard_list)
563 self.list.append(getConfigListEntry(_('Keyboard'), self.keyboard))
565 if self.conf_keymap == "":
566 self.conf_keymap = self.getLanguage()
567 self.lang_list = [("rc_en", "English(RC)"), ("rc_ch", "German(RC)"), ("en", "English"), ("ch", "German")]
568 self.langs = ConfigSelection(default = self.conf_keymap, choices = self.lang_list)
569 self.list.append(getConfigListEntry(_(" - Type"), self.langs))
571 if self.conf_alpha == "":
572 self.conf_alpha = "255"
573 self.alpha = ConfigSlider(default = int(self.conf_alpha), increment = 10, limits = (0, 255))
574 self.list.append(getConfigListEntry(_("Alpha Value"), self.alpha))
575 self["config"].list = self.list
576 self["config"].l.setList(self.list)
578 def getLanguage(self, lang=language.getLanguage()):
579 if self.current_lang_idx == 1:
583 def makeHandlerList(self, data):
589 lines = data.split('\n')
592 if line is not None and len(line) > 0:
602 h_list = line[12:].strip().split()
603 tn = line[12:].strip().find("mouse")
605 event_list.append((h, _(h)))
606 self.name_list.append((h, n))
607 if n[1:].startswith("dream") and self.rc_mouse is None:
608 for thl in h.split(" "):
609 if thl.startswith("event"):
610 self.rc_mouse = copy.deepcopy(h)
611 self.rc_keyboard = copy.deepcopy(h)
612 print "detected!! rc:", h
614 if h.startswith("mouse") and self.usb_mouse is None:
615 self.usb_mouse = copy.deepcopy(h)
616 print "detected!! usb mouse:",h
618 if tn == -1 and self.usb_keyboard is None:
619 self.usb_keyboard = copy.deepcopy(h)
620 print "detected!! usb keyboard:",h
621 elif line[0] == 'B' and line[3:].startswith("ABS") and p.startswith("usb-"):
623 if self.usb_mouse is not None:
625 if self.usb_keyboard is not None and h == self.usb_keyboard[0]:
626 self.usb_keyboard = None
627 print "clean!! usb keyboard:",h
628 self.usb_mouse = copy.deepcopy(h)
629 print "detected!! usb mouse:",h
631 tmp = copy.deepcopy(event_list)
632 if self.usb_mouse is not None:
633 tmp.insert(0, ("musb", "USB Mouse"))
634 if self.rc_mouse is not None:
635 tmp.insert(0, ("mrc", "Remote Control"))
636 self.mouse_list = tmp
638 tmp = copy.deepcopy(event_list)
639 if self.usb_keyboard is not None:
640 tmp.insert(0, ("kusb", "USB Keyboard"))
641 if self.rc_keyboard is not None:
642 tmp.insert(0, ("krc", "Remote Control"))
643 self.keyboard_list = tmp
644 print "E:", event_list
645 print "M:", self.mouse_list
646 print "K:", self.keyboard_list
648 def startBrowser(self):
649 self.timer_start.stop()
652 excute_cmd("killall -15 %s"%(self.browser_name))
653 excute_cmd("echo 0 > /proc/sys/vm/swappiness")
657 extra_cmd = "export VU_DOWNLOAD_DIR=/tmp; "
658 browser_cmd = "%s/%s -qws" % (self.browser_root, self.browser_name)
660 mouse_param = self.mouse.value
661 if self.mouse.value == "mrc":
662 mouse_param = self.rc_mouse
663 elif self.mouse.value == "musb":
664 mouse_param = self.usb_mouse
665 keyboard_param = self.keyboard.value
666 if self.keyboard.value == "krc":
667 keyboard_param = self.rc_keyboard
668 elif self.keyboard.value == "kusb":
669 keyboard_param = self.usb_keyboard
671 if self.getHandlerName(mouse_param)[1:].startswith("dreambox"):
672 enable_rc_mouse(True) #rc-mouse on
673 if str(mouse_param).startswith("event"):
674 mouse_cmd = "export QWS_MOUSE_PROTO=LinuxInput:/dev/input/%s; " % (str(mouse_param))
677 if self.langs.value == "ch":
678 keymap_param = ":keymap=/usr/share/keymaps/vuplus/ch.qmap"
679 elif self.langs.value == "rc_ch":
680 keymap_param = ":keymap=/usr/share/keymaps/vuplus/de.qmap"
681 elif self.langs.value == "rc_en":
682 keymap_param = ":keymap=/usr/share/keymaps/vuplus/us.qmap"
684 kbd_cmd = "export QWS_KEYBOARD=LinuxInput:/dev/input/%s%s; " % (str(keyboard_param), keymap_param)
686 cmd = "%s%s%s%s" % (extra_cmd, kbd_cmd, mouse_cmd, browser_cmd)
687 print "prepared command : [%s]" % cmd
689 self.launcher = eConsoleAppContainer()
690 self.launcher.appClosed.append(self.callbackLauncherAppClosed)
691 self.launcher.dataAvail.append(self.callbackLauncherDataAvail)
693 fbClass.getInstance().lock()
694 #eRCInput.getInstance().lock()
697 alpha_value = self.alpha.value
698 change_galpha(set_const=True, set_value=True)
700 self.launcher.execute(cmd)
701 print "started browser..."
705 self.info.setText("Starting Webbrowser. Please wait...")
706 if self.lock == False:
707 if self.langs.value == "ch" or self.langs.value == "rc_ch":
708 language.activateLanguageIndex(1)
710 language.activateLanguageIndex(0)
711 self.timer_start = eTimer()
712 self.timer_start.callback.append(self.startBrowser)
713 self.timer_start.start(10)
715 def getHandlerName(self, v):
723 v = self.usb_keyboard
724 for l in self.name_list:
729 def callbackLauncherDataAvail(self, ret_data):
731 if ret_data.startswith("--done--"):
735 def callbackLauncherAppClosed(self, retval = 1):
738 def sessionstart(session, **kwargs):
739 enable_rc_mouse(False)
740 change_galpha(set_const=False, set_value=True)
741 excute_cmd("killall -15 arora")
743 def main(session, **kwargs):
744 session.open(BrowserLauncher)
746 def Plugins(**kwargs):
747 return [PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, needsRestart = False, fnc=sessionstart),
748 PluginDescriptor(name=_("Web Browser"), description="start web browser", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)]