Follow Enigma2 API change... its not allowed to directly access ConfigElement notifie...
[enigma2-plugins.git] / autotimer / src / plugin.py
1 # for localized messages
2 from . import _
3
4 # GUI (Screens)
5 from Screens.MessageBox import MessageBox
6
7 # Config
8 from Components.config import config, ConfigSubsection, ConfigEnableDisable, \
9         ConfigNumber, ConfigSelection, ConfigYesNo
10
11 # Plugin
12 from Components.PluginComponent import plugins
13 from Plugins.Plugin import PluginDescriptor
14
15 # Initialize Configuration
16 config.plugins.autotimer = ConfigSubsection()
17 config.plugins.autotimer.autopoll = ConfigEnableDisable(default = False)
18 config.plugins.autotimer.interval = ConfigNumber(default = 3)
19 config.plugins.autotimer.refresh = ConfigSelection(choices = [
20                 ("none", _("None")),
21                 ("auto", _("Only AutoTimers created during this session")),
22                 ("all", _("All non-repeating timers"))
23         ], default = "none"
24 )
25 config.plugins.autotimer.try_guessing = ConfigEnableDisable(default = True)
26 config.plugins.autotimer.editor = ConfigSelection(choices = [
27                 ("plain", _("Classic")),
28                 ("wizard", _("Wizard"))
29         ], default = "wizard"
30 )
31 config.plugins.autotimer.addsimilar_on_conflict = ConfigEnableDisable(default = False)
32 config.plugins.autotimer.disabled_on_conflict = ConfigEnableDisable(default = False)
33 config.plugins.autotimer.show_in_extensionsmenu = ConfigYesNo(default = False)
34 config.plugins.autotimer.fastscan = ConfigYesNo(default = False)
35 config.plugins.autotimer.notifconflict = ConfigYesNo(default = True)
36 config.plugins.autotimer.notifsimilar = ConfigYesNo(default = True)
37 config.plugins.autotimer.maxdaysinfuture = ConfigNumber(default = 0)
38 config.plugins.autotimer.show_help = ConfigYesNo(default = True)
39
40 autotimer = None
41 autopoller = None
42
43 #pragma mark - Help
44 try:
45         from Plugins.SystemPlugins.MPHelp import registerHelp, XMLHelpReader
46         from Tools.Directories import resolveFilename, SCOPE_PLUGINS
47         reader = XMLHelpReader(resolveFilename(SCOPE_PLUGINS, "Extensions/AutoTimer/mphelp.xml"))
48         autotimerHelp = registerHelp(*reader)
49 except Exception as e:
50         print("[AutoTimer] Unable to initialize MPHelp:", e,"- Help not available!")
51         autotimerHelp = None
52 #pragma mark -
53
54 # Autostart
55 def autostart(reason, **kwargs):
56         global autotimer
57         global autopoller
58
59         # Startup
60         if config.plugins.autotimer.autopoll.value and reason == 0:
61                 # Initialize AutoTimer
62                 from AutoTimer import AutoTimer
63                 autotimer = AutoTimer()
64
65                 # Start Poller
66                 from AutoPoller import AutoPoller
67                 autopoller = AutoPoller()
68                 autopoller.start()
69         # Shutdown
70         elif reason == 1:
71                 # Stop Poller
72                 if autopoller is not None:
73                         autopoller.stop()
74                         autopoller = None
75
76                 if autotimer is not None:
77                         # We re-read the config so we won't save wrong information
78                         try:
79                                 autotimer.readXml()
80                         except Exception:
81                                 # XXX: we should at least dump the error
82                                 pass
83
84                         # Save xml
85                         autotimer.writeXml()
86
87                         # Remove AutoTimer
88                         autotimer = None
89
90 # Mainfunction
91 def main(session, **kwargs):
92         global autotimer
93         global autopoller
94
95         if autotimer is None:
96                 from AutoTimer import AutoTimer
97                 autotimer = AutoTimer()
98
99         try:
100                 autotimer.readXml()
101         except SyntaxError as se:
102                 session.open(
103                         MessageBox,
104                         _("Your config file is not well-formed:\n%s") % (str(se)),
105                         type = MessageBox.TYPE_ERROR,
106                         timeout = 10
107                 )
108                 return
109
110         # Do not run in background while editing, this might screw things up
111         if autopoller is not None:
112                 autopoller.pause()
113
114         from AutoTimerOverview import AutoTimerOverview
115         session.openWithCallback(
116                 editCallback,
117                 AutoTimerOverview,
118                 autotimer
119         )
120
121 def editCallback(session):
122         global autotimer
123         global autopoller
124
125         # XXX: canceling of GUI (Overview) won't affect config values which might have been changed - is this intended?
126
127         # Don't parse EPG if editing was canceled
128         if session is not None:
129                 # Poll EPGCache
130                 ret = autotimer.parseEPG()
131                 session.open(
132                         MessageBox,
133                         _("Found a total of %d matching Events.\n%d Timer were added and %d modified, %d conflicts encountered, %d similars added.") % (ret[0], ret[1], ret[2], len(ret[4]), len(ret[5])),
134                         type = MessageBox.TYPE_INFO,
135                         timeout = 10
136                 )
137
138                 # Save xml
139                 autotimer.writeXml()
140
141         # Start autopoller again if wanted
142         if config.plugins.autotimer.autopoll.value:
143                 if autopoller is None:
144                         from AutoPoller import AutoPoller
145                         autopoller = AutoPoller()
146                 autopoller.start(initial = False)
147         # Remove instance if not running in background
148         else:
149                 autopoller = None
150                 autotimer = None
151
152 # Movielist
153 def movielist(session, service, **kwargs):
154         from AutoTimerEditor import addAutotimerFromService
155         addAutotimerFromService(session, service)
156
157 # Event Info
158 def eventinfo(session, servicelist, **kwargs):
159         from AutoTimerEditor import AutoTimerEPGSelection
160         ref = session.nav.getCurrentlyPlayingServiceReference()
161         session.open(AutoTimerEPGSelection, ref)
162
163 # XXX: we need this helper function to identify the descriptor
164 # Extensions menu
165 def extensionsmenu(session, **kwargs):
166         main(session, **kwargs)
167
168 def housekeepingExtensionsmenu(el):
169         if el.value:
170                 plugins.addPlugin(extDescriptor)
171         else:
172                 try:
173                         plugins.removePlugin(extDescriptor)
174                 except ValueError as ve:
175                         print("[AutoTimer] housekeepingExtensionsmenu got confused, tried to remove non-existant plugin entry... ignoring.")
176
177 config.plugins.autotimer.show_in_extensionsmenu.addNotifier(housekeepingExtensionsmenu, initial_call = False, immediate_feedback = True)
178 extDescriptor = PluginDescriptor(name="AutoTimer", description = _("Edit Timers and scan for new Events"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc = extensionsmenu, needsRestart = False)
179
180 def Plugins(**kwargs):
181         l = [
182                 PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart, needsRestart = False),
183                 # TRANSLATORS: description of AutoTimer in PluginBrowser
184                 PluginDescriptor(name="AutoTimer", description = _("Edit Timers and scan for new Events"), where = PluginDescriptor.WHERE_PLUGINMENU, icon = "plugin.png", fnc = main, needsRestart = False),
185                 # TRANSLATORS: AutoTimer title in MovieList (automatically opens importer, I consider this no further interaction)
186                 PluginDescriptor(name="AutoTimer", description= _("add AutoTimer"), where = PluginDescriptor.WHERE_MOVIELIST, fnc = movielist, needsRestart = False),
187                 # TRANSLATORS: AutoTimer title in EventInfo dialog (requires the user to select an event to base the AutoTimer on)
188                 PluginDescriptor(name=_("add AutoTimer..."), where = PluginDescriptor.WHERE_EVENTINFO, fnc = eventinfo, needsRestart = False),
189         ]
190         if config.plugins.autotimer.show_in_extensionsmenu.value:
191                 l.append(extDescriptor)
192         return l
193