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