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