Merge remote branch 'origin/bug_530_add_dm800se_support'
[enigma2.git] / lib / python / Screens / TimerEntry.py
index c6779e73831c0869bfdd807f3199aee57dffd7af..9885e700b05c01181448aab09e3b0ee4ba194212 100644 (file)
@@ -1,28 +1,32 @@
 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 Components.SystemInfo import SystemInfo
+from Components.UsageConfig import defaultMoviePath
+from Screens.MovieSelection import getPreferredTagEditor
+from Screens.LocationBox import MovieLocationBox
 from Screens.ChoiceBox import ChoiceBox
+from Screens.MessageBox import MessageBox
 from RecordTimer import AFTEREVENT
-from enigma import eEPGCache
-import time
-import datetime
+from enigma import eEPGCache, eServiceReference
+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()
@@ -30,11 +34,15 @@ class TimerEntry(Screen, ConfigListScreen):
 
                self.createConfig()
 
-               self["actions"] = NumberActionMap(["SetupActions"],
+               self["actions"] = NumberActionMap(["SetupActions", "GlobalActions", "PiPSetupActions"],
                {
                        "ok": self.keySelect,
                        "save": self.keyGo,
                        "cancel": self.keyCancel,
+                       "volumeUp": self.incrementStart,
+                       "volumeDown": self.decrementStart,
+                       "size+": self.incrementEnd,
+                       "size-": self.decrementEnd
                }, -2)
 
                self.list = []
@@ -43,15 +51,20 @@ class TimerEntry(Screen, ConfigListScreen):
 
        def createConfig(self):
                        justplay = self.timer.justplay
-                               
-                       afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby"}[self.timer.afterEvent]
-                       
-                       weekday_table = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
+
+                       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
                        day = []
                        weekday = 0
-                       for x in range(0,7):
+                       for x in (0, 1, 2, 3, 4, 5, 6):
                                day.append(0)
                        if self.timer.repeated: # repeated
                                type = "repeated"
@@ -63,7 +76,7 @@ class TimerEntry(Screen, ConfigListScreen):
                                        flags = self.timer.repeated
                                        repeated = "user"
                                        count = 0
-                                       for x in range(0, 7):
+                                       for x in (0, 1, 2, 3, 4, 5, 6):
                                                if flags == 1: # weekly
                                                        print "Set to weekday " + str(x)
                                                        weekday = x
@@ -78,29 +91,40 @@ 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)
+                       if SystemInfo["DeepstandbySupport"]:
+                               shutdownString = _("go to deep standby")
+                       else:
+                               shutdownString = _("shut down")
+                       self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", shutdownString), ("auto", _("auto"))], default = afterevent)
                        self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
                        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 = [not self.timerentry_tags 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)
+                       self.timerentry_showendtime = ConfigSelection(default = ((self.timer.end - self.timer.begin) > 4), choices = [(True, _("yes")), (False, _("no"))])
+
+                       default = self.timer.dirname or defaultMoviePath()
+                       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"))])
 
                        self.timerentry_day = ConfigSubList()
-                       for x in range(0,7):
+                       for x in (0, 1, 2, 3, 4, 5, 6):
                                self.timerentry_day.append(ConfigYesNo(default = day[x]))
 
                        # FIXME some service-chooser needed here
@@ -109,20 +133,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 +148,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,135 +168,176 @@ 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)
+               self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date)
                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.list.append(self.entryDate)
+               
+               self.entryStartTime = getConfigListEntry(_("StartTime"), self.timerentry_starttime)
+               self.list.append(self.entryStartTime)
+               
+               self.entryShowEndTime = getConfigListEntry(_("Set End Time"), self.timerentry_showendtime)
+               if self.timerentry_justplay.value == "zap":
+                       self.list.append(self.entryShowEndTime)
+               self.entryEndTime = getConfigListEntry(_("EndTime"), self.timerentry_endtime)
+               if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value:
+                       self.list.append(self.entryEndTime)
 
-               self.entryEndDate = getConfigListEntry(_("End"), self.timerentry_enddate)
-               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.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.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
-               self.list.append(self.channelEntry)
-
                self[widget].list = self.list
                self[widget].l.setList(self.list)
 
        def newConfig(self):
                print "newConfig", self["config"].getCurrent()
