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.SystemInfo import SystemInfo
12 from Components.UsageConfig import defaultMoviePath
13 from Screens.MovieSelection import getPreferredTagEditor
14 from Screens.LocationBox import MovieLocationBox
15 from Screens.ChoiceBox import ChoiceBox
16 from Screens.MessageBox import MessageBox
17 from RecordTimer import AFTEREVENT
18 from enigma import eEPGCache, eServiceReference
19 from time import localtime, mktime, time, strftime
20 from datetime import datetime
22 class TimerEntry(Screen, ConfigListScreen):
23 def __init__(self, session, timer):
24 Screen.__init__(self, session)
28 self.entryService = None
30 self["oktext"] = Label(_("OK"))
31 self["canceltext"] = Label(_("Cancel"))
33 self["cancel"] = Pixmap()
37 self["actions"] = NumberActionMap(["SetupActions", "GlobalActions", "PiPSetupActions"],
41 "cancel": self.keyCancel,
42 "volumeUp": self.incrementStart,
43 "volumeDown": self.decrementStart,
44 "size+": self.incrementEnd,
45 "size-": self.decrementEnd
49 ConfigListScreen.__init__(self, self.list, session = session)
50 self.createSetup("config")
52 def createConfig(self):
53 justplay = self.timer.justplay
56 AFTEREVENT.NONE: "nothing",
57 AFTEREVENT.DEEPSTANDBY: "deepstandby",
58 AFTEREVENT.STANDBY: "standby",
59 AFTEREVENT.AUTO: "auto"
60 }[self.timer.afterEvent]
62 weekday_table = ("mon", "tue", "wed", "thu", "fri", "sat", "sun")
64 # calculate default values
67 for x in (0, 1, 2, 3, 4, 5, 6):
69 if self.timer.repeated: # repeated
71 if (self.timer.repeated == 31): # Mon-Fri
73 elif (self.timer.repeated == 127): # daily
76 flags = self.timer.repeated
79 for x in (0, 1, 2, 3, 4, 5, 6):
80 if flags == 1: # weekly
81 print "Set to weekday " + str(x)
83 if flags & 1 == 1: # set user defined flags
94 weekday = (int(strftime("%w", localtime(self.timer.begin))) - 1) % 7
97 self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay])
98 if SystemInfo["DeepstandbySupport"]:
99 shutdownString = _("go to deep standby")
101 shutdownString = _("shut down")
102 self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", shutdownString), ("auto", _("auto"))], default = afterevent)
103 self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
104 self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False)
105 self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False)
106 self.timerentry_tags = self.timer.tags[:]
107 self.timerentry_tagsset = ConfigSelection(choices = [not self.timerentry_tags and "None" or " ".join(self.timerentry_tags)])
109 self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
111 self.timerentry_date = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
112 self.timerentry_starttime = ConfigClock(default = self.timer.begin)
113 self.timerentry_endtime = ConfigClock(default = self.timer.end)
114 self.timerentry_showendtime = ConfigSelection(default = ((self.timer.end - self.timer.begin) > 4), choices = [(True, _("yes")), (False, _("no"))])
116 default = self.timer.dirname or defaultMoviePath()
117 tmp = config.movielist.videodirs.value
118 if default not in tmp:
120 self.timerentry_dirname = ConfigSelection(default = default, choices = tmp)
122 self.timerentry_repeatedbegindate = ConfigDateTime(default = self.timer.repeatedbegindate, formatstring = _("%d.%B %Y"), increment = 86400)
124 self.timerentry_weekday = ConfigSelection(default = weekday_table[weekday], choices = [("mon",_("Monday")), ("tue", _("Tuesday")), ("wed",_("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])
126 self.timerentry_day = ConfigSubList()
127 for x in (0, 1, 2, 3, 4, 5, 6):
128 self.timerentry_day.append(ConfigYesNo(default = day[x]))
130 # FIXME some service-chooser needed here
132 try: # no current service available?
133 servicename = str(self.timer.service_ref.getServiceName())
136 self.timerentry_service_ref = self.timer.service_ref
137 self.timerentry_service = ConfigSelection([servicename])
139 def createSetup(self, widget):
141 self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
142 self.list.append(getConfigListEntry(_("Description"), self.timerentry_description))
143 self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), self.timerentry_justplay)
144 self.list.append(self.timerJustplayEntry)
145 self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), self.timerentry_type)
146 self.list.append(self.timerTypeEntry)
148 if self.timerentry_type.value == "once":
149 self.frequencyEntry = None
151 self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated)
152 self.list.append(self.frequencyEntry)
153 self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate)
154 self.list.append(self.repeatedbegindateEntry)
155 if self.timerentry_repeated.value == "daily":
157 if self.timerentry_repeated.value == "weekdays":
159 if self.timerentry_repeated.value == "weekly":
160 self.list.append(getConfigListEntry(_("Weekday"), self.timerentry_weekday))
162 if self.timerentry_repeated.value == "user":
163 self.list.append(getConfigListEntry(_("Monday"), self.timerentry_day[0]))
164 self.list.append(getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
165 self.list.append(getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
166 self.list.append(getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
167 self.list.append(getConfigListEntry(_("Friday"), self.timerentry_day[4]))
168 self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
169 self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
171 self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date)
172 if self.timerentry_type.value == "once":
173 self.list.append(self.entryDate)
175 self.entryStartTime = getConfigListEntry(_("StartTime"), self.timerentry_starttime)
176 self.list.append(self.entryStartTime)
178 self.entryShowEndTime = getConfigListEntry(_("Set End Time"), self.timerentry_showendtime)
179 if self.timerentry_justplay.value == "zap":
180 self.list.append(self.entryShowEndTime)
181 self.entryEndTime = getConfigListEntry(_("EndTime"), self.timerentry_endtime)
182 if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value:
183 self.list.append(self.entryEndTime)
185 self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
186 self.list.append(self.channelEntry)
188 self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
189 self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset)
190 if self.timerentry_justplay.value != "zap":
191 if config.usage.setup_level.index >= 2: # expert+
192 self.list.append(self.dirname)
193 if getPreferredTagEditor():
194 self.list.append(self.tagsSet)
195 self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
197 self[widget].list = self.list
198 self[widget].l.setList(self.list)
201 print "newConfig", self["config"].getCurrent()
202 if self["config"].getCurrent() in (self.timerTypeEntry, self.timerJustplayEntry, self.frequencyEntry, self.entryShowEndTime):
203 self.createSetup("config")
206 if self["config"].getCurrent() in (self.channelEntry, self.tagsSet):
209 ConfigListScreen.keyLeft(self)
213 if self["config"].getCurrent() in (self.channelEntry, self.tagsSet):
216 ConfigListScreen.keyRight(self)
220 cur = self["config"].getCurrent()
221 if cur == self.channelEntry:
222 self.session.openWithCallback(
223 self.finishedChannelSelection,
224 ChannelSelection.SimpleChannelSelection,
225 _("Select channel to record from")
227 elif config.usage.setup_level.index >= 2 and cur == self.dirname:
228 self.session.openWithCallback(
231 _("Choose target folder"),
232 self.timerentry_dirname.value,
233 minFree = 100 # We require at least 100MB free space
235 elif getPreferredTagEditor() and cur == self.tagsSet:
236 self.session.openWithCallback(
237 self.tagEditFinished,
238 getPreferredTagEditor(),
244 def finishedChannelSelection(self, *args):
246 self.timerentry_service_ref = ServiceReference(args[0])
247 self.timerentry_service.setCurrentText(self.timerentry_service_ref.getServiceName())
248 self["config"].invalidate(self.channelEntry)
250 def getTimestamp(self, date, mytime):
252 dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
253 return int(mktime(dt.timetuple()))
255 def getBeginEnd(self):
256 date = self.timerentry_date.value
257 endtime = self.timerentry_endtime.value
258 starttime = self.timerentry_starttime.value
260 begin = self.getTimestamp(date, starttime)
261 end = self.getTimestamp(date, endtime)
263 # if the endtime is less than the starttime, add 1 day.
268 def selectChannelSelector(self, *args):
269 self.session.openWithCallback(
270 self.finishedChannelSelectionCorrection,
271 ChannelSelection.SimpleChannelSelection,
272 _("Select channel to record from")
275 def finishedChannelSelectionCorrection(self, *args):
277 self.finishedChannelSelection(*args)
280 def keyGo(self, result = None):
281 if not self.timerentry_service_ref.isRecordable():
282 self.session.openWithCallback(self.selectChannelSelector, MessageBox, _("You didn't select a channel to record from."), MessageBox.TYPE_ERROR)
284 self.timer.name = self.timerentry_name.value
285 self.timer.description = self.timerentry_description.value
286 self.timer.justplay = self.timerentry_justplay.value == "zap"
287 if self.timerentry_justplay.value == "zap":
288 if not self.timerentry_showendtime.value:
289 self.timerentry_endtime.value = self.timerentry_starttime.value
290 self.timer.resetRepeated()
291 self.timer.afterEvent = {
292 "nothing": AFTEREVENT.NONE,
293 "deepstandby": AFTEREVENT.DEEPSTANDBY,
294 "standby": AFTEREVENT.STANDBY,
295 "auto": AFTEREVENT.AUTO
296 }[self.timerentry_afterevent.value]
297 self.timer.service_ref = self.timerentry_service_ref
298 self.timer.tags = self.timerentry_tags
300 if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
301 self.timer.dirname = self.timerentry_dirname.value
302 config.movielist.last_timer_videodir.value = self.timer.dirname
303 config.movielist.last_timer_videodir.save()
305 if self.timerentry_type.value == "once":
306 self.timer.begin, self.timer.end = self.getBeginEnd()
307 if self.timerentry_type.value == "repeated":
308 if self.timerentry_repeated.value == "daily":
309 for x in (0, 1, 2, 3, 4, 5, 6):
310 self.timer.setRepeated(x)
312 if self.timerentry_repeated.value == "weekly":
313 self.timer.setRepeated(self.timerentry_weekday.index)
315 if self.timerentry_repeated.value == "weekdays":
316 for x in (0, 1, 2, 3, 4):
317 self.timer.setRepeated(x)
319 if self.timerentry_repeated.value == "user":
320 for x in (0, 1, 2, 3, 4, 5, 6):
321 if self.timerentry_day[x].value:
322 self.timer.setRepeated(x)
324 self.timer.repeatedbegindate = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
325 if self.timer.repeated:
326 self.timer.begin = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
327 self.timer.end = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value)
329 self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
330 self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
332 # when a timer end is set before the start, add 1 day
333 if self.timer.end < self.timer.begin:
334 self.timer.end += 86400
336 if self.timer.eit is not None:
337 event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
339 n = event.getNumOfLinkageServices()
342 ref = self.session.nav.getCurrentlyPlayingServiceReference()
343 parent = self.timer.service_ref.ref
346 i = event.getLinkageService(parent, x)
347 if i.toString() == ref.toString():
349 tlist.append((i.getName(), i))
350 self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
353 parent = self.timer.service_ref.ref
354 self.timer.service_ref = ServiceReference(event.getLinkageService(parent, 0))
356 self.close((True, self.timer))
358 def incrementStart(self):
359 self.timerentry_starttime.increment()
360 self["config"].invalidate(self.entryStartTime)
362 def decrementStart(self):
363 self.timerentry_starttime.decrement()
364 self["config"].invalidate(self.entryStartTime)
366 def incrementEnd(self):
367 if self.entryEndTime is not None:
368 self.timerentry_endtime.increment()
369 self["config"].invalidate(self.entryEndTime)
371 def decrementEnd(self):
372 if self.entryEndTime is not None:
373 self.timerentry_endtime.decrement()
374 self["config"].invalidate(self.entryEndTime)
376 def subserviceSelected(self, service):
377 if not service is None:
378 self.timer.service_ref = ServiceReference(service[1])
380 self.close((True, self.timer))
383 self.session.nav.RecordTimer.saveTimer()
388 def pathSelected(self, res):
390 if config.movielist.videodirs.value != self.timerentry_dirname.choices:
391 self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
392 self.timerentry_dirname.value = res
394 def tagEditFinished(self, ret):
396 self.timerentry_tags = ret
397 self.timerentry_tagsset.setChoices([not ret and "None" or " ".join(ret)])
398 self["config"].invalidate(self.tagsSet)
400 class TimerLog(Screen):
401 def __init__(self, session, timer):
402 Screen.__init__(self, session)
404 self.log_entries = self.timer.log_entries[:]
408 self["loglist"] = MenuList(self.list)
409 self["logentry"] = Label()
411 self["key_red"] = Button(_("Delete entry"))
412 self["key_green"] = Button()
413 self["key_yellow"] = Button("")
414 self["key_blue"] = Button(_("Clear log"))
416 self.onShown.append(self.updateText)
418 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
421 "cancel": self.keyClose,
426 "red": self.deleteEntry,
427 "blue": self.clearLog
430 def deleteEntry(self):
431 cur = self["loglist"].getCurrent()
434 self.log_entries.remove(cur[1])
436 self["loglist"].l.setList(self.list)
439 def fillLogList(self):
440 self.list = [(str(strftime("%Y-%m-%d %H-%M", localtime(x[0])) + " - " + x[2]), x) for x in self.log_entries]
443 self.log_entries = []
445 self["loglist"].l.setList(self.list)
449 if self.timer.log_entries != self.log_entries:
450 self.timer.log_entries = self.log_entries
451 self.close((True, self.timer))
456 self["loglist"].instance.moveSelection(self["loglist"].instance.moveUp)
460 self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
464 self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
468 self["loglist"].instance.moveSelection(self["loglist"].instance.pageDown)
471 def updateText(self):
473 self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
475 self["logentry"].setText("")