add new after record timer event behavior "auto".. and use it as default
[vuplus_dvbapp] / lib / python / Screens / TimerEntry.py
index cc43a9a..be8b524 100644 (file)
@@ -1,28 +1,30 @@
 from Screen import Screen
 import ChannelSelection
 from ServiceReference import ServiceReference
-from Components.config import ConfigSelection, ConfigText, ConfigSubList, ConfigDateTime, ConfigClock, ConfigYesNo, getConfigListEntry
+from Components.config import config, ConfigSelection, ConfigText, ConfigSubList, ConfigDateTime, ConfigClock, ConfigYesNo, getConfigListEntry
 from Components.ActionMap import NumberActionMap
 from Components.ConfigList import ConfigListScreen
 from Components.MenuList import MenuList
 from Components.Button import Button
 from Components.Label import Label
 from Components.Pixmap import Pixmap
+from Screens.MovieSelection import getPreferredTagEditor
+from Screens.LocationBox import MovieLocationBox
 from Screens.ChoiceBox import ChoiceBox
 from RecordTimer import AFTEREVENT
+from Tools.Directories import resolveFilename, SCOPE_HDD
 from enigma import eEPGCache
-import time
-import datetime
+from time import localtime, mktime, time, strftime
+from datetime import datetime
 
 class TimerEntry(Screen, ConfigListScreen):
        def __init__(self, session, timer):
                Screen.__init__(self, session)
                self.timer = timer
-               
-               self.entryStartDate = None
-               self.entryEndDate = None
+
+               self.entryDate = None
                self.entryService = None
-               
+
                self["oktext"] = Label(_("OK"))
                self["canceltext"] = Label(_("Cancel"))
                self["ok"] = Pixmap()
@@ -43,9 +45,14 @@ class TimerEntry(Screen, ConfigListScreen):
 
        def createConfig(self):
                        justplay = self.timer.justplay
-                               
-                       afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby"}[self.timer.afterEvent]
-                       
+
+                       afterevent = {
+                               AFTEREVENT.NONE: "nothing",
+                               AFTEREVENT.DEEPSTANDBY: "deepstandby",
+                               AFTEREVENT.STANDBY: "standby",
+                               AFTEREVENT.AUTO: "auto"
+                               }[self.timer.afterEvent]
+
                        weekday_table = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
 
                        # calculate default values
@@ -78,23 +85,29 @@ class TimerEntry(Screen, ConfigListScreen):
                        else: # once
                                type = "once"
                                repeated = None
-                               weekday = (int(time.strftime("%w", time.localtime(self.timer.begin))) - 1) % 7
+                               weekday = (int(strftime("%w", localtime(self.timer.begin))) - 1) % 7
                                day[weekday] = 1
-                       
+
                        self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay])
-                       self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby"))], default = afterevent)
+                       self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby")), ("auto", _("auto"))], default = afterevent)
                        self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
-                       self.timerentry_name = ConfigText(default = self.timer.name, fixed_size = False)
-                       self.timerentry_description = ConfigText(default = self.timer.description, fixed_size = False)
+                       self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False)
+                       self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False)
+                       self.timerentry_tags = self.timer.tags + []
+                       self.timerentry_tagsset = ConfigSelection(choices = [len(self.timerentry_tags) == 0 and "None" or " ".join(self.timerentry_tags)])
 
                        self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
 
-                       self.timerentry_startdate = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
+                       self.timerentry_date = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
                        self.timerentry_starttime = ConfigClock(default = self.timer.begin)
-
-                       self.timerentry_enddate = ConfigDateTime(default = self.timer.end, formatstring =  _("%d.%B %Y"), increment = 86400)
                        self.timerentry_endtime = ConfigClock(default = self.timer.end)
 
