X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=RecordTimer.py;h=cac475d6ddda5682517e9875ace039110d79800c;hp=147a38fc6510660b340719e9d5fa2c74d6a6d407;hb=a9f7393e1d00eb89b8282aae0ddc4f6da33d9ca1;hpb=04f4636324ab06c5a3a4f618100048e159eaf6f9 diff --git a/RecordTimer.py b/RecordTimer.py index 147a38f..cac475d 100644 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -10,7 +10,7 @@ from enigma import eEPGCache, getBestPlayableServiceReference, \ eServiceReference, iRecordableService, quitMainloop from Screens.MessageBox import MessageBox - +from Components.TimerSanityCheck import TimerSanityCheck import NavigationInstance import Screens.Standby @@ -47,6 +47,7 @@ class AFTEREVENT: NONE = 0 STANDBY = 1 DEEPSTANDBY = 2 + AUTO = 3 # please do not translate log messages class RecordTimerEntry(timer.TimerEntry, object): @@ -79,7 +80,7 @@ class RecordTimerEntry(timer.TimerEntry, object): RecordTimerEntry.receiveRecordEvents = False @staticmethod - def TryQuitMainloop(): + def TryQuitMainloop(default_yes = True): if not RecordTimerEntry.receiveRecordEvents: print "RecordTimer.TryQuitMainloop" NavigationInstance.instance.record_event.append(RecordTimerEntry.staticGotRecordEvent) @@ -88,10 +89,10 @@ class RecordTimerEntry(timer.TimerEntry, object): # other timers start in a few seconds RecordTimerEntry.staticGotRecordEvent(None, iRecordableService.evEnd) # send normal notification for the case the user leave the standby now.. - Notifications.AddNotification(Screens.Standby.TryQuitMainloop, 1, onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop) + Notifications.AddNotification(Screens.Standby.TryQuitMainloop, 1, onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop, default_yes = default_yes) ################################################################# - def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.NONE, checkOldTimers = False, dirname = None): + def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.AUTO, checkOldTimers = False, dirname = None, tags = None): timer.TimerEntry.__init__(self, int(begin), int(end)) if checkOldTimers == True: @@ -116,7 +117,9 @@ class RecordTimerEntry(timer.TimerEntry, object): self.afterEvent = afterEvent self.dirname = dirname self.dirnameHadToFallback = False - + self.autoincrease = False + self.tags = tags or [] + self.log_entries = [] self.resetState() @@ -191,6 +194,7 @@ class RecordTimerEntry(timer.TimerEntry, object): f.write(self.name + "\n") f.write(self.description + "\n") f.write(str(self.begin) + "\n") + f.write(' '.join(self.tags)) f.close() except IOError: self.log(4, "failed to write meta information") @@ -271,9 +275,9 @@ class RecordTimerEntry(timer.TimerEntry, object): if self.afterEvent == AFTEREVENT.STANDBY: if not Screens.Standby.inStandby: # not already in standby Notifications.AddNotificationWithCallback(self.sendStandbyNotification, MessageBox, _("A finished record timer wants to set your\nDreambox to standby. Do that now?"), timeout = 20) - if self.afterEvent == AFTEREVENT.DEEPSTANDBY: + elif self.afterEvent == AFTEREVENT.DEEPSTANDBY: if not Screens.Standby.inTryQuitMainloop: # not a shutdown messagebox is open - if Screens.Standby.inStandby: # not in standby + if Screens.Standby.inStandby: # in standby RecordTimerEntry.TryQuitMainloop() # start shutdown handling without screen else: Notifications.AddNotificationWithCallback(self.sendTryQuitMainloopNotification, MessageBox, _("A finished record timer wants to shut down\nyour Dreambox. Shutdown now?"), timeout = 20) @@ -358,7 +362,12 @@ def createTimer(xml): disabled = long(xml.getAttribute("disabled") or "0") justplay = long(xml.getAttribute("justplay") or "0") afterevent = str(xml.getAttribute("afterevent") or "nothing") - afterevent = { "nothing": AFTEREVENT.NONE, "standby": AFTEREVENT.STANDBY, "deepstandby": AFTEREVENT.DEEPSTANDBY }[afterevent] + afterevent = { + "nothing": AFTEREVENT.NONE, + "standby": AFTEREVENT.STANDBY, + "deepstandby": AFTEREVENT.DEEPSTANDBY, + "auto": AFTEREVENT.AUTO + }[afterevent] if xml.hasAttribute("eit") and xml.getAttribute("eit") != "None": eit = long(xml.getAttribute("eit")) else: @@ -367,10 +376,14 @@ def createTimer(xml): location = xml.getAttribute("location").encode("utf-8") else: location = None + if xml.hasAttribute("tags") and xml.getAttribute("tags"): + tags = xml.getAttribute("tags").encode("utf-8").split(' ') + else: + tags = None name = xml.getAttribute("name").encode("utf-8") #filename = xml.getAttribute("filename").encode("utf-8") - entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent, dirname = location) + entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent, dirname = location, tags = tags) entry.repeated = int(repeated) for l in elementsWithTag(xml.childNodes, "log"): @@ -418,8 +431,16 @@ class RecordTimer(timer.Timer): return root = doc.childNodes[0] + + # put out a message when at least one timer overlaps + checkit = True for timer in elementsWithTag(root.childNodes, "timer"): - self.record(createTimer(timer)) + newTimer = createTimer(timer) + if (self.record(newTimer, True, True) is not None) and (checkit == True): + from Tools.Notifications import AddPopup + from Screens.MessageBox import MessageBox + AddPopup(_("Timer overlap in timers.xml detected!\nPlease recheck it!"), type = MessageBox.TYPE_ERROR, timeout = 0, id = "TimerLoadFailed") + checkit = False # at moment it is enough when the message is displayed one time def saveTimer(self): #doc = xml.dom.minidom.Document() @@ -478,11 +499,18 @@ class RecordTimer(timer.Timer): list.append(' repeated="' + str(int(timer.repeated)) + '"') list.append(' name="' + str(stringToXML(timer.name)) + '"') list.append(' description="' + str(stringToXML(timer.description)) + '"') - list.append(' afterevent="' + str(stringToXML({ AFTEREVENT.NONE: "nothing", AFTEREVENT.STANDBY: "standby", AFTEREVENT.DEEPSTANDBY: "deepstandby" }[timer.afterEvent])) + '"') + list.append(' afterevent="' + str(stringToXML({ + AFTEREVENT.NONE: "nothing", + AFTEREVENT.STANDBY: "standby", + AFTEREVENT.DEEPSTANDBY: "deepstandby", + AFTEREVENT.AUTO: "auto" + }[timer.afterEvent])) + '"') if timer.eit is not None: list.append(' eit="' + str(timer.eit) + '"') if timer.dirname is not None: list.append(' location="' + str(stringToXML(timer.dirname)) + '"') + if timer.tags is not None: + list.append(' tags="' + str(stringToXML(' '.join(timer.tags))) + '"') list.append(' disabled="' + str(int(timer.disabled)) + '"') list.append(' justplay="' + str(int(timer.justplay)) + '"') list.append('>\n') @@ -521,12 +549,36 @@ class RecordTimer(timer.Timer): return timer.begin return -1 - def record(self, entry): + def isNextRecordAfterEventActionAuto(self): + now = time.time() + t = None + for timer in self.timer_list: + if timer.justplay or timer.begin < now: + continue + if t is None or t.begin == timer.begin: + t = timer + if t.afterEvent == AFTEREVENT.AUTO: + return True + return False + + def record(self, entry, ignoreTSC=False, dosave=True): #wird von loadTimer mit dosave=False aufgerufen + timersanitycheck = TimerSanityCheck(self.timer_list,entry) + if not timersanitycheck.check(): + if ignoreTSC != True: + print "timer conflict detected!" + print timersanitycheck.getSimulTimerList() + return timersanitycheck.getSimulTimerList() + else: + print "ignore timer conflict" + elif timersanitycheck.doubleCheck(): + print "ignore double timer" entry.timeChanged() print "[Timer] Record " + str(entry) entry.Timer = self self.addTimerEntry(entry) - self.saveTimer() + if dosave: + self.saveTimer() + return None def isInTimer(self, eventid, begin, duration, service): time_match = 0