[rygel] Make it work with arbitrary gio sources



commit 75cf277ea08e3bd98d9b0ae30758b1c6d6250e7c
Author: Jens Georg <mail jensge org>
Date:   Fri May 1 02:39:52 2009 +0200

    Make it work with arbitrary gio sources
---
 .../folder/rygel-folder-directorysearch.vala       |   21 ++++++--
 src/plugins/folder/rygel-folder-media-item.vala    |   54 ++++++++++++--------
 2 files changed, 49 insertions(+), 26 deletions(-)

diff --git a/src/plugins/folder/rygel-folder-directorysearch.vala b/src/plugins/folder/rygel-folder-directorysearch.vala
index 3de32ef..3ba40b5 100644
--- a/src/plugins/folder/rygel-folder-directorysearch.vala
+++ b/src/plugins/folder/rygel-folder-directorysearch.vala
@@ -48,6 +48,20 @@ public class Folder.DirectorySearchResult : Rygel.SimpleAsyncResult<Gee.List<Med
         this.complete();
     }
 
+    private string? get_upnp_class_from_content_type(string content_type) {
+        if (content_type.has_prefix("video/")) {
+            return MediaItem.VIDEO_CLASS;
+        }
+        else if (content_type.has_prefix("audio/")) {
+            return MediaItem.AUDIO_CLASS;
+        }
+        else if (content_type.has_prefix("image/")) {
+            return MediaItem.IMAGE_CLASS;
+        }
+
+        return null;
+    }
+
     public void enumerate_next_ready(Object obj, AsyncResult res) {
         var enumerator = (FileEnumerator)obj;
         try {
@@ -56,7 +70,6 @@ public class Folder.DirectorySearchResult : Rygel.SimpleAsyncResult<Gee.List<Med
                 foreach (FileInfo file_info in list) {
                     debug("new file info");
                     var f = file.get_child(file_info.get_name());
-                    try {
                         MediaObject item = null;
                         if (file_info.get_file_type() == FileType.DIRECTORY) {
                             item = new FolderContainer((MediaContainer)source_object, 
@@ -65,13 +78,11 @@ public class Folder.DirectorySearchResult : Rygel.SimpleAsyncResult<Gee.List<Med
 
                         }
                         else {
-                            item = new FilesystemMediaItem((MediaContainer)source_object, f, file_info);
+                            var upnp_class = get_upnp_class_from_content_type(file_info.get_content_type());
+                            item = new FilesystemMediaItem((MediaContainer)source_object, f, upnp_class, file_info);
                         }
                         if (item != null)
                             data.add(item);
-                    } catch (MediaItemError err) {
-                        // most likely invalid content type
-                    }
 
                 }
                 enumerator.next_files_async(MAX_CHILDREN,
diff --git a/src/plugins/folder/rygel-folder-media-item.vala b/src/plugins/folder/rygel-folder-media-item.vala
index 1253131..3310e9d 100644
--- a/src/plugins/folder/rygel-folder-media-item.vala
+++ b/src/plugins/folder/rygel-folder-media-item.vala
@@ -20,40 +20,52 @@
 
 using GLib;
 using Rygel;
-
-public errordomain MediaItemError {
-    INVALID_CONTENT_TYPE
-}
+using Gst;
 
 /**
  * Very simple media item. 
  */
 public class Folder.FilesystemMediaItem : Rygel.MediaItem {
+    private bool need_source;
+    private string raw_uri;
+
     public FilesystemMediaItem(MediaContainer parent, 
                                File file, 
-                               FileInfo file_info) throws MediaItemError {
-        string item_class;
-        var content_type = file_info.get_content_type();
-
-        if (content_type.has_prefix("video/")) {
-            item_class = MediaItem.VIDEO_CLASS;
-        }
-        else if (content_type.has_prefix("audio/")) {
-            item_class = MediaItem.AUDIO_CLASS;
-        }
-        else if (content_type.has_prefix("image/")) {
-            item_class = MediaItem.IMAGE_CLASS;
-        }
-        else {
-            throw new MediaItemError.INVALID_CONTENT_TYPE("content_type %s not supported by plugin".printf(content_type));
-        }
+                               string item_class,
+                               FileInfo file_info) {
 
         base(Checksum.compute_for_string(ChecksumType.MD5, file_info.get_name()), 
              parent,
              file_info.get_name(),
              item_class);
 
+        var content_type = file_info.get_content_type();
+        need_source = false;
+
+
         this.mime_type = content_type;
-        this.uris.add(GLib.Markup.escape_text(file.get_uri()));
+        // check if rygel can handle this uri type itself
+        if (file.get_uri().has_prefix("file:") || 
+            file.get_uri().has_prefix("http:")) {
+            this.uris.add(GLib.Markup.escape_text(file.get_uri()));
+        }
+        else {
+            need_source = true;
+            raw_uri = file.get_uri();
+        }
+    }
+
+    public override Gst.Element? create_stream_source() {
+        if (need_source) {
+            dynamic Element src = ElementFactory.make("giosrc", null);
+            if (src != null) {
+                src.is_live = true;
+                src.location = raw_uri;
+            }
+
+            return src;
+        }
+
+        return null;
     }
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]