+                       default = self.timer.dirname or resolveFilename(SCOPE_HDD)
+                       tmp = config.movielist.videodirs.value
+                       if default not in tmp:
+                               tmp.append(default)
+                       self.timerentry_dirname = ConfigSelection(default = default, choices = tmp)
+
                        self.timerentry_repeatedbegindate = ConfigDateTime(default = self.timer.repeatedbegindate, formatstring = _("%d.%B %Y"), increment = 86400)
 
                        self.timerentry_weekday = ConfigSelection(default = weekday_table[weekday], choices = [("mon",_("Monday")), ("tue", _("Tuesday")), ("wed",_("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])
@@ -109,20 +122,8 @@ class TimerEntry(Screen, ConfigListScreen):
                                servicename = str(self.timer.service_ref.getServiceName())
                        except:
                                pass
+                       self.timerentry_service_ref = self.timer.service_ref
                        self.timerentry_service = ConfigSelection([servicename])
-                       
-                       self.timerentry_startdate.addNotifier(self.checkDate)
-                       self.timerentry_enddate.addNotifier(self.checkDate)
-
-       def checkDate(self, configElement):
-               if configElement is self.timerentry_startdate:
-                       if self.timerentry_enddate.value < self.timerentry_startdate.value:
-                               self.timerentry_enddate.value = self.timerentry_startdate.value
-                               self["config"].invalidate(self.entryEndDate)
-               if configElement is self.timerentry_enddate:
-                       if (self.timerentry_enddate.value < self.timerentry_startdate.value):
-                               self.timerentry_startdate.value = self.timerentry_enddate.value
-                               self["config"].invalidate(self.entryStartDate)
 
        def createSetup(self, widget):
                self.list = []
@@ -136,7 +137,7 @@ class TimerEntry(Screen, ConfigListScreen):
                if self.timerentry_type.value == "once":
                        self.frequencyEntry = None
                else: # repeated
-                       self.frequencyEntry = getConfigListEntry(_("Frequency"), self.timerentry_repeated)
+                       self.frequencyEntry = getConfigListEntry(_("Repeats"), self.timerentry_repeated)
                        self.list.append(self.frequencyEntry)
                        self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate)
                        self.list.append(self.repeatedbegindateEntry)
@@ -156,31 +157,24 @@ class TimerEntry(Screen, ConfigListScreen):
                                self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
                                self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
 
-                       #self.list.append(getConfigListEntry("StartDate", self.timerentry_startdate))
-#              self.list.append(getConfigListEntry("Weekday", self.timerentry_weekday))
-
-               self.entryStartDate = getConfigListEntry(_("Start"), self.timerentry_startdate)
-               if self.timerentry_type.value == "once":
-                       self.list.append(self.entryStartDate)
-                       self.list.append(getConfigListEntry(" ", self.timerentry_starttime))
-               else:
-                       self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
-
-               self.entryEndDate = getConfigListEntry(_("End"), self.timerentry_enddate)
+               self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date)
                if self.timerentry_type.value == "once":
-                       if self.timerentry_justplay.value != "zap":
-                               self.list.append(self.entryEndDate)
-                               self.list.append(getConfigListEntry(" ", self.timerentry_endtime))
-               else:
-                       if self.timerentry_justplay.value != "zap":
-                               self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
-
+                       self.list.append(self.entryDate)
+               self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
                if self.timerentry_justplay.value != "zap":
-                       self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
-
+                       self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
                self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
                self.list.append(self.channelEntry)
 
+               self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
+               self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset)
+               if self.timerentry_justplay.value != "zap":
+                       if config.usage.setup_level.index >= 2: # expert+
+                               self.list.append(self.dirname)
+                       if getPreferredTagEditor():
+                               self.list.append(self.tagsSet)
+                       self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
+
                self[widget].list = self.list
                self[widget].l.setList(self.list)
 
@@ -194,49 +188,64 @@ class TimerEntry(Screen, ConfigListScreen):
                        self.createSetup("config")
 
        def keyLeft(self):
-               if self["config"].getCurrent() is self.channelEntry:
+               if self["config"].getCurrent() in [self.channelEntry, self.tagsSet]:
                        self.keySelect()
                else:
                        ConfigListScreen.keyLeft(self)
                        self.newConfig()
 
        def keyRight(self):
-               if self["config"].getCurrent() is self.channelEntry:
+               if self["config"].getCurrent() in [self.channelEntry, self.tagsSet]:
                        self.keySelect()
                else:
                        ConfigListScreen.keyRight(self)
                        self.newConfig()
-               
+
        def keySelect(self):
-               if self["config"].getCurrent() == self.channelEntry:
-                       self.session.openWithCallback(self.finishedChannelSelection, ChannelSelection.SimpleChannelSelection, _("Select channel to record from"))
+               cur = self["config"].getCurrent()
+               if cur == self.channelEntry:
+                       self.session.openWithCallback(
+                               self.finishedChannelSelection,
+                               ChannelSelection.SimpleChannelSelection,
+                               _("Select channel to record from")
+                       )
+               elif config.usage.setup_level.index >= 2 and cur == self.dirname:
+                       self.session.openWithCallback(
+                               self.pathSelected,
+                               MovieLocationBox,
+                               _("Choose target folder"),
+                               self.timerentry_dirname.value,
+                               minFree = 100 # We require at least 100MB free space
+                       )
+               elif getPreferredTagEditor() and cur == self.tagsSet:
+                       self.session.openWithCallback(
+                               self.tagEditFinished,
+                               getPreferredTagEditor(),
+                               self.timerentry_tags
+                       )
                else:
                        self.keyGo()
 
        def finishedChannelSelection(self, *args):
                if len(args):
-                       self.timer.service_ref = ServiceReference(args[0])
-                       self.timerentry_service.setCurrentText(self.timer.service_ref.getServiceName())
+                       self.timerentry_service_ref = ServiceReference(args[0])
+                       self.timerentry_service.setCurrentText(self.timerentry_service_ref.getServiceName())
                        self["config"].invalidate(self.channelEntry)
 
        def getTimestamp(self, date, mytime):
-               d = time.localtime(date)
-               dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
-               return int(time.mktime(dt.timetuple()))
+               d = localtime(date)
+               dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
+               return int(mktime(dt.timetuple()))
 
        def getBeginEnd(self):
-               enddate = self.timerentry_enddate.value
+               date = self.timerentry_date.value
                endtime = self.timerentry_endtime.value
-               
-               startdate = self.timerentry_startdate.value
                starttime = self.timerentry_starttime.value
-               
-               begin = self.getTimestamp(startdate, starttime)
-               end = self.getTimestamp(enddate, endtime)
-               
-               # because of the dateChecks, startdate can't be < enddate.
-               # however, the endtime can be less than the starttime.
-               # in this case, add 1 day.
+
+               begin = self.getTimestamp(date, starttime)
+               end = self.getTimestamp(date, endtime)
+
+               # if the endtime is less than the starttime, add 1 day.
                if end < begin:
                        end += 86400
                return begin, end
@@ -246,31 +255,46 @@ class TimerEntry(Screen, ConfigListScreen):
                self.timer.description = self.timerentry_description.value
                self.timer.justplay = self.timerentry_justplay.value == "zap"
                self.timer.resetRepeated()
-               self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value]
-               
+               self.timer.afterEvent = {
+                       "nothing": AFTEREVENT.NONE,
+                       "deepstandby": AFTEREVENT.DEEPSTANDBY,
+                       "standby": AFTEREVENT.STANDBY,
+                       "auto": AFTEREVENT.AUTO
+                       }[self.timerentry_afterevent.value]
+               self.timer.service_ref = self.timerentry_service_ref
+               self.timer.tags = self.timerentry_tags
+
+               self.timer.dirname = self.timerentry_dirname.value
+               config.movielist.last_timer_videodir.value = self.timer.dirname
+               config.movielist.last_timer_videodir.save()
+
                if self.timerentry_type.value == "once":
                        self.timer.begin, self.timer.end = self.getBeginEnd()
                if self.timerentry_type.value == "repeated":
