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