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