add basic pip backend for epg refresh
authorMoritz Venn <moritz.venn@freaque.net>
Thu, 6 Jan 2011 19:20:27 +0000 (20:20 +0100)
committerMoritz Venn <moritz.venn@freaque.net>
Mon, 10 Jan 2011 18:05:11 +0000 (19:05 +0100)
currently uses visible (regular) pip

epgrefresh/src/BackgroundAdapter.py [new file with mode: 0644]
epgrefresh/src/EPGRefresh.py
epgrefresh/src/EPGRefreshConfiguration.py
epgrefresh/src/MainPictureAdapter.py [new file with mode: 0644]
epgrefresh/src/plugin.py

diff --git a/epgrefresh/src/BackgroundAdapter.py b/epgrefresh/src/BackgroundAdapter.py
new file mode 100644 (file)
index 0000000..364c36b
--- /dev/null
@@ -0,0 +1,57 @@
+from Screens.PictureInPicture import PictureInPicture
+from Components.SystemInfo import SystemInfo
+
+class BackgroundAdapter:
+       def __init__(self, session):
+               if SystemInfo.get("NumVideoDecoders", 1) < 2:
+                       self.pipAvail = False
+                       return
+
+               self.session = session
+               self.pipAvail = True
+               if session.pipshown:
+                       # Hijack PiP
+                       self.wasShown = True
+                       self.previousService = self.session.pip.getCurrentService()
+                       self.previousPath = self.session.pip.servicePath
+               else:
+                       self.wasShown = False
+                       self.initPiP()
+
+       def initPiP(self):
+               # Instantiate PiP
+               self.session.pip = self.session.instantiateDialog(PictureInPicture)
+               self.session.pip.show()
+               self.session.pipshown = True # Always pretends it's shown (since the ressources are present)
+               newservice = self.session.nav.getCurrentlyPlayingServiceReference()
+               if self.session.pip.playService(newservice):
+                       self.session.pip.servicePath = newservice.getPath()
+
+       def play(self, service):
+               print "[EPGRefresh.BackgroundAdapter.play]"
+               if not self.pipAvail: return False
+
+               if not self.session.pipshown: # make sure pip still exists
+                       self.initPiP()
+
+               if self.session.pip.playService(service):
+                       self.session.pip.servicePath = service.getPath()
+                       return True
+               return False
+
+       def stop(self):
+               if not self.pipAvail: return
+
+               if self.wasShown:
+                       # reset pip and remove it if unable to play service
+                       if self.session.pipshown and self.session.pip.playService(self.previousService):
+                               self.session.pip.servicePath = self.previousPath
+                       else:
+                               self.session.pipshown = False
+                               del self.session.pip
+               else:
+                       # remove pip
+                       self.session.pipshown = False
+                       try: del self.session.pip
+                       except Exception: pass
+
index 240b51e..68c00cd 100644 (file)
@@ -25,6 +25,10 @@ from EPGRefreshService import EPGRefreshService
 # Configuration
 from Components.config import config
 
+# ... II
+from MainPictureAdapter import MainPictureAdapter
+from BackgroundAdapter import BackgroundAdapter
+
 # Path to configuration
 CONFIG = "/etc/enigma2/epgrefresh.xml"
 
@@ -34,7 +38,6 @@ class EPGRefresh:
        def __init__(self):
                # Initialize
                self.services = (set(), set())
-               self.previousService = None
                self.forcedScan = False
                self.session = None
                self.beginOfTimespan = 0
@@ -147,9 +150,6 @@ class EPGRefresh:
        def prepareRefresh(self):
                print "[EPGRefresh] About to start refreshing EPG"
 
-               # Keep service
-               self.previousService =  self.session.nav.getCurrentlyPlayingServiceReference()
-
                # Maybe read in configuration
                try:
                        self.readConfiguration()
@@ -224,6 +224,11 @@ class EPGRefresh:
                # Debug
                #print "[EPGRefresh] Services we're going to scan:", ', '.join([repr(x) for x in scanServices])
 
