X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=autotimer%2Fsrc%2FAutoTimerEditor.py;h=0d623def0b6ec1072564d27325ec1b0ec863eb60;hb=07aa7c4f56ead32aad37b8ff0cc82d91428d2db6;hp=a341167a2af269687295567cede9dc0eff3410b0;hpb=8f0392264a799c0dab6c3ac535d3fca4528fee96;p=vuplus_dvbapp-plugin diff --git a/autotimer/src/AutoTimerEditor.py b/autotimer/src/AutoTimerEditor.py index a341167..0d623de 100644 --- a/autotimer/src/AutoTimerEditor.py +++ b/autotimer/src/AutoTimerEditor.py @@ -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, \ @@ -58,7 +58,7 @@ class ExtendedConfigText(ConfigText): # Workaround some characters currently not "typeable" using NumericalTextInput mapping = self.mapping - if len(mapping): + if mapping: if "&" not in mapping[0]: mapping[0] += "&" if ";" not in mapping[0]: @@ -142,10 +142,10 @@ class AutoTimerEditorBase: timer.getIncludedDescription(), timer.getIncludedDays() ) - if len(excludes[0]) or len(excludes[1]) \ - or len(excludes[2]) or len(excludes[3]) \ - or len(includes[0]) or len(includes[1]) \ - or len(includes[2]) or len(includes[3]): + if excludes[0] or excludes[1] \ + or excludes[2] or excludes[3] \ + or includes[0] or includes[1] \ + or includes[2] or includes[3]: self.filterSet = True else: self.filterSet = False @@ -155,7 +155,7 @@ class AutoTimerEditorBase: # See if services are restricted self.services = timer.services self.bouquets = timer.bouquets - if len(self.services) or len(self.bouquets): + if self.services or self.bouquets: self.serviceRestriction = True else: self.serviceRestriction = False @@ -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 = """ - - - - - - - - - + skin = """ + + + + + + + + + + + """ 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,21 +422,26 @@ 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: try: x() - except: + except Exception: pass def getCurrentEntry(self): @@ -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 = """ - - - - - - - - - + skin = """ + + + + + + + + + """ 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,14 +829,14 @@ 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): for x in self.onChangedEntry: try: x() - except: + except Exception: pass def getCurrentEntry(self): @@ -909,16 +975,16 @@ class AutoTimerFilterEditor(Screen, ConfigListScreen): class AutoTimerServiceEditor(Screen, ConfigListScreen): """Edit allowed Services of a AutoTimer""" - skin = """ - - - - - - - - - + skin = """ + + + + + + + + + """ 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][:] @@ -1005,7 +1071,7 @@ class AutoTimerServiceEditor(Screen, ConfigListScreen): for x in self.onChangedEntry: try: x() - except: + except Exception: pass def getCurrentEntry(self): @@ -1038,14 +1104,16 @@ class AutoTimerServiceEditor(Screen, ConfigListScreen): ) def finishedServiceSelection(self, *args): - if len(args): + if args: 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