Merge commit 'origin/bug_494_disable_automatic_ipkgupdate'
[enigma2.git] / lib / python / Screens / TimerEntry.py
index d11c5c2a766228ce855d851c5bc1269c76f6af87..64fa9f19e69601e2467c9377ae55293f91b281ed 100644 (file)
@@ -1,5 +1,4 @@
 from Screen import Screen
 from Screen import Screen
-from LocationBox import LocationBox
 import ChannelSelection
 from ServiceReference import ServiceReference
 from Components.config import config, ConfigSelection, ConfigText, ConfigSubList, ConfigDateTime, ConfigClock, ConfigYesNo, getConfigListEntry
 import ChannelSelection
 from ServiceReference import ServiceReference
 from Components.config import config, ConfigSelection, ConfigText, ConfigSubList, ConfigDateTime, ConfigClock, ConfigYesNo, getConfigListEntry
@@ -9,60 +8,62 @@ from Components.MenuList import MenuList
 from Components.Button import Button
 from Components.Label import Label
 from Components.Pixmap import Pixmap
 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 RecordTimer import AFTEREVENT
 from enigma import eEPGCache
 from Screens.ChoiceBox import ChoiceBox
 from RecordTimer import AFTEREVENT
 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
 
 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.entryService = None
-               
+
                self["oktext"] = Label(_("OK"))
                self["canceltext"] = Label(_("Cancel"))
                self["oktext"] = Label(_("OK"))
                self["canceltext"] = Label(_("Cancel"))
-               self["locationtext"] = Label(_("Choose Location"))
                self["ok"] = Pixmap()
                self["cancel"] = Pixmap()
                self["ok"] = Pixmap()
                self["cancel"] = Pixmap()
-               self["location"] = Pixmap()
 
                self.createConfig()
 
 
                self.createConfig()
 
-               self["actions"] = NumberActionMap(["SetupActions", "ColorActions"],
+               self["actions"] = NumberActionMap(["SetupActions", "GlobalActions", "PiPSetupActions"],
                {
                        "ok": self.keySelect,
                        "save": self.keyGo,
                        "cancel": self.keyCancel,
                {
                        "ok": self.keySelect,
                        "save": self.keyGo,
                        "cancel": self.keyCancel,
-                       "yellow": self.selectPath,
+                       "volumeUp": self.incrementStart,
+                       "volumeDown": self.decrementStart,
+                       "size+": self.incrementEnd,
+                       "size-": self.decrementEnd
                }, -2)
 
                self.list = []
                ConfigListScreen.__init__(self, self.list, session = session)
                self.createSetup("config")
 
                }, -2)
 
                self.list = []
                ConfigListScreen.__init__(self, self.list, session = session)
                self.createSetup("config")
 
-               self.onLayoutFinish.append(self.handleLocation)
-
-       def handleLocation(self):
-               if config.usage.setup_level.index < 2: # -expert
-                       self["locationtext"].hide()
-                       self["location"].hide()
-
        def createConfig(self):
                        justplay = self.timer.justplay
        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
 
                        # 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"
                                day.append(0)
                        if self.timer.repeated: # repeated
                                type = "repeated"
@@ -74,7 +75,7 @@ class TimerEntry(Screen, ConfigListScreen):
                                        flags = self.timer.repeated
                                        repeated = "user"
                                        count = 0
                                        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
                                                if flags == 1: # weekly
                                                        print "Set to weekday " + str(x)
                                                        weekday = x
@@ -89,31 +90,40 @@ class TimerEntry(Screen, ConfigListScreen):
                        else: # once
                                type = "once"
                                repeated = None
                        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
                                day[weekday] = 1
-                       
+
                        self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay])
                        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_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_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_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_endtime = ConfigClock(default = self.timer.end)
+                       self.timerentry_showendtime = ConfigSelection(default = ((self.timer.end - self.timer.begin) > 4), choices = [(True, _("yes")), (False, _("no"))])
 
 
-                       self.timerentry_dirname = ConfigSelection(choices = [self.timer.dirname or "/hdd/movie/"])
+                       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()
 
                        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
                                self.timerentry_day.append(ConfigYesNo(default = day[x]))
 
                        # FIXME some service-chooser needed here
@@ -124,19 +134,6 @@ class TimerEntry(Screen, ConfigListScreen):
                                pass
                        self.timerentry_service_ref = self.timer.service_ref
                        self.timerentry_service = ConfigSelection([servicename])
                                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 = []
 
        def createSetup(self, widget):
                self.list = []
