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 tmp = config.movielist.videodirs.value
103 if self.timer.dirname and not self.timer.dirname in tmp:
104 tmp.append(self.timer.dirname)
105 self.timerentry_dirname = ConfigSelection(default = self.timer.dirname or resolveFilename(SCOPE_HDD), choices = tmp)
107 self.timerentry_repeatedbegindate = ConfigDateTime(default = self.timer.repeatedbegindate, formatstring = _("%d.%B %Y"), increment = 86400)
109 self.timerentry_weekday = ConfigSelection(default = weekday_table[weekday], choices = [("mon",_("Monday")), ("tue", _("Tuesday")), ("wed",_("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])
111 self.timerentry_day = ConfigSubList()
113 self.timerentry_day.append(ConfigYesNo(default = day[x]))
115 # FIXME some service-chooser needed here
117 try: # no current service available?
118 servicename = str(self.timer.service_ref.getServiceName())
121 self.timerentry_service_ref = self.timer.service_ref
122 self.timerentry_service = ConfigSelection([servicename])
124 self.timerentry_startdate.addNotifier(self.checkDate)
125 self.timerentry_enddate.addNotifier(self.checkDate)
127 def checkDate(self, configElement):
128 if configElement is self.timerentry_startdate:
129 if self.timerentry_enddate.value < self.timerentry_startdate.value:
130 self.timerentry_enddate.value = self.timerentry_startdate.value
131 self["config"].invalidate(self.entryEndDate)
132 if configElement is self.timerentry_enddate:
133 if (self.timerentry_enddate.value < self.timerentry_startdate.value):
134 self.timerentry_startdate.value = self.timerentry_enddate.value
135 self["config"].invalidate(self.entryStartDate)
137 def createSetup(self, widget):
139 self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
140 self.list.append(getConfigListEntry(_("Description"), self.timerentry_description))
141 self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), self.timerentry_justplay)
142 self.list.append(self.timerJustplayEntry)
143 self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), self.timerentry_type)
144 self.list.append(self.timerTypeEntry)
146 if self.timerentry_type.value == "once":
147 self.frequencyEntry = None
149 self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated)
150 self.list.append(self.frequencyEntry)
151 self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate)
152 self.list.append(self.repeatedbegindateEntry)
153 if self.timerentry_repeated.value == "daily":
155 if self.timerentry_repeated.value == "weekdays":
157 if self.timerentry_repeated.value == "weekly":
158 self.list.append(getConfigListEntry(_("Weekday"), self.timerentry_weekday))
160 if self.timerentry_repeated.value == "user":
161 self.list.append(getConfigListEntry(_("Monday"), self.timerentry_day[0]))
162 self.list.append(getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
163 self.list.append(getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
164 self.list.append(getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
165 self.list.append(getConfigListEntry(_("Friday"), self.timerentry_day[4]))
166 self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
167 self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
169 #self.list.append(getConfigListEntry("StartDate", self.timerentry_startdate))
170 # self.list.append(getConfigListEntry("Weekday", self.timerentry_weekday))
172 self.entryStartDate = getConfigListEntry(_("Start"), self.timerentry_startdate)
173 if self.timerentry_type.value == "once":
174 self.list.append(self.entryStartDate)
175 self.list.append(getConfigListEntry(" ", self.timerentry_starttime))
177 self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
179 self.entryEndDate = getConfigListEntry(_("End"), self.timerentry_enddate)
180 if self.timerentry_type.value == "once":
181 if self.timerentry_justplay.value != "zap":
182 self.list.append(self.entryEndDate)
183 self.list.append(getConfigListEntry(" ", self.timerentry_endtime))
185 if self.timerentry_justplay.value != "zap":
186 self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
188 if self.timerentry_justplay.value != "zap":
189 if config.usage.setup_level.index >= 2: # expert+
190 self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
191 self.list.append(self.dirname)
192 self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
194 self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
195 self.list.append(self.channelEntry)
197 self[widget].list = self.list
198 self[widget].l.setList(self.list)
201 print "newConfig", self["config"].getCurrent()
202 if self["config"].getCurrent() == self.timerTypeEntry:
203 self.createSetup("config")
204 if self["config"].getCurrent() == self.timerJustplayEntry:
205 self.createSetup("config")
206 if self["config"].getCurrent() == self.frequencyEntry:
207 self.createSetup("config")
210 if self["config"].getCurrent() is self.channelEntry:
213 ConfigListScreen.keyLeft(self)
217 if self["config"].getCurrent() is self.channelEntry:
220 ConfigListScreen.keyRight(self)
224 cur = self["config"].getCurrent()
225 if cur == self.channelEntry:
226 self.session.openWithCallback(
227 self.finishedChannelSelection,
228 ChannelSelection.SimpleChannelSelection,
229 _("Select channel to record from")
231 elif config.usage.setup_level.index >= 2 and cur == self.dirname:
232 self.session.openWithCallback(
235 _("Choose target folder"),
236 self.timerentry_dirname.value,
237 minFree = 100 # We require at least 100MB free space
242 def finishedChannelSelection(self, *args):
244 self.timerentry_service_ref = ServiceReference(args[0])
245 self.timerentry_service.setCurrentText(self.timerentry_service_ref.getServiceName())
246 self["config"].invalidate(self.channelEntry)
248 def getTimestamp(self, date, mytime):
249 d = time.localtime(date)
250 dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
251 return int(time.mktime(dt.timetuple()))
253 def buildRepeatedBegin(self, rep_time, start_time):
254 d = time.localtime(rep_time)
255 dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, start_time[0], start_time[1])
256 return int(time.mktime(dt.timetuple()))
258 def getBeginEnd(self):
259 enddate = self.timerentry_enddate.value
260 endtime = self.timerentry_endtime.value
262 startdate = self.timerentry_startdate.value
263 starttime = self.timerentry_starttime.value
265 begin = self.getTimestamp(startdate, starttime)
266 end = self.getTimestamp(enddate, endtime)
268 # because of the dateChecks, startdate can't be < enddate.
269 # however, the endtime can be less than the starttime.
270 # in this case, add 1 day.
276 self.timer.name = self.timerentry_name.value
277 self.timer.description = self.timerentry_description.value
278 self.timer.justplay = self.timerentry_justplay.value == "zap"
279 self.timer.resetRepeated()
280 self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value]
281 self.timer.service_ref = self.timerentry_service_ref
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":
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":
299 self.timer.setRepeated(x)
301 if self.timerentry_repeated.value == "user":
303 if self.timerentry_day[x].value:
304 self.timer.setRepeated(x)
306 self.timer.repeatedbegindate = self.buildRepeatedBegin(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
307 self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
308 self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
310 # when a timer end is set before the start, add 1 day
311 if self.timer.end < self.timer.begin:
312 self.timer.end += 86400
314 if self.timer.eit is not None:
315 event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
316 if event is not None:
317 n = event.getNumOfLinkageServices()
320 ref = self.session.nav.getCurrentlyPlayingServiceReference()
321 parent = self.timer.service_ref.ref
324 i = event.getLinkageService(parent, x)
325 if i.toString() == ref.toString():
327 tlist.append((i.getName(), i))
328 self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
332 self.close((True, self.timer))
334 def subserviceSelected(self, service):
335 if not service is None:
336 self.timer.service_ref = ServiceReference(service[1])
338 self.close((True, self.timer))
341 self.session.nav.RecordTimer.saveTimer()
346 def pathSelected(self, res):
348 if config.movielist.videodirs.value != self.timerentry_dirname.choices:
349 self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
350 self.timerentry_dirname.value = res
352 class TimerLog(Screen):
353 def __init__(self, session, timer):
354 Screen.__init__(self, session)
356 self.log_entries = self.timer.log_entries[:]
360 self["loglist"] = MenuList(self.list)
361 self["logentry"] = Label()
363 self["key_red"] = Button(_("Delete entry"))
364 self["key_green"] = Button()
365 self["key_yellow"] = Button("")
366 self["key_blue"] = Button(_("Clear log"))
368 self.onShown.append(self.updateText)
370 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
373 "cancel": self.keyClose,
378 "red": self.deleteEntry,
379 "blue": self.clearLog
382 def deleteEntry(self):
383 cur = self["loglist"].getCurrent()
386 self.log_entries.remove(cur[1])
388 self["loglist"].l.setList(self.list)
391 def fillLogList(self):
393 for x in self.log_entries:
394 self.list.append((str(time.strftime("%Y-%m-%d %H-%M", time.localtime(x[0])) + " - " + x[2]), x))
397 self.log_entries = []
399 self["loglist"].l.setList(self.list)
403 if self.timer.log_entries != self.log_entries:
404 self.timer.log_entries = self.log_entries
405 self.close((True, self.timer))
410 self["loglist"].instance.moveSelection(self["loglist"].instance.moveUp)
414 self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
418 self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
422 self["loglist"].instance.moveSelection(self["loglist"].instance.pageDown)
425 def updateText(self):
426 if len(self.list) > 0:
427 self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
429 self["logentry"].setText("")