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 Components.SystemInfo import SystemInfo
14 from Screens.MovieSelection import getPreferredTagEditor
15 from Screens.LocationBox import MovieLocationBox
16 from Screens.ChoiceBox import ChoiceBox
17 from RecordTimer import AFTEREVENT
18 from enigma import eEPGCache
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)
115 default = self.timer.dirname or defaultMoviePath()
116 tmp = config.movielist.videodirs.value
117 if default not in tmp:
119 self.timerentry_dirname = ConfigSelection(default = default, choices = tmp)
121 self.timerentry_repeatedbegindate = ConfigDateTime(default = self.timer.repeatedbegindate, formatstring = _("%d.%B %Y"), increment = 86400)
123 self.timerentry_weekday = ConfigSelection(default = weekday_table[weekday], choices = [("mon",_("Monday")), ("tue", _("Tuesday")), ("wed",_("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])
125 self.timerentry_day = ConfigSubList()
126 for x in (0, 1, 2, 3, 4, 5, 6):
127 self.timerentry_day.append(ConfigYesNo(default = day[x]))
129 # FIXME some service-chooser needed here
131 try: # no current service available?
132 servicename = str(self.timer.service_ref.getServiceName())
135 self.timerentry_service_ref = self.timer.service_ref
136 self.timerentry_service = ConfigSelection([servicename])
138 def createSetup(self, widget):
140 self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
141 self.list.append(getConfigListEntry(_("Description"), self.timerentry_description))
142 self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), self.timerentry_justplay)
143 self.list.append(self.timerJustplayEntry)
144 self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), self.timerentry_type)
145 self.list.append(self.timerTypeEntry)
147 if self.timerentry_type.value == "once":
148 self.frequencyEntry = None
150 self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated)
151 self.list.append(self.frequencyEntry)
152 self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate)
153 self.list.append(self.repeatedbegindateEntry)
154 if self.timerentry_repeated.value == "daily":
156 if self.timerentry_repeated.value == "weekdays":
158 if self.timerentry_repeated.value == "weekly":
159 self.list.append(getConfigListEntry(_("Weekday"), self.timerentry_weekday))
161 if self.timerentry_repeated.value == "user":
162 self.list.append(getConfigListEntry(_("Monday"), self.timerentry_day[0]))
163 self.list.append(getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
164 self.list.append(getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
165 self.list.append(getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
166 self.list.append(getConfigListEntry(_("Friday"), self.timerentry_day[4]))
167 self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
168 self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
170 self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date)
171 if self.timerentry_type.value == "once":
172 self.list.append(self.entryDate)
174 self.entryStartTime = getConfigListEntry(_("StartTime"), self.timerentry_starttime)
175 self.list.append(self.entryStartTime)
176 if self.timerentry_justplay.value != "zap":
177 self.entryEndTime = getConfigListEntry(_("EndTime"), self.timerentry_endtime)
178 self.list.append(self.entryEndTime)
180 self.entryEndTime = None
181 self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
182 self.list.append(self.channelEntry)
184 self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
185 self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset)
186 if self.timerentry_justplay.value != "zap":
187 if config.usage.setup_level.index >= 2: # expert+
188 self.list.append(self.dirname)
189 if getPreferredTagEditor():
190 self.list.append(self.tagsSet)
191 self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
193 self[widget].list = self.list
194 self[widget].l.setList(self.list)
197 print "newConfig", self["config"].getCurrent()
198 if self["config"].getCurrent() == self.timerTypeEntry:
199 self.createSetup("config")
200 if self["config"].getCurrent() == self.timerJustplayEntry:
201 self.createSetup("config")
202 if self["config"].getCurrent() == self.frequencyEntry:
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.
269 self.timer.name = self.timerentry_name.value
270 self.timer.description = self.timerentry_description.value
271 self.timer.justplay = self.timerentry_justplay.value == "zap"
272 self.timer.resetRepeated()
273 self.timer.afterEvent = {
274 "nothing": AFTEREVENT.NONE,
275 "deepstandby": AFTEREVENT.DEEPSTANDBY,
276 "standby": AFTEREVENT.STANDBY,
277 "auto": AFTEREVENT.AUTO
278 }[self.timerentry_afterevent.value]
279 self.timer.service_ref = self.timerentry_service_ref
280 self.timer.tags = self.timerentry_tags
282 if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
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()
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 (0, 1, 2, 3, 4, 5, 6):
292 self.timer.setRepeated(x)
294 if self.timerentry_repeated.value == "weekly":
295 self.timer.setRepeated(self.timerentry_weekday.index)
297 if self.timerentry_repeated.value == "weekdays":
298 for x in (0, 1, 2, 3, 4):
299 self.timer.setRepeated(x)
301 if self.timerentry_repeated.value == "user":
302 for x in (0, 1, 2, 3, 4, 5, 6):
303 if self.timerentry_day[x].value:
304 self.timer.setRepeated(x)
306 self.timer.repeatedbegindate = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
307 if self.timer.repeated:
308 self.timer.begin = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
309 self.timer.end = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value)
311 self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
312 self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
314 # when a timer end is set before the start, add 1 day
315 if self.timer.end < self.timer.begin:
316 self.timer.end += 86400
318 if self.timer.eit is not None:
319 event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
321 n = event.getNumOfLinkageServices()
324 ref = self.session.nav.getCurrentlyPlayingServiceReference()
325 parent = self.timer.service_ref.ref
328 i = event.getLinkageService(parent, x)
329 if i.toString() == ref.toString():
331 tlist.append((i.getName(), i))
332 self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
335 parent = self.timer.service_ref.ref
336 self.timer.service_ref = ServiceReference(event.getLinkageService(parent, 0))
338 self.close((True, self.timer))
340 def incrementStart(self):
341 self.timerentry_starttime.increment()
342 self["config"].invalidate(self.entryStartTime)
344 def decrementStart(self):
345 self.timerentry_starttime.decrement()
346 self["config"].invalidate(self.entryStartTime)
348 def incrementEnd(self):
349 if self.entryEndTime is not None:
350 self.timerentry_endtime.increment()
351 self["config"].invalidate(self.entryEndTime)
353 def decrementEnd(self):
354 if self.entryEndTime is not None:
355 self.timerentry_endtime.decrement()
356 self["config"].invalidate(self.entryEndTime)
358 def subserviceSelected(self, service):
359 if not service is None:
360 self.timer.service_ref = ServiceReference(service[1])
362 self.close((True, self.timer))
365 self.session.nav.RecordTimer.saveTimer()
370 def pathSelected(self, res):
372 if config.movielist.videodirs.value != self.timerentry_dirname.choices:
373 self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
374 self.timerentry_dirname.value = res
376 def tagEditFinished(self, ret):
378 self.timerentry_tags = ret
379 self.timerentry_tagsset.setChoices([not ret and "None" or " ".join(ret)])
380 self["config"].invalidate(self.tagsSet)
382 class TimerLog(Screen):
383 def __init__(self, session, timer):
384 Screen.__init__(self, session)
386 self.log_entries = self.timer.log_entries[:]
390 self["loglist"] = MenuList(self.list)
391 self["logentry"] = Label()
393 self["key_red"] = Button(_("Delete entry"))
394 self["key_green"] = Button()
395 self["key_yellow"] = Button("")
396 self["key_blue"] = Button(_("Clear log"))
398 self.onShown.append(self.updateText)
400 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
403 "cancel": self.keyClose,
408 "red": self.deleteEntry,
409 "blue": self.clearLog
412 def deleteEntry(self):
413 cur = self["loglist"].getCurrent()
416 self.log_entries.remove(cur[1])
418 self["loglist"].l.setList(self.list)
421 def fillLogList(self):
422 self.list = [(str(strftime("%Y-%m-%d %H-%M", localtime(x[0])) + " - " + x[2]), x) for x in self.log_entries]
425 self.log_entries = []
427 self["loglist"].l.setList(self.list)
431 if self.timer.log_entries != self.log_entries:
432 self.timer.log_entries = self.log_entries
433 self.close((True, self.timer))
438 self["loglist"].instance.moveSelection(self["loglist"].instance.moveUp)
442 self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
446 self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
450 self["loglist"].instance.moveSelection(self["loglist"].instance.pageDown)
453 def updateText(self):
455 self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
457 self["logentry"].setText("")