@@ -150,7 +147,7 @@ class TimerEntry(Screen, ConfigListScreen):
                if self.timerentry_type.value == "once":
                        self.frequencyEntry = None
                else: # repeated
                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)
                        self.list.append(self.frequencyEntry)
                        self.repeatedbegindateEntry = getConfigListEntry(_("Starting on"), self.timerentry_repeatedbegindate)
                        self.list.append(self.repeatedbegindateEntry)
@@ -170,94 +167,99 @@ 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(_("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":
                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+
                if self.timerentry_justplay.value != "zap":
                        if config.usage.setup_level.index >= 2: # expert+
-                               self.list.append(getConfigListEntry(_("Location"), self.timerentry_dirname))
+                               self.list.append(self.dirname)
+                       if getPreferredTagEditor():
+                               self.list.append(self.tagsSet)
                        self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
 
                        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()
                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):
                        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):
                        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()
                        self.keySelect()
                else:
                        ConfigListScreen.keyRight(self)
                        self.newConfig()
-               
+
        def keySelect(self):
        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):
                else:
                        self.keyGo()
 
        def finishedChannelSelection(self, *args):
-               if len(args):
+               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):
                        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):
 
        def getBeginEnd(self):
-               enddate = self.timerentry_enddate.value
+               date = self.timerentry_date.value
                endtime = self.timerentry_endtime.value
                endtime = self.timerentry_endtime.value
-               
-               startdate = self.timerentry_startdate.value
                starttime = self.timerentry_starttime.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
                if end < begin:
                        end += 86400
                return begin, end
@@ -266,48 +268,60 @@ class TimerEntry(Screen, ConfigListScreen):
                self.timer.name = self.timerentry_name.value
                self.timer.description = self.timerentry_description.value
                self.timer.justplay = self.timerentry_justplay.value == "zap"
                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.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.service_ref = self.timerentry_service_ref
+               self.timer.tags = self.timerentry_tags
 
 
-               # TODO: fix that thing with none (this might as well just be ignored)
-               if self.timerentry_dirname.value == "/hdd/movie/":
-                       self.timer.dirname = None
-               else:
+               if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
                        self.timer.dirname = self.timerentry_dirname.value
                        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":
 
                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)
                                        self.timer.setRepeated(x)
 
                        if self.timerentry_repeated.value == "weekly":
                                self.timer.setRepeated(self.timerentry_weekday.index)
-                               
+
                        if self.timerentry_repeated.value == "weekdays":
                        if self.timerentry_repeated.value == "weekdays":
-                               for x in range(0,5):
+                               for x in (0, 1, 2, 3, 4):
                                        self.timer.setRepeated(x)
                                        self.timer.setRepeated(x)
-                               
+
                        if self.timerentry_repeated.value == "user":
                        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)
 
                                        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)
                        # 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()
                                n = event.getNumOfLinkageServices()
-                               if n > 0:
+                               if n > 1:
                                        tlist = []
                                        ref = self.session.nav.getCurrentlyPlayingServiceReference()
                                        parent = self.timer.service_ref.ref
                                        tlist = []
                                        ref = self.session.nav.getCurrentlyPlayingServiceReference()
                                        parent = self.timer.service_ref.ref
@@ -319,10 +333,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
                                                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))
 
                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])
        def subserviceSelected(self, service):
                if not service is None:
                        self.timer.service_ref = ServiceReference(service[1])
@@ -335,40 +369,34 @@ class TimerEntry(Screen, ConfigListScreen):
        def keyCancel(self):
                self.close((False,))
 
        def keyCancel(self):
                self.close((False,))
 
-       def selectPath(self):
-               if config.usage.setup_level.index < 2: #-expert
-                       return
-               self.session.openWithCallback(
-                       self.pathSelected,
-                       LocationBox,
-                       text = _("Choose target folder"),
-                       filename = "",
-                       currDir = None, # TODO: fix FileList to correctly determine mountpoint
-                       minFree = 100
-               )
-
        def pathSelected(self, res):
                if res is not None:
        def pathSelected(self, res):
                if res is not None:
-                       self.timerentry_dirname.choices.append(res)
-                       self.timerentry_dirname.description[res] = res
+                       if config.movielist.videodirs.value != self.timerentry_dirname.choices:
+                               self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
                        self.timerentry_dirname.value = 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[:]
 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.fillLogList()
-               
+
                self["loglist"] = MenuList(self.list)
                self["logentry"] = Label()
                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["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"],
                self.onShown.append(self.updateText)
 
                self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
@@ -393,27 +421,25 @@ class TimerLog(Screen):
                self.updateText()
 
        def fillLogList(self):
                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()
                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 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 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()
        def down(self):
                self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
                self.updateText()
@@ -421,13 +447,13 @@ class TimerLog(Screen):
        def left(self):
                self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
                self.updateText()
        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):
        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("")
                        self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
                else:
                        self["logentry"].setText("")