1 # -*- coding: iso-8859-1 -*-
3 # Babelzapper Plugin by gutemine
5 babelzapper_version = "0.9.6"
6 babelzapper_plugindir="/usr/lib/enigma2/python/Plugins/Extensions/BabelZapper"
7 babelzapper_readme = "%s/readme.txt" % babelzapper_plugindir
8 babelzapper_menus = "/etc/babelzapper"
10 from RecordTimer import parseEvent
11 from Plugins.Plugin import PluginDescriptor
12 from enigma import eTimer, eServiceReference, eServiceCenter, iServiceInformation, eEPGCache, iTimeshiftServicePtr
13 from Screens.Screen import Screen
14 from Screens.Setup import SetupSummary
15 from Screens.Console import Console
16 from Screens.MessageBox import MessageBox
17 from Components.config import config, ConfigSubsection, ConfigEnableDisable, ConfigInteger, getConfigListEntry
18 from Components.ConfigList import ConfigListScreen
19 from Components.ActionMap import ActionMap
20 from Components.Label import Label, MultiColorLabel
21 from Tools.Directories import *
22 from Tools.HardwareInfo import HardwareInfo
23 from GlobalActions import globalActionMap
24 from Components.config import config, ConfigSubsection, ConfigInteger
27 from struct import pack
28 from keyids import KEYIDS
37 config.plugins.babelzapper = ConfigSubsection()
38 config.plugins.babelzapper.enabled = ConfigEnableDisable(default = False)
39 config.plugins.babelzapper.changetime = ConfigInteger(default = 1000, limits = (200, 10000))
40 config.plugins.babelzapper.exit2escape = ConfigEnableDisable(default = False)
42 def main(session,**kwargs):
43 session.open(BabelzapperConfiguration)
45 def autostart(reason, **kwargs):
47 if kwargs.has_key("session") and reason == 0:
48 session = kwargs["session"]
49 print "[BABELZAPPER] autostart"
50 session.open(BabelZapperStartup)
52 def Plugins(**kwargs):
53 return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart),
54 PluginDescriptor(name="Babelzapper", description=_("Mute button remote control"), where = PluginDescriptor.WHERE_PLUGINMENU, icon="babelzapper.png", fnc=main)]
56 class BabelzapperConfiguration(Screen, ConfigListScreen):
58 <screen position="center,center" size="450,240" title="Babelzapper Plugin" >
59 <widget name="config" position="0,0" size="450,200" scrollbarMode="showOnDemand" />
60 <widget name="buttonred" position="10,200" size="100,40" backgroundColor="red" valign="center" halign="center" zPosition="2" foregroundColor="white" font="Regular;18"/>
61 <widget name="buttongreen" position="120,200" size="100,40" backgroundColor="green" valign="center" halign="center" zPosition="2" foregroundColor="white" font="Regular;18"/>
62 <widget name="buttonyellow" position="230,200" size="100,40" backgroundColor="yellow" valign="center" halign="center" zPosition="2" foregroundColor="white" font="Regular;18"/>
63 <widget name="buttonblue" position="340,200" size="100,40" backgroundColor="blue" valign="center" halign="center" zPosition="2" foregroundColor="white" font="Regular;18"/>
64 <ePixmap position="175,80" size="100,100" pixmap="%s/babel.png" transparent="1" alphatest="on" />
65 </screen>""" % babelzapper_plugindir
66 def __init__(self, session, args = 0):
67 Screen.__init__(self, session)
69 self.list.append(getConfigListEntry(_("Enable Babelzapper on Mute"), config.plugins.babelzapper.enabled))
70 self.list.append(getConfigListEntry(_("Scroll Time [msec]"), config.plugins.babelzapper.changetime))
71 self.list.append(getConfigListEntry(_("Send ESC for EXIT key"), config.plugins.babelzapper.exit2escape))
72 self.onShown.append(self.setWindowTitle)
73 ConfigListScreen.__init__(self, self.list)
74 self.onChangedEntry = []
75 self["buttonred"] = Label(_("Cancel"))
76 self["buttongreen"] = Label(_("OK"))
77 self["buttonyellow"] = Label(_("Info"))
78 self["buttonblue"] = Label(_("About"))
79 self["setupActions"] = ActionMap([ "ColorActions", "SetupActions" ],
83 "yellow": self.readme,
86 "cancel": self.cancel,
90 def setWindowTitle(self):
91 self.setTitle(_("Babelzapper Plugin"))
94 for x in self["config"].list:
96 keymapfile = open("/usr/share/enigma2/keymap.xml", "r")
97 text=keymapfile.read()
99 keymapfile = open("/usr/share/enigma2/keymap.xml", "w")
100 if config.plugins.babelzapper.enabled.value:
101 text=text.replace("volumeMute","babelzapperMute")
102 text=text.replace("id=\"KEY_MUTE\" mapto=\"deleteForward\" flags=\"mr\"","id=\"KEY_MUTE\" mapto=\"babelzapperMute\" flags=\"m\"")
103 text=text.replace("id=\"KEY_MUTE\" mapto=\"delete\" flags=\"mr\"","id=\"KEY_MUTE\" mapto=\"babelzapperMute\" flags=\"b\"")
105 text=text.replace("id=\"KEY_MUTE\" mapto=\"babelzapperMute\" flags=\"b\"","id=\"KEY_MUTE\" mapto=\"delete\" flags=\"mr\"")
106 text=text.replace("id=\"KEY_MUTE\" mapto=\"babelzapperMute\" flags=\"m\"","id=\"KEY_MUTE\" mapto=\"deleteForward\" flags=\"mr\"")
107 text=text.replace("babelzapperMute","volumeMute")
108 keymapfile.write(text)
110 keymapparser.removeKeymap("/usr/share/enigma2/keymap.xml")
111 keymapparser.readKeymap("/usr/share/enigma2/keymap.xml")
115 for x in self["config"].list:
120 self.session.open(Console,_("Babelzapper readme.txt"),["cat %s" % (babelzapper_readme) ])
123 self.session.open(MessageBox, _("Babelzapper Version %s\nby gutemine and garbage") % babelzapper_version, MessageBox.TYPE_INFO)
125 class BabelZapperStartup(Screen):
127 def __init__(self, session):
128 Screen.__init__(self, session)
129 self.skin = BabelZapperStartup.skin
130 print "[BABELZAPPER] starting"
131 global globalActionMap
132 # overwrite Mute for the handicaped
133 globalActionMap.actions["babelzapperMute"]=self.setKey
134 self.babelDialog = session.instantiateDialog(BabelZapper)
141 length=len(babelmenu)-1
142 self.nextKeyTimer = eTimer()
143 self.nextKeyTimer.callback.append(self.nextKey)
144 self.nextKeyTimer.stop()
145 self.resetKeyTimer = eTimer()
146 self.resetKeyTimer.callback.append(self.resetKey)
147 self.resetKeyTimer.stop()
148 self.delayedKeyTimer = eTimer()
149 self.delayedKeyTimer.callback.append(self.setKey)
150 self.delayedKeyTimer.stop()
151 print "[BABELZAPPER] received mute key"
153 print "[BABELZAPPER] now starts from beginning\n"
154 self.nextKeyTimer.start(200, True)
156 print "[BABELZAPPER] now starts with last key\n"
159 self.nextKeyTimer.start(config.plugins.babelzapper.changetime.value, True)
160 # self.nextKeyTimer.start(200, True)
162 self.babelDialog.hide()
163 cmdlen=len(babelmenu[babelkey])
164 print "[BABELZAPPER] %i commands" % cmdlen
167 # here comes the command line interpreter
169 cmd=babelmenu[babelkey][i]
170 cmdname=cmd.lstrip(" ")
171 print "[BABELZAPPER] command: %s" % cmdname
172 if cmdname.startswith("$KEY_"):
173 self.babelDialog.executeKey(cmdname)
174 elif cmdname.startswith("END"):
175 self.babelDialog.hide()
176 print "[BABELZAPPER] ENDs\n"
179 elif cmdname.startswith("IFON"):
181 print "[BABELZAPPER] ON is off\n"
182 # skip rest of commandline
185 print "[BABELZAPPER] ON is on executing rest and setting it off\n"
187 elif cmdname.startswith("ON"):
188 print "[BABELZAPPER] ON\n"
190 elif cmdname.startswith("TOGGLE"):
192 print "[BABELZAPPER] TOGGLE on\n"
195 print "[BABELZAPPER] TOGGLE off\n"
197 elif cmdname.startswith("OFF"):
198 print "[BABELZAPPER] OFF\n"
200 elif cmdname.startswith("GOTO"):
202 babelkey=int(cmdname.replace("GOTO",""))
203 print "[BABELZAPPER] GOTO %i \n" % babelkey
206 # skip rest of commandline
208 elif cmdname.startswith("STOP"):
210 babelstop=int(cmdname.replace("STOP",""))
215 elif babelstop > 60000:
217 print "[BABELZAPPER] STOP %i \n" % babelstop
218 self.babelDialog.show()
220 self.delayedKeyTimer.start(babelstop, True)
222 elif cmdname.startswith("PRINT"):
223 babeltext=cmd.replace("PRINT","")
224 print "[BABELZAPPER] PRINTs: %s \n" % babeltext
225 self.session.open(MessageBox, babeltext, MessageBox.TYPE_INFO)
226 elif cmdname.startswith("LOAD") or cmdname.startswith("RUN"):
233 babelfile="%s/%s.zbb" % (babelzapper_menus,cmdname.replace("LOAD","").replace("RUN","").replace(" ","").replace(" ",""))
234 print "[BABELZAPPER] LOADs: %s\n" % babelfile
235 if os.path.exists(babelfile):
236 f = open(babelfile, 'r')
238 f = open("%s/babelzapper.zbb" % babelzapper_menus, 'r')
239 line=f.readline().replace("\r","").replace("\n","")
243 print "[BABELZAPPER] wrong line %s in babelzapper.zbb" % line
244 babelmenu.append(("????", "PRINT ???? %s" % line))
246 babelmenu.append((bz))
247 line=f.readline().replace("\r","").replace("\n","")
249 # skip rest of commandline
251 elif cmdname.startswith("REM"):
252 # skip rest of commandline
256 print "[BABELZAPPER] unknown command %s\n" % cmd
257 babeltext="???? %s\n" % cmd
259 babeltext="???? empty command found\n"
260 self.session.open(MessageBox, babeltext, MessageBox.TYPE_ERROR)
261 # skip rest of commandline
265 # continue babelzapping but show last command again to make repeats easier
267 self.nextKeyTimer.start(config.plugins.babelzapper.changetime.value, True)
271 print "[BABELZAPPER] resets last key"
272 self.resetKeyTimer.stop()
273 self.babelDialog.hide()
283 if not config.plugins.babelzapper.enabled.value:
284 self.babelDialog.hide()
286 length=len(babelmenu)-1
289 elif babelkey < length:
293 self.nextKeyTimer.stop()
294 cmd=babelmenu[babelkey][1]
295 cmdname=cmd.lstrip(" ")
296 if cmdname.startswith("RETURN"):
298 babelkey=int(cmdname.replace("RETURN",""))-1
301 print "[BABELZAPPER] RETURN %i \n" % babelkey
302 self.nextKeyTimer.start(0, True)
304 elif cmdname.startswith("REM"):
305 # skip this commandline
306 self.nextKeyTimer.start(0, True)
308 elif cmdname.startswith("ON"):
309 print "[BABELZAPPER] ON\n"
311 # skip this commandline
312 self.nextKeyTimer.start(0, True)
314 elif cmdname.startswith("OFF"):
315 print "[BABELZAPPER] OFF\n"
317 # skip this commandline
318 self.nextKeyTimer.start(0, True)
320 elif cmdname.startswith("TOGGLE"):
322 print "[BABELZAPPER] TOGGLE on\n"
325 print "[BABELZAPPER] TOGGLE off\n"
327 # skip this commandline
328 self.nextKeyTimer.start(0, True)
330 elif cmdname.startswith("STOP"):
332 babelstop=int(cmdname.replace("STOP",""))
337 elif babelstop > 60000:
339 print "[BABELZAPPER] STOP %i \n" % babelstop
340 currentkey=babelmenu[babelkey][0]
341 split=currentkey.split(":")
346 currentbg=int(split[1])
348 currentfg=int(split[2])
349 self.babelDialog.updateKey(currentkey,currentbg,currentfg)
350 self.babelDialog.show()
351 self.nextKeyTimer.start(babelstop, True)
353 elif cmdname.startswith("RUN"):
358 babelfile="%s/%s.zbb" % (babelzapper_menus,cmdname.replace("RUN","").replace(" ","").replace(" ",""))
359 print "[BABELZAPPER] RUNs: %s\n" % babelfile
360 if os.path.exists(babelfile):
361 f = open(babelfile, 'r')
363 f = open("/%s/babelzapper.zbb" % babelzapper_menus, 'r')
364 line=f.readline().replace("\r","").replace("\n","")
368 print "[BABELZAPPER] wrong line %s in babelzapper.zbb" % line
369 babelmenu.append(("????", "PRINT ???? %s" % line))
371 babelmenu.append((bz))
372 line=f.readline().replace("\r","").replace("\n","")
375 self.babelDialog.updateKey(babelmenu[babelkey][0])
376 self.babelDialog.show()
377 self.nextKeyTimer.start(0, True)
381 currentkey=babelmenu[babelkey][0]
382 split=currentkey.split(":")
387 currentbg=int(split[1])
389 currentfg=int(split[2])
390 self.babelDialog.updateKey(currentkey,currentbg,currentfg)
391 self.babelDialog.show()
392 self.nextKeyTimer.start(config.plugins.babelzapper.changetime.value, True)
394 class BabelZapper(Screen):
396 <screen position="center,60" size="180,30" flags="wfNoBorder">
397 <widget name="babelzapper" position="1,1" size="180,30" font="Regular;26" valign="center" halign="center" backgroundColors="black,white,#00AAAAAA,red,green,yellow,blue" foregroundColors="black,white,#00AAAAAA,red,green,yellow,blue">
400 def __init__(self, session):
401 Screen.__init__(self, session)
402 self.skin = BabelZapper.skin
404 print "[BABELZAPPER] loading %s/babelzapper.zbb" % babelzapper_menus
407 babelmenu.append(("NONE", "END"))
408 if os.path.exists("%s/babelzapper.zbb" % babelzapper_menus):
409 f = open("%s/babelzapper.zbb" % babelzapper_menus, 'r')
410 line=f.readline().replace("\r","").replace("\n","")
414 print "[BABELZAPPER] wrong line %s in babelzapper.zbb" % line
415 babelmenu.append(("????", "PRINT ???? %s" % line))
418 babelmenu.append((bz))
419 line=f.readline().replace("\r","").replace("\n","")
422 self["babelzapper"] = MultiColorLabel(babelmenu[babelkey][0])
423 self["babelzapper"].setForegroundColorNum(0)
424 self["babelzapper"].setBackgroundColorNum(1)
426 def updateKey(self, keyname,keybg=0,keyfg=1):
427 self["babelzapper"].setText(keyname)
428 self["babelzapper"].setForegroundColorNum(keyfg)
429 self["babelzapper"].setBackgroundColorNum(keybg)
431 def executeKey(self, keyname):
432 keyname=keyname.replace("$","").replace(" ","").replace("\n","")
434 if keyname.startswith("KEY_EXIT") and config.plugins.babelzapper.exit2escape.value:
435 keyname=keyname.replace("KEY_EXIT","KEY_ESC")
436 if keyname.startswith("KEY_"):
437 if keyname.endswith("_LONG"):
439 keyname=keyname.replace("_LONG","")
441 keycode=KEYIDS[keyname]
442 print "[BABELZAPPER] found key %i" % keycode
444 print "[BABELZAPPER] found unknown key %s" % keyname
447 print "[BABELZAPPER] found unknown key %s" % keyname
449 if HardwareInfo.device_name == "dm8000":
450 fp = open("/dev/input/event2", 'wb')
452 fp = open("/dev/input/event1", 'wb')
454 dataon = pack('iiHHi', 0, 0, 1, keycode, 1)
456 dataon = pack('iiHHi', 0, 0, 1, keycode, 2)
458 dataon = pack('iiHHi', 0, 0, 1, keycode, 2)
460 dataon = pack('iiHHi', 0, 0, 1, keycode, 2)
462 dataon = pack('iiHHi', 0, 0, 1, keycode, 2)
465 print "[BABELZAPPER] now writes out: %i\n" % (keycode)
466 dataon = pack('iiHHi', 0, 0, 1, keycode, 1)
468 dataoff = pack('iiHHi', 0, 0, 1, keycode, 0)