add timeout for MessageBox screens (just add timeout=<seconds> as argument when creat...
[enigma2.git] / RecordTimer.py
index caedc1ee8d9cd8608989b6a650666d1f82fd07a9..10a601384d046f9f49dc96610107c2a607b83b68 100644 (file)
@@ -7,8 +7,9 @@ from Components.config import config
 import timer
 import xml.dom.minidom
 
+from enigma import quitMainloop, eEPGCache, eEPGCachePtr
+
 from Screens.MessageBox import MessageBox
-from Screens.SubserviceSelection import SubserviceSelection
 import NavigationInstance
 from time import localtime
 
@@ -34,11 +35,23 @@ def parseEvent(ev):
        end += config.recording.margin_after.value[0] * 60
        return (begin, end, name, description, eit)
 
+class AFTEREVENT:
+       NONE = 0
+       STANDBY = 1
+       DEEPSTANDBY = 2
+
 # please do not translate log messages
 class RecordTimerEntry(timer.TimerEntry):
-       def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False):
+       def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.NONE, checkOldTimers = False):
                timer.TimerEntry.__init__(self, int(begin), int(end))
                
+               if checkOldTimers == True:
+                       if self.begin < time.time() - 1209600:
+                               self.begin = int(time.time())
+               
+               if self.end < self.begin:
+                       self.end = self.begin
+               
                assert isinstance(serviceref, ServiceReference)
                
                self.service_ref = serviceref
@@ -51,6 +64,8 @@ class RecordTimerEntry(timer.TimerEntry):
                self.record_service = None
                self.start_prepare = 0
                self.justplay = justplay
+               self.afterEvent = afterEvent
+               self.session = None
                
                self.log_entries = []
                self.resetState()
@@ -61,6 +76,7 @@ class RecordTimerEntry(timer.TimerEntry):
        
        def resetState(self):
                self.state = self.StateWaiting
+               self.cancelled = False
                self.first_try_prepare = True
                self.timeChanged()
        
@@ -99,7 +115,13 @@ class RecordTimerEntry(timer.TimerEntry):
                                        self.log(2, "'prepare' failed: error %d" % prep_res)
                                        self.record_service = None
                                        return False
-       
+
+                               if self.repeated:
+                                       epgcache = eEPGCache.getInstance()
+                                       queryTime=self.begin+(self.end-self.begin)/2
+                                       evt = epgcache.lookupEventTime(self.service_ref.ref, queryTime)
+                                       if evt:
+                                               self.description = evt.getShortDescription()
                                self.log(3, "prepare ok, writing meta information to %s" % self.Filename)
                                try:
                                        f = open(self.Filename + ".ts.meta", "w")
@@ -108,7 +130,7 @@ class RecordTimerEntry(timer.TimerEntry):
                                        f.write(self.description + "\n")
                                        f.write(str(self.begin) + "\n")
                                        f.close()
-                               except:
+                               except IOError:
                                        self.log(4, "failed to write meta information")
                                return True
 
@@ -138,9 +160,10 @@ class RecordTimerEntry(timer.TimerEntry):
                                self.first_try_prepare = False
                                if config.recording.asktozap.value == 0:
                                        self.log(8, "asking user to zap away")
-                                       Notifications.AddNotificationWithCallback(self.failureCB, MessageBox, _("A timer failed to record!\nDisable TV and try again?\n"))
+                                       Notifications.AddNotificationWithCallback(self.failureCB, MessageBox, _("A timer failed to record!\nDisable TV and try again?\n"), timeout=15)
                                else: # zap without asking
                                        self.log(9, "zap without asking")
+                                       Notifications.AddNotification(MessageBox, _("In order to record a timer, the TV was switched to the recording service!\n"), type=MessageBox.TYPE_WARNING, timeout=15)
                                        self.failureCB(True)
 
                        self.do_backoff()
@@ -148,6 +171,10 @@ class RecordTimerEntry(timer.TimerEntry):
                        self.start_prepare = time.time() + self.backoff
                        return False
                elif next_state == self.StateRunning:
