AutoTimer: add "Fast Scan" support
[vuplus_dvbapp-plugin] / autotimer / src / AutoTimerEditor.py
index 758b9ad..0d623de 100644 (file)
@@ -15,7 +15,7 @@ from Screens.Setup import SetupSummary
 
 # GUI (Components)
 from Components.ActionMap import ActionMap
-from Components.Button import Button
+from Components.Sources.StaticText import StaticText
 
 # Configuration
 from Components.config import getConfigListEntry, ConfigEnableDisable, \
@@ -180,6 +180,9 @@ class AutoTimerEditorBase:
                self.searchType = NoSave(ConfigSelection(choices = [("partial", _("partial match")), ("exact", _("exact match"))], default = timer.searchType))
                self.searchCase = NoSave(ConfigSelection(choices = [("sensitive", _("case-sensitive search")), ("insensitive", _("case-insensitive search"))], default = timer.searchCase))
 
+               # Alternatives override
+               self.overrideAlternatives = NoSave(ConfigYesNo(default = timer.overrideAlternatives))
+
                # Justplay
                self.justplay = NoSave(ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[int(timer.justplay)]))
 
@@ -347,16 +350,18 @@ class AutoTimerEditorBase:
 class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
        """Edit AutoTimer"""
 
-       skin = """<screen name="AutoTimerEdit" title="Edit AutoTimer" position="75,155" size="565,280">
-               <widget name="config" position="5,5" size="555,225" scrollbarMode="showOnDemand" />
-               <ePixmap position="0,235" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
-               <ePixmap position="140,235" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
-               <ePixmap position="280,235" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
-               <ePixmap position="420,235" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
-               <widget name="key_red" position="0,235" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_green" position="140,235" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_yellow" position="280,235" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_blue" position="420,235" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+       skin = """<screen name="AutoTimerEditor" title="Edit AutoTimer" position="center,center" size="565,350">
+               <ePixmap position="0,5" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
+               <ePixmap position="140,5" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
+               <ePixmap position="280,5" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
+               <ePixmap position="420,5" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
+               <widget source="key_red" render="Label" position="0,5" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_green" render="Label" position="140,5" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_yellow" render="Label" position="280,5" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_blue" render="Label" position="420,5" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget name="config" position="5,50" size="555,225" scrollbarMode="showOnDemand" />
+               <ePixmap pixmap="skin_default/div-h.png" position="0,275" zPosition="1" size="565,2" />
+               <widget source="help" render="Label" position="5,280" size="555,63" font="Regular;21" />
        </screen>"""
 
        def __init__(self, session, timer, editingDefaults = False):
@@ -378,14 +383,19 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
                self.useDestination.addNotifier(self.reloadList, initial_call = False)
 
                self.refresh()
+               self.initHelpTexts()
 
-               ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changed)
+               # XXX: no help for numericaltextinput since it is shown on top of our help
+               ConfigListScreen.__init__(self, self.list, on_change = self.changed)
+               self["config"].onSelectionChanged.append(self.updateHelp)
 
                # Initialize Buttons
-               self["key_red"] = Button(_("Cancel"))
-               self["key_green"] = Button(_("OK"))
-               self["key_yellow"] = Button()
-               self["key_blue"] = Button()
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("OK"))
+               self["key_yellow"] = StaticText()
+               self["key_blue"] = StaticText()
+
+               self["help"] = StaticText()
 
                # Set Button texts
                self.renameServiceButton()
@@ -412,15 +422,20 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
 
        def renameFilterButton(self):
                if self.filterSet:
-                       self["key_yellow"].setText(_("Edit Filters"))
+                       self["key_yellow"].text = _("edit filters")
                else:
-                       self["key_yellow"].setText(_("Add Filters"))
+                       self["key_yellow"].text = _("add filters")
 
        def renameServiceButton(self):
                if self.serviceRestriction:
-                       self["key_blue"].setText(_("Edit Services"))
+                       self["key_blue"].text = _("edit services")
                else:
-                       self["key_blue"].setText(_("Add Services"))
+                       self["key_blue"].text = _("add services")
+
+       def updateHelp(self):
+               cur = self["config"].getCurrent()
+               if cur:
+                       self["help"].text = self.helpDict[cur[1]]
 
        def changed(self):
                for x in self.onChangedEntry:
@@ -438,6 +453,37 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
        def createSummary(self):
                return SetupSummary
 
+       def initHelpTexts(self):
+               self.helpDict = {
+                       self.enabled: _("Set this NO to disable this AutoTimer."),
+                       self.name: _("This is a name you can give the AutoTimer. It will be shown in the Overview and the Preview."),
+                       self.match: _("This is what will be looked for in event titles. Note that looking for e.g. german umlauts can be tricky as you have to know the encoding the channel uses."),
+                       self.encoding: _("Encoding the channel uses for it's EPG data. You only need to change this if you're searching for special characters like the german umlauts."),
+                       self.searchType: _("Select \"exact match\" to enforce \"Match title\" to match exactly or \"partial match\" if you only want to search for a part of the event title."),
+                       self.searchCase: _("Select whether or not you want to enforce case correctness."),
+                       self.justplay: _("Add zap timer instead of record timer?"),
+                       self.overrideAlternatives: _("With this option enabled the channel to record on can be changed to a alternative service it is restricted to."),
+                       self.timespan: _("Should this AutoTimer be restricted to a timespan?"),
+                       self.timespanbegin: _("Lower bound of timespan. Nothing before this time will be matched. Offsets are not taken into account!"),
+                       self.timespanend: _("Upper bound of timespan. Nothing after this time will be matched. Offsets are not taken into account!"),
+                       self.offset: _("Change default recording offset?"),
+                       self.offsetbegin: _("Time in minutes to prepend to recording."),
+                       self.offsetend: _("Time in minutes to append to recording."),
+                       self.duration: _("Should this AutoTimer only match up to a certain event duration?"),
+                       self.durationlength: _("Maximum event duration to match. If an event is longer than this ammount of time (without offset) it won't be matched."),
+                       self.afterevent: _("Power state to change to after recordings. Select \"standard\" to not change the default behavior of enigma2 or values changed by yourself."),
+                       self.afterevent_timespan: _("Restrict \"after event\" to a certain timespan?"),
+                       self.afterevent_timespanbegin: _("Lower bound of timespan."),
+                       self.afterevent_timespanend: _("Upper bound of timespan."),
+                       self.counter: _("With this option you can restrict the AutoTimer to a certain ammount of scheduled recordings. Set this to 0 to disable this functionality."),
+                       self.counterLeft: _("Number of scheduled recordings left."),
+                       self.counterFormatString: _("The counter can automatically be reset to the limit at certain intervals."),
+                       self.avoidDuplicateDescription: _("When this option is enabled the AutoTimer won't match events where another timer with the same description already exists in the timer list."),
+                       self.useDestination: _("Should timers created by this AutoTimer be recorded to a custom location?"),
+                       self.destination: _("Select the location to save the recording to."),
+                       self.tags: _("Tags the Timer/Recording will have."),
+               }
+
        def refresh(self):
                # First three entries are only showed when not editing defaults
                list = []
@@ -445,22 +491,23 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
                        list.extend((
                                getConfigListEntry(_("Enabled"), self.enabled),
                                getConfigListEntry(_("Description"), self.name),
-                               getConfigListEntry(_("Match Title"), self.match),
+                               getConfigListEntry(_("Match title"), self.match),
                        ))
 
                list.extend((
-                       getConfigListEntry(_("EPG Encoding"), self.encoding),
-                       getConfigListEntry(_("Search Type"), self.searchType),
+                       getConfigListEntry(_("EPG encoding"), self.encoding),
+                       getConfigListEntry(_("Search type"), self.searchType),
                        getConfigListEntry(_("Search strictness"), self.searchCase),
-                       getConfigListEntry(_("Timer Type"), self.justplay),
-                       getConfigListEntry(_("Only match during Timespan"), self.timespan)
+                       getConfigListEntry(_("Timer type"), self.justplay),
+                       getConfigListEntry(_("Override found with alternative service"), self.overrideAlternatives),
+                       getConfigListEntry(_("Only match during timespan"), self.timespan)
                ))
 
                # Only allow editing timespan when it's enabled
                if self.timespan.value:
                        list.extend((
-                               getConfigListEntry(_("Begin of Timespan"), self.timespanbegin),
-                               getConfigListEntry(_("End of Timespan"), self.timespanend)
+                               getConfigListEntry(_("Begin of timespan"), self.timespanbegin),
+                               getConfigListEntry(_("End of timespan"), self.timespanend)
                        ))
 
                list.append(getConfigListEntry(_("Custom offset"), self.offset))
@@ -472,23 +519,23 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
                                getConfigListEntry(_("Offset after recording (in m)"), self.offsetend)
                        ))
 
-               list.append(getConfigListEntry(_("Set maximum Duration"), self.duration))
+               list.append(getConfigListEntry(_("Set maximum duration"), self.duration))
 
                # Only allow editing maxduration when it's enabled
                if self.duration.value:
-                       list.append(getConfigListEntry(_("Maximum Duration (in m)"), self.durationlength))
+                       list.append(getConfigListEntry(_("Maximum duration (in m)"), self.durationlength))
 
                list.append(getConfigListEntry(_("After event"), self.afterevent))
 
                # Only allow setting afterevent timespan when afterevent is active
                if self.afterevent.value != "default":
-                       list.append(getConfigListEntry(_("Execute after Event during Timespan"), self.afterevent_timespan))
+                       list.append(getConfigListEntry(_("Execute \"after event\" during timespan"), self.afterevent_timespan))
 
                        # Only allow editing timespan when it's enabled
                        if self.afterevent_timespan.value:
                                list.extend((
-                                       getConfigListEntry(_("Begin of after Event Timespan"), self.afterevent_timespanbegin),
-                                       getConfigListEntry(_("End of after Event Timespan"), self.afterevent_timespanend)
+                                       getConfigListEntry(_("Begin of \"after event\" timespan"), self.afterevent_timespanbegin),
+                                       getConfigListEntry(_("End of \"after event\" timespan"), self.afterevent_timespanend)
                                ))
 
                list.append(getConfigListEntry(_("Record a maximum of x times"), self.counter))
@@ -497,14 +544,14 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
                if self.counter.value:
                        if not self.editingDefaults:
                                list.append(getConfigListEntry(_("Ammount of recordings left"), self.counterLeft))
-                       list.append(getConfigListEntry(_("Reset Count"), self.counterFormatString))
+                       list.append(getConfigListEntry(_("Reset count"), self.counterFormatString))
 
-               list.append(getConfigListEntry(_("Require Description to be unique"), self.avoidDuplicateDescription))
+               list.append(getConfigListEntry(_("Require description to be unique"), self.avoidDuplicateDescription))
 
                # We always add this option though its expert only in enigma2
                list.append(getConfigListEntry(_("Use a custom location"), self.useDestination))
                if self.useDestination.value:
-                       list.append(getConfigListEntry(_("Custom Location"), self.destination))
+                       list.append(getConfigListEntry(_("Custom location"), self.destination))
 
                list.append(getConfigListEntry(_("Tags"), self.tags))
 
@@ -546,6 +593,22 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
                        self.bouquets = ret[1][1]
                        self.renameServiceButton()
 
+       def keyLeft(self):
+               cur = self["config"].getCurrent()
+               cur = cur and cur[1]
+               if cur == self.tags:
+                       self.chooseTags()
+               else:
+                       ConfigListScreen.keyLeft(self)
+
+       def keyRight(self):
+               cur = self["config"].getCurrent()
+               cur = cur and cur[1]
+               if cur == self.tags:
+                       self.chooseTags()
+               else:
+                       ConfigListScreen.keyRight(self)
+
        def ok(self):
                cur = self["config"].getCurrent()
                cur = cur and cur[1]
@@ -614,6 +677,9 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
                self.timer.searchType = self.searchType.value
                self.timer.searchCase = self.searchCase.value
 
+               # Alternatives
+               self.timer.overrideAlternatives = self.overrideAlternatives.value
+
                # Enabled
                self.timer.enabled = self.enabled.value
 
@@ -705,16 +771,16 @@ class AutoTimerEditor(Screen, ConfigListScreen, AutoTimerEditorBase):
 class AutoTimerFilterEditor(Screen, ConfigListScreen):
        """Edit AutoTimer Filter"""
 
-       skin = """<screen name="AutoFilterEditor" title="Edit AutoTimer Filters" position="75,150" size="565,245">
-               <widget name="config" position="5,5" size="555,200" scrollbarMode="showOnDemand" />
-               <ePixmap position="5,205" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
-               <ePixmap position="145,205" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
-               <ePixmap position="285,205" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
-               <ePixmap position="425,205" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
-               <widget name="key_red" position="5,205" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_green" position="145,205" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_yellow" position="285,205" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_blue" position="425,205" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+       skin = """<screen name="AutoTimerFilterEditor" title="Edit AutoTimer Filters" position="center,center" size="565,280">
+               <ePixmap position="0,0" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
+               <ePixmap position="140,0" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
+               <ePixmap position="280,0" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
+               <ePixmap position="420,0" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
+               <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget name="config" position="5,45" size="555,225" scrollbarMode="showOnDemand" />
        </screen>"""
 
        def __init__(self, session, filterset, excludes, includes):
@@ -742,10 +808,10 @@ class AutoTimerFilterEditor(Screen, ConfigListScreen):
                ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changed)
 
                # Initialize Buttons
-               self["key_red"] = Button(_("Cancel"))
-               self["key_green"] = Button(_("Save"))
-               self["key_yellow"] = Button(_("delete"))
-               self["key_blue"] = Button(_("New"))
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("Save"))
+               self["key_yellow"] = StaticText(_("delete"))
+               self["key_blue"] = StaticText(_("New"))
 
                # Define Actions
                self["actions"] = ActionMap(["SetupActions", "ColorActions"],
@@ -763,7 +829,7 @@ class AutoTimerFilterEditor(Screen, ConfigListScreen):
                self.onLayoutFinish.append(self.setCustomTitle)
 
        def setCustomTitle(self):
-               self.setTitle(_("Edit AutoTimer Filters"))
+               self.setTitle(_("Edit AutoTimer filters"))
 
 
        def changed(self):
@@ -909,16 +975,16 @@ class AutoTimerFilterEditor(Screen, ConfigListScreen):
 class AutoTimerServiceEditor(Screen, ConfigListScreen):
        """Edit allowed Services of a AutoTimer"""
 
-       skin = """<screen name="AutoTimerServiceEditor" title="Edit AutoTimer Services" position="75,150" size="565,245">
-               <widget name="config" position="5,5" size="555,200" scrollbarMode="showOnDemand" />
-               <ePixmap position="5,205" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
-               <ePixmap position="145,205" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
-               <ePixmap position="285,205" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
-               <ePixmap position="425,205" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
-               <widget name="key_red" position="5,205" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_green" position="145,205" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_yellow" position="285,205" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               <widget name="key_blue" position="425,205" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+       skin = """<screen name="AutoTimerServiceEditor" title="Edit AutoTimer Services" position="center,center" size="565,280">
+               <ePixmap position="0,0" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
+               <ePixmap position="140,0" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
+               <ePixmap position="280,0" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
+               <ePixmap position="420,0" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
+               <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               <widget name="config" position="5,45" size="555,225" scrollbarMode="showOnDemand" />
        </screen>"""
 
        def __init__(self, session, servicerestriction, servicelist, bouquetlist):
