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