-                       self.timer.repeatedbegindate = self.timerentry_repeatedbegindate.value
                        if self.timerentry_repeated.value == "daily":
                                for x in range(0,7):
                                        self.timer.setRepeated(x)
 
                        if self.timerentry_repeated.value == "weekly":
                                self.timer.setRepeated(self.timerentry_weekday.index)
-                               
+
                        if self.timerentry_repeated.value == "weekdays":
                                for x in range(0,5):
                                        self.timer.setRepeated(x)
-                               
+
                        if self.timerentry_repeated.value == "user":
                                for x in range(0,7):
                                        if self.timerentry_day[x].value:
                                                self.timer.setRepeated(x)
 
-                       self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
-                       self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
-                       
+                       self.timer.repeatedbegindate = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
+                       if self.timer.repeated:
+                               self.timer.begin = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
+                               self.timer.end = self.getTimestamp(self.timerentry_repeatedbegindate.value, self.timerentry_endtime.value)
+                       else:
+                               self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
+                               self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
+
                        # when a timer end is set before the start, add 1 day
                        if self.timer.end < self.timer.begin:
                                self.timer.end += 86400
@@ -291,32 +315,50 @@ class TimerEntry(Screen, ConfigListScreen):
                                                tlist.append((i.getName(), i))
                                        self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
                                        return