@@ -945,10 +1011,10 @@ class AutoTimerServiceEditor(Screen, ConfigListScreen):
                ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changed)
 
                # Initialize Buttons
-               self["key_red"] = Button(_("Cancel"))
-               self["key_green"] = Button(_("OK"))
-               self["key_yellow"] = Button(_("delete"))
-               self["key_blue"] = Button(_("New"))
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("OK"))
+               self["key_yellow"] = StaticText(_("delete"))
+               self["key_blue"] = StaticText(_("New"))
 
                # Define Actions
                self["actions"] = ActionMap(["SetupActions", "ColorActions"],
@@ -966,7 +1032,7 @@ class AutoTimerServiceEditor(Screen, ConfigListScreen):
                self.onLayoutFinish.append(self.setCustomTitle)
 
        def setCustomTitle(self):
-               self.setTitle(_("Edit AutoTimer Services"))
+               self.setTitle(_("Edit AutoTimer services"))
 
        def saveCurrent(self):
                del self.services[self.idx][:]
@@ -1042,10 +1108,12 @@ class AutoTimerServiceEditor(Screen, ConfigListScreen):
                        list = self["config"].getList()
                        sname = args[0].toString()
 
-                       if self.typeSelection.value == "channels":
-                               # strip all after last : when adding a channel
+                       if self.typeSelection.value == "channels" and not (args[0].flags & eServiceReference.isGroup):
+                               # strip all after last : when adding a (non alternative) channel
                                pos = sname.rfind(':')
                                if pos != -1:
+                                       if sname[pos-1] == ':':
+                                               pos -= 1
                                        sname = sname[:pos+1]
 
                        list.append(getConfigListEntry(_("Record on"), NoSave(ConfigSelection(choices = [(sname, ServiceReference(args[0]).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''))]))))
