[rygel/wip/dvd: 103/103] wip: Expose DVD images, first draft
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel/wip/dvd: 103/103] wip: Expose DVD images, first draft
- Date: Wed, 16 Sep 2015 12:25:49 +0000 (UTC)
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]