update some syntax and make the code more future-proof ;)
[enigma2-plugins.git] / pluginhider / src / plugin.py
1 from __future__ import print_function
2
3 from . import _
4
5 # Plugin definition
6 from Plugins.Plugin import PluginDescriptor
7
8 from Components.PluginComponent import PluginComponent
9 from Components.config import config, ConfigSubsection, ConfigSet
10
11 from PluginHiderSetup import PluginHiderSetup
12
13 config.plugins.pluginhider = ConfigSubsection()
14 config.plugins.pluginhider.hideextensions = ConfigSet(choices=[])
15 config.plugins.pluginhider.hideplugins = ConfigSet(choices=[])
16 config.plugins.pluginhider.hideeventinfo = ConfigSet(choices=[])
17
18 hasPluginWeight = True
19
20 def hidePlugin(plugin):
21         """Convenience function for external code to hide a plugin."""
22         hide = config.plugins.pluginhider.hideplugins.value
23         if not plugin.name in hide:
24                 hide.append(plugin.name)
25                 config.plugins.pluginhider.hideplugins.save()   
26
27 def PluginComponent_getPlugins(self, where):
28         if not isinstance(where, list):
29                 where = [ where ]
30
31         res = []
32         if PluginDescriptor.WHERE_EXTENSIONSMENU in where:
33                 hide = config.plugins.pluginhider.hideextensions.value
34                 res.extend((x for x in self.plugins.get(PluginDescriptor.WHERE_EXTENSIONSMENU, []) if x.name not in hide))
35                 where.remove(PluginDescriptor.WHERE_EXTENSIONSMENU)
36
37         if PluginDescriptor.WHERE_PLUGINMENU in where:
38                 hide = config.plugins.pluginhider.hideplugins.value
39                 res.extend((x for x in self.plugins.get(PluginDescriptor.WHERE_PLUGINMENU, []) if x.name not in hide))
40                 where.remove(PluginDescriptor.WHERE_PLUGINMENU)
41
42         if PluginDescriptor.WHERE_EVENTINFO in where:
43                 hide = config.plugins.pluginhider.hideeventinfo.value
44                 res.extend((x for x in self.plugins.get(PluginDescriptor.WHERE_EVENTINFO , []) if x.name not in hide))
45                 where.remove(PluginDescriptor.WHERE_EVENTINFO)
46
47         if where:
48                 res.extend(PluginComponent.pluginHider_baseGetPlugins(self, where))
49         if hasPluginWeight:
50                 res.sort(key=lambda x:x.weight)
51         return res
52
53 def autostart(reason, *args, **kwargs):
54         if reason == 0:
55                 if hasattr(PluginComponent, 'pluginHider_baseGetPlugins'):
56                         print("[PluginHider] Something went wrong as our autostart handler was called multiple times for startup, printing traceback and ignoring.")
57                         import traceback, sys
58                         traceback.print_stack(limit=5, file=sys.stdout)
59                 else:
60                         PluginComponent.pluginHider_baseGetPlugins = PluginComponent.getPlugins
61                         PluginComponent.getPlugins = PluginComponent_getPlugins
62         else:
63                 if hasattr(PluginComponent, 'pluginHider_baseGetPlugins'):
64                         PluginComponent.getPlugins = PluginComponent.pluginHider_baseGetPlugins
65                         del PluginComponent.pluginHider_baseGetPlugins
66                 else:
67                         print("[PluginHider] Something went wrong as our autostart handler was called multiple times for shutdown, printing traceback and ignoring.")
68                         import traceback, sys
69                         traceback.print_stack(limit=5, file=sys.stdout)
70
71 def main(session, *args, **kwargs):
72         session.open(PluginHiderSetup)
73
74 def menu(menuid):
75         if menuid != "system":
76                 return []
77         return [(_("Hide Plugins"), main, "pluginhider_setup", None)]
78
79 def Plugins(**kwargs):
80         pd =  PluginDescriptor(
81                 where=PluginDescriptor.WHERE_AUTOSTART,
82                 fnc=autostart,
83                 needsRestart=False,
84         )
85
86         if not hasattr(pd, 'weight'):
87                 global hasPluginWeight
88                 hasPluginWeight = False
89
90         return [
91                 pd,
92                 PluginDescriptor(
93                         where=PluginDescriptor.WHERE_MENU,
94                         fnc=menu,
95                         needsRestart=False,
96                 ),
97         ]