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
21 class TimerEntry(Screen, ConfigListScreen):
22 def __init__(self, session, timer):
23 Screen.__init__(self, session)
26 self.entryStartDate = None
27 self.entryEndDate = None
28 self.entryService = None
30 self["oktext"] = Label(_("OK"))
31 self["canceltext"] = Label(_("Cancel"))
33 self["cancel"] = Pixmap()
37 self["actions"] = NumberActionMap(["SetupActions"],
41 "cancel": self.keyCancel,
45 ConfigListScreen.__init__(self, self.list, session = session)
46 self.createSetup("config")
48 def createConfig(self):
49 justplay = self.timer.justplay
51 afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby"}[self.timer.afterEvent]
53 weekday_table = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
55 # calculate default values
60 if self.timer.repeated: # repeated
62 if (self.timer.repeated == 31): # Mon-Fri
64 elif (self.timer.repeated == 127): # daily
67 flags = self.timer.repeated
71 if flags == 1: # weekly
72 print "Set to weekday " + str(x)
74 if flags & 1 == 1: # set user defined flags
85 weekday = (int(time.strftime("%w", time.localtime(self.timer.begin))) - 1) % 7
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)
94 self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
96 self.timerentry_startdate = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
97 self.timerentry_starttime = ConfigClock(default = self.timer.begin)
99 self.timerentry_enddate = ConfigDateTime(default = self.timer.end, formatstring = _("%d.%B %Y"), increment = 86400)
100 self.timerentry_endtime = ConfigClock(default = self.timer.end)
102 default = self.timer.dirname or resolveFilename(SCOPE_HDD)
103 tmp = config.movielist.videodirs.value
104 if default not in tmp:
106 self.timerentry_dirname = ConfigSelection(default = default, choices = tmp)
108 self.timerentry_repeatedbegindate = ConfigDateTime(default = self.timer.repeatedbegindate, formatstring = _("%d.%B %Y"), increment = 86400)
110 self.timerentry_weekday = ConfigSelection(default = weekday_table[weekday], choices = [("mon",_("Monday")), ("tue", _("Tuesday")), ("wed",_("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])
112 self.timerentry_day = ConfigSubList()
114 self.timerentry_day.append(ConfigYesNo(default = day[x]))
116 # FIXME some service-chooser needed here
118 try: # no current service available?
119 servicename = str(self.timer.service_ref.getServiceName())
122 self.timerentry_service_ref = self.timer.service_ref
123 self.timerentry_service = ConfigSelection([servicename])
125 self.timerentry_startdate.addNotifier(self.checkDate)
126 self.timerentry_enddate.addNotifier(self.checkDate)
128 def checkDate(self, configElement):
129 if configElement is self.timerentry_startdate:
130 if self.timerentry_enddate.value < self.timerentry_startdate.value:
131 self.timerentry_enddate.value = self.timerentry_startdate.value
132 self["config"].invalidate(self.entryEndDate)
133 if configElement is self.timerentry_enddate:
134 if (self.timerentry_enddate.value < self.timerentry_startdate.value):
135 self.timerentry_startdate.value = self.timerentry_enddate.value
136 self["config"].invalidate(self.entryStartDate)
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.list.append(getConfigListEntry("StartDate", self.timerentry_startdate))
171 # self.list.append(getConfigListEntry("Weekday", self.timerentry_weekday))
173 self.entryStartDate = getConfigListEntry(_("Start"), self.timerentry_startdate)
174 if self.timerentry_type.value == "once":
175 self.list.append(self.entryStartDate)
176 self.list.append(getConfigListEntry(" ", self.timerentry_starttime))
178 self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
180 self.entryEndDate = getConfigListEntry(_("End"), self.timerentry_enddate)
181 if self.timerentry_type.value == "once":
182 if self.timerentry_justplay.value != "zap":
183 self.list.append(self.entryEndDate)
184 self.list.append(getConfigListEntry(" ", self.timerentry_endtime))
186 if self.timerentry_justplay.value != "zap":
187 self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
189 if self.timerentry_justplay.value != "zap":
190 if config.usage.setup_level.index >= 2: # expert+
191 self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
192 self.list.append(self.dirname)
193 self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
195 self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
196 self.list.append(self.channelEntry)
198 self[widget].list = self.list
199 self[widget].l.setList(self.list)
202 print "newConfig", self["config"].getCurrent()
203 if self["config"].getCurrent() == self.timerTypeEntry:
204 self.createSetup("config")
205 if self["config"].getCurrent() == self.timerJustplayEntry:
206 self.createSetup("config")
207 if self["config"].getCurrent() == self.frequencyEntry:
208 self.createSetup("config")
211 if self["config"].getCurrent() is self.channelEntry:
214 ConfigListScreen.keyLeft(self)
218 if self["config"].getCurrent() is self.channelEntry:
221 ConfigListScreen.keyRight(self)
225 cur = self["config"].getCurrent()
226 if cur == self.channelEntry:
227 self.session.openWithCallback(
228 self.finishedChannelSelection,
229 ChannelSelection.SimpleChannelSelection,
230 _("Select channel to record from")
232 elif config.usage.setup_level.index >= 2 and cur == self.dirname:
233 self.session.openWithCallback(
236 _("Choose target folder"),
237 self.timerentry_dirname.value,
238 minFree = 100 # We require at least 100MB free space
243 def finishedChannelSelection(self, *args):
245 self.timerentry_service_ref = ServiceReference(args[0])
246 self.timerentry_service.setCurrentText(self.timerentry_service_ref.getServiceName())
247 self["config"].invalidate(self.channelEntry)
249 def getTimestamp(self, date, mytime):
250 d = time.localtime(date)
251 dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
252 return int(time.mktime(dt.timetuple()))
254 def buildRepeatedBegin(self, rep_time, start_time):
255 d = time.localtime(rep_time)
256 dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, start_time[0], start_time[1])
257 return int(time.mktime(dt.timetuple()))
259 def getBeginEnd(self):
260 enddate = self.timerentry_enddate.value
261 endtime = self.timerentry_endtime.value
263 startdate = self.timerentry_startdate.value
264 starttime = self.timerentry_starttime.value
266 begin = self.getTimestamp(startdate, starttime)
267 end = self.getTimestamp(enddate, endtime)
269 # because of the dateChecks, startdate can't be < enddate.
270 # however, the endtime can be less than the starttime.
271 # in this case, add 1 day.
277 self.timer.name = self.timerentry_name.value
278 self.timer.description = self.timerentry_description.value
279 self.timer.justplay = self.timerentry_justplay.value == "zap"
280 self.timer.resetRepeated()
281 self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value]
282 self.timer.service_ref = self.timerentry_service_ref
284 self.timer.dirname = self.timerentry_dirname.value
285 config.movielist.last_timer_videodir.value = self.timer.dirname
286 config.movielist.last_timer_videodir.save()
288 if self.timerentry_type.value == "once":
289 self.timer.begin, self.timer.end = self.getBeginEnd()
290 if self.timerentry_type.value == "repeated":
291 if self.timerentry_repeated.value == "daily":
293 self.timer.setRepeated(x)
295 if self.timerentry_repeated.value == "weekly":
296 self.timer.setRepeated(self.timerentry_weekday.index)
298 if self.timerentry_repeated.value == "weekdays":
300 self.timer.setRepeated(x)
302 if self.timerentry_repeated.value == "user":
304 if self.timerentry_day[x].value:
305 self.timer.setRepeated(x)
307 self.timer.repeatedbegindate = self.buildRepeatedBegin(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
308 self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
309 self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
311 # when a timer end is set before the start, add 1 day
312 if self.timer.end < self.timer.begin:
313 self.timer.end += 86400
315 if self.timer.eit is not None:
316 event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
317 if event is not None:
318 n = event.getNumOfLinkageServices()
321 ref = self.session.nav.getCurrentlyPlayingServiceReference()
322 parent = self.timer.service_ref.ref
325 i = event.getLinkageService(parent, x)
326 if i.toString() == ref.toString():
328 tlist.append((i.getName(), i))
329 self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
333 self.close((True, self.timer))
335 def subserviceSelected(self, service):
336 if not service is None:
337 self.timer.service_ref = ServiceReference(service[1])
339 self.close((True, self.timer))
342 self.session.nav.RecordTimer.saveTimer()
347 def pathSelected(self, res):
349 if config.movielist.videodirs.value != self.timerentry_dirname.choices:
350 self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
351 self.timerentry_dirname.value = res
353 class TimerLog(Screen):
354 def __init__(self, session, timer):
355 Screen.__init__(self, session)
357 self.log_entries = self.timer.log_entries[:]
361 self["loglist"] = MenuList(self.list)
362 self["logentry"] = Label()
364 self["key_red"] = Button(_("Delete entry"))
365 self["key_green"] = Button()
366 self["key_yellow"] = Button("")
367 self["key_blue"] = Button(_("Clear log"))
369 self.onShown.append(self.updateText)
371 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
374 "cancel": self.keyClose,
379 "red": self.deleteEntry,
380 "blue": self.clearLog
383 def deleteEntry(self):
384 cur = self["loglist"].getCurrent()
387 self.log_entries.remove(cur[1])
389 self["loglist"].l.setList(self.list)
392 def fillLogList(self):
394 for x in self.log_entries:
395 self.list.append((str(time.strftime("%Y-%m-%d %H-%M", time.localtime(x[0])) + " - " + x[2]), x))
398 self.log_entries = []
400 self["loglist"].l.setList(self.list)
404 if self.timer.log_entries != self.log_entries:
405 self.timer.log_entries = self.log_entries
406 self.close((True, self.timer))
411 self["loglist"].instance.moveSelection(self["loglist"].instance.moveUp)
415 self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
419 self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
423 self["loglist"].instance.moveSelection(self["loglist"].instance.pageDown)
426 def updateText(self):
427 if len(self.list) > 0:
428 self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
430 self["logentry"].setText("")