msmith - in flumotion/trunk: . flumotion/component/producers/playlist

flumotion-commit at lists.fluendo.com flumotion-commit at lists.fluendo.com
Wed May 9 16:01:21 CEST 2007


Author: msmith
Date: Wed May  9 16:01:18 2007
New Revision: 4908

Modified:
   flumotion/trunk/ChangeLog
   flumotion/trunk/flumotion/component/producers/playlist/playlistparser.py
Log:
        * flumotion/component/producers/playlist/playlistparser.py:
          Use the discoverer on files before adding them.



Modified: flumotion/trunk/ChangeLog
==============================================================================
--- flumotion/trunk/ChangeLog	(original)
+++ flumotion/trunk/ChangeLog	Wed May  9 16:01:18 2007
@@ -1,3 +1,8 @@
+2007-05-09  Michael Smith <msmith at fluendo.com>
+
+	* flumotion/component/producers/playlist/playlistparser.py:
+	  Use the discoverer on files before adding them.
+
 2007-05-09  Zaheer Abbas Merali  <<zaheerabbas at merali dot org>>
 
 	* flumotion/common/config.py (FlumotionConfigXML.parseFeed,

Modified: flumotion/trunk/flumotion/component/producers/playlist/playlistparser.py
==============================================================================
--- flumotion/trunk/flumotion/component/producers/playlist/playlistparser.py	(original)
+++ flumotion/trunk/flumotion/component/producers/playlist/playlistparser.py	Wed May  9 16:01:18 2007
@@ -20,11 +20,15 @@
 # Headers in this file shall remain intact.
 
 import gst
+from gst.extend import discoverer
+
 import time
 from StringIO import StringIO
 
 from xml.dom import Node
 
+from twisted.internet import reactor
+
 from flumotion.common import log, fxml
 
 import singledecodebin
@@ -68,12 +72,18 @@
 
         self.producer = producer
 
-    def addItem(self, timestamp, uri, offset, duration):
+        self._pending_items = []
+        self._discovering = False
+
+    def addItem(self, timestamp, uri, offset, duration, hasAudio, hasVideo):
         """
         Add an item to the playlist.
         The duration of previous and this entry may be adjusted to make it fit.
         """
         newitem = PlaylistItem(timestamp, uri, offset, duration)
+        newitem.hasAudio = hasAudio
+        newitem.hasVideo = hasVideo
+
         prev = next = None
         item = self.items
         while item:
@@ -153,25 +163,76 @@
                 self.debug("Parsing entry")
                 self._parsePlaylistEntry(parser, child)
 
+        # Now launch the discoverer for any pending items
+        if not self._discovering:
+            self._discoverPending()
+
+    def _discoverPending(self):
+        def _discovered(disc, is_media):
+            self.debug("Discovered!")
+            reactor.callFromThread(_discoverer_done, disc, is_media)
+
+        def _discoverer_done(disc, is_media):
+            if is_media:
+                self.debug("Discovery complete, media found")
+                uri = "file://" + item[0]
+                timestamp = item[1]
+                duration = item[2]
+                offset = item[3]
+
+                hasA = disc.is_audio
+                hasV = disc.is_video
+                durationDiscovered = min(disc.audiolength, 
+                    disc.videolength)
+                if not duration or duration > durationDiscovered:
+                    duration = durationDiscovered
+
+                if duration + offset > durationDiscovered:
+                    offset = 0
+
+                if duration > 0:
+                    self.addItem(timestamp, uri, offset, duration, hasA, hasV)
+                else:
+                    self.warning("Duration of item is zero, not adding")
+            else:
+                self.warning("Discover failed to find media in %s", item[0])
+    
+            self.debug("Continuing on to next file")
+            self._discoverPending()
+
+        if not self._pending_items:
+            self.debug("No more files to discover")
+            self._discovering = False
+            return
+
+        self._discovering = True
+        
+        item = self._pending_items.pop(0)
+
+        self.debug("Discovering file %s", item[0])
+        disc = discoverer.Discoverer(item[0])
+
+        disc.connect('discovered', _discovered)
+        disc.discover()
+
     def _parsePlaylistEntry(self, parser, entry):
-        # TODO: Once we use the discoverer, we should move duration to optional
-        mandatory = ['filename', 'time', 'duration']
-        optional = ['offset']
+        mandatory = ['filename', 'time']
+        optional = ['duration', 'offset']
 
         (filename, timestamp, duration, offset) = parser.parseAttributes(
             entry, mandatory, optional)
 
-        duration = int(float(duration) * gst.SECOND)
+        if duration is not None:
+            duration = int(float(duration) * gst.SECOND)
         if offset is None:
             offset = 0
-        offset = int(offset)
+        offset = int(offset) * gst.SECOND
 
         timestamp = self._parseTimestamp(timestamp)
 
         uri = 'file://'+filename
 
-        self.debug("Adding item")
-        self.addItem(timestamp, uri, offset, duration)
+        self._pending_items.append((filename, timestamp, duration, offset))
 
     def _parseTimestamp(self, ts):
         # Take TS in YYYY-MM-DDThh:mm:ssZ format, return timestamp in 


More information about the flumotion-commit mailing list