-               if self["config"].getCurrent() == self.timerTypeEntry:
-                       self.createSetup("config")
-               if self["config"].getCurrent() == self.timerJustplayEntry:
-                       self.createSetup("config")
-               if self["config"].getCurrent() == self.frequencyEntry:
+               if self["config"].getCurrent() in (self.timerTypeEntry, self.timerJustplayEntry, self.frequencyEntry, self.entryShowEndTime):
                        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())
+               if args:
+                       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()))
-
-       def buildRepeatedBegin(self, rep_time, start_time):
-               d = time.localtime(rep_time)
-               dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, start_time[0], start_time[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
 
-       def keyGo(self):
+       def selectChannelSelector(self, *args):
+               self.session.openWithCallback(
+                               self.finishedChannelSelectionCorrection,
+                               ChannelSelection.SimpleChannelSelection,
+                               _("Select channel to record from")
+                       )
+
+       def finishedChannelSelectionCorrection(self, *args):
+               if args:
+                       self.finishedChannelSelection(*args)
+                       self.keyGo()
+
+       def keyGo(self, result = None):
+               if not self.timerentry_service_ref.isRecordable():
+                       self.session.openWithCallback(self.selectChannelSelector, MessageBox, _("You didn't select a channel to record from."), MessageBox.TYPE_ERROR)
+                       return
                self.timer.name = self.timerentry_name.value
                self.timer.description = self.timerentry_description.value
                self.timer.justplay = self.timerentry_justplay.value == "zap"
+               if self.timerentry_justplay.value == "zap":
+                       if not self.timerentry_showendtime.value:
+                               self.timerentry_endtime.value = self.timerentry_starttime.value
                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
+
+               if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
+                       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":
                        if self.timerentry_repeated.value == "daily":
-                               for x in range(0,7):
+                               for x in (0, 1, 2, 3, 4, 5, 6):
                                        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):
+                               for x in (0, 1, 2, 3, 4):
                                        self.timer.setRepeated(x)
-                               
+
                        if self.timerentry_repeated.value == "user":
-                               for x in range(0,7):
+                               for x in (0, 1, 2, 3, 4, 5, 6):
                                        if self.timerentry_day[x].value:
                                                self.timer.setRepeated(x)
 
-                       self.timer.repeatedbegindate = self.buildRepeatedBegin(self.timerentry_repeatedbegindate.value, self.timerentry_starttime.value)
-                       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
 
                if self.timer.eit is not None:
                        event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
-                       if event is not None:
+                       if event:
                                n = event.getNumOfLinkageServices()
-                               if n > 0:
+                               if n > 1:
                                        tlist = []
                                        ref = self.session.nav.getCurrentlyPlayingServiceReference()
                                        parent = self.timer.service_ref.ref
@@ -296,10 +349,30 @@ 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
-
+                               elif n > 0:
+                                       parent = self.timer.service_ref.ref
+                                       self.timer.service_ref = ServiceReference(event.getLinkageService(parent, 0))
                self.saveTimer()
                self.close((True, self.timer))
 
+       def incrementStart(self):
+               self.timerentry_starttime.increment()
+               self["config"].invalidate(self.entryStartTime)
+
+       def decrementStart(self):
+               self.timerentry_starttime.decrement()
+               self["config"].invalidate(self.entryStartTime)
+
+       def incrementEnd(self):
+               if self.entryEndTime is not None:
+                       self.timerentry_endtime.increment()
+                       self["config"].invalidate(self.entryEndTime)
+
+       def decrementEnd(self):
+               if self.entryEndTime is not None:
+                       self.timerentry_endtime.decrement()
+                       self["config"].invalidate(self.entryEndTime)
+
        def subserviceSelected(self, service):
                if not service is None:
                        self.timer.service_ref = ServiceReference(service[1])
@@ -311,23 +384,35 @@ class TimerEntry(Screen, ConfigListScreen):
 
        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([not ret 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"],
@@ -352,27 +437,25 @@ class TimerLog(Screen):
                self.updateText()
 
        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 = [(str(strftime("%Y-%m-%d %H-%M", localtime(x[0])) + " - " + x[2]), x) for x in self.log_entries]
+
+       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()
@@ -380,13 +463,13 @@ 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()
 
        def updateText(self):
-               if len(self.list) > 0:
+               if self.list:
                        self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
                else:
                        self["logentry"].setText("")