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

flumotion-commit at lists.fluendo.com flumotion-commit at lists.fluendo.com
Tue May 22 15:28:27 CEST 2007


Author: msmith
Date: Tue May 22 15:28:24 2007
New Revision: 4991

Modified:
   flumotion/trunk/ChangeLog
   flumotion/trunk/flumotion/component/producers/playlist/playlist.py
   flumotion/trunk/flumotion/component/producers/playlist/playlist.xml
   flumotion/trunk/flumotion/component/producers/playlist/playlistparser.py
Log:
        * flumotion/component/producers/playlist/playlist.xml:
          Add playlist-directory, base-directory properties. Make playlist
          optional.

        * flumotion/component/producers/playlist/playlist.py:
          Watch playlist-directory (if any) for changes. Currently only
          supports adding new files. Read base directory and pass to parser.

        * flumotion/component/producers/playlist/playlistparser.py:
          Use base directory to resolve relative paths.



Modified: flumotion/trunk/ChangeLog
==============================================================================
--- flumotion/trunk/ChangeLog	(original)
+++ flumotion/trunk/ChangeLog	Tue May 22 15:28:24 2007
@@ -1,3 +1,16 @@
+2007-05-22  Michael Smith <msmith at fluendo.com>
+
+	* flumotion/component/producers/playlist/playlist.xml:
+	  Add playlist-directory, base-directory properties. Make playlist
+	  optional.
+
+	* flumotion/component/producers/playlist/playlist.py:
+	  Watch playlist-directory (if any) for changes. Currently only
+	  supports adding new files. Read base directory and pass to parser.
+	  
+	* flumotion/component/producers/playlist/playlistparser.py:
+	  Use base directory to resolve relative paths.
+
 2007-05-21  Andy Wingo  <wingo at pobox.com>
 
 	* flumotion/common/fxml.py (Parser.checkAttributes): Treat an

Modified: flumotion/trunk/flumotion/component/producers/playlist/playlist.py
==============================================================================
--- flumotion/trunk/flumotion/component/producers/playlist/playlist.py	(original)
+++ flumotion/trunk/flumotion/component/producers/playlist/playlist.py	Tue May 22 15:28:24 2007
@@ -27,6 +27,7 @@
 
 from flumotion.common import errors, messages, log, fxml
 from flumotion.component import feedcomponent
+from flumotion.component.base import watcher
 
 from flumotion.common.messages import N_
 
@@ -298,6 +299,8 @@
         props = self.config['properties'];
 
         self._playlistfile = props.get('playlist', None)
+        self._playlistdirectory = props.get('playlist-directory', None)
+        self._baseDirectory = props.get('base-directory', None)
 
         self._width = props.get('width', 320)
         self._height = props.get('height', 240)
@@ -316,19 +319,42 @@
         self.connect_feeders(pipeline)
         return pipeline
 
+    def _watchDirectory(self, dir):
+        self.debug("Watching directory %s", dir)
+        self._filesAdded = {}
+
+        self._directoryWatcher = watcher.DirectoryWatcher(dir)
+        self._directoryWatcher.subscribe(fileChanged=self._watchFileChanged)
+        self._directoryWatcher.start()
+
+    def _watchFileChanged(self, file):
+        self.debug("File changed: %s", file)
+        if file not in self._filesAdded:
+            self._filesAdded[file] = None
+            try:
+                self.debug("Parsing file: %s", file)
+                self.playlistparser.parseFile(file)
+            except fxml.ParserError, e:
+                self.warning("Failed to parse playlist file: %r", e)
+        else:
+            self.warning("Can't yet change existing files")
+
     def do_start(self, clocking):
         self.link()
 
         playlist = playlistparser.Playlist(self)
         self.playlistparser = playlistparser.PlaylistXMLParser(playlist)
-        try:
-            if self._playlistfile:
+        if self._baseDirectory:
+            self.playlistparser.setBaseDirectory(self._baseDirectory)
+
+        if self._playlistfile:
+            try:
                 self.playlistparser.parseFile(self._playlistfile)
-        except fxml.ParserError, e:
-            self.warning("Failed to parse playlist file: %r", e)
+            except fxml.ParserError, e:
+                self.warning("Failed to parse playlist file: %r", e)
 
-        #if self._playlistdirectory:
-        #    watchdirectory(playlistdirectory, newplaylistfile, playlistfiledelted)
+        if self._playlistdirectory:
+            self._watchDirectory(self._playlistdirectory)
 
         return defer.succeed(None)
         

Modified: flumotion/trunk/flumotion/component/producers/playlist/playlist.xml
==============================================================================
--- flumotion/trunk/flumotion/component/producers/playlist/playlist.xml	(original)
+++ flumotion/trunk/flumotion/component/producers/playlist/playlist.xml	Tue May 22 15:28:24 2007
@@ -30,8 +30,13 @@
         <property name="channels" type="int"
                   description="Audio channels to output" />
 
-        <property name="playlist" type="string" required="yes"
-                  description="Location of the initial playlist file" />
+        <property name="playlist" type="string"
+                  description="Location of the initial playlist file if any" />
+        <property name="playlist-directory" type="string"
+                  description="Location of a directory to monitor for playlist files to add" />
+
+        <property name="base-directory" type="string"
+                  description="Base directory for relative paths in playlist files" />
       </properties>
     </component>
   </components>

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	Tue May 22 15:28:24 2007
@@ -189,6 +189,13 @@
         self._pending_items = []
         self._discovering = False
 
+        self._baseDirectory = None
+
+    def setBaseDirectory(self, baseDir):
+        if not baseDir.endswith('/'):
+            baseDir = baseDir + '/'
+        self._baseDirectory = baseDir
+
     def _discoverPending(self):
         def _discovered(disc, is_media):
             self.debug("Discovered!")
@@ -197,7 +204,11 @@
         def _discoverer_done(disc, is_media):
             if is_media:
                 self.debug("Discovery complete, media found")
-                uri = "file://" + item[0]
+                filename = item[0]
+                if filename[0] != '/' and self._baseDirectory:
+                    filename = self._baseDirectory + filename
+
+                uri = "file://" + filename
                 timestamp = item[1]
                 duration = item[2]
                 offset = item[3]


More information about the flumotion-commit mailing list