1 from Plugins.Plugin import PluginDescriptor
3 from Screens.Screen import Screen
4 from Screens.InfoBar import InfoBar
5 from Screens.ChoiceBox import ChoiceBox
6 from Screens.MessageBox import MessageBox
7 from Screens.InfoBarGenerics import InfoBarNotifications
8 from Screens.VirtualKeyBoard import VirtualKeyBoard
9 from Screens.HelpMenu import HelpableScreen
10 from Screens.ChannelSelection import service_types_tv
12 from Components.Language import language
13 from Components.PluginComponent import plugins
14 from Components.Button import Button
15 from Components.Sources.StaticText import StaticText
16 from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap
17 from Components.ServiceEventTracker import ServiceEventTracker
18 from Components.MenuList import MenuList
19 from Components.Label import Label, MultiColorLabel
20 from Components.ConfigList import ConfigListScreen
21 from Components.VolumeControl import VolumeControl
22 from Components.Pixmap import Pixmap
23 from Components.config import config, ConfigYesNo, ConfigSubsection, ConfigPosition, getConfigListEntry, ConfigBoolean, ConfigInteger, ConfigText, ConfigSelection, configfile
25 from enigma import eTimer, eConsoleAppContainer, getDesktop, eServiceReference, iPlayableService, iServiceInformation, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, RT_VALIGN_CENTER, getPrevAsciiCode, eRCInput, fbClass, eServiceCenter
27 from bookmark import BookmarkManager, BookmarkData, CategoryData
29 import os, struct, threading, stat, select, time, socket, select
31 from __init__ import _
33 strIsEmpty = lambda x: x is None or len(x) == 0
35 HBBTVAPP_PATH = "/usr/local/hbb-browser"
36 COMMAND_PATH = '/tmp/.sock.hbbtv.cmd'
46 channel_info_sid = None
47 channel_info_onid = None
48 channel_info_tsid = None
49 channel_info_name = None
50 channel_info_orgid = None
56 packet_hl = struct.calcsize(packet_h)
63 def UpdateInfoBar(self):
64 if self.resX == 1024 and self.resY == 720:
67 infobar = InfoBar.instance
68 if infobar._InfoBarShowHide__state != 3:
71 infobar.serviceStarted()
74 __gval__ = GlobalValues()
76 def setDefaultResolution(x, y):
81 def setResolution(xres, yres):
83 if __gval__.resX == 1280 and __gval__.resY == 720:
85 from enigma import gMainDC
86 gMainDC.getInstance().setResolution(xres, yres)
88 def restoreResolution():
90 setResolution(1280, 720)
91 setResolution(__gval__.resX, __gval__.resY)
93 if __gval__.resX == 1280 and __gval__.resY == 720:
95 __gval__.UpdateInfoBar()
97 def setPluginBrowser(browser=None):
99 __gval__.plugin_browser = browser
100 def getPluginBrowser():
102 return __gval__.plugin_browser
104 def getPacketHeaders():
106 return (__gval__.packet_m, __gval__.packet_h, __gval__.packet_hl)
108 def setChannelInfo(sid, onid, tsid, name, orgid):
109 if sid is None: sid = 0;
110 if onid is None: onid = 0;
111 if tsid is None: tsid = 0;
112 if name is None: name = "";
113 if orgid is None: orgid = 0;
115 __gval__.channel_info_sid = sid
116 __gval__.channel_info_onid = onid
117 __gval__.channel_info_tsid = tsid
118 __gval__.channel_info_name = name
119 __gval__.channel_info_orgid = orgid
120 print "Set Channel Info >> sid : %X, onid : %X, tsid : %X, name : %s, orgid : %d " % (sid, onid, tsid, name, orgid)
121 def getChannelInfos():
123 print "Get Channel Info >> sid : %X, onid : %X, tsid : %X, name : %s, orgid : %d " % (__gval__.channel_info_sid,
124 __gval__.channel_info_onid, __gval__.channel_info_tsid, __gval__.channel_info_name, __gval__.channel_info_orgid)
125 return (__gval__.channel_info_sid,
126 __gval__.channel_info_onid,
127 __gval__.channel_info_tsid,
128 __gval__.channel_info_name,
129 __gval__.channel_info_orgid)
133 print "Need Restart(GET) : ", __gval__.need_restart
134 return __gval__.need_restart
135 def setNeedRestart(n):
137 __gval__.need_restart = n
138 print "Need Restart(SET) : ", __gval__.need_restart
140 def getCommandUtil():
142 return __gval__.command_util
143 def getCommandServer():
145 return __gval__.command_server
147 def setBeforeService(s):
149 __gval__.before_service = s
150 def getBeforeService():
152 return __gval__.before_service
154 def _unpack(packed_data):
155 (mg, h, hlen) = getPacketHeaders()
157 if strIsEmpty(packed_data):
159 (m, o, l, s) = struct.unpack(h, packed_data[:hlen])
164 d = packed_data[hlen:hlen+l]
167 def _pack(opcode, params=None, reserved=0):
168 (m, h, hlen) = getPacketHeaders()
169 if strIsEmpty(params):
171 packed_data = struct.pack(h, m, opcode, len(params), reserved)
172 return packed_data + params
177 "OP_UNKNOWN" : 0x0000
178 ,"OP_HBBTV_EXIT" : 0x0001
179 ,"OP_HBBTV_OPEN_URL" : 0x0002
180 ,"OP_HBBTV_LOAD_AIT" : 0x0003
181 ,"OP_HBBTV_UNLOAD_AIT" : 0x0004
182 ,"OP_HBBTV_FULLSCREEN" : 0x0005
183 ,"OP_HBBTV_TITLE" : 0x0006
184 ,"OP_HBBTV_RETRY_OPEN_URL" : 0x0009
185 ,"OP_HBBTV_CHANGE_CHANNEL" : 0x000A
186 ,"OP_OIPF_GET_CHANNEL_INFO_URL" : 0x0101
187 ,"OP_OIPF_GET_CHANNEL_INFO_AIT" : 0x0102
188 ,"OP_OIPF_GET_CHANNEL_INFO_LIST": 0x0103
189 ,"OP_VOD_URI" : 0x0201
190 ,"OP_VOD_PLAY" : 0x0202
191 ,"OP_VOD_STOP" : 0x0203
192 ,"OP_VOD_PAUSE" : 0x0204
193 ,"OP_VOD_STATUS" : 0x0205
194 ,"OP_VOD_FORBIDDEN" : 0x0206
195 ,"OP_VOD_STOPED" : 0x0207
196 ,"OP_VOD_SPEED_CTRL" : 0x0208
197 ,"OP_VOD_SEEK_CTRL" : 0x0209
198 ,"OP_BROWSER_OPEN_URL" : 0x0301
199 ,"OP_BROWSER_VKBD_REQ" : 0x0309
200 ,"OP_BROWSER_VKBD_RES" : 0x030A
201 ,"OP_BROWSER_VKBD_PASTE_REQ" : 0x030B
202 ,"OP_BROWSER_VKBD_PASTE_KEY" : 0x030C
203 ,"OP_BROWSER_VKBD_PASTE_MOUSE" : 0x030D
204 ,"OP_BROWSER_MENU_REQ" : 0x030E
205 ,"OP_BROWSER_MENU_RES" : 0x030F
206 ,"OP_BROWSER_NEED_RELOAD_KEYMAP": 0x0313
207 ,"OP_DVBAPP_VOL_UP" : 0x0401
208 ,"OP_DVBAPP_VOL_DOWN" : 0x0402
209 ,"OP_DVBAPP_SET_VOL" : 0x0403
210 ,"OP_SYSTEM_OUT_OF_MEMORY" : 0x0501
211 ,"OP_SYSTEM_NOTIFY_MY_PID" : 0x0502
212 ,"OP_VIDEOBACKEND_ENABLE" : 0x0601
213 ,"OP_VIDEOBACKEND_DISABLE" : 0x0602
214 ,"OP_BROWSER_OPEN_YOUTUBETV" : 0x0603
217 0x0000 : "OP_UNKNOWN"
218 ,0x0001 : "OP_HBBTV_EXIT"
219 ,0x0002 : "OP_HBBTV_OPEN_URL"
220 ,0x0003 : "OP_HBBTV_LOAD_AIT"
221 ,0x0004 : "OP_HBBTV_UNLOAD_AIT"
222 ,0x0005 : "OP_HBBTV_FULLSCREEN"
223 ,0x0006 : "OP_HBBTV_TITLE"
224 ,0x0009 : "OP_HBBTV_RETRY_OPEN_URL"
225 ,0x000A : "OP_HBBTV_CHANGE_CHANNEL"
226 ,0x0101 : "OP_OIPF_GET_CHANNEL_INFO_URL"
227 ,0x0102 : "OP_OIPF_GET_CHANNEL_INFO_AIT"
228 ,0x0103 : "OP_OIPF_GET_CHANNEL_INFO_LIST"
229 ,0x0201 : "OP_VOD_URI"
230 ,0x0202 : "OP_VOD_PLAY"
231 ,0x0203 : "OP_VOD_STOP"
232 ,0x0204 : "OP_VOD_PAUSE"
233 ,0x0205 : "OP_VOD_STATUS"
234 ,0x0206 : "OP_VOD_FORBIDDEN"
235 ,0x0207 : "OP_VOD_STOPED"
236 ,0x0208 : "OP_VOD_SPEED_CTRL"
237 ,0x0209 : "OP_VOD_SEEK_CTRL"
238 ,0x0301 : "OP_BROWSER_OPEN_URL"
239 ,0x0309 : "OP_BROWSER_VKBD_REQ"
240 ,0x030A : "OP_BROWSER_VKBD_RES"
241 ,0x030B : "OP_BROWSER_VKBD_PASTE_REQ"
242 ,0x030C : "OP_BROWSER_VKBD_PASTE_KEY"
243 ,0x030D : "OP_BROWSER_VKBD_PASTE_MOUSE"
244 ,0x030E : "OP_BROWSER_MENU_REQ"
245 ,0x030F : "OP_BROWSER_MENU_RES"
246 ,0x0313 : "OP_BROWSER_NEED_RELOAD_KEYMAP"
247 ,0x0401 : "OP_DVBAPP_VOL_UP"
248 ,0x0402 : "OP_DVBAPP_VOL_DOWN"
249 ,0x0403 : "OP_DVBAPP_SET_VOL"
250 ,0x0501 : "OP_SYSTEM_OUT_OF_MEMORY"
251 ,0x0502 : "OP_SYSTEM_NOTIFY_MY_PID"
252 ,0x0601 : "OP_VIDEOBACKEND_ENABLE"
253 ,0x0602 : "OP_VIDEOBACKEND_DISABLE"
254 ,0x0603 : "OP_BROWSER_OPEN_YOUTUBETV"
257 def get(self, opstr):
259 return self._opcode_[opstr]
261 return self._opcode_["OP_UNKNOWN"]
263 def what(self, opcode):
265 return self._opstr_[opcode]
267 return self._opstr_["0x0000"]
280 def __init__(self, params):
281 self._protocol = params.protocol
282 self._type = params.type
283 self._addr = params.addr
284 self._buf_size = params.buf_size
285 self._handler = params.handler
286 self._timeout = params.timeout
287 self._destroy = params.destroy
289 self._terminated = False
290 self._server_thread = None
292 self.onHbbTVCloseCB = []
293 self.onSetPageTitleCB = []
296 if self._destroy is not None:
297 self._destroy(self._addr)
300 self._terminated = True
301 if self._server_thread is not None:
302 self._server_thread.join()
303 self._server_thread = None
306 self._socket = socket.socket(self._protocol, self._type)
307 self._socket.settimeout(self._timeout)
308 self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
309 self._socket.bind(self._addr)
310 self._socket.listen(True)
312 self._server_thread = threading.Thread(target=self._listen)
313 self._server_thread.start()
316 select_list = [self._socket]
319 conn, addr = self._socket.accept()
320 self._client(conn, addr)
321 except Exception, ErrMsg:
322 print "ServerSocket Error >>", ErrMsg
325 while not self._terminated:
326 readable, writable, errored = select.select(select_list, [], [], self._timeout)
328 if s is self._socket:
331 def _client(self, conn, addr):
334 received_data = conn.recv(self._buf_size)
335 if self._handler is not None and not strIsEmpty(received_data):
336 send_data = self._handler.doHandle(received_data, self.onHbbTVCloseCB, self.onSetPageTitleCB)
337 self._send(conn, send_data)
338 except Exception, ErrMsg:
341 if self._handler is not None:
342 self._handler.printError(ErrMsg)
343 def _send(self, conn, data) :
348 def doListenUnixTCP(self, name, handler):
352 if os.path.exists(name):
354 print "Removed ", name
358 params = SocketParams()
359 params.protocol = socket.AF_UNIX
360 params.type = socket.SOCK_STREAM
362 params.handler = handler
363 params.destroy = destroy
365 streamServer = StreamServer(params)
369 def doListenInetTCP(self, ip, port, handler):
370 print "Not implemented yet!!"
371 def doListenUnixDGRAM(self, name, handler):
372 print "Not implemented yet!!"
373 def doListenInetDGRAM(self, ip, port, handler):
374 print "Not implemented yet!!"
377 def doUnpack(self, data):
380 def doPack(self, opcode, params, reserved=0):
381 return _pack(opcode, params, reserved)
383 def doHandle(self, data, onCloseCB):
384 opcode, params = 0x0, 'Invalid Request!!'
385 return _pack(opcode, params)
387 def printError(self, reason):
390 class BrowserCommandUtil(OpCodeSet):
393 OpCodeSet.__init__(self)
395 def isConnected(self):
400 def doConnect(self, filename):
401 if not os.path.exists(filename):
402 print "File not exists :", filename
405 self._fd = os.open(filename, os.O_WRONLY|os.O_NONBLOCK)
407 print "Fail to open file :", filename
409 except Exception, ErrMsg:
415 def doDisconnect(self):
421 def doSend(self, command, params=None, reserved=0):
423 print "No found pipe!!"
427 data = _pack(self.get(command), params, reserved)
430 os.write(self._fd, data)
431 print "Send OK!! :", command
435 def sendCommand(self, command, params=None, reserved=0):
436 if not self.isConnected():
438 self.doConnect(COMMAND_PATH)
439 result = self.doSend(command, params, reserved)
443 class HandlerHbbTV(Handler):
445 def __init__(self, session):
446 self._session = session
447 self.opcode = OpCodeSet()
449 0x0001 : self._cb_handleCloseHbbTVBrowser
450 ,0x0006 : self._cb_handleSetPageTitle
451 ,0x0009 : self._cb_handleHbbTVRetryOpen
452 ,0x000A : self._cb_handleHbbTVChangeChannel
453 ,0x0101 : self._cb_handleGetChannelInfoForUrl
454 ,0x0102 : self._cb_handleGetChannelInfoForAIT
455 ,0x0103 : self._cb_handleGetChannelInfoList
456 ,0x0201 : self._cb_handleVODPlayerURI
457 ,0x0202 : self._cb_handleVODPlayerPlay
458 ,0x0203 : self._cb_handleVODPlayerStop
459 ,0x0204 : self._cb_handleVODPlayerPlayPause
460 ,0x0401 : self._cb_handleDVBAppVolUp
461 ,0x0402 : self._cb_handleDVBAppVolDown
462 ,0x0403 : self._cb_handleDVBAppSetVol
463 ,0x0208 : self._cb_handleVODSpeedCtrl
464 ,0x0209 : self._cb_handleVODSeekCtrl
465 ,0x0501 : self._cb_handleSystemOutOfMemory
466 ,0x0502 : self._cb_handleSystemNotufyMyPID
467 ,0x0309 : self._cb_handleShowVirtualKeyboard
468 ,0x030B : self._cb_handlePasteVirtualKeyboard
469 ,0x030E : self._cb_handleBrowserMenuReq
470 ,0x0601 : self._cb_handleVideobackendEnable
471 ,0x0602 : self._cb_handleVideobackendDisable
473 self._on_close_cb = None
474 self._on_set_title_cb = None
478 self._retry_open_url = None
479 self._timer_retry_open = eTimer()
480 self._timer_paste_vkbd = eTimer()
481 self._curren_title = None
482 self._max_volume = -1
483 self._soft_volume = -1
485 def _handle_dump(self, handle, opcode, data=None):
489 print " - opcode : ", self.opcode.what(opcode)
491 print " - data : ", data
493 def doHandle(self, data, onCloseCB, onSetPageTitleCB):
494 opcode, params, reserved = None, None, 0
495 self._on_close_cb = onCloseCB
496 self._on_set_title_cb = onSetPageTitleCB
498 datas = self.doUnpack(data)
499 except Exception, ErrMsg:
500 print "Unpacking packet ERR :", ErrMsg
501 params = 'fail to unpack packet!!'
502 opcode = self.opcode.get("OP_UNKNOWN")
503 return self.doPack(opcode, params)
507 self.opcode.what(opcode)
510 #print self.handle_map[opcode]
511 (reserved, params) = self.handle_map[opcode](opcode, params)
512 except Exception, ErrMsg:
513 print "Handling packet ERR :", ErrMsg
514 params = 'fail to handle packet!!'
515 opcode = self.opcode.get("OP_UNKNOWN")
516 return self.doPack(opcode, params)
517 self._on_close_cb = None
518 self._on_set_title_cb = None
519 return self.doPack(opcode, params, reserved)
521 def _cb_handleVideobackendEnable(self, opcode, data):
522 self._handle_dump(self._cb_handleVideobackendEnable, opcode, data)
523 service = self._session.nav.getCurrentlyPlayingServiceReference()
524 setBeforeService(service)
525 self._session.nav.stopService()
528 def _cb_handleVideobackendDisable(self, opcode, data):
529 self._handle_dump(self._cb_handleVideobackendDisable, opcode, data)
530 before_service = getBeforeService()
531 if before_service is not None:
532 self._session.nav.playService(before_service)
535 def _cb_handleHbbTVChangeChannel(self, opcode, data):
536 self._handle_dump(self._cb_handleHbbTVChangeChannel, opcode, data)
538 if _g_helper is None:
540 dataItems = data.split(":")
543 if not _g_helper.doChangeChannel(sid, tsid):
547 def _cb_handleBrowserMenuReq(self, opcode, data):
548 self._handle_dump(self._cb_handleBrowserMenuReq, opcode, data)
550 fbClass.getInstance().unlock()
551 eRCInput.getInstance().unlock()
552 browser = getPluginBrowser()
553 if browser is not None:
554 browser.setCurrentPageUrl(data, self._curren_title)
557 def _cb_handlePasteVirtualKeyboard(self, opcode, data):
558 self._handle_dump(self._cb_handlePasteVirtualKeyboard, opcode, data)
559 def _cb_PasteRefocusVirtualKeyboard():
560 self._timer_paste_vkbd.stop()
561 command_util = getCommandUtil()
562 command_util.sendCommand('OP_BROWSER_VKBD_PASTE_MOUSE')
564 self._timer_paste_vkbd.callback.remove(_cb_PasteMouseVirtualKeyboard)
566 def _cb_PasteKeyVirtualKeyboard():
567 self._timer_paste_vkbd.stop()
568 command_util = getCommandUtil()
569 command_util.sendCommand('OP_BROWSER_VKBD_PASTE_KEY')
571 self._timer_paste_vkbd.callback.remove(_cb_PasteKeyVirtualKeyboard)
573 self._timer_paste_vkbd.callback.append(_cb_PasteRefocusVirtualKeyboard)
574 self._timer_paste_vkbd.start(100)
575 def _cb_PasteMouseVirtualKeyboard():
576 self._timer_paste_vkbd.stop()
577 command_util = getCommandUtil()
578 command_util.sendCommand('OP_BROWSER_VKBD_PASTE_MOUSE')
580 #command_util.sendCommand('OP_BROWSER_VKBD_PASTE_MOUSE')
582 self._timer_paste_vkbd.callback.remove(_cb_PasteMouseVirtualKeyboard)
584 #self._timer_paste_vkbd.callback.append(_cb_PasteKeyVirtualKeyboard)
585 #self._timer_paste_vkbd.start(1000)
586 self._timer_paste_vkbd.callback.append(_cb_PasteMouseVirtualKeyboard)
587 self._timer_paste_vkbd.start(50)
590 def _cb_virtualKeyboardClosed(self, data=None):
591 fbClass.getInstance().lock()
592 eRCInput.getInstance().lock()
593 #setResolution(1280, 720)
594 command_util = getCommandUtil()
595 command_util.sendCommand('OP_BROWSER_VKBD_RES', data)
597 def _cb_handleShowVirtualKeyboard(self, opcode, data):
598 self._handle_dump(self._cb_handleShowVirtualKeyboard, opcode, data)
600 fbClass.getInstance().unlock()
601 eRCInput.getInstance().unlock()
602 if data == 0 or strIsEmpty(data):
604 self._session.openWithCallback(self._cb_virtualKeyboardClosed, VirtualKeyBoard, title=("Please enter URL here"), text=data)
607 def _cb_handleVODSeekCtrl(self, opcode, data):
608 self._handle_dump(self._cb_handleVODSeekCtrl, opcode, data)
609 headLen = struct.calcsize('!I')
610 unpackedData = struct.unpack('!I', data[:headLen])
611 seekTime = unpackedData[0]
612 service = self._session.nav.getCurrentService()
613 seekable = service.seek()
614 if seekable is None or not seekable.isCurrentlySeekable():
615 raise Exception("This stream is not support manual seek.")
617 seekable.seekRelative(pts<0 and -1 or 1, abs(pts))
620 def _cb_handleHbbTVRetryOpen(self, opcode, data):
621 def _cb_HbbTVRetryOpenURL():
622 self._timer_retry_open.stop()
623 if self._retry_open_url is not None:
624 command_util = getCommandUtil()
625 command_util.sendCommand('OP_HBBTV_RETRY_OPEN_URL', params=self._retry_open_url)
626 self._retry_open_url = None
628 self._timer_retry_open.callback.remove(_cb_HbbTVRetryOpenURL)
630 self._handle_dump(self._cb_handleHbbTVRetryOpen, opcode, data)
631 headLen = struct.calcsize('!I')
632 unpackedData = struct.unpack('!I', data[:headLen])
633 delayTime = unpackedData[0]
634 restartUrl = data[headLen:]
636 self._retry_open_url = restartUrl.strip()
637 self._timer_retry_open.callback.append(_cb_HbbTVRetryOpenURL)
638 self._timer_retry_open.start(delayTime*1000)
641 def _cb_handleSystemNotufyMyPID(self, opcode, data):
642 self._handle_dump(self._cb_handleSystemNotufyMyPID, opcode, data)
645 def _cb_handleSystemOutOfMemory(self, opcode, data):
646 self._handle_dump(self._cb_handleSystemOutOfMemory, opcode, data)
650 def _cb_handleVODSpeedCtrl(self, opcode, data):
651 self._handle_dump(self._cb_handleVODSpeedCtrl, opcode, data)
652 headLen = struct.calcsize('!I')
653 unpackedData = struct.unpack('!I', data[:headLen])
654 playSpeed = unpackedData[0]
655 service = self._session.nav.getCurrentService()
656 pauseable = service.pause()
659 if pauseable.setFastForward(playSpeed) == -1:
660 pauseable.setFastForward(1)
661 raise Exception("This stream is not support trick play.")
664 def SetVolume(self, volume):
665 if self._max_volume < 0:
666 self._max_volume = VolumeControl.instance.volctrl.getVolume()
668 self._max_volume += volume
669 if self._max_volume > 100:
670 self._max_volume = 100
671 elif self._max_volume < 0:
674 if self._soft_volume > 0:
675 v = int((self._max_volume * self._soft_volume) / 100)
676 VolumeControl.instance.volctrl.setVolume(v, v)
677 else: VolumeControl.instance.volctrl.setVolume(self._max_volume, self._max_volume)
679 def _cb_handleDVBAppVolUp(self, opcode, data):
680 self._handle_dump(self._cb_handleDVBAppVolUp, opcode, data)
684 def _cb_handleDVBAppVolDown(self, opcode, data):
685 self._handle_dump(self._cb_handleDVBAppVolDown, opcode, data)
689 def _cb_handleDVBAppSetVol(self, opcode, data):
690 self._handle_dump(self._cb_handleDVBAppSetVol, opcode, data)
691 if self._max_volume < 0:
692 self._max_volume = VolumeControl.instance.volctrl.getVolume()
693 self._soft_volume = int(data)
696 if self._soft_volume > 0 and self._max_volume > 0:
697 v = int((self._max_volume * self._soft_volume) / 100)
698 VolumeControl.instance.volctrl.setVolume(v, v)
701 def _cb_handleGetChannelInfoForUrl(self, opcode, data):
702 self._handle_dump(self._cb_handleGetChannelInfoForUrl, opcode, data)
703 (sid, onid, tsid, name, orgid) = getChannelInfos()
705 return (0, struct.pack('!IIII', sid, onid, tsid, namelen) + name)
707 def _cb_handleGetChannelInfoForAIT(self, opcode, data):
708 self._handle_dump(self._cb_handleGetChannelInfoForAIT, opcode, data)
709 (sid, onid, tsid, name, orgid) = getChannelInfos()
711 return (0, struct.pack('!IIIII', orgid, sid, onid, tsid, namelen) + name)
713 def _cb_handleGetChannelInfoList(self, opcode, data):
714 self._handle_dump(self._cb_handleGetChannelInfoList, opcode, data)
715 (sid, onid, tsid, name, orgid) = getChannelInfos()
717 channel_list_size = 1
718 return (channel_list_size, struct.pack('!IIII', sid, onid, tsid, namelen) + name)
720 def _cb_handleSetPageTitle(self, opcode, data):
721 self._handle_dump(self._cb_handleSetPageTitle, opcode, data)
722 if data.startswith('file://') or data.startswith('http://'):
724 if self._on_set_title_cb is not None:
725 for x in self._on_set_title_cb:
728 self._curren_title = data
729 except Exception, ErrMsg:
730 if x in self._on_set_title_cb:
731 self._on_set_title_cb.remove(x)
734 def _cb_handleCloseHbbTVBrowser(self, opcode, data):
735 self._timer_retry_open.stop()
737 self._timer_retry_open.callback.remove(_cb_HbbTVRetryOpenURL)
739 self._handle_dump(self._cb_handleCloseHbbTVBrowser, opcode, data)
741 if self._on_close_cb:
742 for x in self._on_close_cb:
745 except Exception, ErrMsg:
746 if x in self._on_close_cb:
747 self._on_close_cb.remove(x)
749 command_util = getCommandUtil()
750 command_util.sendCommand('OP_HBBTV_FULLSCREEN', None)
752 before_service = getBeforeService()
753 if before_service is not None:
754 self._session.nav.playService(before_service)
760 def _cb_handleVODPlayerURI(self, opcode, data):
762 hl = struct.calcsize('!II')
763 datas = struct.unpack('!II', data[:hl])
765 vodUri = data[hl:hl+uriLength]
766 self._handle_dump(self._cb_handleVODPlayerURI, opcode, vodUri)
767 self._vod_uri = vodUri
770 def doStop(self, restoreBeforeService=True, needStop=True):
772 self._session.nav.stopService()
773 if self._vod_service is not None and restoreBeforeService:
774 before_service = getBeforeService()
775 self._session.nav.playService(before_service)
777 self._vod_service = None
782 def doRetryOpen(self, url):
786 self._vod_service = None
788 #print "Try to open vod [%d] : %s" % (ii, url)
789 print "Try to open vod"
790 self._vod_service = eServiceReference(4097, 0, url)
791 self._session.nav.playService(self._vod_service)
792 if self._vod_service is not None:
794 except Exception, ErrMsg:
795 print "OpenVOD ERR :", ErrMsg
799 def _cb_handleVODPlayerPlay(self, opcode, data):
800 self._handle_dump(self._cb_handleVODPlayerPlay, opcode, data)
801 self.doStop(restoreBeforeService=False)
802 if self.doRetryOpen(url=self._vod_uri) == False:
806 def _cb_handleVODPlayerStop(self, opcode, data):
807 self._handle_dump(self._cb_handleVODPlayerStop, opcode, data)
811 def _cb_handleVODPlayerPlayPause(self, opcode, data):
812 self._handle_dump(self._cb_handleVODPlayerPlayPause, opcode, data)
813 service = self._session.nav.getCurrentService()
816 servicePause = service.pause()
818 servicePause.unpause()
819 elif pauseFlag == 'P':
821 except Exception, ErrMsg:
822 print "onPause ERR :", ErrMsg
825 from libshm import SimpleSharedMemory
827 class HbbTVWindow(Screen, InfoBarNotifications):
829 <screen name="HbbTVWindow" position="0,0" size="1280,720" backgroundColor="transparent" flags="wfNoBorder" title="HbbTV Plugin">
832 def __init__(self, session, url=None, cbf=None, useAIT=False, profile=0):
833 self._session = session
834 setResolution(1280, 720)
835 fbClass.getInstance().lock()
836 eRCInput.getInstance().lock()
838 Screen.__init__(self, session)
839 InfoBarNotifications.__init__(self)
840 self.__event_tracker = ServiceEventTracker(screen = self, eventmap = {
841 iPlayableService.evStart: self._serviceStarted,
842 iPlayableService.evEOF: self._serviceEOF,
846 self._use_ait = useAIT
847 self._profile = profile
848 self._cb_closed_func = cbf
849 self.onLayoutFinish.append(self._layoutFinished)
851 command_server = getCommandServer()
852 if self._cb_set_page_title not in command_server.onSetPageTitleCB:
853 command_server.onSetPageTitleCB.append(self._cb_set_page_title)
855 if self._cb_close_window not in command_server.onHbbTVCloseCB:
856 command_server.onHbbTVCloseCB.append(self._cb_close_window)
858 self._closeTimer = eTimer()
859 self._closeTimer.callback.append(self._do_close)
861 self._currentServicePositionTimer = eTimer()
862 self._currentServicePositionTimer.callback.append(self._cb_currentServicePosition)
869 def getVodPlayTime(self):
871 service = self._session.nav.getCurrentService()
872 seek = service and service.seek()
874 p = seek.getPlayPosition()
875 if(not l[0] and not p[0]):
881 def _cb_currentServicePosition(self):
882 def getTimeString(t):
883 t = time.localtime(t/90000)
884 return "%2d:%02d:%02d" % (t.tm_hour, t.tm_min, t.tm_sec)
885 position,length = 0,0
887 (position,length) = self.getVodPlayTime()
888 self._vod_length = length
889 if position == -1 and length == -1:
890 raise Exception("Can't get play status")
891 #print getTimeString(position), "/", getTimeString(length)
892 self._ssm.setStatus(position, length, 1)
893 except Exception, ErrMsg:
897 def _serviceStarted(self):
899 self._ssm.setStatus(0, 0, 0)
900 self._currentServicePositionTimer.start(1000)
901 except Exception, ErrMsg:
904 def _serviceEOF(self):
905 (position,length) = self.getVodPlayTime()
906 self._ssm.setStatus(length, length, 1)
908 self._currentServicePositionTimer.stop()
910 def _layoutFinished(self):
912 __gval__.hbbtv_handelr._soft_volume = -1
913 self.setTitle(_('HbbTV Plugin'))
914 command_util = getCommandUtil()
915 profile = self._profile
916 (sid, onid, tsid, name, orgid) = getChannelInfos()
917 params = struct.pack('!IIIIII', orgid, profile, sid, onid, tsid, len(name)) + name
919 command_util.sendCommand('OP_HBBTV_UNLOAD_AIT')
921 command_util.sendCommand('OP_HBBTV_LOAD_AIT', params, 1)
923 command_util.sendCommand('OP_HBBTV_LOAD_AIT', params)
925 command_util.sendCommand('OP_HBBTV_OPEN_URL', self._url)
927 def _cb_close_window(self):
928 self._closeTimer.start(1000)
931 self._closeTimer.stop()
932 command_server = getCommandServer()
934 if self._cb_set_page_title in command_server.onSetPageTitleCB:
935 command_server.onSetPageTitleCB.remove(self._cb_set_page_title)
936 except Exception, ErrMsg: pass
938 if self._cb_close_window in command_server.onHbbTVCloseCB:
939 command_server.onHbbTVCloseCB.remove(self._cb_close_window)
940 except Exception, ErrMsg: pass
942 if self._cb_closed_func is not None:
943 self._cb_closed_func()
946 fbClass.getInstance().unlock()
947 eRCInput.getInstance().unlock()
950 def _cb_set_page_title(self, title=None):
951 print "page title :",title
956 class HbbTVHelper(Screen, InfoBarNotifications):
957 skin = """<screen name="HbbTVHelper" position="0,0" size="0,0" backgroundColor="transparent" flags="wfNoBorder" title=" "></screen>"""
958 def __init__(self, session):
960 __gval__.hbbtv_handelr = HandlerHbbTV(session)
961 __gval__.command_server = ServerFactory().doListenUnixTCP('/tmp/.sock.hbbtv.url', __gval__.hbbtv_handelr)
963 Screen.__init__(self, session)
964 InfoBarNotifications.__init__(self)
966 self._session = session
968 self._restart_opera()
970 self._timer_infobar = eTimer()
971 self._timer_infobar.callback.append(self._cb_registrate_infobar)
972 self._timer_infobar.start(1000)
974 self._excuted_browser = False
977 __gval__.command_util = BrowserCommandUtil()
981 _g_ssm_ = SimpleSharedMemory()
984 self._callbackStartStop = None
986 self.__et = ServiceEventTracker(screen=self, eventmap={
987 iPlayableService.evHBBTVInfo: self._cb_detectedAIT,
988 iPlayableService.evUpdatedInfo: self._cb_updateInfo
990 self._applicationList = None
992 self.mVuplusBox = False
993 issue = open("/etc/issue").read()
994 if(issue.startswith("Vuplus")):
995 self.mVuplusBox = True
997 def _cb_detectedAIT(self):
998 name = self._cb_ready_for_ait()
999 if name is not None and self.mVuplusBox:
1000 from Screens.InfoBarGenerics import gHbbtvApplication
1001 gHbbtvApplication.setApplicationName(str(name))
1003 def _cb_updateInfo(self):
1004 if not self._excuted_browser:
1005 command_util = getCommandUtil()
1006 command_util.sendCommand('OP_HBBTV_UNLOAD_AIT')
1008 from Screens.InfoBarGenerics import gHbbtvApplication
1009 gHbbtvApplication.setApplicationName("")
1010 #self._applicationList = None
1012 def _cb_registrate_infobar(self):
1013 if InfoBar.instance:
1014 self._timer_infobar.stop()
1015 if self._cb_hbbtv_activated not in InfoBar.instance.onHBBTVActivation:
1016 InfoBar.instance.onHBBTVActivation.append(self._cb_hbbtv_activated)
1018 def _cb_ready_for_ait(self):
1019 setChannelInfo(None, None, None, None, None)
1021 service = self._session.nav.getCurrentService()
1022 info = service and service.info()
1023 if info is not None:
1024 sid = info.getInfo(iServiceInformation.sSID)
1025 onid = info.getInfo(iServiceInformation.sONID)
1026 tsid = info.getInfo(iServiceInformation.sTSID)
1027 name = info.getName()
1031 pmtid = info.getInfo(iServiceInformation.sPMTPID)
1032 demux = info.getInfoString(iServiceInformation.sLiveStreamDemuxId)
1034 from aitreader import eAITSectionReader
1035 reader = eAITSectionReader(demux, pmtid, sid)
1036 if reader.doOpen(info, self.mVuplusBox):
1037 reader.doParseApplications()
1039 else: print "no data!!"
1042 self._applicationList = reader.getApplicationList()
1043 if len(self._applicationList) > 0:
1044 orgid = int(self._applicationList[0]["orgid"])
1045 setChannelInfo(sid, onid, tsid, name, orgid)
1046 return self._applicationList[0]["name"]
1050 def _cb_hbbtv_activated(self, title=None, url=None):
1051 if not self._is_browser_running():
1052 message = _("HbbTV Browser was not running.\nPlease running browser before start HbbTV Application.")
1053 self._session.open(MessageBox, message, MessageBox.TYPE_INFO)
1055 service = self._session.nav.getCurrentlyPlayingServiceReference()
1056 setBeforeService(service)
1057 self._start_hbbtv_application(title, url)
1059 def _start_hbbtv_application(self, title, url):
1061 tmp_url = self.getStartHbbTVUrl()
1065 print "can't get url of hbbtv!!"
1067 print "success to get url of hbbtv!! >>", url
1068 if self._excuted_browser:
1069 print "already excuted opera browser!!"
1073 self._restart_opera()
1075 setNeedRestart(False)
1077 for x in self._applicationList:
1078 control_code = int(x["control"])
1080 if tmp_url == url and control_code == 1:
1082 self._excuted_browser = True
1083 self._session.open(HbbTVWindow, url, self._cb_closed_browser, use_ait, self._profile)
1085 def _cb_closed_browser(self):
1086 self._excuted_browser = False
1088 def _start_opera(self):
1089 if not self._is_browser_running():
1090 global HBBTVAPP_PATH
1092 start_command = '%s/launcher start %d %d'%(HBBTVAPP_PATH, __gval__.resX, __gval__.resY)
1093 os.system(start_command)
1096 def _stop_opera(self):
1097 global HBBTVAPP_PATH
1098 try: os.system('%s/launcher stop'%(HBBTVAPP_PATH))
1101 def _restart_opera(self):
1102 global HBBTVAPP_PATH
1104 try: os.system('%s/launcher restart %d %d'%(HBBTVAPP_PATH, __gval__.resX, __gval__.resY))
1108 def getStartHbbTVUrl(self):
1109 url, self._profile = None, 0
1110 if self._applicationList is not None:
1111 self._profile = self._applicationList[0]["profile"]
1112 url = self._applicationList[0]["url"]
1114 service = self._session.nav.getCurrentService()
1115 info = service and service.info()
1116 url = info.getInfoString(iServiceInformation.sHBBTVUrl)
1119 def showApplicationSelectionBox(self):
1122 if self.getStartHbbTVUrl():
1123 for x in self._applicationList:
1124 applications.append((x["name"], x))
1125 else: applications.append((_("No detected HbbTV applications."), None))
1126 self._session.openWithCallback(self._application_selected, ChoiceBox, title=_("Please choose an HbbTV application."), list=applications)
1128 def _application_selected(self, selected):
1131 if selected[1] is None: return
1132 self._cb_hbbtv_activated(selected[1]["name"], selected[1]["url"])
1133 except Exception, ErrMsg: print ErrMsg
1135 def showBrowserConfigBox(self, callback=None):
1136 start_stop_mode = []
1137 self._callbackStartStop = callback
1138 if self._is_browser_running():
1139 start_stop_mode.append((_('Stop'),'Stop'))
1140 else: start_stop_mode.append((_('Start'),'Start'))
1141 self._session.openWithCallback(self._browser_config_selected, ChoiceBox, title=_("Please choose one."), list=start_stop_mode)
1143 def _browser_config_selected(self, selected):
1144 if selected is None:
1146 if self._callbackStartStop is not None:
1147 self._callbackStartStop()
1151 if not self._is_browser_running():
1153 elif mode == 'Stop':
1155 except Exception, ErrMsg: print "Config ERR :", ErrMsg
1157 def _is_browser_running(self):
1159 global HBBTVAPP_PATH
1160 ret = os.popen('%s/launcher check'%(HBBTVAPP_PATH)).read()
1161 return ret.strip() != "0"
1162 except Exception, ErrMsg:
1163 print "Check Browser Running ERR :", ErrMsg
1166 def doChangeChannel(self, _sid, _tsid):
1167 root = eServiceReference(service_types_tv)
1170 serviceList = eServiceCenter.getInstance().list(root)
1171 if serviceList is None:
1174 service = serviceList.getNext()
1175 if service is None or not service.valid():
1178 #1:0:19:2840:3FB:1:C00000:0:0:0:
1179 serviceRef = service.toString()
1180 if strIsEmpty(serviceRef):
1182 serviceRefItems = serviceRef.split(":")
1183 if len(serviceRefItems) < 5:
1186 sid = serviceRefItems[3]
1187 tsid = serviceRefItems[4]
1188 if sid == _sid and tsid == _tsid:
1189 self._session.nav.playService(eServiceReference(serviceRef))
1190 service = self._session.nav.getCurrentlyPlayingServiceReference()
1191 setBeforeService(service)
1195 class OperaBrowserSetting:
1197 self._settingFileName = '/usr/local/hbb-browser/home/setting.ini'
1203 f = open(self._settingFileName)
1204 for line in f.readlines():
1205 if line.startswith('start='):
1206 tmp = line[6:len(line)-1].split()
1207 self._start = tmp[0]
1209 self._type = int(tmp[1])
1210 else: self._type = 0
1211 elif line.startswith('keymap='):
1212 self._keymap = line[7:len(line)-1]
1216 tmpstr.append('start=%s %d\n' % (self._start, self._type))
1217 tmpstr.append('keymap=%s\n' % (self._keymap))
1218 f = open(self._settingFileName, 'w')
1219 f.writelines(tmpstr)
1221 def setData(self, start, types=0, keymap="us-rc"):
1224 self._keymap = keymap
1228 'start':self._start,
1230 'keymap':self._keymap,
1233 class OperaBrowserPreferenceWindow(ConfigListScreen, Screen):
1235 <screen position="center,120" size="600,350" title="Preference">
1236 <widget name="url" position="5,0" size="590,100" valign="center" font="Regular;20" />
1237 <widget name="config" position="0,100" size="600,200" scrollbarMode="showOnDemand" />
1239 <ePixmap pixmap="skin_default/buttons/red.png" position="310,310" size="140,40" alphatest="on" />
1240 <ePixmap pixmap="skin_default/buttons/green.png" position="150,310" size="140,40" alphatest="on" />
1242 <widget source="key_red" render="Label" position="310,310" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
1243 <widget source="key_green" render="Label" position="150,310" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
1246 def __init__(self, session, currentUrl):
1247 self.session = session
1248 Screen.__init__(self, session)
1251 ConfigListScreen.__init__(self, self.menulist)
1253 self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", ], {
1254 "red" : self.keyRed,
1255 "green" : self.keyGreen,
1257 "cancel" : self.keyRed
1259 self["key_red"] = StaticText(_("Cancel"))
1260 self["key_green"] = StaticText(_("Save"))
1261 self["url"] = Label()
1263 self._currentPageUrl = currentUrl
1264 if self._currentPageUrl is None:
1265 self._currentPageUrl = ''
1266 self._startPageUrl = None
1267 self._keymapType = None
1268 self.makeMenuEntry()
1269 self.onLayoutFinish.append(self.layoutFinished)
1271 def layoutFinished(self):
1272 self.setTitle(_('Preference'))
1274 def updateStartPageUrl(self):
1275 if self.menuItemStartpage.value == "startpage":
1276 self["url"].setText(self._startPageUrl)
1277 elif self.menuItemStartpage.value == "current":
1278 self["url"].setText(self._currentPageUrl)
1279 elif self.menuItemStartpage.value == "direct":
1280 self["url"].setText('')
1283 url = self["url"].getText()
1285 self.session.open(MessageBox, _('Invalid URL!!(Empty)\nPlease, Input to the URL.'), type = MessageBox.TYPE_INFO)
1288 if url.find('/usr/local/manual') > 0:
1290 self._keymapType = self.menuItemKeyboardLayout.value
1291 OperaBrowserSetting().setData(url, mode, self._keymapType)
1292 command_util = getCommandUtil()
1293 command_util.sendCommand('OP_BROWSER_NEED_RELOAD_KEYMAP')
1300 def _cb_directInputUrl(data):
1301 if strIsEmpty(data):
1303 self["url"].setText(data)
1304 if self.menuItemStartpage.value == "direct":
1305 self.session.openWithCallback(_cb_directInputUrl, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
1308 ConfigListScreen.keyLeft(self)
1309 self.updateStartPageUrl()
1312 ConfigListScreen.keyRight(self)
1313 self.updateStartPageUrl()
1315 def getKeymapTypeList(self):
1317 for f in os.listdir("/usr/local/hbb-browser/keymap"):
1318 filesplit = f.split('.')
1319 if len(filesplit) < 2:
1321 types.append((filesplit[1], filesplit[1]))
1325 def makeMenuEntry(self):
1327 l.append(("startpage", _("Start Page")))
1328 if not strIsEmpty(self._currentPageUrl):
1329 l.append(("current", _("Current Page")))
1330 l.append(("direct", _("Direct Input")))
1331 self.menuItemStartpage = ConfigSelection(default="startpage", choices = l)
1332 self.menuEntryStartpage = getConfigListEntry(_("Startpage"), self.menuItemStartpage)
1334 kl = self.getKeymapTypeList()
1337 d = OperaBrowserSetting().getData()
1338 self._startPageUrl = d['start']
1339 self._keymapType = d['keymap']
1341 except: self._startPageUrl = 'http://vuplus.com'
1342 self.updateStartPageUrl()
1344 if self._keymapType is None or len(self._keymapType) == 0:
1345 self._keymapType = "us-rc"
1346 self.menuItemKeyboardLayout = ConfigSelection(default=self._keymapType, choices = kl)
1347 self.menuEntryKeyboardLayout = getConfigListEntry(_("Keyboard Layout"), self.menuItemKeyboardLayout)
1348 self.resetMenuList()
1350 def resetMenuList(self):
1352 self.menulist.append(self.menuEntryStartpage)
1353 self.menulist.append(self.menuEntryKeyboardLayout)
1355 self["config"].list = self.menulist
1356 self["config"].l.setList(self.menulist)
1358 class BookmarkEditWindow(ConfigListScreen, Screen):
1359 CATEGORY,BOOKMARK = 0,1
1361 <screen position="center,center" size="600,140" title="Bookmark Edit">
1362 <widget name="config" position="0,0" size="600,100" scrollbarMode="showOnDemand" />
1364 <ePixmap pixmap="skin_default/buttons/red.png" position="310,100" size="140,40" alphatest="on" />
1365 <ePixmap pixmap="skin_default/buttons/green.png" position="150,100" size="140,40" alphatest="on" />
1367 <widget source="key_red" render="Label" position="310,100" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
1368 <widget source="key_green" render="Label" position="150,100" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
1370 <widget name="VKeyIcon" pixmap="skin_default/buttons/key_text.png" position="0,100" zPosition="10" size="35,25" transparent="1" alphatest="on" />
1374 def __init__(self, session, _mode, _type, _data, _bm):
1378 self.mSession = session
1379 self.mBookmarkManager = _bm
1381 if _data is not None:
1384 Screen.__init__(self, session)
1387 ConfigListScreen.__init__(self, self.menulist)
1389 self["actions"] = ActionMap(["OkCancelActions", "ColorActions",], {
1390 "ok" : self.keyGreen,
1391 "green" : self.keyGreen,
1392 "red" : self.keyRed,
1393 "cancel" : self.keyRed,
1396 self["VKeyIcon"] = Pixmap()
1397 self["key_red"] = StaticText(_("Cancel"))
1398 self["key_green"] = StaticText(_("Save"))
1400 self.menuItemTitle = None
1401 self.menuItemUrl = None
1402 self.menuItemName = None
1404 self.menuEntryName = None
1405 self.menuEntryTitle = None
1406 self.menuEntryUrl = None
1408 self.makeConfigList()
1409 self.onLayoutFinish.append(self.layoutFinished)
1411 def layoutFinished(self):
1412 self.setTitle(_('Bookmark') + ' ' + self.mMode)
1414 def selectedItem(self):
1415 currentPosition = self["config"].getCurrent()
1416 if self.mType == BookmarkEditWindow.CATEGORY:
1417 return (_("Name"), self.menuItemName)
1419 if currentPosition == self.menuEntryTitle:
1420 return (_("Title"), self.menuItemTitle)
1421 elif currentPosition == self.menuEntryUrl:
1422 return (_("Url"), self.menuItemUrl)
1425 def showMessageBox(self, text):
1426 msg = _("Invalid ") + text + _("!!(Empty)\nPlease, Input to the ") + text + "."
1427 self.mSession.openWithCallback(self.showVKeyWindow, MessageBox, msg, MessageBox.TYPE_INFO)
1430 def showVKeyWindow(self, data=None):
1433 selected = self.selectedItem()
1434 if selected is not None:
1435 itemValue = selected[1].value
1436 if strIsEmpty(itemValue):
1438 itemTitle = selected[0]
1440 self.session.openWithCallback(self.cbVKeyWindow, VirtualKeyBoard, title=itemTitle, text=itemValue)
1442 def cbVKeyWindow(self, data=None):
1443 if data is not None:
1444 selected = self.selectedItem()
1445 if selected is not None:
1446 selected[1].setValue(data)
1449 if self.mType == BookmarkEditWindow.CATEGORY:
1450 if self.mMode == _('Add'):
1451 categoryName = self.menuItemName.value
1452 if strIsEmpty(categoryName):
1453 return self.showMessageBox(_("Category Name"))
1454 self.mBookmarkManager.addCategory(categoryName)
1456 if strIsEmpty(self.menuItemName.value):
1457 return self.showMessageBox(_("Category Name"))
1458 self.mData.mName = self.menuItemName.value
1459 self.mBookmarkManager.updateCategory(self.mData)
1461 if self.mMode == _('Add'):
1462 bookmarkTitle = self.menuItemTitle.value
1463 bookmarkUrl = self.menuItemUrl.value
1464 if strIsEmpty(bookmarkTitle):
1465 self["config"].setCurrentIndex(0)
1466 return self.showMessageBox(_("Bookmark Title"))
1467 if strIsEmpty(bookmarkUrl):
1468 self["config"].setCurrentIndex(1)
1469 return self.showMessageBox(_("Bookmark URL"))
1470 self.mBookmarkManager.addBookmark(bookmarkTitle, bookmarkUrl, self.mData.mParent, 0)
1472 if strIsEmpty(self.menuItemTitle.value):
1473 self["config"].setCurrentIndex(0)
1474 return self.showMessageBox(_("Bookmark Title"))
1475 if strIsEmpty(self.menuItemUrl.value):
1476 self["config"].setCurrentIndex(1)
1477 return self.showMessageBox(_("Bookmark URL"))
1478 self.mData.mTitle = self.menuItemTitle.value
1479 self.mData.mUrl = self.menuItemUrl.value
1480 self.mBookmarkManager.updateBookmark(self.mData)
1484 if not self.saveData():
1490 ConfigListScreen.keyLeft(self)
1492 ConfigListScreen.keyRight(self)
1493 def makeConfigList(self):
1496 if self.mType == BookmarkEditWindow.CATEGORY:
1497 self.menuItemName = ConfigText(default=self.mData.mName, visible_width=65, fixed_size=False)
1499 self.menuEntryName = getConfigListEntry(_("Name"), self.menuItemName)
1501 self.menulist.append(self.menuEntryName)
1503 self.menuItemTitle = ConfigText(default=self.mData.mTitle, visible_width=65, fixed_size=False)
1504 self.menuItemUrl = ConfigText(default=self.mData.mUrl, visible_width=65, fixed_size=False)
1506 self.menuEntryTitle = getConfigListEntry(_("Title"), self.menuItemTitle)
1507 self.menuEntryUrl = getConfigListEntry(_("Url"), self.menuItemUrl)
1509 self.menulist.append(self.menuEntryTitle)
1510 self.menulist.append(self.menuEntryUrl)
1512 self["config"].list = self.menulist
1513 self["config"].l.setList(self.menulist)
1515 class OperaBrowserBookmarkWindow(Screen):
1517 <screen name="HbbTVBrowserBookmarkWindow" position="center,120" size="600,400" title="Bookmark" >
1518 <widget name="bookmarklist" position="0,0" size="600,200" zPosition="10" scrollbarMode="showOnDemand" />
1520 <ePixmap pixmap="skin_default/buttons/key_0.png" position="556,330" size="35,30" alphatest="on" />
1521 <widget source="key_0" render="Label" position="258,330" zPosition="1" size="300,30" font="Regular;20" halign="right" valign="center"/>
1523 <ePixmap pixmap="skin_default/buttons/red.png" position="5,360" size="140,40" alphatest="on" />
1524 <ePixmap pixmap="skin_default/buttons/green.png" position="155,360" size="140,40" alphatest="on" />
1525 <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,360" size="140,40" alphatest="on" />
1526 <ePixmap pixmap="skin_default/buttons/blue.png" position="450,360" size="140,40" alphatest="on" />
1528 <widget source="key_red" render="Label" position="5,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
1529 <widget source="key_green" render="Label" position="155,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
1530 <widget source="key_yellow" render="Label" position="305,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
1531 <widget source="key_blue" render="Label" position="450,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
1535 def __init__(self, _session, _url=None, _title=None):
1537 self.mTitle = _title
1538 self.mBookmarkManager = BookmarkManager.getInstance()
1539 self.mSession = _session
1540 Screen.__init__(self, _session)
1541 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions","ColorActions", "NumberActions"], {
1543 "cancel": self.keyCancel,
1544 "red" : self.keyRed,
1545 "green" : self.keyGreen,
1546 "yellow": self.keyYellow,
1547 "blue" : self.keyBlue,
1548 "0" : self.keyNumber,
1551 self["key_red"] = StaticText(_("Exit"))
1552 self["key_green"] = StaticText(_("Add"))
1553 self["key_yellow"] = StaticText(_("Edit"))
1554 self["key_blue"] = StaticText(_("Delete"))
1555 self["key_0"] = StaticText(_("Set as Startpage"))
1557 self.mBookmarkList = self.setBookmarkList()
1558 self["bookmarklist"] = MenuList(self.mBookmarkList)
1560 self.onLayoutFinish.append(self.layoutFinished)
1562 def layoutFinished(self):
1563 self.setTitle(_('Bookmark'))
1565 def setBookmarkList(self):
1567 #self.mBookmarkManager.dump()
1568 cd = self.mBookmarkManager.getBookmarkRoot()
1569 for ck in cd.iterkeys():
1570 l.append(('# ' + cd[ck].mName, cd[ck]))
1571 bd = cd[ck].mBookmarks
1572 for bk in bd.iterkeys():
1573 l.append((' - ' + bd[bk].mTitle, bd[bk]))
1575 def updateBookmarkList(self):
1576 self.mBookmarkList = self.setBookmarkList()
1577 self["bookmarklist"].setList(self.mBookmarkList)
1578 def cbEditWindow(self, ret=False):
1581 self.updateBookmarkList()
1582 def getParentCategory(self):
1583 idx = self["bookmarklist"].getSelectedIndex()
1586 data = self.mBookmarkList[idx][0].strip()
1588 return self.mBookmarkList[idx][1]
1592 def isCategoryItem(self):
1594 head = self["bookmarklist"].getCurrent()[0].strip()
1599 def keyNumber(self):
1600 data = self["bookmarklist"].getCurrent()[1]
1601 if strIsEmpty(data.mUrl):
1602 msg = _("Invalid URL. Please check again!!")
1603 self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
1605 def cbSetStartpage(ret=None):
1606 if ret is None: return
1608 data = self["bookmarklist"].getCurrent()[1]
1609 OperaBrowserSetting().setData(data.mUrl, data.mType)
1610 msg = _("Do you want to set selected url to the Startpage?")
1611 self.mSession.openWithCallback(cbSetStartpage, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
1618 parent = self.getParentCategory()
1621 if strIsEmpty(self.mTitle):
1623 retAdd = self.mBookmarkManager.addBookmark(self.mTitle, self.mUrl, parent.mId, 0)
1625 msg = _("Current page is already exist.")
1626 self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
1627 self.cbEditWindow(True)
1629 parent = self.getParentCategory()
1632 b = BookmarkData(0, '', '', parent.mId, 0)
1633 self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Add'), BookmarkEditWindow.BOOKMARK, b, self.mBookmarkManager)
1635 c = CategoryData(0, '')
1636 self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Add'), BookmarkEditWindow.CATEGORY, c, self.mBookmarkManager)
1637 if strIsEmpty(self.mUrl):
1638 l = [(_('Direct Input(Bookmark)'),2,), (_('Direct Input(Category)'),3,)]
1639 else: l = [(_('Currentpage(Bookmark)'),1,), (_('Direct Input(Bookmark)'),2,), (_('Direct Input(Category)'),3,)]
1640 self.mSession.openWithCallback(cbGreen, ChoiceBox, title=_("Please choose."), list=l)
1641 def keyYellow(self):
1642 data = self["bookmarklist"].getCurrent()[1]
1643 if self.isCategoryItem():
1644 self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Edit'), BookmarkEditWindow.CATEGORY, data, self.mBookmarkManager)
1645 else: self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Edit'), BookmarkEditWindow.BOOKMARK, data, self.mBookmarkManager)
1647 def cbBlue(ret=None):
1649 data = self["bookmarklist"].getCurrent()[1]
1650 if self.isCategoryItem():
1651 self.mBookmarkManager.deleteCategory(data.mId)
1652 else: self.mBookmarkManager.deleteBookmark(data.mId)
1653 self.updateBookmarkList()
1654 if self.isCategoryItem():
1655 msg = _("Do you want to delete the category and the bookmarks?")
1656 else: msg = _("Do you want to delete the bookmark?")
1657 self.mSession.openWithCallback(cbBlue, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
1659 if self.isCategoryItem(): return
1661 data = self["bookmarklist"].getCurrent()[1]
1662 url = data.mUrl.strip()
1664 self.session.open(MessageBox, _("Can't open selected bookmark.\n - URL data is empty!!"), type = MessageBox.TYPE_INFO)
1668 lang = language.getLanguage()
1669 if lang == 'ru_RU' and os.path.exists('/usr/local/manual/ru_RU'):
1670 url = '/usr/local/manual/ru_RU/main.html'
1671 elif lang == 'de_DE' and os.path.exists('/usr/local/manual/de_DE'):
1672 url = '/usr/local/manual/de_DE/main.html'
1673 self.close((url, mode))
1676 def keyCancel(self):
1679 class BrowserHelpWindow(Screen, HelpableScreen):
1680 MODE_GLOBAL,MODE_KEYBOARD,MODE_MOUSE = 1,2,3
1682 <screen name="BrowserHelpWindow" position="center,center" size="600,40" title="Browser Help" >
1683 <ePixmap pixmap="skin_default/buttons/red.png" position="5,0" size="140,40" alphatest="on" />
1684 <ePixmap pixmap="skin_default/buttons/green.png" position="155,0" size="140,40" alphatest="on" />
1685 <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,0" size="140,40" alphatest="on" />
1686 <ePixmap pixmap="skin_default/buttons/blue.png" position="450,0" size="140,40" alphatest="on" />
1688 <widget source="key_red" render="Label" position="5,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
1689 <widget source="key_green" render="Label" position="155,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
1690 <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
1691 <widget source="key_blue" render="Label" position="450,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
1694 def __init__(self, session):
1695 Screen.__init__(self, session)
1696 HelpableScreen.__init__(self)
1698 self["key_red"] = StaticText(_("Exit"))
1699 self["key_green"] = StaticText(_("Global"))
1700 self["key_yellow"] = StaticText(_("Mouse"))
1701 self["key_blue"] = StaticText(_("Keyboard"))
1703 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions","ColorActions"], {
1705 "cancel": self.keyRed,
1706 "red" : self.keyRed,
1707 "green" : self.keyGreen,
1708 "yellow": self.keyYellow,
1709 "blue" : self.keyBlue,
1712 self.showHelpTimer = eTimer()
1713 self.showHelpTimer.callback.append(self.cbShowHelpTimerClosed)
1714 self.showHelpTimer.start(500)
1716 self.onLayoutFinish.append(self.layoutFinished)
1718 def layoutFinished(self):
1719 self.setTitle(_('Browser Help'))
1721 def cbShowHelpTimerClosed(self):
1722 self.showHelpTimer.stop()
1723 self.setHelpModeActions(self.MODE_GLOBAL)
1725 def setHelpModeActions(self, _mode=0):
1727 if _mode == self.MODE_GLOBAL:
1728 self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
1729 "cancel" : (self.keyPass, _("Exit the Opera browser.")),
1731 self["MenuActions"] = HelpableActionMap(self, "MenuActions", {
1732 "menu" : (self.keyPass, _("Show the Menu window.")),
1734 self["ColorActions"] = HelpableActionMap(self, "ColorActions", {
1735 "green" : (self.keyPass, _("Enter Key")),
1736 "yellow" : (self.keyPass, _("Show the Virtual keyboard window.")),
1737 "blue" : (self.keyPass, _("Backspace Key")),
1739 self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
1740 "info" : (self.keyPass, _("Switch to keyboard/mouse mode.")),
1743 elif _mode == self.MODE_MOUSE:
1744 self["DirectionActions"] = HelpableActionMap(self, "DirectionActions", {
1745 "up" : (self.keyPass, _("It will move the mouse pointer up.")),
1746 "down" : (self.keyPass, _("It will move the mouse pointer down.")),
1747 "left" : (self.keyPass, _("It will move the mouse pointer left.")),
1748 "right" : (self.keyPass, _("It will move the mouse pointer right.")),
1750 self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
1751 "ok" : (self.keyPass, _("Left Mouse Button")),
1753 self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
1754 "nextBouquet" : (self.keyPass, _("Right Mouse Button")),
1755 "nextService" : (self.keyPass, _("Left Key")),
1756 "prevService" : (self.keyPass, _("Right Key")),
1758 elif _mode == self.MODE_KEYBOARD:
1759 self["DirectionActions"] = HelpableActionMap(self, "DirectionActions", {
1760 "up" : (self.keyPass, _("Up Key")),
1761 "down" : (self.keyPass, _("Down Key")),
1762 "left" : (self.keyPass, _("Left Key")),
1763 "right" : (self.keyPass, _("Right Key")),
1765 self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
1766 "ok" : (self.keyPass, _("Enter Key")),
1768 self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
1769 "nextBouquet" : (self.keyPass, _("PageUp Key")),
1770 "prevBouquet" : (self.keyPass, _("PageDown Key")),
1771 "nextService" : (self.keyPass, _("Go to previous page.")),
1772 "prevService" : (self.keyPass, _("Go to next page.")),
1784 self.setHelpModeActions(self.MODE_GLOBAL)
1785 def keyYellow(self):
1786 self.setHelpModeActions(self.MODE_MOUSE)
1788 self.setHelpModeActions(self.MODE_KEYBOARD)
1790 class OperaBrowser(Screen):
1791 MENUBAR_ITEM_WIDTH = 150
1792 MENUBAR_ITEM_HEIGHT = 30
1793 SUBMENULIST_WIDTH = 200
1794 SUBMENULIST_HEIGHT = 25
1795 SUBMENULIST_NEXT = 2
1797 # menulist->position->y : MENUBAR_ITEM_HEIGHT+30
1798 # menulist->size->x : SUBMENULIST_WIDTH
1799 # submenulist->position->x : SUBMENULIST_WIDTH+50+SUBMENULIST_NEXT
1800 # submenulist->position->y : MENUBAR_ITEM_HEIGHT+30
1801 # submenulist->size->x : SUBMENULIST_WIDTH
1803 size = getDesktop(0).size()
1804 WIDTH = int(size.width())
1805 HEIGHT = int(size.height())
1807 <screen name="OperaBrowser" position="0,0" size="%(width)d,%(height)d" backgroundColor="transparent" flags="wfNoBorder" title="Opera Browser">
1808 <widget name="topArea" zPosition="-1" position="0,0" size="1280,60" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
1809 <widget name="menuitemFile" position="30,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
1810 <widget name="menuitemTool" position="180,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
1811 <widget name="menuitemHelp" position="330,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
1812 <widget name="menulist" position="50,60" size="200,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
1813 <widget name="submenulist" position="252,60" size="200,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
1814 <widget name="bottomArea" position="0,%(bottom_pos_y)d" size="%(bottom_size_x)d,80" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
1816 """ % { 'width' :WIDTH,
1818 'bottom_pos_y' :HEIGHT-80,
1819 'bottom_size_x' :WIDTH }
1823 def __init__(self, session, url=None, isWebAppMode=False):
1824 Screen.__init__(self, session)
1825 self["actions"] = ActionMap(["DirectionActions", "MenuActions", "OkCancelActions"], {
1826 "cancel" : self.keyCancel
1828 ,"left" : self.keyLeft
1829 ,"right" : self.keyRight
1831 ,"down" : self.keyDown
1832 ,"menu" : self.keyMenu
1835 self.UpdateLanguageCB()
1837 self._terminatedBrowser = True
1838 self._enableKeyEvent = True
1839 self._currentPageUrl = None
1840 self._currentPageTitle = None
1841 self.menubarCurrentIndex = 0
1842 self.lvMenuItems = []
1843 self.lvSubMenuItems = []
1845 self["topArea"] = Label()
1846 self["bottomArea"] = Label()
1848 self["menuitemFile"] = MultiColorLabel()# modify menu
1849 self["menuitemTool"] = MultiColorLabel()
1850 self["menuitemHelp"] = MultiColorLabel()
1852 self["menulist"] = MenuList(self.setListOnView())
1853 self["submenulist"] = MenuList(self.setSubListOnView())
1855 self.toggleMainScreenFlag = True
1856 self.toggleListViewFlag = False
1857 self.toggleSubListViewFlag = False
1858 self.currentListView = self["menulist"]
1860 self.onLayoutFinish.append(self.layoutFinished)
1862 self._onCloseTimer = eTimer()
1863 self._onCloseTimer.callback.append(self._cb_onClose)
1866 self.paramIsWebAppMode = isWebAppMode
1867 language.addCallback(self.UpdateLanguageCB)
1869 def UpdateLanguageCB(self):
1871 self.MENUITEMS_LIST = [
1872 [(_('Open Startpage'), None), (_('Open URL'), None), (_('Start/Stop'),None), (_('Exit'), None)],
1873 [(_('Bookmark'), None), (_('Preference'), None)],
1874 [(_('About'), None), (_('Help'), None)]]
1875 self.COMMAND_MAP = {}
1876 self.COMMAND_MAP[_('Exit')] = self._cmd_on_Exit
1877 self.COMMAND_MAP[_('Help')] = self._cmd_on_Help
1878 self.COMMAND_MAP[_('About')] = self._cmd_on_About
1879 self.COMMAND_MAP[_('Open URL')] = self._cmd_on_OpenUrl
1880 self.COMMAND_MAP[_('Start/Stop')] = self._cmd_on_StartStop
1881 self.COMMAND_MAP[_('Bookmark')] = self._cmd_on_Bookmark
1882 self.COMMAND_MAP[_('Preference')] = self._cmd_on_Preference
1883 self.COMMAND_MAP[_('Return')] = self._cmd_on_ReturnToBrowser
1884 self.COMMAND_MAP[_('Open Startpage')] = self._cmd_on_OpenStartpage
1886 def enableRCMouse(self, mode): #mode=[0|1]|[False|True]
1887 rcmouse_path = "/proc/stb/fp/mouse"
1888 if os.path.exists(rcmouse_path):
1889 os.system("echo %d > %s" % (mode, rcmouse_path))
1891 def layoutFinished(self):
1892 self["menuitemFile"].setText(_("File"))# modify menu
1893 self["menuitemTool"].setText(_("Tools"))
1894 self["menuitemHelp"].setText(_("Help"))
1896 self["menulist"].hide()
1897 self["submenulist"].hide()
1899 self["bottomArea"].setText(_("Opera Web Browser Plugin v1.0"))
1900 self.setTitle(_("BrowserMain"))
1901 self.selectMenuitem()
1903 if self.paramUrl is not None:
1905 if self.paramIsWebAppMode:
1906 self.cbUrlText(data=self.paramUrl, mode=1, opcode='OP_BROWSER_OPEN_YOUTUBETV')
1907 else: self.cbUrlText(data=self.paramUrl, mode=1)
1909 def selectMenuitem(self):
1910 tmp = [self["menuitemFile"], self["menuitemTool"], self["menuitemHelp"]]# modify menu
1911 self["menuitemFile"].setForegroundColorNum(0)
1912 self["menuitemTool"].setForegroundColorNum(0)
1913 self["menuitemHelp"].setForegroundColorNum(0)
1914 tmp[self.menubarCurrentIndex].setForegroundColorNum(1)
1916 def popupCloseAll(self):
1922 def setListOnView(self):
1923 l = self.MENUITEMS_LIST[self.menubarCurrentIndex]
1924 if not self._terminatedBrowser and self.menubarCurrentIndex == 0: # running
1925 l = [(_('Return'), None)]
1926 self.lvMenuItems = l #self.MENUITEMS_LIST[self.menubarCurrentIndex]
1927 return self.lvMenuItems
1929 def setSubListOnView(self):
1930 self.lvSubMenuItems = []
1931 xl = self["menulist"].getCurrent()[1]
1932 if xl is None: return []
1934 self.lvSubMenuItems.append((x,None))
1935 return self.lvSubMenuItems
1937 def toggleMainScreen(self):
1938 if not self.toggleMainScreenFlag:
1941 self.toggleMainScreenFlag = not self.toggleMainScreenFlag
1943 def toggleListView(self):
1944 if not self.toggleListViewFlag:
1945 self["menulist"].show()
1946 else: self["menulist"].hide()
1947 self.toggleListViewFlag = not self.toggleListViewFlag
1949 def toggleSubListView(self):
1950 if not self.toggleSubListViewFlag:
1951 self["submenulist"].show()
1952 else: self["submenulist"].hide()
1953 self.toggleSubListViewFlag = not self.toggleSubListViewFlag
1955 def setCurrentListView(self, listViewIdx):
1956 if listViewIdx == 0:
1957 self.currentListView = None
1958 elif listViewIdx == 1:
1959 self.currentListView = self["menulist"]
1960 elif listViewIdx == 2:
1961 self.currentListView = self["submenulist"]
1963 def _cb_onClose(self):
1964 self._onCloseTimer.stop()
1965 command_server = getCommandServer()
1967 if self._on_close_window in command_server.onHbbTVCloseCB:
1968 command_server.onHbbTVCloseCB.remove(self._on_close_window)
1969 except Exception, ErrMsg: pass
1971 if self._on_setPageTitle in command_server.onSetPageTitleCB:
1972 command_server.onSetPageTitleCB.remove(self._on_setPageTitle)
1973 except Exception, ErrMsg: pass
1974 self._on_setPageTitle(_('Opera Browser'))
1975 self.enableRCMouse(False)
1976 self.toggleMainScreen()
1978 fbClass.getInstance().unlock()
1979 eRCInput.getInstance().unlock()
1980 self._terminatedBrowser = True
1981 self._enableKeyEvent = True
1982 #if not self.toggleListViewFlag:
1985 self._currentPageUrl = ''
1986 if self.paramUrl is not None:
1992 def _on_setPageTitle(self, title=None):
1993 print "Title :",title
1996 self.setTitle(title)
1998 def cbUrlText(self, data=None, mode=0, opcode='OP_BROWSER_OPEN_URL'):
2000 if not _g_helper._is_browser_running():
2002 print "Inputed Url :", data, mode
2003 if strIsEmpty(data):
2006 command_server = getCommandServer()
2007 if self._on_setPageTitle not in command_server.onSetPageTitleCB:
2008 command_server.onSetPageTitleCB.append(self._on_setPageTitle)
2009 if self._on_close_window not in command_server.onHbbTVCloseCB:
2010 command_server.onHbbTVCloseCB.append(self._on_close_window)
2011 self.toggleMainScreen()
2012 self.enableRCMouse(True)
2014 fbClass.getInstance().lock()
2015 eRCInput.getInstance().lock()
2017 #setResolution(1280, 720)
2019 command_util = getCommandUtil()
2020 command_util.sendCommand(opcode, data, mode)
2021 self._terminatedBrowser = False
2022 self._enableKeyEvent = False
2025 __gval__.hbbtv_handelr._soft_volume = -1
2027 def _on_close_window(self):
2028 self._onCloseTimer.start(1000)
2030 def _cb_bookmarkWindowClosed(self, data=None):
2035 if not _g_helper._is_browser_running():
2036 message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
2037 self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
2039 self.cbUrlText(url, mode)
2041 def _cmd_on_OpenUrl(self):
2043 if not _g_helper._is_browser_running():
2044 message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
2045 self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
2047 self.session.openWithCallback(self.cbUrlText, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
2048 def _cmd_on_About(self):
2049 self.session.open(MessageBox, _('Opera Web Browser Plugin v1.0'), type = MessageBox.TYPE_INFO)
2050 def _cmd_on_Exit(self):
2052 def _cb_cmdOnStartSTop(self):
2054 def _cmd_on_StartStop(self):
2056 if _g_helper is None:
2058 _g_helper.showBrowserConfigBox(self._cb_cmdOnStartSTop)
2060 def _cmd_on_Bookmark(self):
2061 url = self._currentPageUrl
2064 title = self._currentPageTitle
2067 self.session.openWithCallback(self._cb_bookmarkWindowClosed, OperaBrowserBookmarkWindow, url, title)
2068 def _cmd_on_Preference(self):
2069 url = self._currentPageUrl
2072 self.session.open(OperaBrowserPreferenceWindow, url)
2073 def _cmd_on_OpenStartpage(self):
2075 if not _g_helper._is_browser_running():
2076 message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
2077 self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
2080 start = 'http://vuplus.com'
2082 d = OperaBrowserSetting().getData()
2086 self.cbUrlText(start, mode)
2087 def _cmd_on_ReturnToBrowser(self):
2090 def _cmd_on_Help(self):
2091 self.session.open(BrowserHelpWindow)
2093 def doCommand(self, command):
2095 self.COMMAND_MAP[command]()
2096 except Exception, ErrMsg: print ErrMsg
2099 if not self.toggleMainScreenFlag:
2102 if not self.toggleListViewFlag:
2105 if self.currentListView.getCurrent()[1] is None:
2106 self.doCommand(self.currentListView.getCurrent()[0])
2107 #self.session.open(MessageBox, _(self.currentListView.getCurrent()[0]), type = MessageBox.TYPE_INFO)
2111 def updateSelectedMenuitem(self, status):
2112 if self.menubarCurrentIndex == 0 and status < 0:
2113 self.menubarCurrentIndex = 2 # modify menu
2114 elif self.menubarCurrentIndex == 2 and status > 0: # modify menu
2115 self.menubarCurrentIndex = 0
2116 else: self.menubarCurrentIndex += status
2117 self.selectMenuitem()
2120 if not self.toggleMainScreenFlag:
2122 if not self.toggleListViewFlag:
2123 self.updateSelectedMenuitem(-1)
2125 if self.toggleSubListViewFlag:
2126 self.setCurrentListView(1)
2127 self.toggleSubListView()
2129 #if self.currentListView.getSelectedIndex():
2130 self.currentListView.pageUp()
2136 if not self.toggleMainScreenFlag:
2138 if not self.toggleListViewFlag:
2139 self.updateSelectedMenuitem(1)
2141 if self.currentListView is None:
2143 if self.currentListView.getCurrent()[1] is not None:
2144 parentSelectedIndex = self.currentListView.getSelectedIndex()
2145 self.setCurrentListView(2)
2146 self.currentListView.setList(self.setSubListOnView())
2147 self.currentListView.resize(self.SUBMENULIST_WIDTH, self.SUBMENULIST_HEIGHT*len(self.lvSubMenuItems)+5)
2148 self.currentListView.move(self.MENUBAR_ITEM_WIDTH*self.menubarCurrentIndex + self.SUBMENULIST_WIDTH+self.SUBMENULIST_NEXT + 50,self.MENUBAR_ITEM_HEIGHT+30+(parentSelectedIndex*self.SUBMENULIST_HEIGHT))
2149 self.toggleSubListView()
2151 self.currentListView.pageUp()
2157 if not self.toggleMainScreenFlag:
2159 if self.currentListView is None:
2161 if not self.toggleListViewFlag:
2162 self.currentListView.setList(self.setListOnView())
2163 self.currentListView.resize(self.SUBMENULIST_WIDTH, self.SUBMENULIST_HEIGHT*len(self.lvMenuItems)+5)
2164 self.currentListView.move(self.MENUBAR_ITEM_WIDTH*self.menubarCurrentIndex+1+ 50,self.MENUBAR_ITEM_HEIGHT+30)
2165 self.toggleListView()
2167 self.currentListView.down()
2170 if not self.toggleMainScreenFlag:
2172 if self.currentListView is None:
2174 if self.currentListView == self["menulist"]:
2175 if self.currentListView.getSelectedIndex() == 0:
2176 self.toggleListView()
2178 self.currentListView.up()
2180 def keyCancel(self):
2181 if not self._terminatedBrowser:
2182 #self._session.openWithCallback(self._cb_virtualKeyboardClosed, VirtualKeyBoard, title=("Please enter URL here"), text="")
2183 fbClass.getInstance().lock()
2184 eRCInput.getInstance().lock()
2185 #setResolution(1280, 720)
2186 if self.toggleListViewFlag:
2187 self.toggleMainScreen()
2188 self._currentPageUrl = None
2189 self._currentPageTitle = None
2190 command_util = getCommandUtil()
2191 command_util.sendCommand('OP_BROWSER_MENU_RES')
2196 self.toggleMainScreen()
2198 def setCurrentPageUrl(self, url, title=None):
2199 self._currentPageUrl = url
2202 if idx > 10: idx = 10
2204 self._currentPageTitle = title
2205 print self._currentPageUrl
2206 self.toggleMainScreen()
2210 def hideSubmenu(self):
2211 self.currentListView.pageUp()
2214 config.plugins.youtubetv = ConfigSubsection()
2215 config.plugins.youtubetv.showhelp = ConfigYesNo(default = False)
2216 config.plugins.youtubetv.uri = ConfigText(default = "http://www.youtube.com/tv", visible_width = 50, fixed_size = False)
2217 class YoutubeTVWindow(Screen, HelpableScreen):
2219 <screen name="YoutubeTVWindow" position="center,center" size="550,160" title="Start YouTube TV" >
2220 <widget name="infomation" position="5,0" size="540,80" valign="center" halign="center" font="Regular;20" />
2221 <widget name="startdesc" position="10,80" size="395,40" valign="center" font="Regular;20" />
2222 <widget name="helpdesc" position="10,120" size="395,40" valign="center" font="Regular;20" />
2223 <ePixmap pixmap="skin_default/buttons/green.png" position="400,80" size="140,40" alphatest="on" />
2224 <ePixmap pixmap="skin_default/buttons/yellow.png" position="400,120" size="140,40" alphatest="on" />
2225 <widget source="key_green" render="Label" position="400,80" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
2226 <widget source="key_yellow" render="Label" position="400,120" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
2229 def __init__(self, session):
2230 Screen.__init__(self, session)
2231 HelpableScreen.__init__(self)
2233 self["actions"] = ActionMap(["WizardActions", "DirectionActions", "OkCancelActions","ColorActions", "EPGSelectActions",], {
2234 "cancel": self.keyCancel,
2235 "red" : self.keyCancel,
2236 "green" : self.keyGreen,
2237 "yellow": self.keyYellow,
2240 self["key_green"] = StaticText(_("Start"))
2241 self["key_yellow"] = StaticText(_("Help"))
2243 self["infomation"] = Label()
2244 self["startdesc"] = Label()
2245 self["helpdesc"] = Label()
2247 self.onLayoutFinish.append(self.layoutFinished)
2249 def layoutFinished(self):
2250 self.setTitle(_('Start YouTube TV'))
2251 self["infomation"].setText(_("YouTube TV is a new way to watch YouTube videos on Vu+"))
2252 self["startdesc" ].setText(_("* Start YouTube TV"))
2253 self["helpdesc" ].setText(_("* RC Help"))
2255 def setHelpModeActions(self):
2257 self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
2258 "ok" : (self.keyPass, _("Play ther selected the video")),
2259 "cancel": (self.keyPass, _("Exit the YouTube TV")),
2261 self["EventViewActions"] = HelpableActionMap(self, "EventViewActions", {
2262 "pageUp" : (self.keyPass, _("Move up")),
2263 "pageDown" : (self.keyPass, _("Move down")),
2264 "prevEvent" : (self.keyPass, _("Move left")),
2265 "nextEvent" : (self.keyPass, _("Move right")),
2267 self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
2268 "info" : (self.keyPass, _("Search a video")),
2269 "nextService" : (self.keyPass, _("Skip forward 10 sec")),
2270 "prevService" : (self.keyPass, _("Skip backward 10 sec")),
2272 self["MediaPlayerActions"] = HelpableActionMap(self, "MediaPlayerActions", {
2273 "play" : (self.keyPass, _("Play current video")),
2274 "pause" : (self.keyPass, _("Pause current video")),
2275 "stop" : (self.keyPass, _("Stop current video")),
2277 self["ColorActions"] = HelpableActionMap(self, "ColorActions", {
2278 "red" : (self.keyPass, _("Back")),
2284 def keyCancel(self):
2285 config.plugins.youtubetv.showhelp.cancel()
2288 config.plugins.youtubetv.showhelp.save()
2289 config.plugins.youtubetv.save()
2290 config.plugins.save()
2292 def keyYellow(self):
2293 self.setHelpModeActions()
2295 if config.plugins.youtubetv.showhelp.value == True :
2296 config.plugins.youtubetv.showhelp.setValue(False)
2297 else: config.plugins.youtubetv.showhelp.setValue(True)
2299 class YoutubeTVSettings(ConfigListScreen, Screen):
2301 <screen position="center,center" size="600,140" title="YouTube TV Settings">
2302 <widget name="config" position="0,0" size="600,100" scrollbarMode="showOnDemand" />
2304 <ePixmap pixmap="skin_default/buttons/red.png" position="310,100" size="140,40" alphatest="on" />
2305 <ePixmap pixmap="skin_default/buttons/green.png" position="150,100" size="140,40" alphatest="on" />
2307 <widget source="key_red" render="Label" position="310,100" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
2308 <widget source="key_green" render="Label" position="150,100" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
2311 def __init__(self, session):
2312 self.session = session
2313 Screen.__init__(self, session)
2316 ConfigListScreen.__init__(self, self.menulist)
2318 self["actions"] = ActionMap(["OkCancelActions", "ColorActions",], {
2319 "ok" : self.keyGreen,
2320 "green" : self.keyGreen,
2321 "red" : self.keyRed,
2322 "cancel" : self.keyRed,
2325 self["key_red"] = StaticText(_("Cancel"))
2326 self["key_green"] = StaticText(_("Save"))
2328 self.makeConfigList()
2329 self.onLayoutFinish.append(self.layoutFinished)
2331 def layoutFinished(self):
2332 self.setTitle(_('YouTube TV Settings'))
2335 config.plugins.youtubetv.showhelp.save()
2336 config.plugins.youtubetv.uri.save()
2337 config.plugins.youtubetv.save()
2338 config.plugins.save()
2341 config.plugins.youtubetv.showhelp.cancel()
2342 config.plugins.youtubetv.uri.cancel()
2346 ConfigListScreen.keyLeft(self)
2349 ConfigListScreen.keyRight(self)
2351 def makeConfigList(self):
2353 entryUri = getConfigListEntry(_("YouTube TV URL"), config.plugins.youtubetv.uri)
2354 entryShowHelp = getConfigListEntry(_("Do not show YouTube TV Stater again"), config.plugins.youtubetv.showhelp)
2355 self.menulist.append(entryUri)
2356 self.menulist.append(entryShowHelp)
2358 self["config"].list = self.menulist
2359 self["config"].l.setList(self.menulist)
2361 def auto_start_main(reason, **kwargs):
2363 command_server = getCommandServer()
2364 command_server.stop()
2366 from Screens.HelpMenu import HelpableScreen
2367 def session_start_main(session, reason, **kwargs):
2368 fbClass.getInstance().unlock()
2369 eRCInput.getInstance().unlock()
2371 from enigma import getDesktop
2372 desktopSize = getDesktop(0).size()
2373 setDefaultResolution(desktopSize.width(), desktopSize.height())
2376 _g_helper = session.open(HbbTVHelper)
2378 HelpableScreen.__init__ = HelpableScreen__init__
2379 HelpableScreen.session = session
2381 def HelpableScreen__init__(self):
2382 if isinstance(self, HelpableScreen):
2383 HelpableScreen.showManual = showManual
2385 self["helpActions"] = ActionMap(["HelpbuttonActions"], {
2386 "help_b" : self.showHelp,
2387 "help_l" : self.showManual,
2390 _g_clearBrowserDataTimer = eTimer()
2391 def showManual(self):
2392 if not os.path.exists('/usr/local/manual'):
2395 url = 'file:///usr/local/manual/main.html'
2396 lang = language.getLanguage()
2397 if lang == 'ru_RU' and os.path.exists('/usr/local/manual/ru_RU'):
2398 url = 'file:///usr/local/manual/ru_RU/main.html'
2399 elif lang == 'de_DE' and os.path.exists('/usr/local/manual/de_DE'):
2400 url = 'file:///usr/local/manual/de_DE/main.html'
2403 _g_clearBrowserDataTimer.stop()
2404 try: _g_clearBrowserDataTimer.callback.remove(_do_clean)
2406 setPluginBrowser(None)
2407 def clearBrowserData():
2408 _g_clearBrowserDataTimer.callback.append(_do_clean)
2409 _g_clearBrowserDataTimer.start(50)
2410 setPluginBrowser(self.session.openWithCallback(clearBrowserData, OperaBrowser, url))
2412 _g_backupSession = None
2413 def showYoutubeTV(session, **kwargs):
2415 _g_clearBrowserDataTimer.stop()
2416 try: _g_clearBrowserDataTimer.callback.remove(_do_clean)
2418 setPluginBrowser(None)
2419 global _g_backupSession
2421 service = getBeforeService()
2422 if service is not None:
2423 _g_backupSession.nav.playService(eServiceReference(service))
2424 _g_backupSession = None
2425 def clearBrowserData():
2426 _g_clearBrowserDataTimer.callback.append(_do_clean)
2427 _g_clearBrowserDataTimer.start(50)
2428 def cbYoutubeTVClose(ret):
2430 global _g_backupSession
2431 _g_backupSession = session
2432 service = session.nav.getCurrentlyPlayingServiceReference()
2433 if service is not None:
2434 setBeforeService(service.toString())
2435 session.nav.stopService()
2436 else: setBeforeService(service)
2437 setPluginBrowser(session.openWithCallback(clearBrowserData, OperaBrowser, config.plugins.youtubetv.uri.value, True))
2438 if config.plugins.youtubetv.showhelp.value == True:
2439 cbYoutubeTVClose(True)
2440 else: session.openWithCallback(cbYoutubeTVClose, YoutubeTVWindow)
2442 def youtube_setting_main(session, **kwargs):
2443 session.open(YoutubeTVSettings)
2445 def start_menu_main(menuid, **kwargs):
2446 if menuid == "mainmenu":
2447 return [(_("YouTube TV"), showYoutubeTV, "youtube_tv", 46)]
2450 def plugin_start_main(session, **kwargs):
2451 #session.open(OperaBrowser)
2453 _g_clearBrowserDataTimer.stop()
2454 try: _g_clearBrowserDataTimer.callback.remove(_do_clean)
2456 setPluginBrowser(None)
2457 def clearBrowserData():
2458 _g_clearBrowserDataTimer.callback.append(_do_clean)
2459 _g_clearBrowserDataTimer.start(50)
2460 setPluginBrowser(session.openWithCallback(clearBrowserData, OperaBrowser))
2462 def plugin_extension_start_application(session, **kwargs):
2464 if _g_helper is None:
2466 _g_helper.showApplicationSelectionBox()
2468 def plugin_extension_browser_config(session, **kwargs):
2470 if _g_helper is None:
2472 _g_helper.showBrowserConfigBox()
2474 def Plugins(path, **kwargs):
2476 l.append(PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=auto_start_main))
2477 l.append(PluginDescriptor(name=_("YouTube TV"), where=PluginDescriptor.WHERE_MENU, fnc=start_menu_main))
2478 l.append(PluginDescriptor(name=_("YouTube TV Settings"), where=PluginDescriptor.WHERE_PLUGINMENU, fnc=youtube_setting_main))
2479 l.append(PluginDescriptor(where=PluginDescriptor.WHERE_SESSIONSTART, needsRestart=True, fnc=session_start_main, weight=-10))
2480 l.append(PluginDescriptor(name=_("HbbTV Applications"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=plugin_extension_start_application))
2481 l.append(PluginDescriptor(name=_("Browser Start/Stop"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=plugin_extension_browser_config))
2482 l.append(PluginDescriptor(name=_("Opera Web Browser"), description=_("start opera web browser"), where=PluginDescriptor.WHERE_PLUGINMENU, needsRestart=True, fnc=plugin_start_main))