X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/bc937acb188ea59ced7d67ceaa91f2598db39ab9..f3078c3363b29cdb8ccf05cbb251392966137977:/RecordTimer.py diff --git a/RecordTimer.py b/RecordTimer.py index 63ddaab0..397ff8a7 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 @@ -79,7 +79,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,7 +88,7 @@ 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): @@ -115,20 +115,16 @@ class RecordTimerEntry(timer.TimerEntry, object): self.justplay = justplay self.afterEvent = afterEvent self.dirname = dirname - + self.dirnameHadToFallback = False + self.autoincrease = False + self.log_entries = [] self.resetState() def log(self, code, msg): self.log_entries.append((int(time.time()), code, msg)) print "[TIMER]", msg - - def resetState(self): - self.state = self.StateWaiting - self.cancelled = False - self.first_try_prepare = True - self.timeChanged() - + def calculateFilename(self): service_name = self.service_ref.getServiceName() begin_date = time.strftime("%Y%m%d %H%M", time.localtime(self.begin)) @@ -142,7 +138,11 @@ class RecordTimerEntry(timer.TimerEntry, object): if self.name: filename += " - " + self.name - self.Filename = Directories.getRecordingFilename(filename, self.dirname) + if self.dirname and not Directories.pathExists(self.dirname): + self.dirnameHadToFallback = True + self.Filename = Directories.getRecordingFilename(filename, None) + else: + self.Filename = Directories.getRecordingFilename(filename, self.dirname) self.log(0, "Filename calculated as: '%s'" % self.Filename) #begin_date + " - " + service_name + description) @@ -272,9 +272,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) @@ -329,8 +329,12 @@ class RecordTimerEntry(timer.TimerEntry, object): # that in our state, with also keeping the possibility to re-try. # TODO: this has to be done. elif event == iRecordableService.evStart: + text = _("A record has been started:\n%s") % self.name + if self.dirnameHadToFallback: + text = '\n'.join([text, _("Please note that the previously selected media could not be accessed and therefore the default directory is being used instead.")]) + # maybe this should be configurable? - Notifications.AddPopup(text = _("A record has been started:\n%s") % self.name, type = MessageBox.TYPE_INFO, timeout = 3) + Notifications.AddPopup(text = text, type = MessageBox.TYPE_INFO, timeout = 3) # we have record_service as property to automatically subscribe to record service events def setRecordService(self, service): @@ -361,11 +365,10 @@ def createTimer(xml): else: eit = None if xml.hasAttribute("location") and xml.getAttribute("location") != "None": - location = str(xml.getAttribute("location")).encode("utf-8") + location = xml.getAttribute("location").encode("utf-8") else: location = 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) @@ -416,8 +419,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() @@ -519,12 +530,24 @@ class RecordTimer(timer.Timer): return timer.begin return -1 - def record(self, entry): + 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