some cleanups,
[enigma2.git] / lib / python / Screens / TimerEntry.py
1 from Screen import Screen
2 import ChannelSelection
3 from ServiceReference import ServiceReference
4 from Components.config import config, ConfigSelection, ConfigText, ConfigSubList, ConfigDateTime, ConfigClock, ConfigYesNo, getConfigListEntry
5 from Components.ActionMap import NumberActionMap
6 from Components.ConfigList import ConfigListScreen
7 from Components.MenuList import MenuList
8 from Components.Button import Button
9 from Components.Label import Label
10 from Components.Pixmap import Pixmap
11 from Components.SelectionList import SelectionList, SelectionEntryComponent
12 from Components.MovieList import MovieList
13 from Screens.LocationBox import MovieLocationBox
14 from Screens.ChoiceBox import ChoiceBox
15 from RecordTimer import AFTEREVENT
16 from Tools.Directories import resolveFilename, SCOPE_HDD
17 from enigma import eEPGCache, eServiceReference
18 import time
19 import datetime
20
21 class TimerEntry(Screen, ConfigListScreen):
22         def __init__(self, session, timer):
23                 Screen.__init__(self, session)
24                 self.timer = timer
25
26                 self.entryStartDate = None
27                 self.entryEndDate = None
28                 self.entryService = None
29
30                 self["oktext"] = Label(_("OK"))
31                 self["canceltext"] = Label(_("Cancel"))
32                 self["ok"] = Pixmap()
33                 self["cancel"] = Pixmap()
34
35                 self.createConfig()
36
37                 self["actions"] = NumberActionMap(["SetupActions"],
38                 {
39                         "ok": self.keySelect,
40                         "save": self.keyGo,
41                         "cancel": self.keyCancel,
42                 }, -2)
43
44                 self.list = []
45                 ConfigListScreen.__init__(self, self.list, session = session)
46                 self.createSetup("config")
47
48         def createConfig(self):
49                         justplay = self.timer.justplay
50
51                         afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby"}[self.timer.afterEvent]
52
53                         weekday_table = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
54
55                         # calculate default values
56                         day = []
57                         weekday = 0
58                         for x in range(0,7):
59                                 day.append(0)
60                         if self.timer.repeated: # repeated
61                                 type = "repeated"
62                                 if (self.timer.repeated == 31): # Mon-Fri
63                                         repeated = "weekdays"
64                                 elif (self.timer.repeated == 127): # daily
65                                         repeated = "daily"
66                                 else:
67                                         flags = self.timer.repeated
68                                         repeated = "user"
69                                         count = 0
70                                         for x in range(0, 7):
71                                                 if flags == 1: # weekly
72                                                         print "Set to weekday " + str(x)
73                                                         weekday = x
74                                                 if flags & 1 == 1: # set user defined flags
75                                                         day[x] = 1
76                                                         count += 1
77                                                 else:
78                                                         day[x] = 0
79                                                 flags = flags >> 1
80                                         if count == 1:
81                                                 repeated = "weekly"
82                         else: # once
83                                 type = "once"
84                                 repeated = None
85                                 weekday = (int(time.strftime("%w", time.localtime(self.timer.begin))) - 1) % 7
86                                 day[weekday] = 1
87
88                         self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay])
89                         self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby"))], default = afterevent)
90                         self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
91                         self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False)
92                         self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False)
93
94                         self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
95
96                         self.timerentry_startdate = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
97                         self.timerentry_starttime = ConfigClock(default = self.timer.begin)
98
99                         self.timerentry_enddate = ConfigDateTime(default = self.timer.end, formatstring =  _("%d.%B %Y"), increment = 86400)
100                         self.timerentry_endtime = ConfigClock(default = self.timer.end)
101
102                         tmp = config.movielist.videodirs.value
103                         if self.timer.dirname and not self.timer.dirname in tmp:
104                                 tmp.append(self.timer.dirname)
105                         self.timerentry_dirname = ConfigSelection(default = self.timer.dirname or resolveFilename(SCOPE_HDD), choices = tmp)
106
107                         self.timerentry_repeatedbegindate = ConfigDateTime(default = self.timer.repeatedbegindate, formatstring = _("%d.%B %Y"), increment = 86400)
108
109                         self.timerentry_weekday = ConfigSelection(default = weekday_table[weekday], choices = [("mon",_("Monday")), ("tue", _("Tuesday")), ("wed",_("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])
110
111                         self.timerentry_day = ConfigSubList()
112                         for x in range(0,7):
113                                 self.timerentry_day.append(ConfigYesNo(default = day[x]))
114
115                         # FIXME some service-chooser needed here
116                         servicename = "N/A"
117                         try: # no current service available?
118                                 servicename = str(self.timer.service_ref.getServiceName())
119                         except:
120                                 pass
121                         self.timerentry_service_ref = self.timer.service_ref
122                         self.timerentry_service = ConfigSelection([servicename])
123
124                         self.timerentry_startdate.addNotifier(self.checkDate)
125                         self.timerentry_enddate.addNotifier(self.checkDate)
126
127         def checkDate(self, configElement):
128                 if configElement is self.timerentry_startdate:
129                         if self.timerentry_enddate.value < self.timerentry_startdate.value:
130                                 self.timerentry_enddate.value = self.timerentry_startdate.value
131                                 self["config"].invalidate(self.entryEndDate)
132                 if configElement is self.timerentry_enddate:
133                         if (self.timerentry_enddate.value < self.timerentry_startdate.value):
134                                 self.timerentry_startdate.value = self.timerentry_enddate.value
135                                 self["config"].invalidate(self.entryStartDate)
136
137         def createSetup(self, widget):
138                 self.list = []
139                 self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
140                 self.list.append(getConfigListEntry(_("Description"), self.timerentry_description))
141                 self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), self.timerentry_justplay)
142                 self.list.append(self.timerJustplayEntry)
143                 self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), self.timerentry_type)
144                 self.list.append(self.timerTypeEntry)
145
146                 if self.timerentry_type.value == "once":
147                         self.frequencyEntry = None
148                 else: # repeated
149                         self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated)
150                         self.list.append(self.frequencyEntry)
151                         self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate)
152                         self.list.append(self.repeatedbegindateEntry)
153                         if self.timerentry_repeated.value == "daily":
154                                 pass
155                         if self.timerentry_repeated.value == "weekdays":
156                                 pass
157                         if self.timerentry_repeated.value == "weekly":
158                                 self.list.append(getConfigListEntry(_("Weekday"), self.timerentry_weekday))
159
160                         if self.timerentry_repeated.value == "user":
161                                 self.list.append(getConfigListEntry(_("Monday"), self.timerentry_day[0]))
162                                 self.list.append(getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
163                                 self.list.append(getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
164                                 self.list.append(getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
165                                 self.list.append(getConfigListEntry(_("Friday"), self.timerentry_day[4]))
166                                 self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
167                                 self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
168
169                         #self.list.append(getConfigListEntry("StartDate", self.timerentry_startdate))
170 #               self.list.append(getConfigListEntry("Weekday", self.timerentry_weekday))
171
172                 self.entryStartDate = getConfigListEntry(_("Start"), self.timerentry_startdate)
173                 if self.timerentry_type.value == "once":
174                         self.list.append(self.entryStartDate)
175                         self.list.append(getConfigListEntry(" ", self.timerentry_starttime))
176                 else:
177                         self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
178
179                 self.entryEndDate = getConfigListEntry(_("End"), self.timerentry_enddate)
180                 if self.timerentry_type.value == "once":
181                         if self.timerentry_justplay.value != "zap":
182                                 self.list.append(self.entryEndDate)
183                                 self.list.append(getConfigListEntry(" ", self.timerentry_endtime))
184                 else:
185                         if self.timerentry_justplay.value != "zap":
186                                 self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
187
188                 if self.timerentry_justplay.value != "zap":
189                         if config.usage.setup_level.index >= 2: # expert+
190                                 self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
191                                 self.list.append(self.dirname)
192                         self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
193
194                 self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
195                 self.list.append(self.channelEntry)
196
197                 self[widget].list = self.list
198                 self[widget].l.setList(self.list)
199
200         def newConfig(self):
201                 print "newConfig", self["config"].getCurrent()
202                 if self["config"].getCurrent() == self.timerTypeEntry:
203                         self.createSetup("config")
204                 if self["config"].getCurrent() == self.timerJustplayEntry:
205                         self.createSetup("config")
206                 if self["config"].getCurrent() == self.frequencyEntry:
207                         self.createSetup("config")
208
209         def keyLeft(self):
210                 if self["config"].getCurrent() is self.channelEntry:
211                         self.keySelect()
212                 else:
213                         ConfigListScreen.keyLeft(self)
214                         self.newConfig()
215
216         def keyRight(self):
217                 if self["config"].getCurrent() is self.channelEntry:
218                         self.keySelect()
219                 else:
220                         ConfigListScreen.keyRight(self)
221                         self.newConfig()
222
223         def keySelect(self):
224                 cur = self["config"].getCurrent()
225                 if cur == self.channelEntry:
226                         self.session.openWithCallback(
227                                 self.finishedChannelSelection,
228                                 ChannelSelection.SimpleChannelSelection,
229                                 _("Select channel to record from")
230                         )
231                 elif config.usage.setup_level.index >= 2 and cur == self.dirname:
232                         self.session.openWithCallback(
233                                 self.pathSelected,
234                                 MovieLocationBox,
235                                 _("Choose target folder"),
236                                 self.timerentry_dirname.value,
237                                 minFree = 100 # We require at least 100MB free space
238                         )
239                 else:
240                         self.keyGo()
241
242         def finishedChannelSelection(self, *args):
243                 if len(args):
244                         self.timerentry_service_ref = ServiceReference(args[0])
245                         self.timerentry_service.setCurrentText(self.timerentry_service_ref.getServiceName())
246                         self["config"].invalidate(self.channelEntry)
247
248         def getTimestamp(self, date, mytime):
249                 d = time.localtime(date)
250                 dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
251                 return int(time.mktime(dt.timetuple()))
252
253         def buildRepeatedBegin(self, rep_time, start_time):
254                 d = time.localtime(rep_time)
255                 dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, start_time[0], start_time[1])
256                 return int(time.mktime(dt.timetuple()))
257
258         def getBeginEnd(self):
259                 enddate = self.timerentry_enddate.value
260                 endtime = self.timerentry_endtime.value
261
262                 startdate = self.timerentry_startdate.value
263                 starttime = self.timerentry_starttime.value
264
265                 begin = self.getTimestamp(startdate, starttime)
266                 end = self.getTimestamp(enddate, endtime)
267
268                 # because of the dateChecks, startdate can't be < enddate.
269                 # however, the endtime can be less than the starttime.
270                 # in this case, add 1 day.
271                 if end < begin:
272                         end += 86400
273                 return begin, end
274
275         def keyGo(self):
276                 self.timer.name = self.timerentry_name.value
277                 self.timer.description = self.timerentry_description.value
278                 self.timer.justplay = self.timerentry_justplay.value == "zap"
279                 self.timer.resetRepeated()
280                 self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value]
281                 self.timer.service_ref = self.timerentry_service_ref
282
283                 self.timer.dirname = self.timerentry_dirname.value
284                 config.movielist.last_timer_videodir.value = self.timer.dirname
285                 config.movielist.last_timer_videodir.save()
286
287                 if self.timerentry_type.value == "once":
288                         self.timer.begin, self.timer.end = self.getBeginEnd()
289                 if self.timerentry_type.value == "repeated":
290                         if self.timerentry_repeated.value == "daily":
291                                 for x in range(0,7):
292                                         self.timer.setRepeated(x)
293
294                         if self.timerentry_repeated.value == "weekly":
295                                 self.timer.setRepeated(self.timerentry_weekday.index)
296
297                         if self.timerentry_repeated.value == "weekdays":
298                                 for x in range(0,5):
299                                         self.timer.setRepeated(x)
300
301                         if self.timerentry_repeated.value == "user":
302                                 for x in range(0,7):
303                                         if self.timerentry_day[x].value:
304                                                 self.timer.setRepeated(x)
305
306                         self.timer.repeatedbegindate = self.buildRepeatedBegin(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
307                         self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
308                         self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
309
310                         # when a timer end is set before the start, add 1 day
311                         if self.timer.end < self.timer.begin:
312                                 self.timer.end += 86400
313
314                 if self.timer.eit is not None:
315                         event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
316                         if event is not None:
317                                 n = event.getNumOfLinkageServices()
318                                 if n > 0:
319                                         tlist = []
320                                         ref = self.session.nav.getCurrentlyPlayingServiceReference()
321                                         parent = self.timer.service_ref.ref
322                                         selection = 0
323                                         for x in range(n):
324                                                 i = event.getLinkageService(parent, x)
325                                                 if i.toString() == ref.toString():
326                                                         selection = x
327                                                 tlist.append((i.getName(), i))
328                                         self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
329                                         return
330
331                 self.saveTimer()
332                 self.close((True, self.timer))
333
334         def subserviceSelected(self, service):
335                 if not service is None:
336                         self.timer.service_ref = ServiceReference(service[1])
337                 self.saveTimer()
338                 self.close((True, self.timer))
339
340         def saveTimer(self):
341                 self.session.nav.RecordTimer.saveTimer()
342
343         def keyCancel(self):
344                 self.close((False,))
345
346         def pathSelected(self, res):
347                 if res is not None:
348                         if config.movielist.videodirs.value != self.timerentry_dirname.choices:
349                                 self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
350                         self.timerentry_dirname.value = res
351
352 class TimerLog(Screen):
353         def __init__(self, session, timer):
354                 Screen.__init__(self, session)
355                 self.timer = timer;
356                 self.log_entries = self.timer.log_entries[:]
357
358                 self.fillLogList()
359
360                 self["loglist"] = MenuList(self.list)
361                 self["logentry"] = Label()
362
363                 self["key_red"] = Button(_("Delete entry"))
364                 self["key_green"] = Button()
365                 self["key_yellow"] = Button("")
366                 self["key_blue"] = Button(_("Clear log"))
367
368                 self.onShown.append(self.updateText)
369
370                 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
371                 {
372                         "ok": self.keyClose,
373                         "cancel": self.keyClose,
374                         "up": self.up,
375                         "down": self.down,
376                         "left": self.left,
377                         "right": self.right,
378                         "red": self.deleteEntry,
379                         "blue": self.clearLog
380                 }, -1)
381
382         def deleteEntry(self):
383                 cur = self["loglist"].getCurrent()
384                 if cur is None:
385                         return 
386                 self.log_entries.remove(cur[1])
387                 self.fillLogList()
388                 self["loglist"].l.setList(self.list)
389                 self.updateText()
390
391         def fillLogList(self):
392                 self.list = [ ]
393                 for x in self.log_entries:
394                         self.list.append((str(time.strftime("%Y-%m-%d %H-%M", time.localtime(x[0])) + " - " + x[2]), x))
395
396         def clearLog(self):
397                 self.log_entries = []
398                 self.fillLogList()
399                 self["loglist"].l.setList(self.list)
400                 self.updateText()
401
402         def keyClose(self):
403                 if self.timer.log_entries != self.log_entries:
404                         self.timer.log_entries = self.log_entries
405                         self.close((True, self.timer))
406                 else:
407                         self.close((False,))
408
409         def up(self):
410                 self["loglist"].instance.moveSelection(self["loglist"].instance.moveUp)
411                 self.updateText()
412
413         def down(self):
414                 self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
415                 self.updateText()
416
417         def left(self):
418                 self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
419                 self.updateText()
420
421         def right(self):
422                 self["loglist"].instance.moveSelection(self["loglist"].instance.pageDown)
423                 self.updateText()
424
425         def updateText(self):
426                 if len(self.list) > 0:
427                         self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
428                 else:
429                         self["logentry"].setText("")