2 from Screens.Screen import Screen
3 from Components.ConfigList import ConfigListScreen
4 from Screens.ChannelSelection import SimpleChannelSelection
5 from Screens.MessageBox import MessageBox
6 from Screens.ChoiceBox import ChoiceBox
9 from Screens.Setup import SetupSummary
12 from Components.ActionMap import ActionMap
13 from Components.Button import Button
16 from Components.config import getConfigListEntry, ConfigEnableDisable, \
17 ConfigYesNo, ConfigText, ConfigClock, ConfigInteger, ConfigSelection
20 from RecordTimer import AFTEREVENT
22 # Needed to convert our timestamp back and forth
23 from time import localtime, mktime
25 # Show ServiceName instead of ServiceReference
26 from ServiceReference import ServiceReference
31 ("2", _("Wednesday")),
36 ("weekend", _("Weekend")),
37 ("weekday", _("Weekday"))
40 class SimpleBouquetSelection(SimpleChannelSelection):
41 def __init__(self, session, title):
42 SimpleChannelSelection.__init__(self, session, title)
43 self.skinName = "SimpleChannelSelection"
45 def channelSelected(self): # just return selected service
46 ref = self.getCurrentSelection()
47 if (ref.flags & 7) == 7:
50 # We return the currently active path here
51 # Asking the user if this is what he wants might be better though
52 self.close(self.servicePath[-1])
54 class AutoTimerEditor(Screen, ConfigListScreen):
57 skin = """<screen name="AutoTimerEdit" title="Edit AutoTimer" position="75,155" size="565,280">
58 <widget name="config" position="5,5" size="555,225" scrollbarMode="showOnDemand" />
59 <ePixmap position="0,235" zPosition="4" size="140,40" pixmap="skin_default/key-red.png" transparent="1" alphatest="on" />
60 <ePixmap position="140,235" zPosition="4" size="140,40" pixmap="skin_default/key-green.png" transparent="1" alphatest="on" />
61 <ePixmap position="280,235" zPosition="4" size="140,40" pixmap="skin_default/key-yellow.png" transparent="1" alphatest="on" />
62 <ePixmap position="420,235" zPosition="4" size="140,40" pixmap="skin_default/key-blue.png" transparent="1" alphatest="on" />
63 <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" />
64 <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" />
65 <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" />
66 <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" />
69 def __init__(self, session, timer):
70 Screen.__init__(self, session)
76 self.setup_title = "AutoTimer Editor"
77 self.onChangedEntry = []
79 # See if we are filtering some strings
81 timer.getExcludedTitle(),
82 timer.getExcludedShort(),
83 timer.getExcludedDescription(),
84 timer.getExcludedDays()
87 timer.getIncludedTitle(),
88 timer.getIncludedShort(),
89 timer.getIncludedDescription(),
90 timer.getIncludedDays()
92 if len(self.excludes[0]) or len(self.excludes[1]) \
93 or len(self.excludes[2]) or len(self.excludes[3]) \
94 or len(self.includes[0]) or len(self.includes[1]) \
95 or len(self.includes[2]) or len(self.includes[3]):
98 self.filterSet = False
100 # See if services are restricted
101 self.services = timer.getServices()
102 self.bouquets = timer.getBouquets()
103 if len(self.services) or len(self.bouquets):
104 self.serviceRestriction = True
106 self.serviceRestriction = False
108 self.createSetup(timer)
110 # We might need to change shown items, so add some notifiers
111 self.timespan.addNotifier(self.reloadList, initial_call = False)
112 self.offset.addNotifier(self.reloadList, initial_call = False)
113 self.duration.addNotifier(self.reloadList, initial_call = False)
114 self.afterevent.addNotifier(self.reloadList, initial_call = False)
115 self.afterevent_timespan.addNotifier(self.reloadList, initial_call = False)
116 self.counter.addNotifier(self.reloadList, initial_call = False)
120 ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changed)
123 self["key_red"] = Button(_("Cancel"))
124 self["key_green"] = Button(_("OK"))
125 self["key_yellow"] = Button()
126 self["key_blue"] = Button()
129 self.renameServiceButton()
130 self.renameFilterButton()
133 self["actions"] = ActionMap(["SetupActions", "ColorActions"],
135 "cancel": self.cancel,
136 "save": self.maybeSave,
137 "yellow": self.editFilter,
138 "blue": self.editServices
145 def renameFilterButton(self):
147 self["key_yellow"].setText(_("Edit Filters"))
149 self["key_yellow"].setText(_("Add Filters"))
151 def renameServiceButton(self):
152 if self.serviceRestriction:
153 self["key_blue"].setText(_("Edit Services"))
155 self["key_blue"].setText(_("Add Services"))
158 for x in self.onChangedEntry:
164 def getCurrentEntry(self):
165 return self["config"].getCurrent()[0]
167 def getCurrentValue(self):
168 return str(self["config"].getCurrent()[1].getText())
170 def createSummary(self):
173 def createSetup(self, timer):
175 self.name = ConfigText(default = timer.name, fixed_size = False)
178 self.match = ConfigText(default = timer.match, fixed_size = False)
181 self.justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[int(timer.justplay)])
184 now = [x for x in localtime()]
185 if timer.hasTimespan():
187 now[3] = timer.timespan[0][0]
188 now[4] = timer.timespan[0][1]
190 now[3] = timer.timespan[1][0]
191 now[4] = timer.timespan[1][1]
201 self.timespan = ConfigEnableDisable(default = default)
202 self.timespanbegin = ConfigClock(default = begin)
203 self.timespanend = ConfigClock(default = end)
205 # Services have their own Screen
208 if timer.hasOffset():
210 begin = timer.getOffsetBegin()
211 end = timer.getOffsetEnd()
216 self.offset = ConfigEnableDisable(default = default)
217 self.offsetbegin = ConfigInteger(default = begin, limits = (0, 180))
218 self.offsetend = ConfigInteger(default = end, limits = (0, 180))
221 if timer.hasAfterEvent():
222 afterevent = { None: "default", AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby"}[timer.afterevent[0][0]]
224 afterevent = "default"
225 self.afterevent = ConfigSelection(choices = [("default", _("standard")), ("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby"))], default = afterevent)
227 # AfterEvent (Timespan)
228 if timer.hasAfterEvent() and timer.afterevent[0][1][0] is not None:
230 now[3] = timer.afterevent[0][1][0][0]
231 now[4] = timer.afterevent[0][1][0][1]
233 now[3] = timer.afterevent[0][1][1][0]
234 now[4] = timer.afterevent[0][1][1][1]
244 self.afterevent_timespan = ConfigEnableDisable(default = default)
245 self.afterevent_timespanbegin = ConfigClock(default = begin)
246 self.afterevent_timespanend = ConfigClock(default = end)
249 self.enabled = ConfigYesNo(default = timer.enabled)
252 if timer.hasDuration():
254 duration = timer.getDuration()
258 self.duration = ConfigEnableDisable(default = default)
259 self.durationlength = ConfigInteger(default = duration, limits = (0, 600))
262 if timer.hasCounter():
263 default = timer.matchCount
266 self.counter = ConfigInteger(default = default, limits = (0, 50))
267 self.counterLeft = ConfigInteger(default = timer.matchLeft, limits = (0, 50))
268 selection = [("", _("Never")), ("%m", _("Monthly")), ("%U", _("Weekly (Sunday)")), ("%W", _("Weekly (Monday)"))]
269 if timer.getCounterFormatString() not in ["", "%m", "%U", "%W"]:
270 selection.append((timer.getCounterFormatString(), _("Custom (%s)") % (timer.getCounterFormatString())))
271 self.counterFormatString = ConfigSelection(selection, default = timer.getCounterFormatString())
273 # Avoid Duplicate Description
274 self.avoidDuplicateDescription = ConfigEnableDisable(default = timer.getAvoidDuplicateDescription())
277 # First four entries are always shown
279 getConfigListEntry(_("Enabled"), self.enabled),
280 getConfigListEntry(_("Description"), self.name),
281 getConfigListEntry(_("Match Title"), self.match),
282 getConfigListEntry(_("Timer Type"), self.justplay),
283 getConfigListEntry(_("Only match during Timespan"), self.timespan)
286 # Only allow editing timespan when it's enabled
287 if self.timespan.value:
289 getConfigListEntry(_("Begin of Timespan"), self.timespanbegin),
290 getConfigListEntry(_("End of Timespan"), self.timespanend)
293 self.list.append(getConfigListEntry(_("Custom offset"), self.offset))
295 # Only allow editing offsets when it's enabled
296 if self.offset.value:
298 getConfigListEntry(_("Offset before recording (in m)"), self.offsetbegin),
299 getConfigListEntry(_("Offset after recording (in m)"), self.offsetend)
302 self.list.append(getConfigListEntry(_("Set maximum Duration"), self.duration))
304 # Only allow editing maxduration when it's enabled
305 if self.duration.value:
307 getConfigListEntry(_("Maximum Duration (in m)"), self.durationlength)
310 self.list.append(getConfigListEntry(_("After event"), self.afterevent))
312 # Only allow setting afterevent timespan when afterevent is active
313 if self.afterevent.value != "default":
314 self.list.append(getConfigListEntry(_("Execute after Event during Timespan"), self.afterevent_timespan))
316 # Only allow editing timespan when it's enabled
317 if self.afterevent_timespan.value:
319 getConfigListEntry(_("Begin of after Event Timespan"), self.afterevent_timespanbegin),
320 getConfigListEntry(_("End of after Event Timespan"), self.afterevent_timespanend)
323 self.list.append(getConfigListEntry(_("Record a maximum of x times"), self.counter))
325 # Only allow setting matchLeft when counting hits
326 if self.counter.value:
327 self.list.append(getConfigListEntry(_("Ammount of recordings left"), self.counterLeft))
328 self.list.append(getConfigListEntry(_("Reset Count"), self.counterFormatString))
330 self.list.append(getConfigListEntry(_("Require Description to be unique"), self.avoidDuplicateDescription))
332 def reloadList(self, value):
334 self["config"].setList(self.list)
336 def editFilter(self):
337 self.session.openWithCallback(
338 self.editFilterCallback,
339 AutoTimerFilterEditor,
345 def editFilterCallback(self, ret):
347 self.filterSet = ret[0]
348 self.excludes = ret[1]
349 self.includes = ret[2]
350 self.renameFilterButton()
352 def editServices(self):
353 self.session.openWithCallback(
354 self.editServicesCallback,
355 AutoTimerServiceEditor,
356 self.serviceRestriction,
361 def editServicesCallback(self, ret):
363 self.serviceRestriction = ret[0]
364 self.services = ret[1][0]
365 self.bouquets = ret[1][1]
366 self.renameServiceButton()
369 if self["config"].isChanged():
370 self.session.openWithCallback(
373 _("Really close without saving settings?")
378 def cancelConfirm(self, ret):
383 # Check if we have a trailing whitespace
384 if self.match.value[-1:] == " ":
385 self.session.openWithCallback(
388 _('You entered "%s" as Text to match.\nDo you want to remove trailing whitespaces?') % (self.match.value)
394 def saveCallback(self, ret):
397 self.match.value = self.match.value.rstrip()
399 # Don't to anything if MessageBox was canceled!
403 self.timer.match = self.match.value
406 self.timer.name = self.name.value or self.timer.match
409 self.timer.enabled = self.enabled.value
412 self.timer.justplay = self.justplay.value == "zap"
415 if self.timespan.value:
416 start = self.timespanbegin.value
417 end = self.timespanend.value
418 self.timer.timespan = (start, end)
420 self.timer.timespan = None
423 if self.serviceRestriction:
424 self.timer.services = self.services
425 self.timer.bouquets = self.bouquets
427 self.timer.services = None
428 self.timer.bouquets = None
431 if self.offset.value:
432 self.timer.offset = (self.offsetbegin.value*60, self.offsetend.value*60)
434 self.timer.offset = None
437 if self.afterevent.value == "default":
438 self.timer.afterevent = []
440 afterevent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.afterevent.value]
441 # AfterEvent Timespan
442 if self.afterevent_timespan.value:
443 start = self.afterevent_timespanbegin.value
444 end = self.afterevent_timespanend.value
445 self.timer.afterevent = [(afterevent, (start, end))]
447 self.timer.afterevent = [(afterevent, None)]
450 if self.duration.value:
451 self.timer.maxduration = self.durationlength.value*60
453 self.timer.maxduration = None
457 self.timer.exclude = self.excludes
458 self.timer.include = self.includes
460 self.timer.exclude = None
461 self.timer.include = None
464 if self.counter.value:
465 self.timer.matchCount = self.counter.value
466 if self.counterLeft.value <= self.counter.value:
467 self.timer.matchLeft = self.counterLeft.value
469 self.timer.matchLeft = self.counter.value
470 if self.counterFormatString.value:
471 self.timer.matchFormatString = self.counterFormatString.value
473 self.timer.matchFormatString = ''
475 self.timer.matchCount = 0
476 self.timer.matchLeft = 0
477 self.timer.matchFormatString = ''
479 self.timer.avoidDuplicateDescription = self.avoidDuplicateDescription.value
482 self.close(self.timer)
484 class AutoTimerFilterEditor(Screen, ConfigListScreen):
485 """Edit AutoTimer Filter"""
487 skin = """<screen name="AutoFilterEditor" title="Edit AutoTimer Filters" position="75,150" size="565,245">
488 <widget name="config" position="5,5" size="555,200" scrollbarMode="showOnDemand" />
489 <ePixmap position="5,205" zPosition="4" size="140,40" pixmap="skin_default/key-red.png" transparent="1" alphatest="on" />
490 <ePixmap position="145,205" zPosition="4" size="140,40" pixmap="skin_default/key-green.png" transparent="1" alphatest="on" />
491 <ePixmap position="285,205" zPosition="4" size="140,40" pixmap="skin_default/key-yellow.png" transparent="1" alphatest="on" />
492 <ePixmap position="425,205" zPosition="4" size="140,40" pixmap="skin_default/key-blue.png" transparent="1" alphatest="on" />
493 <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" />
494 <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" />
495 <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" />
496 <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" />
499 def __init__(self, session, filterset, excludes, includes):
500 Screen.__init__(self, session)
503 self.setup_title = "AutoTimer Filters"
504 self.onChangedEntry = []
506 self.typeSelection = ConfigSelection(choices = [("title", _("in Title")), ("short", _("in Shortdescription")), ("desc", _("in Description")), ("day", _("on Weekday"))])
507 self.typeSelection.addNotifier(self.refresh, initial_call = False)
509 self.enabled = ConfigEnableDisable(default = filterset)
511 self.excludes = excludes
512 self.includes = includes
516 ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changed)
519 self["key_red"] = Button(_("Cancel"))
520 self["key_green"] = Button(_("Save"))
521 self["key_yellow"] = Button(_("delete"))
522 self["key_blue"] = Button(_("New"))
525 self["actions"] = ActionMap(["SetupActions", "ColorActions"],
527 "cancel": self.cancel,
529 "yellow": self.remove,
538 for x in self.onChangedEntry:
544 def getCurrentEntry(self):
545 return self["config"].getCurrent()[0]
547 def getCurrentValue(self):
548 return str(self["config"].getCurrent()[1].getText())
550 def createSummary(self):
553 def saveCurrent(self):
554 del self.excludes[self.idx][:]
555 del self.includes[self.idx][:]
557 # Warning, accessing a ConfigListEntry directly might be considered evil!
560 for item in self["config"].getList():
562 # Skip empty entries (and those which are no filters)
563 if item[1].value == "" or idx < 2:
565 elif idx < self.lenExcludes:
566 self.excludes[self.idx].append(item[1].value.encode("UTF-8"))
568 self.includes[self.idx].append(item[1].value.encode("UTF-8"))
570 def refresh(self, value):
574 self["config"].setList(self.list)
576 def reloadList(self):
578 getConfigListEntry(_("Enable Filtering"), self.enabled),
579 getConfigListEntry(_("Filter"), self.typeSelection)
582 if self.typeSelection.value == "day":
585 # Weekdays are presented as ConfigSelection
587 getConfigListEntry(_("Exclude"), ConfigSelection(choices = weekdays, default = x))
588 for x in self.excludes[3]
590 self.lenExcludes = len(self.list)
592 getConfigListEntry(_("Include"), ConfigSelection(choices = weekdays, default = x))
593 for x in self.includes[3]
596 elif self.typeSelection.value == "title":
598 elif self.typeSelection.value == "short":
600 else: # self.typeSelection.value == "desc":
604 getConfigListEntry(_("Exclude"), ConfigText(default = x, fixed_size = False))
605 for x in self.excludes[self.idx]
607 self.lenExcludes = len(self.list)
609 getConfigListEntry(_("Include"), ConfigText(default = x, fixed_size = False))
610 for x in self.includes[self.idx]
614 idx = self["config"].getCurrentIndex()
616 if idx < self.lenExcludes:
617 self.lenExcludes -= 1
619 list = self["config"].getList()
620 list.remove(self["config"].getCurrent())
621 self["config"].setList(list)
624 self.session.openWithCallback(
627 _("Select type of Filter"),
634 def typeSelected(self, ret):
636 list = self["config"].getList()
639 pos = self.lenExcludes
640 self.lenExcludes += 1
646 if self.typeSelection.value == "day":
647 entry = getConfigListEntry(text, ConfigSelection(choices = weekdays))
649 entry = getConfigListEntry(text, ConfigText(fixed_size = False))
651 list.insert(pos, entry)
652 self["config"].setList(list)
655 if self["config"].isChanged():
656 self.session.openWithCallback(
659 _("Really close without saving settings?")
664 def cancelConfirm(self, ret):
677 class AutoTimerServiceEditor(Screen, ConfigListScreen):
678 """Edit allowed Services of a AutoTimer"""
680 skin = """<screen name="AutoTimerServiceEditor" title="Edit AutoTimer Services" position="75,150" size="565,245">
681 <widget name="config" position="5,5" size="555,200" scrollbarMode="showOnDemand" />
682 <ePixmap position="5,205" zPosition="4" size="140,40" pixmap="skin_default/key-red.png" transparent="1" alphatest="on" />
683 <ePixmap position="145,205" zPosition="4" size="140,40" pixmap="skin_default/key-green.png" transparent="1" alphatest="on" />
684 <ePixmap position="285,205" zPosition="4" size="140,40" pixmap="skin_default/key-yellow.png" transparent="1" alphatest="on" />
685 <ePixmap position="425,205" zPosition="4" size="140,40" pixmap="skin_default/key-blue.png" transparent="1" alphatest="on" />
686 <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" />
687 <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" />
688 <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" />
689 <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" />
692 def __init__(self, session, servicerestriction, servicelist, bouquetlist):
693 Screen.__init__(self, session)
696 self.setup_title = "AutoTimer Services"
697 self.onChangedEntry = []
704 self.enabled = ConfigEnableDisable(default = servicerestriction)
705 self.typeSelection = ConfigSelection(choices = [("channels", _("Channels")), ("bouquets", _("Bouquets"))])
706 self.typeSelection.addNotifier(self.refresh, initial_call = False)
710 ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changed)
713 self["key_red"] = Button(_("Cancel"))
714 self["key_green"] = Button(_("OK"))
715 self["key_yellow"] = Button(_("delete"))
716 self["key_blue"] = Button(_("New"))
719 self["actions"] = ActionMap(["SetupActions", "ColorActions"],
721 "cancel": self.cancel,
723 "yellow": self.remove,
732 def saveCurrent(self):
733 del self.services[self.idx][:]
735 # Warning, accessing a ConfigListEntry directly might be considered evil!
737 myl = self["config"].getList()
741 self.services[self.idx].append(item[1].value)
743 def refresh(self, value):
747 self["config"].setList(self.list)
749 def reloadList(self):
751 getConfigListEntry(_("Enable Service Restriction"), self.enabled),
752 getConfigListEntry(_("Editing"), self.typeSelection)
755 if self.typeSelection.value == "channels":
757 else: # self.typeSelection.value == "bouquets":
761 getConfigListEntry(_("Record on"), ConfigSelection(choices = [(str(x), ServiceReference(str(x)).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''))]))
762 for x in self.services[self.idx]
766 for x in self.onChangedEntry:
772 def getCurrentEntry(self):
773 return self["config"].getCurrent()[0]
775 def getCurrentValue(self):
776 return str(self["config"].getCurrent()[1].getText())
778 def createSummary(self):
782 if self["config"].getCurrentIndex() != 0:
783 list = self["config"].getList()
784 list.remove(self["config"].getCurrent())
785 self["config"].setList(list)
788 if self.typeSelection.value == "channels":
789 self.session.openWithCallback(
790 self.finishedServiceSelection,
791 SimpleChannelSelection,
792 _("Select channel to record on")
794 else: # self.typeSelection.value == "bouquets":
795 self.session.openWithCallback(
796 self.finishedServiceSelection,
797 SimpleBouquetSelection,
798 _("Select bouquet to record on")
801 def finishedServiceSelection(self, *args):
803 list = self["config"].getList()
804 sname = args[0].toString()
806 if self.typeSelection.value == "channels":
807 # strip all after last : when adding a channel
808 pos = sname.rfind(':')
810 sname = sname[:pos+1]
812 list.append(getConfigListEntry(_("Record on"), ConfigSelection(choices = [(sname, ServiceReference(args[0]).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''))])))
813 self["config"].setList(list)
816 if self["config"].isChanged():
817 self.session.openWithCallback(
820 _("Really close without saving settings?")
825 def cancelConfirm(self, ret):
837 def addAutotimerFromEvent(session, evt = None, service = None):
838 from AutoTimerComponent import AutoTimerComponent
840 name = evt and evt.getEventName() or "New AutoTimer"
841 match = evt and evt.getEventName() or ""
843 if service is not None:
844 service = str(service)
845 # strip all after last :
846 pos = service.rfind(':')
848 service = service[:pos+1]
850 servicelist.append(service)
852 begin = evt.getBeginTime()
853 end = begin + evt.getDuration()
854 timetuple = (begin-3600, end+3600) # timespan defaults to +- 1h
858 session.openWithCallback(
862 self.autotimer.getUniqueId(), # Id
866 timespan = timetuple,
867 services = servicelist
871 def addCallback(ret):
873 from plugin import autotimer
875 # Create instance if needed
876 if autotimer is None:
877 from AutoTimer import AutoTimer
878 autotimer = AutoTimer()
882 # Remove instance if not running in background
883 if not config.plugins.autotimer.autopoll.value: