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 Screens.MovieSelection import getPreferredTagEditor
12 from Screens.LocationBox import MovieLocationBox
13 from Screens.ChoiceBox import ChoiceBox
14 from RecordTimer import AFTEREVENT
15 from Tools.Directories import resolveFilename, SCOPE_HDD
16 from enigma import eEPGCache
17 from time import localtime, mktime, time, strftime
18 from datetime import datetime
20 class TimerEntry(Screen, ConfigListScreen):
21 def __init__(self, session, timer):
22 Screen.__init__(self, session)
26 self.entryService = None
28 self["oktext"] = Label(_("OK"))
29 self["canceltext"] = Label(_("Cancel"))
31 self["cancel"] = Pixmap()
35 self["actions"] = NumberActionMap(["SetupActions"],
39 "cancel": self.keyCancel,
43 ConfigListScreen.__init__(self, self.list, session = session)
44 self.createSetup("config")
46 def createConfig(self):
47 justplay = self.timer.justplay
50 AFTEREVENT.NONE: "nothing",
51 AFTEREVENT.DEEPSTANDBY: "deepstandby",
52 AFTEREVENT.STANDBY: "standby",
53 AFTEREVENT.AUTO: "auto"
54 }[self.timer.afterEvent]
56 weekday_table = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
58 # calculate default values
63 if self.timer.repeated: # repeated
65 if (self.timer.repeated == 31): # Mon-Fri
67 elif (self.timer.repeated == 127): # daily
70 flags = self.timer.repeated
74 if flags == 1: # weekly
75 print "Set to weekday " + str(x)
77 if flags & 1 == 1: # set user defined flags
88 weekday = (int(strftime("%w", localtime(self.timer.begin))) - 1) % 7
91 self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay])
92 self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby")), ("auto", _("auto"))], default = afterevent)
93 self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
94 self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False)
95 self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False)
96 self.timerentry_tags = self.timer.tags + []
97 self.timerentry_tagsset = ConfigSelection(choices = [len(self.timerentry_tags) == 0 and "None" or " ".join(self.timerentry_tags)])
99 self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
101 self.timerentry_date = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
102 self.timerentry_starttime = ConfigClock(default = self.timer.begin)
103 self.timerentry_endtime = ConfigClock(default = self.timer.end)
105 default = self.timer.dirname or resolveFilename(SCOPE_HDD)
106 tmp = config.movielist.videodirs.value
107 if default not in tmp:
109 self.timerentry_dirname = ConfigSelection(default = default, choices = tmp)
111 self.timerentry_repeatedbegindate = ConfigDateTime(default = self.timer.repeatedbegindate, formatstring = _("%d.%B %Y"), increment = 86400)
113 self.timerentry_weekday = ConfigSelection(default = weekday_table[weekday], choices = [("mon",_("Monday")), ("tue", _("Tuesday")), ("wed",_("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])
115 self.timerentry_day = ConfigSubList()
117 self.timerentry_day.append(ConfigYesNo(default = day[x]))
119 # FIXME some service-chooser needed here
121 try: # no current service available?
122 servicename = str(self.timer.service_ref.getServiceName())
125 self.timerentry_service_ref = self.timer.service_ref
126 self.timerentry_service = ConfigSelection([servicename])
128 def createSetup(self, widget):
130 self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
131 self.list.append(getConfigListEntry(_("Description"), self.timerentry_description))
132 self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), self.timerentry_justplay)
133 self.list.append(self.timerJustplayEntry)
134 self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), self.timerentry_type)
135 self.list.append(self.timerTypeEntry)
137 if self.timerentry_type.value == "once":
138 self.frequencyEntry = None
140 self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated)
141 self.list.append(self.frequencyEntry)
142 self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate)
143 self.list.append(self.repeatedbegindateEntry)
144 if self.timerentry_repeated.value == "daily":
146 if self.timerentry_repeated.value == "weekdays":
148 if self.timerentry_repeated.value == "weekly":
149 self.list.append(getConfigListEntry(_("Weekday"), self.timerentry_weekday))
151 if self.timerentry_repeated.value == "user":
152 self.list.append(getConfigListEntry(_("Monday"), self.timerentry_day[0]))
153 self.list.append(getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
154 self.list.append(getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
155 self.list.append(getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
156 self.list.append(getConfigListEntry(_("Friday"), self.timerentry_day[4]))
157 self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
158 self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
160 self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date)
161 if self.timerentry_type.value == "once":
162 self.list.append(self.entryDate)
163 self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
164 if self.timerentry_justplay.value != "zap":
165 self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
166 self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
167 self.list.append(self.channelEntry)
169 self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
170 self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset)
171 if self.timerentry_justplay.value != "zap":
172 if config.usage.setup_level.index >= 2: # expert+
173 self.list.append(self.dirname)
174 if getPreferredTagEditor():
175 self.list.append(self.tagsSet)
176 self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
178 self[widget].list = self.list
179 self[widget].l.setList(self.list)
182 print "newConfig", self["config"].getCurrent()
183 if self["config"].getCurrent() == self.timerTypeEntry:
184 self.createSetup("config")
185 if self["config"].getCurrent() == self.timerJustplayEntry:
186 self.createSetup("config")
187 if self["config"].getCurrent() == self.frequencyEntry:
188 self.createSetup("config")
191 if self["config"].getCurrent() in [self.channelEntry, self.tagsSet]:
194 ConfigListScreen.keyLeft(self)
198 if self["config"].getCurrent() in [self.channelEntry, self.tagsSet]:
201 ConfigListScreen.keyRight(self)
205 cur = self["config"].getCurrent()
206 if cur == self.channelEntry:
207 self.session.openWithCallback(
208 self.finishedChannelSelection,
209 ChannelSelection.SimpleChannelSelection,
210 _("Select channel to record from")
212 elif config.usage.setup_level.index >= 2 and cur == self.dirname:
213 self.session.openWithCallback(
216 _("Choose target folder"),
217 self.timerentry_dirname.value,
218 minFree = 100 # We require at least 100MB free space
220 elif getPreferredTagEditor() and cur == self.tagsSet:
221 self.session.openWithCallback(
222 self.tagEditFinished,
223 getPreferredTagEditor(),
229 def finishedChannelSelection(self, *args):
231 self.timerentry_service_ref = ServiceReference(args[0])
232 self.timerentry_service.setCurrentText(self.timerentry_service_ref.getServiceName())
233 self["config"].invalidate(self.channelEntry)
235 def getTimestamp(self, date, mytime):
237 dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
238 return int(mktime(dt.timetuple()))
240 def getBeginEnd(self):
241 date = self.timerentry_date.value
242 endtime = self.timerentry_endtime.value
243 starttime = self.timerentry_starttime.value
245 begin = self.getTimestamp(date, starttime)
246 end = self.getTimestamp(date, endtime)
248 # if the endtime is less than the starttime, add 1 day.
254 self.timer.name = self.timerentry_name.value
255 self.timer.description = self.timerentry_description.value
256 self.timer.justplay = self.timerentry_justplay.value == "zap"
257 self.timer.resetRepeated()
258 self.timer.afterEvent = {
259 "nothing": AFTEREVENT.NONE,
260 "deepstandby": AFTEREVENT.DEEPSTANDBY,
261 "standby": AFTEREVENT.STANDBY,
262 "auto": AFTEREVENT.AUTO
263 }[self.timerentry_afterevent.value]
264 self.timer.service_ref = self.timerentry_service_ref
265 self.timer.tags = self.timerentry_tags
267 self.timer.dirname = self.timerentry_dirname.value
268 config.movielist.last_timer_videodir.value = self.timer.dirname
269 config.movielist.last_timer_videodir.save()
271 if self.timerentry_type.value == "once":
272 self.timer.begin, self.timer.end = self.getBeginEnd()
273 if self.timerentry_type.value == "repeated":
274 if self.timerentry_repeated.value == "daily":
276 self.timer.setRepeated(x)
278 if self.timerentry_repeated.value == "weekly":
279 self.timer.setRepeated(self.timerentry_weekday.index)
281 if self.timerentry_repeated.value == "weekdays":
283 self.timer.setRepeated(x)
285 if self.timerentry_repeated.value == "user":
287 if self.timerentry_day[x].value:
288 self.timer.setRepeated(x)
290 self.timer.repeatedbegindate = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
291 if self.timer.repeated:
292 self.timer.begin = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
293 self.timer.end = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value)
295 self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
296 self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
298 # when a timer end is set before the start, add 1 day
299 if self.timer.end < self.timer.begin:
300 self.timer.end += 86400
302 if self.timer.eit is not None:
303 event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
304 if event is not None:
305 n = event.getNumOfLinkageServices()
308 ref = self.session.nav.getCurrentlyPlayingServiceReference()
309 parent = self.timer.service_ref.ref
312 i = event.getLinkageService(parent, x)
313 if i.toString() == ref.toString():
315 tlist.append((i.getName(), i))
316 self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
320 self.close((True, self.timer))
322 def subserviceSelected(self, service):
323 if not service is None:
324 self.timer.service_ref = ServiceReference(service[1])
326 self.close((True, self.timer))
329 self.session.nav.RecordTimer.saveTimer()
334 def pathSelected(self, res):
336 if config.movielist.videodirs.value != self.timerentry_dirname.choices:
337 self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
338 self.timerentry_dirname.value = res
340 def tagEditFinished(self, ret):
342 self.timerentry_tags = ret
343 self.timerentry_tagsset.setChoices([len(ret) == 0 and "None" or " ".join(ret)])
344 self["config"].invalidate(self.tagsSet)
346 class TimerLog(Screen):
347 def __init__(self, session, timer):
348 Screen.__init__(self, session)
350 self.log_entries = self.timer.log_entries[:]
354 self["loglist"] = MenuList(self.list)
355 self["logentry"] = Label()
357 self["key_red"] = Button(_("Delete entry"))
358 self["key_green"] = Button()
359 self["key_yellow"] = Button("")
360 self["key_blue"] = Button(_("Clear log"))
362 self.onShown.append(self.updateText)
364 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
367 "cancel": self.keyClose,
372 "red": self.deleteEntry,
373 "blue": self.clearLog
376 def deleteEntry(self):
377 cur = self["loglist"].getCurrent()
380 self.log_entries.remove(cur[1])
382 self["loglist"].l.setList(self.list)
385 def fillLogList(self):
387 for x in self.log_entries:
388 self.list.append((str(strftime("%Y-%m-%d %H-%M", localtime(x[0])) + " - " + x[2]), x))
391 self.log_entries = []
393 self["loglist"].l.setList(self.list)
397 if self.timer.log_entries != self.log_entries:
398 self.timer.log_entries = self.log_entries
399 self.close((True, self.timer))
404 self["loglist"].instance.moveSelection(self["loglist"].instance.moveUp)
408 self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
412 self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
416 self["loglist"].instance.moveSelection(self["loglist"].instance.pageDown)
419 def updateText(self):
420 if len(self.list) > 0:
421 self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
423 self["logentry"].setText("")