@@ -1073,8 +1141,39 @@ class AutoTimerServiceEditor(Screen, ConfigListScreen):
                        self.services
                ))
 
+def addAutotimerFromSearchString(session, match):
+       from AutoTimerComponent import preferredAutoTimerComponent
+       from AutoTimerImporter import AutoTimerImporter
+       from plugin import autotimer
+
+       # Create instance if needed
+       if autotimer is None:
+               from AutoTimer import AutoTimer
+               autotimer = AutoTimer()
+               autotimer.readXml()
+
+       session.openWithCallback(
+               importerCallback,
+               AutoTimerImporter,
+               preferredAutoTimerComponent(
+                       autotimer.getUniqueId(),
+                       match,
+                       '',             # Match
+                       True    # Enabled
+               ),
+               match,          # Proposed Match
+               None,           # Proposed Begin
+               None,           # Proposed End
+               None,           # Proposed Disabled
+               None,           # Proposed ServiceReference
+               None,           # Proposed afterEvent
+               None,           # Proposed justplay
+               None,           # Proposed dirname, can we get anything useful here?
+               []                      # Proposed tags
+       )
+
 def addAutotimerFromEvent(session, evt = None, service = None):
-       from AutoTimerComponent import AutoTimerComponent
+       from AutoTimerComponent import preferredAutoTimerComponent
        from AutoTimerImporter import AutoTimerImporter
        from plugin import autotimer
 
