+ 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)
+
+ # we must calc nur start time before stopRecordService call because in Screens/Standby.py TryQuitMainloop tries to get
+ # the next start time in evEnd event handler...
+ self.do_backoff()
+ self.start_prepare = time() + self.backoff
+
+ 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")
+ # create file to "reserve" the filename
+ # because another recording at the same time on another service can try to record the same event
+ # i.e. cable / sat.. then the second recording needs an own extension... when we create the file
+ # here than calculateFilename is happy
+ if not self.justplay:
+ open(self.Filename + ".ts", "w").close()
+ # 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")
+ 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()