from Components.Sources.Boolean import Boolean
from Components.Sources.Clock import Clock
from Components.TimerList import TimerEntryComponent
-from Components.config import config, ConfigBoolean
-
+from Components.config import config, ConfigBoolean, ConfigClock
from EpgSelection import EPGSelection
from Plugins.Plugin import PluginDescriptor
from Screens.SubtitleDisplay import SubtitleDisplay
from Screens.RdsDisplay import RdsInfoDisplay, RassInteractive
from Screens.SleepTimerEdit import SleepTimerEdit
+from Screens.TimeDateInput import TimeDateInput
from ServiceReference import ServiceReference
from Tools import Notifications
from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \
iPlayableService, eServiceReference, eDVBResourceManager, iFrontendInformation, eEPGCache
-from time import time
+from time import time, localtime, strftime
from os import stat as os_stat
from bisect import insort
self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
{
- iPlayableService.evStart: self.__serviceStarted,
- iPlayableService.evUpdatedEventInfo: self.__eventInfoChanged
+ iPlayableService.evStart: self.serviceStarted,
})
self.__state = self.STATE_SHOWN
self.onShow.append(self.__onShow)
self.onHide.append(self.__onHide)
- self.current_begin_time=0
- def __eventInfoChanged(self):
+ def serviceStarted(self):
if self.execing:
- service = self.session.nav.getCurrentService()
- old_begin_time = self.current_begin_time
- info = service and service.info()
- ptr = info and info.getEvent(0)
- self.current_begin_time = ptr and ptr.getBeginTime() or 0
- if config.usage.show_infobar_on_event_change.value:
- if old_begin_time and old_begin_time != self.current_begin_time:
- self.doShow()
-
- def __serviceStarted(self):
- if self.execing:
- self.current_begin_time=0
if config.usage.show_infobar_on_zap.value:
self.doShow()
iPlayableService.evUpdatedRassSlidePic: self.RassSlidePicChanged
})
- self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions",
+ self["RdsActions"] = ActionMap(["InfobarRdsActions"],
{
- "startRassInteractive": (self.startRassInteractive, _("View Rass interactive..."))
+ "startRassInteractive": self.startRassInteractive
},-1)
self["RdsActions"].setEnabled(False)
if action[:5] == "seek:":
time = int(action[5:])
self.screen.seekRelative(time * 90000)
+ self.screen.doShow()
return 1
else:
return HelpableActionMap.action(self, contexts, action)
def __evEOF(self):
if self.seekstate == self.SEEK_STATE_EOF:
return
+ if self.seekstate[1] < 0: # SEEK_STATE_BACK_*X
+ print "end of stream while seeking back, ignoring."
+ return
+
# if we are seeking, we try to end up ~1s before the end, and pause there.
if not self.seekstate in [self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE]:
self.setSeekState(self.SEEK_STATE_EOF)
# Timeshift works the following way:
# demux0 demux1 "TimeshiftActions" "TimeshiftActivateActions" "SeekActions"
# - normal playback TUNER unused PLAY enable disable disable
-# - user presses "yellow" button. TUNER record PAUSE enable disable enable
+# - user presses "yellow" button. FILE record PAUSE enable disable enable
# - user presess pause again FILE record PLAY enable disable enable
# - user fast forwards FILE record FF enable disable enable
# - end of timeshift buffer reached TUNER record PLAY enable enable disable
}, prio=1)
self["TimeshiftActivateActions"] = ActionMap(["InfobarTimeshiftActivateActions"],
{
- "timeshiftActivateEnd": self.activateTimeshiftEnd, # something like "pause key"
- "timeshiftActivateEndAndPause": self.activateTimeshiftEndAndPause # something like "backward key"
+ "timeshiftActivateEnd": self.activateTimeshiftEnd, # something like "rewind key"
+ "timeshiftActivateEndAndPause": self.activateTimeshiftEndAndPause # something like "pause key"
}, prio=-1) # priority over record
self.timeshift_enabled = 0
self.timeshift_state = 0
- self.ts_pause_timer = eTimer()
- self.ts_pause_timer.timeout.get().append(self.pauseService)
+ self.ts_rewind_timer = eTimer()
+ self.ts_rewind_timer.timeout.get().append(self.rewindService)
self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
{
if ts is None:
self.session.open(MessageBox, _("Timeshift not possible!"), MessageBox.TYPE_ERROR)
print "no ts interface"
- return 0;
+ return 0
if self.timeshift_enabled:
print "hu, timeshift already enabled?"
#self.pvrStateDialog["timeshift"].setRelative(time.time())
# PAUSE.
- self.setSeekState(self.SEEK_STATE_PAUSE)
+ #self.setSeekState(self.SEEK_STATE_PAUSE)
+ self.activateTimeshiftEnd(False)
# enable the "TimeshiftEnableActions", which will override
# the startTimeshift actions
self.__seekableStatusChanged()
# activates timeshift, and seeks to (almost) the end
- def activateTimeshiftEnd(self):
+ def activateTimeshiftEnd(self, back = True):
ts = self.getTimeshift()
print "activateTimeshiftEnd"
self.setSeekState(self.SEEK_STATE_PAUSE)
self.seekRelativeToEnd(-90000) # seek approx. 1 sec before end
+ if back:
+ self.ts_rewind_timer.start(200, 1)
+
+ def rewindService(self):
+ self.setSeekState(self.SEEK_STATE_BACK_16X)
+
# same as activateTimeshiftEnd, but pauses afterwards.
def activateTimeshiftEndAndPause(self):
print "activateTimeshiftEndAndPause"
- state = self.seekstate
- self.activateTimeshiftEnd()
-
- ## well, this is "andPause", but it could be pressed from pause,
- ## when pausing on the (fake-)"live" picture, so an un-pause
- ## is perfectly ok.
-
- #print "now, pauseService"
- #if state == self.SEEK_STATE_PLAY:
- # print "is PLAYING, start pause timer"
- # self.ts_pause_timer.start(200, 1)
- #else:
- # print "unpause"
- # self.unPauseService()
+ #state = self.seekstate
+ self.activateTimeshiftEnd(False)
def __seekableStatusChanged(self):
enabled = False
self.changeDuration(0)
else:
self.session.openWithCallback(self.changeDuration, TimerSelection, list)
+ elif answer[1] == "changeendtime":
+ if len(self.recording) == 1:
+ self.setEndtime(0)
+ else:
+ self.session.openWithCallback(self.setEndTime, TimerSelection, list)
elif answer[1] == "stop":
if len(self.recording) == 1:
self.stopCurrentRecording(0)
else:
self.session.openWithCallback(self.stopCurrentRecording, TimerSelection, list)
- if answer[1] == "indefinitely" or answer[1] == "manualduration" or answer[1] == "event":
- limitEvent = False
- if answer[1] == "event":
- limitEvent = True
+ elif answer[1] in ( "indefinitely" , "manualduration", "manualendtime", "event"):
+ self.startInstantRecording(limitEvent = answer[1] in ("event", "manualendtime") or False)
if answer[1] == "manualduration":
- self.selectedEntry = len(self.recording)
- self.session.openWithCallback(self.inputCallback, InputBox, title=_("How many minutes do you want to record?"), text="5", maxSize=False, type=Input.NUMBER)
- self.startInstantRecording(limitEvent = limitEvent)
-
+ self.changeDuration(len(self.recording)-1)
+ elif answer[1] == "manualendtime":
+ self.setEndtime(len(self.recording)-1)
print "after:\n", self.recording
+ def setEndtime(self, entry):
+ if entry is not None:
+ self.selectedEntry = entry
+ self.endtime=ConfigClock(default = self.recording[self.selectedEntry].end)
+ dlg = self.session.openWithCallback(self.TimeDateInputClosed, TimeDateInput, self.endtime)
+ dlg.setTitle(_("Please change recording endtime"))
+
+ def TimeDateInputClosed(self, ret):
+ if len(ret) > 1:
+ if ret[0]:
+ localendtime = localtime(ret[1])
+ print "stopping recording at", strftime("%c", localendtime)
+ self.recording[self.selectedEntry].end = ret[1]
+ self.session.nav.RecordTimer.timeChanged(self.recording[self.selectedEntry])
+
def changeDuration(self, entry):
if entry is not None:
self.selectedEntry = entry
title=_("A recording is currently running.\nWhat do you want to do?"), \
list=[(_("stop recording"), "stop"), \
(_("change recording (duration)"), "changeduration"), \
+ (_("change recording (endtime)"), "changeendtime"), \
(_("add recording (indefinitely)"), "indefinitely"), \
(_("add recording (stop after current event)"), "event"), \
(_("add recording (enter recording duration)"), "manualduration"), \
+ (_("add recording (enter recording endtime)"), "manualendtime"), \
(_("do nothing"), "no")])
else:
self.session.openWithCallback(self.recordQuestionCallback, ChoiceBox, \
list=[(_("add recording (indefinitely)"), "indefinitely"), \
(_("add recording (stop after current event)"), "event"), \
(_("add recording (enter recording duration)"), "manualduration"), \
+ (_("add recording (enter recording endtime)"), "manualendtime"), \
(_("don't record"), "no")])
from Tools.ISO639 import LanguageCodes
iPlayableService.evUpdatedInfo: self.__updatedInfo
})
self.cached_subtitle_checked = False
+ self.__selected_subtitle = None
def __serviceStopped(self):
self.subtitle_window.hide()
if not self.cached_subtitle_checked:
subtitle = self.getCurrentServiceSubtitle()
self.cached_subtitle_checked = True
- if subtitle:
- self.__selected_subtitle = subtitle.getCachedSubtitle()
+ self.__selected_subtitle = subtitle and subtitle.getCachedSubtitle()
if self.__selected_subtitle:
subtitle.enableSubtitles(self.subtitle_window.instance, self.selected_subtitle)
self.subtitle_window.show()