X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/9777558b9e1dc4a1ac89fe7a0740b8651f3936a0..7f2d734e1bc984f496fd0c3394ebba28e5f9d0d3:/Navigation.py diff --git a/Navigation.py b/Navigation.py index 09daff34..a905da19 100644 --- a/Navigation.py +++ b/Navigation.py @@ -1,91 +1,125 @@ -from enigma import * +from enigma import eServiceCenter, eServiceReference, pNavigation, getBestPlayableServiceReference, iPlayableService +from Components.ParentalControl import parentalControl +from Tools.BoundFunction import boundFunction +from Tools.DreamboxHardware import setFPWakeuptime, getFPWakeuptime, getFPWasTimerWakeup, clearFPWasTimerWakeup +from time import time import RecordTimer - +import SleepTimer +import Screens.Standby import NavigationInstance import ServiceReference # TODO: remove pNavgation, eNavigation and rewrite this stuff in python. class Navigation: - def __init__(self): + def __init__(self, nextRecordTimerAfterEventActionAuto=False): if NavigationInstance.instance is not None: raise NavigationInstance.instance NavigationInstance.instance = self self.ServiceHandler = eServiceCenter.getInstance() - + import Navigation as Nav Nav.navcore = self self.pnav = pNavigation() - self.pnav.m_event.get().append(self.callEvent) + self.pnav.m_event.get().append(self.dispatchEvent) + self.pnav.m_record_event.get().append(self.dispatchRecordEvent) self.event = [ ] - self.currentlyPlayingService = None + self.record_event = [ ] self.currentlyPlayingServiceReference = None - + self.currentlyPlayingService = None self.RecordTimer = RecordTimer.RecordTimer() + if getFPWasTimerWakeup(): + clearFPWasTimerWakeup() + if getFPWasTimerWakeup(): # sanity check to detect if the FP driver is working correct! + print "buggy fp driver detected!!! please update drivers.... ignore timer wakeup!" + elif nextRecordTimerAfterEventActionAuto and (len(self.getRecordings()) or abs(self.RecordTimer.getNextRecordingTime() - time()) <= 360): + if not Screens.Standby.inTryQuitMainloop: # not a shutdown messagebox is open + RecordTimer.RecordTimerEntry.TryQuitMainloop(False) # start shutdown handling + self.SleepTimer = SleepTimer.SleepTimer() - def callEvent(self, i): + def dispatchEvent(self, i): for x in self.event: x(i) - - def playService(self, ref): - self.currentlyPlayingServiceReference = None + if i == iPlayableService.evEnd: + self.currentlyPlayingServiceReference = None + self.currentlyPlayingService = None + + def dispatchRecordEvent(self, rec_service, event): +# print "record_event", rec_service, event + for x in self.record_event: + x(rec_service, event) + + def playService(self, ref, checkParentalControl = True, forceRestart = False): + oldref = self.currentlyPlayingServiceReference + if ref and oldref and ref == oldref and not forceRestart: + print "ignore request to play already running service(1)" + return 0 + print "playing", ref and ref.toString() if ref is None: self.stopService() return 0 - - if not self.pnav.playService(ref): - self.currentlyPlayingServiceReference = ref - return 0 + if not checkParentalControl or parentalControl.isServicePlayable(ref, boundFunction(self.playService, checkParentalControl = False)): + if ref.flags & eServiceReference.isGroup: + if not oldref: + oldref = eServiceReference() + playref = getBestPlayableServiceReference(ref, oldref) + print "playref", playref + if playref and oldref and playref == oldref and not forceRestart: + print "ignore request to play already running service(2)" + return 0 + if not playref or (checkParentalControl and not parentalControl.isServicePlayable(playref, boundFunction(self.playService, checkParentalControl = False))): + self.stopService() + return 0 + else: + playref = ref + if self.pnav and not self.pnav.playService(playref): + self.currentlyPlayingServiceReference = playref + return 0 + else: + self.stopService() return 1 def getCurrentlyPlayingServiceReference(self): return self.currentlyPlayingServiceReference - def recordService(self, ref): + def recordService(self, ref, simulate=False): + service = None print "recording service: %s" % (str(ref)) if isinstance(ref, ServiceReference.ServiceReference): ref = ref.ref - service = self.pnav.recordService(ref) - - if service is None: - print "record returned non-zero" - return None - else: - return service - - def enqueueService(self, ref): - return self.pnav.enqueueService(ref) - - def getCurrentService(self): - service = self.pnav.getCurrentService() - - if service is None: - return None - + if ref: + if ref.flags & eServiceReference.isGroup: + ref = getBestPlayableServiceReference(ref, eServiceReference(), simulate) + service = ref and self.pnav and self.pnav.recordService(ref, simulate) + if service is None: + print "record returned non-zero" return service - + + def stopRecordService(self, service): + ret = self.pnav and self.pnav.stopRecordService(service) + return ret + + def getRecordings(self, simulate=False): + return self.pnav and self.pnav.getRecordings(simulate) + + def getCurrentService(self): + if not self.currentlyPlayingService: + self.currentlyPlayingService = self.pnav and self.pnav.getCurrentService() + return self.currentlyPlayingService + def stopService(self): - self.pnav.stopService() - - def getPlaylist(self): - playlist = ePlaylistPtr() - if self.pnav.getPlaylist(playlist): - return None - return playlist - + print "stopService" + if self.pnav: + self.pnav.stopService() + def pause(self, p): - return self.pnav.pause(p) - - def recordWithTimer(self, begin, end, ref, epg, description): - if isinstance(ref, eServiceReference): - ref = ServiceReference.ServiceReference(ref) - entry = RecordTimer.RecordTimerEntry(begin, end, ref, epg, description) - self.RecordTimer.record(entry) - return entry - + return self.pnav and self.pnav.pause(p) + def shutdown(self): self.RecordTimer.shutdown() + self.ServiceHandler = None + self.pnav = None def stopUserServices(self): self.stopService()