Fix linebreaks
[vuplus_dvbapp-plugin] / babelzapper / src / plugin.py
1 # -*- coding: iso-8859-1 -*-
2 #
3 # Babelzapper Plugin by gutemine
4 #
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"
9 #
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
25 import os
26 import keymapparser
27 from struct import pack
28 from keyids import KEYIDS
29
30 global babelkey
31 global babeldone
32 global babelon
33 babelkey=-1
34 babeldone=0
35 babelon=0
36
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)
41
42 def main(session,**kwargs):
43         session.open(BabelzapperConfiguration)
44
45 def autostart(reason, **kwargs):
46 #       global session
47         if kwargs.has_key("session") and reason == 0:
48                 session = kwargs["session"]
49                 print "[BABELZAPPER] autostart"
50                 session.open(BabelZapperStartup)
51
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)]
55
56 class BabelzapperConfiguration(Screen, ConfigListScreen):
57         skin = """
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)
68                 self.list = []
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" ],
80                         {
81                         "green": self.save,
82                         "red": self.cancel,
83                         "yellow": self.readme,
84                         "blue": self.about,
85                         "save": self.save,
86                         "cancel": self.cancel,
87                         "ok": self.save,
88                         })
89
90         def setWindowTitle(self):
91                 self.setTitle(_("Babelzapper Plugin"))
92
93         def save(self):
94                 for x in self["config"].list:
95                         x[1].save()
96                 keymapfile = open("/usr/share/enigma2/keymap.xml", "r")
97                 text=keymapfile.read()
98                 keymapfile.close()
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\"")
104                 else:
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)
109                 keymapfile.close()
110                 keymapparser.removeKeymap("/usr/share/enigma2/keymap.xml")
111                 keymapparser.readKeymap("/usr/share/enigma2/keymap.xml")
112                 self.close(True)
113
114         def cancel(self):
115                 for x in self["config"].list:
116                         x[1].cancel()
117                 self.close(False)
118
119         def readme(self):
120                 self.session.open(Console,_("Babelzapper readme.txt"),["cat %s" % (babelzapper_readme) ])
121  
122         def about(self):
123                 self.session.open(MessageBox, _("Babelzapper Version %s\nby gutemine and garbage") % babelzapper_version, MessageBox.TYPE_INFO)
124
125 class BabelZapperStartup(Screen):
126         skin = ""
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)
135                                 
136         def setKey(self):
137                 global babelmenu
138                 global babelkey
139                 global babeldone
140                 global babelon
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"
152                 if babelkey==-1:
153                         print "[BABELZAPPER] now starts from beginning\n"
154                         self.nextKeyTimer.start(200, True)
155                 elif babeldone==-1:
156                         print "[BABELZAPPER] now starts with last key\n"
157                         babeldone=0
158                         babelkey=babelkey-1
159                         self.nextKeyTimer.start(config.plugins.babelzapper.changetime.value, True)
160 #                       self.nextKeyTimer.start(200, True)
161                 else:
162                         self.babelDialog.hide()
163                         cmdlen=len(babelmenu[babelkey])
164                         print "[BABELZAPPER] %i commands" % cmdlen
165                         i=1+babeldone
166                         babeldone=0
167                         # here comes the command line interpreter
168                         while i < cmdlen: 
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" 
177                                         babelkey=-1
178                                         return
179                                 elif cmdname.startswith("IFON"):
180                                         if babelon == 0:
181                                                 print "[BABELZAPPER] ON is off\n" 
182                                                 # skip rest of commandline
183                                                 i=cmdlen
184                                         else:
185                                                 print "[BABELZAPPER] ON is on executing rest and setting it off\n" 
186                                                 babelon=0;
187                                 elif cmdname.startswith("ON"):
188                                         print "[BABELZAPPER] ON\n" 
189                                         babelon=1
190                                 elif cmdname.startswith("TOGGLE"):
191                                         if babelon == 0:
192                                                 print "[BABELZAPPER] TOGGLE on\n" 
193                                                 babelon=1
194                                         else:
195                                                 print "[BABELZAPPER] TOGGLE off\n" 
196                                                 babelon=0
197                                 elif cmdname.startswith("OFF"):
198                                         print "[BABELZAPPER] OFF\n" 
199                                         babelon=0
200                                 elif cmdname.startswith("GOTO"):
201                                         try:
202                                                 babelkey=int(cmdname.replace("GOTO",""))
203                                                 print "[BABELZAPPER] GOTO %i \n" % babelkey
204                                         except:
205                                                 babelkey=0
206                                         # skip rest of commandline
207                                         i=cmdlen
208                                 elif cmdname.startswith("STOP"):
209                                         try:            
210                                                 babelstop=int(cmdname.replace("STOP",""))
211                                         except:
212                                                 babelstop=1000
213                                         if babelstop < 1000:            
214                                                 babelstop=1000
215                                         elif babelstop > 60000:
216                                                 babelstop=60000
217                                         print "[BABELZAPPER] STOP %i \n" % babelstop
218                                         self.babelDialog.show()
219                                         babeldone=i
220                                         self.delayedKeyTimer.start(babelstop, True)
221                                         return
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"):
227                                         babelkey=-1
228                                         babeldone=0
229                                         i=len(babelmenu)
230                                         while i > 1:
231                                                 i=i-1
232                                                 babelmenu.pop(i)
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')
237                                         else:
238                                                 f = open("%s/babelzapper.zbb" % babelzapper_menus, 'r')
239                                         line=f.readline().replace("\r","").replace("\n","")
240                                         while (line):
241                                                 bz=line.split(";")
242                                                 if len(bz) < 2:
243                                                         print "[BABELZAPPER] wrong line %s in babelzapper.zbb" % line
244                                                         babelmenu.append(("????", "PRINT ???? %s" % line))
245                                                 else:
246                                                         babelmenu.append((bz))
247                                                 line=f.readline().replace("\r","").replace("\n","")
248                                         f.close()
249                                         # skip rest of commandline
250                                         i=cmdlen
251                                 elif cmdname.startswith("REM"):
252                                         # skip rest of commandline
253                                         i=cmdlen
254                                 else:
255                                         if len(cmd) > 0:
256                                                 print "[BABELZAPPER] unknown command %s\n" % cmd
257                                                 babeltext="???? %s\n" % cmd
258                                         else:
259                                                 babeltext="???? empty command found\n"
260                                         self.session.open(MessageBox, babeltext, MessageBox.TYPE_ERROR)
261                                         # skip rest of commandline
262                                         i=cmdlen
263                                 # next command  
264                                 i=i+1
265                         # continue babelzapping but show last command again to make repeats easier
266                         babelkey=babelkey-1
267                         self.nextKeyTimer.start(config.plugins.babelzapper.changetime.value, True)
268                         
269                                 
270         def resetKey(self):
271                 print "[BABELZAPPER] resets last key"
272                 self.resetKeyTimer.stop()
273                 self.babelDialog.hide()
274                 global babelkey
275                 global babeldone
276                 babelkey=-1
277                 babeldone=0
278
279         def nextKey(self):
280                 global babelmenu
281                 global babelkey
282                 global babelon
283                 if not config.plugins.babelzapper.enabled.value:
284                         self.babelDialog.hide()
285                         return
286                 length=len(babelmenu)-1
287                 if babelkey<0:
288                         babelkey=0
289                 elif babelkey < length:
290                         babelkey=babelkey+1
291                 else:
292                         babelkey=0
293                 self.nextKeyTimer.stop()
294                 cmd=babelmenu[babelkey][1]
295                 cmdname=cmd.lstrip("     ")
296                 if cmdname.startswith("RETURN"):
297                         try:            
298                                 babelkey=int(cmdname.replace("RETURN",""))-1
299                         except:
300                                 babelkey=-1
301                         print "[BABELZAPPER] RETURN %i \n" % babelkey
302                         self.nextKeyTimer.start(0, True)
303                         return
304                 elif cmdname.startswith("REM"):
305                         # skip this commandline
306                         self.nextKeyTimer.start(0, True)
307                         return
308                 elif cmdname.startswith("ON"):
309                         print "[BABELZAPPER] ON\n" 
310                         babelon=1
311                         # skip this commandline
312                         self.nextKeyTimer.start(0, True)
313                         return
314                 elif cmdname.startswith("OFF"):
315                         print "[BABELZAPPER] OFF\n" 
316                         babelon=0
317                         # skip this commandline
318                         self.nextKeyTimer.start(0, True)
319                         return
320                 elif cmdname.startswith("TOGGLE"):
321                         if babelon == 0:
322                                 print "[BABELZAPPER] TOGGLE on\n" 
323                                 babelon=0
324                         else:
325                                 print "[BABELZAPPER] TOGGLE off\n" 
326                                 babelon=1
327                         # skip this commandline
328                         self.nextKeyTimer.start(0, True)
329                         return
330                 elif cmdname.startswith("STOP"):
331                         try:            
332                                 babelstop=int(cmdname.replace("STOP",""))
333                         except:
334                                 babelstop=1000
335                         if babelstop < 1000:            
336                                 babelstop=1000
337                         elif babelstop > 60000:
338                                 babelstop=60000
339                         print "[BABELZAPPER] STOP %i \n" % babelstop
340                         currentkey=babelmenu[babelkey][0]
341                         split=currentkey.split(":")
342                         currentkey=split[0]
343                         currentbg=0
344                         currentfg=1
345                         if len(split) > 1:
346                                 currentbg=int(split[1])
347                         if len(split) > 2:
348                                 currentfg=int(split[2])
349                         self.babelDialog.updateKey(currentkey,currentbg,currentfg)
350                         self.babelDialog.show()
351                         self.nextKeyTimer.start(babelstop, True)
352                         return
353                 elif cmdname.startswith("RUN"):
354                         i=len(babelmenu)
355                         while i > 1:
356                                 i=i-1
357                                 babelmenu.pop(i)
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')
362                         else:
363                                 f = open("/%s/babelzapper.zbb" % babelzapper_menus, 'r')
364                         line=f.readline().replace("\r","").replace("\n","")
365                         while (line):
366                                 bz=line.split(";")
367                                 if len(bz) < 2:
368                                         print "[BABELZAPPER] wrong line %s in babelzapper.zbb" % line
369                                         babelmenu.append(("????", "PRINT ???? %s" % line))
370                                 else:
371                                         babelmenu.append((bz))
372                                 line=f.readline().replace("\r","").replace("\n","")
373                         f.close()
374                         babelkey=-1
375                         self.babelDialog.updateKey(babelmenu[babelkey][0])
376                         self.babelDialog.show()
377                         self.nextKeyTimer.start(0, True)
378                         return
379                 else:
380                         pass
381                 currentkey=babelmenu[babelkey][0]
382                 split=currentkey.split(":")
383                 currentkey=split[0]
384                 currentbg=0
385                 currentfg=1
386                 if len(split) > 1:
387                         currentbg=int(split[1])
388                 if len(split) > 2:
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)
393
394 class BabelZapper(Screen):
395         skin = """
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">
398                 </widget>
399                 </screen>"""
400         def __init__(self, session):
401                 Screen.__init__(self, session)
402                 self.skin = BabelZapper.skin
403                 global babelmenu
404                 print "[BABELZAPPER] loading %s/babelzapper.zbb" % babelzapper_menus
405                 global babelkey
406                 babelmenu= []
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","")
411                         while (line):
412                                 bz=line.split(";")
413                                 if len(bz) < 2:
414                                         print "[BABELZAPPER] wrong line %s in babelzapper.zbb" % line
415                                         babelmenu.append(("????", "PRINT ???? %s" % line))
416                                         
417                                 else:
418                                         babelmenu.append((bz))
419                                 line=f.readline().replace("\r","").replace("\n","")
420                         f.close()
421                 babelkey=-1
422                 self["babelzapper"] = MultiColorLabel(babelmenu[babelkey][0])
423                 self["babelzapper"].setForegroundColorNum(0)
424                 self["babelzapper"].setBackgroundColorNum(1)
425                 
426         def updateKey(self, keyname,keybg=0,keyfg=1):
427                 self["babelzapper"].setText(keyname)
428                 self["babelzapper"].setForegroundColorNum(keyfg)
429                 self["babelzapper"].setBackgroundColorNum(keybg)
430
431         def executeKey(self, keyname):
432                 keyname=keyname.replace("$","").replace(" ","").replace("\n","")
433                 long=False
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"):
438                                 long=True
439                                 keyname=keyname.replace("_LONG","")
440                         try:            
441                                 keycode=KEYIDS[keyname]
442                                 print "[BABELZAPPER] found key %i" % keycode
443                         except:
444                                 print "[BABELZAPPER] found unknown key %s" % keyname
445                                 return
446                 else:
447                         print "[BABELZAPPER] found unknown key %s" % keyname
448                         return
449                 if HardwareInfo.device_name == "dm8000":
450                         fp = open("/dev/input/event2", 'wb')
451                 else:
452                         fp = open("/dev/input/event1", 'wb')
453                 if long:
454                         dataon = pack('iiHHi', 0, 0, 1, keycode, 1)
455                         fp.write(dataon)
456                         dataon = pack('iiHHi', 0, 0, 1, keycode, 2)
457                         fp.write(dataon)
458                         dataon = pack('iiHHi', 0, 0, 1, keycode, 2)
459                         fp.write(dataon)
460                         dataon = pack('iiHHi', 0, 0, 1, keycode, 2)
461                         fp.write(dataon)
462                         dataon = pack('iiHHi', 0, 0, 1, keycode, 2)
463                         fp.write(dataon)
464                 else:
465                         print "[BABELZAPPER] now writes out: %i\n" % (keycode)
466                         dataon = pack('iiHHi', 0, 0, 1, keycode, 1)
467                         fp.write(dataon)
468                 dataoff = pack('iiHHi', 0, 0, 1, keycode, 0)
469                 fp.write(dataoff)
470                 fp.close()