+                       # if this timer has been cancelled, just go to "end" state.
+                       if self.cancelled:
+                               return True
+
                        if self.justplay:
                                self.log(11, "zapping")
                                NavigationInstance.instance.playService(self.service_ref.ref)
@@ -166,8 +193,14 @@ class RecordTimerEntry(timer.TimerEntry):
                                return True
                elif next_state == self.StateEnded:
                        self.log(12, "stop recording")
-                       self.record_service.stop()
-                       self.record_service = None
+                       if not self.justplay:
+                               self.record_service.stop()
+                               self.record_service = None
+                       if self.afterEvent == AFTEREVENT.STANDBY:
+                               if self.session is not None:
+                                       self.session.open(Standby, self)
+                       elif self.afterEvent == AFTEREVENT.DEEPSTANDBY:
+                               quitMainloop(1)
                        return True
 
        def getNextActivation(self):
@@ -204,6 +237,8 @@ def createTimer(xml):
        repeated = xml.getAttribute("repeated").encode("utf-8")
        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]
        if xml.hasAttribute("eit") and xml.getAttribute("eit") != "None":
                eit = long(xml.getAttribute("eit"))
        else:
@@ -211,7 +246,7 @@ def createTimer(xml):
        
        name = xml.getAttribute("name").encode("utf-8")
        #filename = xml.getAttribute("filename").encode("utf-8")
-       entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay)
+       entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent)
        entry.repeated = int(repeated)
        
        for l in elementsWithTag(xml.childNodes, "log"):
@@ -236,7 +271,7 @@ class RecordTimer(timer.Timer):
        def isRecording(self):
                isRunning = False
                for timer in self.timer_list:
-                       if timer.isRunning():
+                       if timer.isRunning() and not timer.justplay:
                                isRunning = True
                return isRunning
        
@@ -305,6 +340,7 @@ 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])) + '"')
                        if timer.eit is not None:
                                list.append(' eit="' + str(timer.eit) + '"')
                        list.append(' disabled="' + str(int(timer.disabled)) + '"')
@@ -337,24 +373,29 @@ class RecordTimer(timer.Timer):
                
        def isInTimer(self, eventid, begin, duration, service):
                time_match = 0
+               chktime = None
+               chktimecmp = None
+               chktimecmp_end = None
+               end = begin + duration
                for x in self.timer_list:
                        if str(x.service_ref) == str(service):
                                #if x.eit is not None and x.repeated == 0:
                                #       if x.eit == eventid:
                                #               return duration
                                if x.repeated != 0:
-                                       chktime = localtime(begin)
+                                       if chktime is None:
+                                               chktime = localtime(begin)
+                                               chktimecmp = chktime.tm_wday * 1440 + chktime.tm_hour * 60 + chktime.tm_min
+                                               chktimecmp_end = chktimecmp + (duration / 60)
                                        time = localtime(x.begin)
-                                       chktimecmp = chktime.tm_wday * 1440 + chktime.tm_hour * 60 + chktime.tm_min
                                        for y in range(7):
                                                if x.repeated & (2 ** y):
                                                        timecmp = y * 1440 + time.tm_hour * 60 + time.tm_min
                                                        if timecmp <= chktimecmp < (timecmp + ((x.end - x.begin) / 60)):
                                                                time_match = ((timecmp + ((x.end - x.begin) / 60)) - chktimecmp) * 60
-                                                       elif chktimecmp <= timecmp < (chktimecmp + (duration / 60)):
-                                                               time_match = ((chktimecmp + (duration / 60)) - timecmp) * 60
+                                                       elif chktimecmp <= timecmp < chktimecmp_end:
+                                                               time_match = (chktimecmp_end - timecmp) * 60
                                else: #if x.eit is None:
-                                       end = begin + duration
                                        if begin <= x.begin <= end:
                                                diff = end - x.begin
                                                if time_match < diff:
@@ -364,10 +405,6 @@ class RecordTimer(timer.Timer):
                                                if time_match < diff:
                                                        time_match = diff
                return time_match
-                                                       
-                                               
-                                               
-                       
 
        def removeEntry(self, entry):
                print "[Timer] Remove " + str(entry)