+ filename = begin_date + " - " + service_name
+ if self.name:
+ filename += " - " + self.name
+
+ if config.recording.ascii_filenames.value:
+ filename = ASCIItranslit.legacyEncode(filename)
+
+ if self.dirname and not Directories.fileExists(self.dirname, 'w'):
+ 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)
+
+ def tryPrepare(self):
+ if self.justplay:
+ return True
+ else:
+ self.calculateFilename()
+ rec_ref = self.service_ref and self.service_ref.ref
+ if rec_ref and rec_ref.flags & eServiceReference.isGroup:
+ rec_ref = getBestPlayableServiceReference(rec_ref, eServiceReference())
+ if not rec_ref:
+ self.log(1, "'get best playable service for group... record' failed")
+ return False
+
+ self.record_service = rec_ref and NavigationInstance.instance.recordService(rec_ref)
+
+ if not self.record_service:
+ self.log(1, "'record service' failed")
+ return False
+
+ if self.repeated:
+ epgcache = eEPGCache.getInstance()
+ queryTime=self.begin+(self.end-self.begin)/2
+ evt = epgcache.lookupEventTime(rec_ref, queryTime)
+ if evt:
+ self.description = evt.getShortDescription()
+ event_id = evt.getEventId()
+ else:
+ event_id = -1
+ else:
+ event_id = self.eit
+ if event_id is None:
+ event_id = -1
+
+ prep_res=self.record_service.prepare(self.Filename + ".ts", self.begin, self.end, event_id, self.name.replace("\n", ""), self.description.replace("\n", ""), ' '.join(self.tags))
+ if prep_res:
+ if prep_res == -255:
+ self.log(4, "failed to write meta information")
+ else:
+ self.log(2, "'prepare' failed: error %d" % prep_res)
+ NavigationInstance.instance.stopRecordService(self.record_service)
+ self.record_service = None
+ return False
+ return True
+
+ def do_backoff(self):
+ if self.backoff == 0:
+ self.backoff = 5
+ else:
+ self.backoff *= 2
+ if self.backoff > 100:
+ self.backoff = 100
+ self.log(10, "backoff: retry in %d seconds" % self.backoff)
+
+ def activate(self):
+ next_state = self.state + 1
+ self.log(5, "activating state %d" % next_state)
+
+ if next_state == self.StatePrepared:
+ if self.tryPrepare():
+ self.log(6, "prepare ok, waiting for begin")
+ # fine. it worked, resources are allocated.
+ self.next_activation = self.begin
+ self.backoff = 0
+ return True
+
+ self.log(7, "prepare failed")
+ if self.first_try_prepare:
+ self.first_try_prepare = False
+ cur_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
+ if cur_ref and not cur_ref.getPath():
+ if not config.recording.asktozap.value:
+ self.log(8, "asking user to zap away")
+ Notifications.AddNotificationWithCallback(self.failureCB, MessageBox, _("A timer failed to record!\nDisable TV and try again?\n"), timeout=20)
+ 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_INFO, timeout=20)
+ self.failureCB(True)
+ elif cur_ref:
+ self.log(8, "currently running service is not a live service.. so stop it makes no sense")
+ else:
+ self.log(8, "currently no service running... so we dont need to stop it")
+
+ self.do_backoff()
+ # retry
+ 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:
+ if Screens.Standby.inStandby:
+ self.log(11, "wakeup and zap")
+ #set service to zap after standby
+ Screens.Standby.inStandby.prev_running_service = self.service_ref.ref
+ #wakeup standby
+ Screens.Standby.inStandby.Power()
+ else:
+ self.log(11, "zapping")
+ NavigationInstance.instance.playService(self.service_ref.ref)
+ return True
+ else:
+ self.log(11, "start recording")
+ record_res = self.record_service.start()
+
+ if record_res:
+ self.log(13, "start record returned %d" % record_res)
+ self.do_backoff()
+ # retry
+ self.begin = time.time() + self.backoff
+ return False
+
+ return True
+ elif next_state == self.StateEnded:
+ old_end = self.end
+ if self.setAutoincreaseEnd():
+ self.log(12, "autoincrase recording %d minute(s)" % int((self.end - old_end)/60))
+ self.state -= 1
+ return True
+ self.log(12, "stop recording")
+ if not self.justplay:
+ NavigationInstance.instance.stopRecordService(self.record_service)
+ self.record_service = None
+ 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)
+ elif self.afterEvent == AFTEREVENT.DEEPSTANDBY:
+ if not Screens.Standby.inTryQuitMainloop: # not a shutdown messagebox is open
+ 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)
+ return True
+
+ def setAutoincreaseEnd(self, entry = None):
+ if not self.autoincrease:
+ return False
+ if entry is None:
+ new_end = int(time.time()) + self.autoincreasetime
+ else:
+ new_end = entry.begin -30
+
+ dummyentry = RecordTimerEntry(self.service_ref, self.begin, new_end, self.name, self.description, self.eit, disabled=True, justplay = self.justplay, afterEvent = self.afterEvent, dirname = self.dirname, tags = self.tags)
+ dummyentry.disabled = self.disabled
+ timersanitycheck = TimerSanityCheck(NavigationInstance.instance.RecordTimer.timer_list, dummyentry)
+ if not timersanitycheck.check():
+ simulTimerList = timersanitycheck.getSimulTimerList()
+ new_end = simulTimerList[1].begin
+ del simulTimerList
+ new_end -= 30 # 30 Sekunden Prepare-Zeit lassen
+ del dummyentry
+ if new_end <= time.time():
+ return False
+ self.end = new_end
+ return True
+
+
+ def sendStandbyNotification(self, answer):
+ if answer:
+ Notifications.AddNotification(Screens.Standby.Standby)
+
+ def sendTryQuitMainloopNotification(self, answer):
+ if answer:
+ Notifications.AddNotification(Screens.Standby.TryQuitMainloop, 1)
+
+ def getNextActivation(self):
+ if self.state == self.StateEnded:
+ return self.end