+               if config.plugins.epgrefresh.background.value:
+                       self.refreshAdapter = BackgroundAdapter(self.session)
+               else:
+                       self.refreshAdapter = MainPictureAdapter(self.session)
+
                self.scanServices = scanServices
                self.refresh()
 
@@ -264,10 +269,7 @@ class EPGRefresh:
 
                self.forcedScan = False
                epgrefreshtimer.cleanup()
-
-               # Zap back
-               if self.previousService is not None or Screens.Standby.inStandby:
-                       self.session.nav.playService(self.previousService)
+               self.refreshAdapter.stop()
 
        def refresh(self):
                if self.forcedScan:
@@ -320,7 +322,8 @@ class EPGRefresh:
                        self.cleanUp()
                else:
                        # Play next service
-                       self.session.nav.playService(eServiceReference(service.sref))
+                       # XXX: we might want to check the return value
+                       self.refreshAdapter.play(eServiceReference(service.sref))
 
                        # Start Timer
                        delay = service.duration or config.plugins.epgrefresh.interval.value
index 0e9d3ac..57c58e4 100644 (file)
@@ -17,6 +17,7 @@ from Components.Sources.StaticText import StaticText
 from Components.config import config, getConfigListEntry
 
 from EPGRefresh import epgrefresh
+from Components.SystemInfo import SystemInfo
 
 class EPGRefreshConfiguration(Screen, ConfigListScreen):
        """Configuration of EPGRefresh"""
@@ -60,6 +61,8 @@ class EPGRefreshConfiguration(Screen, ConfigListScreen):
                        getConfigListEntry(_("Make AutoTimer parse EPG if available"), config.plugins.epgrefresh.parse_autotimer, _("If you're also using the AutoTimer plugin this will initiate a scan of the EPG after a completed refresh.")),
                        getConfigListEntry(_("Shutdown after refresh"), config.plugins.epgrefresh.afterevent, _("This setting controls if the receiver should be sent to deep-standby after a completed refresh.")),
                ]
+               if SystemInfo.get("NumVideoDecoders", 1) > 1:
+                       self.list.insert(1, getConfigListEntry(_("Refresh in Background"), config.plugins.epgrefresh.background, _("Use Picture In Picture to refresh EPG?")))
 
                ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changed)
                self["config"].onSelectionChanged.append(self.updateHelp)
diff --git a/epgrefresh/src/MainPictureAdapter.py b/epgrefresh/src/MainPictureAdapter.py
new file mode 100644 (file)
index 0000000..b6d7f92
--- /dev/null
@@ -0,0 +1,15 @@
+import Screens.Standby
+
+class MainPictureAdapter:
+       def __init__(self, session):
+               self.session = session
+               self.previousService = session.nav.getCurrentlyPlayingServiceReference()
+
+       def play(self, service):
+               print "[EPGRefresh.MainPictureAdapter.play]"
+               return self.session.nav.playService(service)
+
+       def stop(self):
+               if self.previousService is not None or Screens.Standby.inStandby:
+                       self.session.nav.playService(self.previousService)
+
index 24c7df4..388022f 100644 (file)
@@ -3,7 +3,7 @@ from . import _
 
 # Config
 from Components.config import config, ConfigYesNo, ConfigNumber, \
-       ConfigSubsection, ConfigClock
+       ConfigSubsection, ConfigClock, ConfigYesNo
 
 # Calculate default begin/end
 from time import time, localtime, mktime
@@ -29,6 +29,7 @@ config.plugins.epgrefresh.force = ConfigYesNo(default = False)
 config.plugins.epgrefresh.wakeup = ConfigYesNo(default = False)
 config.plugins.epgrefresh.lastscan = ConfigNumber(default = 0)
 config.plugins.epgrefresh.parse_autotimer = ConfigYesNo(default = False)
+config.plugins.epgrefresh.background = ConfigYesNo(default = False)
 
 del now, begin, end