Fix Mediaplayer crash for WAV playback and add basic Audio CD support (needs kernel...
[enigma2.git] / RecordTimer.py
index 0f4256813aaa052c5a30542da1489eef0fa57d70..147a38fc6510660b340719e9d5fa2c74d6a6d407 100644 (file)
@@ -91,7 +91,7 @@ class RecordTimerEntry(timer.TimerEntry, object):
                        Notifications.AddNotification(Screens.Standby.TryQuitMainloop, 1, onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop)
 #################################################################
 
-       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)
 
@@ -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')
@@ -502,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
@@ -583,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()