[rygel/wip/dvd: 103/103] wip: Expose DVD images, first draft



commit 1506ef63bf906488510682a00b0cfd3cc93e78ff
Author: Jens Georg <mail jensge org>
Date:   Wed Sep 16 14:24:34 2015 +0200

    wip: Expose DVD images, first draft
    
    Signed-off-by: Jens Georg <mail jensge org>

 .../rygel-media-export-dvd-container.vala          |   95 +++++++++++++++++++-
 .../rygel-media-export-item-factory.vala           |    3 +-
 .../rygel-media-export-object-factory.vala         |   13 ++-
 .../rygel-media-export-root-container.vala         |   12 +++-
 4 files changed, 112 insertions(+), 11 deletions(-)
---
diff --git a/src/plugins/media-export/rygel-media-export-dvd-container.vala 
b/src/plugins/media-export/rygel-media-export-dvd-container.vala
index df7fda6..a51a7ce 100644
--- a/src/plugins/media-export/rygel-media-export-dvd-container.vala
+++ b/src/plugins/media-export/rygel-media-export-dvd-container.vala
@@ -21,8 +21,11 @@
 using Rygel;
 using Gee;
 
-internal class Rygel.DVDContainer : MediaContainer {
+internal class Rygel.MediaExport.DVDContainer : MediaContainer, UpdatableObject {
     public new const string UPNP_CLASS = MediaContainer.PLAYLIST + ".DVD";
+    public const string PREFIX = "dvd";
+    public const string TRACK_PREFIX = "dvd-track";
+
     public string path { get; construct set; }
 
     private GUPnP.XMLDoc doc;
@@ -61,7 +64,7 @@ internal class Rygel.DVDContainer : MediaContainer {
             it = it->next;
         }
 
-        warning ("Found title %s, got %d children", this.title, child_count);
+        this.child_count = child_count;
     }
 
     public override async MediaObjects? get_children (
@@ -70,13 +73,54 @@ internal class Rygel.DVDContainer : MediaContainer {
                                                      string       sort_criteria,
                                                      Cancellable? cancellable)
                                                      throws Error {
-        return new MediaObjects ();
+        var children = new MediaObjects ();
+
+        var context = new Xml.XPath.Context (this.doc.doc);
+        var xpo = context.eval ("/lsdvd/track");
+        if (xpo->type != Xml.XPath.ObjectType.NODESET) {
+            delete xpo;
+            warning ("No tracks found in DVD");
+
+            return children;
+        }
+
+        for (int i = 0; i < xpo->nodesetval->length (); i++) {
+            var node = xpo->nodesetval->item (i);
+            var item = this.get_item_for_xml (i, node);
+            children.add (item);
+        }
+
+        delete xpo;
+
+        return children;
     }
 
     public override async MediaObject? find_object (string id,
                                                     Cancellable? cancellable)
                                                     throws Error {
-        return null;
+        warning ("=> called find object");
+        if (!id.has_prefix (DVDContainer.TRACK_PREFIX)) {
+            return null;
+        }
+
+        var parts = id.split (":");
+        var track = int.parse (parts[2]);
+        var context = new Xml.XPath.Context (this.doc.doc);
+        var xpo = context.eval ("/lsdvd/track");
+        if (!(xpo->type == Xml.XPath.ObjectType.NODESET &&
+              xpo->nodesetval->length () >= track)) {
+            delete xpo;
+
+            warning ("No track %s in DVD", parts[2]);
+
+            return null;
+        }
+
+        var object = this.get_item_for_xml (int.parse (parts[2]),
+                                            xpo->nodesetval->item (track));
+        delete xpo;
+
+        return object;
     }
 
     private string get_cache_path (string image_path) {
@@ -89,4 +133,47 @@ internal class Rygel.DVDContainer : MediaContainer {
         return Path.build_filename (cache_folder, id);
     }
 
+    public async void commit () throws Error {
+        yield this.commit_custom (true);
+    }
+
+    public async void commit_custom (bool override_guarded) throws Error {
+        MediaCache.get_default ().save_container (this);
+    }
+
+    private string get_track_id (int track) {
+        var parts = this.id.split (":");
+
+        parts[0] = "dvd-track";
+        parts += track.to_string ();
+
+        return string.joinv (":", parts);
+    }
+
+    private MediaFileItem get_item_for_xml (int track, Xml.Node *node) {
+        var item = new VideoItem (this.get_track_id (track),
+                                  this,
+                                  "Track %d".printf (track + 1));
+        item.parent_ref = this;
+
+        var uri = new Soup.URI (this.get_uris ()[0]);
+        uri.set_scheme ("dvd");
+        uri.set_query ("title=%d".printf (track + 1));
+        item.add_uri (uri.to_string (false));
+                var media_engine = MediaEngine.get_default ( );
+                media_engine.get_resources_for_item.begin ( item,
+                                                            (obj, res) => {
+                    var added_resources = media_engine
+                                          .get_resources_for_item.end (res);
+                    debug ("Adding %d resources to item source %s",
+                           added_resources.size, item.get_primary_uri ());
+                    foreach (var resrc in added_resources) {
+                       debug ("Media-export item media resource %s",
+                              resrc.get_name ());
+                    }
+                    item.get_resource_list ().add_all (added_resources);
+                  });
+
+        return item;
+    }
 }
diff --git a/src/plugins/media-export/rygel-media-export-item-factory.vala 
b/src/plugins/media-export/rygel-media-export-item-factory.vala
index 4c84b4e..98962db 100644
--- a/src/plugins/media-export/rygel-media-export-item-factory.vala
+++ b/src/plugins/media-export/rygel-media-export-item-factory.vala
@@ -169,9 +169,8 @@ namespace Rygel.MediaExport.ItemFactory {
                 item = ItemFactory.create_playlist_item (file, parent, "");
                 break;
             case DVDContainer.UPNP_CLASS:
-                object = new DVDContainer (id, parent, "", file.get_path ());
+                object = new DVDContainer ("dvd:" + id, parent, "", file.get_path ());
                 object.add_uri (file.get_uri ());
-                warning ("=> Fkjdhkdsjhfkjdshdskjf ");
                 return object;
             default:
                 return null;
diff --git a/src/plugins/media-export/rygel-media-export-object-factory.vala 
b/src/plugins/media-export/rygel-media-export-object-factory.vala
index 8ce86cd..bfec32e 100644
--- a/src/plugins/media-export/rygel-media-export-object-factory.vala
+++ b/src/plugins/media-export/rygel-media-export-object-factory.vala
@@ -33,10 +33,10 @@ internal class Rygel.MediaExport.ObjectFactory : Object {
      * @param title title of the container
      * @param child_count number of children in the container
      */
-    public virtual DBContainer get_container (string     id,
-                                              string     title,
-                                              uint       child_count,
-                                              string?    uri) {
+    public virtual MediaContainer get_container (string     id,
+                                                 string     title,
+                                                 uint       child_count,
+                                                 string?    uri) {
         if (id == "0") {
             return RootContainer.get_instance ();
         } else if (id == RootContainer.FILESYSTEM_FOLDER_ID) {
@@ -65,6 +65,11 @@ internal class Rygel.MediaExport.ObjectFactory : Object {
             return new TrackableDbContainer (id, title);
         }
 
+        if (id.has_prefix ("dvd:")) {
+            var file = File.new_for_uri (uri);
+            return new DVDContainer (id, null, title, file.get_path ());
+        }
+
         if (id.has_prefix ("playlist:")) {
             return new PlaylistContainer (id, title);
         }
diff --git a/src/plugins/media-export/rygel-media-export-root-container.vala 
b/src/plugins/media-export/rygel-media-export-root-container.vala
index 08e9a17..64f41dc 100644
--- a/src/plugins/media-export/rygel-media-export-root-container.vala
+++ b/src/plugins/media-export/rygel-media-export-root-container.vala
@@ -94,7 +94,17 @@ public class Rygel.MediaExport.RootContainer : TrackableDbContainer {
             return object;
         }
 
-        if (id.has_prefix (QueryContainer.PREFIX)) {
+        if (id.has_prefix (DVDContainer.TRACK_PREFIX)) {
+            var parts = id.split (":");
+            var parent_id = DVDContainer.PREFIX + ":" + parts[1];
+            object = yield base.find_object (parent_id, cancellable);
+            var container = object as MediaContainer;
+            if (container != null) {
+                return yield container.find_object (id, cancellable);
+            }
+
+            return null;
+        } else  if (id.has_prefix (QueryContainer.PREFIX)) {
             var factory = QueryContainerFactory.get_default ();
             var container = factory.create_from_hashed_id (id);
             if (container != null) {


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