check for presence of a correspondant .srt subtitle file and try parsing it
[enigma2.git] / RecordTimer.py
index 5200e096a2dc18028b0ad9c78eb32275f0eb5af4..f93872cd69c19c9e02bdad2ae3d3830c02d00097 100644 (file)
@@ -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,10 +88,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):
+       def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.NONE, checkOldTimers = False, dirname = None):
                timer.TimerEntry.__init__(self, int(begin), int(end))
 
                if checkOldTimers == True:
@@ -114,6 +114,8 @@ class RecordTimerEntry(timer.TimerEntry, object):
                self.start_prepare = 0
                self.justplay = justplay
                self.afterEvent = afterEvent
+               self.dirname = dirname
+               self.dirnameHadToFallback = False
                
                self.log_entries = []
                self.resetState()
@@ -121,13 +123,7 @@ class RecordTimerEntry(timer.TimerEntry, object):
        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))
@@ -141,7 +137,11 @@ class RecordTimerEntry(timer.TimerEntry, object):
                if self.name:
                        filename += " - " + self.name
 
-               self.Filename = Directories.getRecordingFilename(filename)
+               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)
 
@@ -271,9 +271,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)
@@ -328,8 +328,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):
@@ -359,10 +363,14 @@ def createTimer(xml):
                eit = long(xml.getAttribute("eit"))
        else:
                eit = None
-       
+       if xml.hasAttribute("location") and xml.getAttribute("location") != "None":
+               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)
+       entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent, dirname = location)
        entry.repeated = int(repeated)
        
        for l in elementsWithTag(xml.childNodes, "log"):
@@ -393,8 +401,22 @@ class RecordTimer(timer.Timer):
        
        def loadTimer(self):
                # TODO: PATH!
-               doc = xml.dom.minidom.parse(self.Filename)
-               
+               try:
+                       doc = xml.dom.minidom.parse(self.Filename)
+               except xml.parsers.expat.ExpatError:
+                       from Tools.Notifications import AddPopup
+                       from Screens.MessageBox import MessageBox
+
+                       AddPopup(_("The timer file (timers.xml) is corrupt and could not be loaded."), type = MessageBox.TYPE_ERROR, timeout = 0, id = "TimerLoadFailed")
+
+                       print "timers.xml failed to load!"
+                       try:
+                               import os
+                               os.rename(self.Filename, self.Filename + "_old")
+                       except IOError:
+                               print "renaming broken timer failed"
+                       return
+
                root = doc.childNodes[0]
                for timer in elementsWithTag(root.childNodes, "timer"):
                        self.record(createTimer(timer))
@@ -459,6 +481,8 @@ class RecordTimer(timer.Timer):
                        list.append(' afterevent="' + str(stringToXML({ AFTEREVENT.NONE: "nothing", AFTEREVENT.STANDBY: "standby", AFTEREVENT.DEEPSTANDBY: "deepstandby" }[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)) + '"')
                        list.append(' disabled="' + str(int(timer.disabled)) + '"')
                        list.append(' justplay="' + str(int(timer.justplay)) + '"')
                        list.append('>\n')
@@ -482,27 +506,19 @@ class RecordTimer(timer.Timer):
                file.close()
 
        def getNextZapTime(self):
-               llen = len(self.timer_list)
-               idx = 0
                now = time.time()
-               while idx < llen:
-                       timer = self.timer_list[idx]
+               for timer in self.timer_list:
                        if not timer.justplay or timer.begin < now:
-                               idx += 1
-                       else:
-                               return timer.begin
+                               continue
+                       return timer.begin
                return -1
 
        def getNextRecordingTime(self):
-               llen = len(self.timer_list)
-               idx = 0
                now = time.time()
-               while idx < llen:
-                       timer = self.timer_list[idx]
+               for timer in self.timer_list:
                        if timer.justplay or timer.begin < now:
-                               idx += 1
-                       else:
-                               return timer.begin
+                               continue
+                       return timer.begin
                return -1
 
        def record(self, entry):
@@ -510,6 +526,7 @@ class RecordTimer(timer.Timer):
                print "[Timer] Record " + str(entry)
                entry.Timer = self
                self.addTimerEntry(entry)
+               self.saveTimer()
                
        def isInTimer(self, eventid, begin, duration, service):
                time_match = 0
@@ -591,6 +608,7 @@ class RecordTimer(timer.Timer):
                print "in running: ", entry in self.timer_list
                # now the timer should be in the processed_timers list. remove it from there.
                self.processed_timers.remove(entry)
+               self.saveTimer()
 
        def shutdown(self):
                self.saveTimer()