@@ -1089,12 +1188,16 @@ def addAutotimerFromEvent(session, evt = None, service = None):
        sref = None
        if service is not None:
                service = str(service)
-               # strip all after last :
-               pos = service.rfind(':')
-               if pos != -1:
-                       service = service[:pos+1]
-
-               sref = ServiceReference(service)
+               myref = eServiceReference(service)
+               if not (myref.flags & eServiceReference.isGroup):
+                       # strip all after last :
+                       pos = service.rfind(':')
+                       if pos != -1:
+                               if service[pos-1] == ':':
+                                       pos -= 1
+                               service = service[:pos+1]
+
+               sref = ServiceReference(myref)
        if evt:
                # timespan defaults to +- 1h
                begin = evt.getBeginTime()-3600
@@ -1107,7 +1210,7 @@ def addAutotimerFromEvent(session, evt = None, service = None):
        session.openWithCallback(
                importerCallback,
                AutoTimerImporter,
-               AutoTimerComponent(
+               preferredAutoTimerComponent(
                        autotimer.getUniqueId(),
                        name,
                        '',             # Match
@@ -1125,7 +1228,7 @@ def addAutotimerFromEvent(session, evt = None, service = None):
        )
 
 def addAutotimerFromService(session, service = None):
-       from AutoTimerComponent import AutoTimerComponent
+       from AutoTimerComponent import preferredAutoTimerComponent
        from AutoTimerImporter import AutoTimerImporter
        from plugin import autotimer
 
@@ -1145,6 +1248,8 @@ def addAutotimerFromService(session, service = None):
                # strip all after last :
                pos = sref.rfind(':')
                if pos != -1:
+                       if sref[pos-1] == ':':
+                               pos -= 1
                        sref = sref[:pos+1]
 
                sref = ServiceReference(sref)
@@ -1167,7 +1272,7 @@ def addAutotimerFromService(session, service = None):
        session.openWithCallback(
                importerCallback,
                AutoTimerImporter,
-               AutoTimerComponent(
+               preferredAutoTimerComponent(
                        autotimer.getUniqueId(),
                        name,
                        '',             # Match