+
+               self.saveTimer()
                self.close((True, self.timer))
 
        def subserviceSelected(self, service):
                if not service is None:
                        self.timer.service_ref = ServiceReference(service[1])
+               self.saveTimer()
                self.close((True, self.timer))
 
+       def saveTimer(self):
+               self.session.nav.RecordTimer.saveTimer()
+
        def keyCancel(self):
                self.close((False,))
-               
+
+       def pathSelected(self, res):
+               if res is not None:
+                       if config.movielist.videodirs.value != self.timerentry_dirname.choices:
+                               self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
+                       self.timerentry_dirname.value = res
+
+       def tagEditFinished(self, ret):
+               if ret is not None:
+                       self.timerentry_tags = ret
+                       self.timerentry_tagsset.setChoices([len(ret) == 0 and "None" or " ".join(ret)])
+                       self["config"].invalidate(self.tagsSet)
+
 class TimerLog(Screen):
        def __init__(self, session, timer):
                Screen.__init__(self, session)
                self.timer = timer;
                self.log_entries = self.timer.log_entries[:]
-               
+
                self.fillLogList()
-               
+
                self["loglist"] = MenuList(self.list)
                self["logentry"] = Label()
-               
+
                self["key_red"] = Button(_("Delete entry"))
                self["key_green"] = Button()
                self["key_yellow"] = Button("")
                self["key_blue"] = Button(_("Clear log"))
-               
+
                self.onShown.append(self.updateText)
 
                self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
@@ -332,7 +374,10 @@ class TimerLog(Screen):
                }, -1)
 
        def deleteEntry(self):
-               self.log_entries.remove(self["loglist"].getCurrent()[1])
+               cur = self["loglist"].getCurrent()
+               if cur is None:
+                       return 
+               self.log_entries.remove(cur[1])
                self.fillLogList()
                self["loglist"].l.setList(self.list)
                self.updateText()
@@ -340,25 +385,25 @@ class TimerLog(Screen):
        def fillLogList(self):
                self.list = [ ]
                for x in self.log_entries:
-                       self.list.append((str(time.strftime("%Y-%m-%d %H-%M", time.localtime(x[0])) + " - " + x[2]), x))
-       
-       def clearLog(self):             
+                       self.list.append((str(strftime("%Y-%m-%d %H-%M", localtime(x[0])) + " - " + x[2]), x))
+
+       def clearLog(self):
                self.log_entries = []
                self.fillLogList()
                self["loglist"].l.setList(self.list)
                self.updateText()
-               
+
        def keyClose(self):
                if self.timer.log_entries != self.log_entries:
                        self.timer.log_entries = self.log_entries
                        self.close((True, self.timer))
                else:
                        self.close((False,))
-               
+
        def up(self):
                self["loglist"].instance.moveSelection(self["loglist"].instance.moveUp)
                self.updateText()
-               
+
        def down(self):
                self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
                self.updateText()
@@ -366,7 +411,7 @@ class TimerLog(Screen):
        def left(self):
                self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
                self.updateText()
-               
+
        def right(self):
                self["loglist"].instance.moveSelection(self["loglist"].instance.pageDown)
                self.updateText()