[rygel] Make it work with arbitrary gio sources
- From: Zeeshan Ali Khattak <zeeshanak src gnome org>
- To: svn-commits-list gnome org
- Subject: [rygel] Make it work with arbitrary gio sources
- Date: Sun, 3 May 2009 15:15:55 -0400 (EDT)
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]