[rygel/wip/dvd: 2/2] media-export: Export DVD images, part1
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel/wip/dvd: 2/2] media-export: Export DVD images, part1
- Date: Sun, 14 Jul 2013 12:56:10 +0000 (UTC)
commit c493ec2349b5b573f0289aa373490b74e42bc1e4
Author: Jens Georg <jensg openismus com>
Date: Sun Jul 14 14:55:12 2013 +0200
media-export: Export DVD images, part1
configure.ac | 1 +
src/plugins/media-export/Makefile.am | 1 +
.../rygel-media-export-dvd-parser.vala | 126 ++++++++++++++++++++
.../media-export/rygel-media-export-harvester.vala | 3 +-
.../rygel-media-export-metadata-extractor.vala | 48 +++++---
5 files changed, 160 insertions(+), 19 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 3e67688..671f364 100644
--- a/configure.ac
+++ b/configure.ac
@@ -160,6 +160,7 @@ AS_IF([test "x$with_media_engine" = "xgstreamer"],
gstreamer-pbutils-1.0 >= $GSTPBU_REQUIRED
libsoup-2.4 >= $LIBSOUP_REQUIRED
sqlite3 >= $LIBSQLITE3_REQUIRED
+ libxml-2.0 >= $LIBXML_REQUIRED
uuid])
RYGEL_PLUGIN_MEDIA_EXPORT_DEPS_VALAFLAGS="$RYGEL_COMMON_MODULES_VALAFLAGS --pkg gupnp-dlna-2.0
--pkg gupnp-dlna-gst-2.0 --pkg gstreamer-tag-1.0 --pkg gstreamer-app-1.0 --pkg gstreamer-pbutils-1.0 --pkg
sqlite3"
AC_SUBST([RYGEL_PLUGIN_MEDIA_EXPORT_DEPS_VALAFLAGS])
diff --git a/src/plugins/media-export/Makefile.am b/src/plugins/media-export/Makefile.am
index 470fed6..f659b1c 100644
--- a/src/plugins/media-export/Makefile.am
+++ b/src/plugins/media-export/Makefile.am
@@ -7,6 +7,7 @@ librygel_media_export_la_SOURCES = \
rygel-media-export-plugin.vala \
rygel-media-export-database.vala \
rygel-media-export-database-cursor.vala \
+ rygel-media-export-dvd-parser.vala \
rygel-media-export-sqlite-wrapper.vala \
rygel-media-export-db-container.vala \
rygel-media-export-sql-factory.vala \
diff --git a/src/plugins/media-export/rygel-media-export-dvd-parser.vala
b/src/plugins/media-export/rygel-media-export-dvd-parser.vala
new file mode 100644
index 0000000..086c3db
--- /dev/null
+++ b/src/plugins/media-export/rygel-media-export-dvd-parser.vala
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2013 Jens Georg <mail jensge org>.
+ *
+ * Author: Jens Georg <mail jensge org>
+ *
+ * This file is part of Rygel.
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+internal class Rygel.MediaExport.DVDParser : GLib.Object {
+ /// URI to the image / toplevel directory
+ public File file { private get; construct; }
+
+ private File cache_file;
+
+ public DVDParser (File file) {
+ Object (file : file);
+ }
+
+ public override void constructed () {
+ unowned string user_cache = Environment.get_user_cache_dir ();
+ var cache_folder = Path.build_filename (user_cache,
+ "rygel",
+ "dvd-content");
+ DirUtils.create_with_parents (cache_folder, 0700);
+ var cache_path = Path.build_filename (cache_folder,
+ MediaCache.get_id (this.file));
+
+ this.cache_file = File.new_for_path (cache_path);
+ }
+
+ public async void run () {
+ var doc = yield this.get_information ();
+ if (doc != null) {
+ doc->children;
+ }
+ }
+
+ public async Xml.Doc* get_information () {
+ if (this.cache_file.query_exists ()) {
+ return Xml.Parser.read_file (this.cache_file.get_path (),
+ null,
+ Xml.ParserOption.NOERROR |
+ Xml.ParserOption.NOWARNING);
+ }
+
+ Pid pid;
+ int stdout_fd, stderr_fd;
+
+ try {
+ Process.spawn_async_with_pipes (null,
+ { "/usr/bin/lsdvd",
+ "-Ox",
+ "-x",
+ "-q",
+ this.file.get_path (),
+ null },
+ null,
+ SpawnFlags.DO_NOT_REAP_CHILD,
+ null,
+ out pid,
+ null,
+ out stdout_fd,
+ out stderr_fd);
+ var data = new StringBuilder ();
+ var io_channel = new IOChannel.unix_new (stdout_fd);
+ var io_watch = io_channel.add_watch (IOCondition.IN |
+ IOCondition.PRI,
+ () => {
+ string line;
+
+ try {
+ io_channel.read_to_end (out line, null);
+ data.append (line);
+ } catch (Error error) { }
+
+ return true;
+ });
+
+ uint child_watch = 0;
+ child_watch = ChildWatch.add (pid, () => {
+ Source.remove (child_watch);
+ Source.remove (io_watch);
+ Process.close_pid (pid);
+
+ get_information.callback ();
+ });
+
+ yield;
+
+ try {
+ this.cache_file.replace_contents (data.str.data,
+ null,
+ false,
+ FileCreateFlags.NONE,
+ null);
+ } catch (Error rc_error) {
+ debug ("Failed to cache lsdvd output: %s", rc_error.message);
+ }
+
+ return Xml.Parser.read_memory (data.str,
+ (int) data.len,
+ null,
+ null,
+ Xml.ParserOption.NOERROR |
+ Xml.ParserOption.NOWARNING);
+ } catch (SpawnError error) {
+ debug ("Failed to run lsdvd: %s", error.message);
+ }
+
+ return null;
+ }
+}
diff --git a/src/plugins/media-export/rygel-media-export-harvester.vala
b/src/plugins/media-export/rygel-media-export-harvester.vala
index d85489c..8fb7635 100644
--- a/src/plugins/media-export/rygel-media-export-harvester.vala
+++ b/src/plugins/media-export/rygel-media-export-harvester.vala
@@ -73,7 +73,8 @@ internal class Rygel.MediaExport.Harvester : GLib.Object {
info.get_content_type () == "application/ogg" ||
info.get_content_type () == "application/xml" ||
info.get_content_type () == "text/xml" ||
- info.get_content_type () == "text/plain";
+ info.get_content_type () == "text/plain" ||
+ info.get_content_type () == "application/x-cd-image";
}
/**
diff --git a/src/plugins/media-export/rygel-media-export-metadata-extractor.vala
b/src/plugins/media-export/rygel-media-export-metadata-extractor.vala
index 6024cdc..41a5742 100644
--- a/src/plugins/media-export/rygel-media-export-metadata-extractor.vala
+++ b/src/plugins/media-export/rygel-media-export-metadata-extractor.vala
@@ -59,6 +59,8 @@ public class Rygel.MediaExport.MetadataExtractor: GLib.Object {
private bool extract_metadata;
+ private DVDParser dvd_parser;
+
public MetadataExtractor () {
this.file_hash = new HashMap<string, File> ();
@@ -68,26 +70,36 @@ public class Rygel.MediaExport.MetadataExtractor: GLib.Object {
}
public void extract (File file, string content_type) {
- if (this.extract_metadata && !content_type.has_prefix ("text/")) {
- string uri = file.get_uri ();
- try {
- var gst_timeout = (ClockTime) (this.timeout * Gst.SECOND);
-
- this.discoverer = new Discoverer (gst_timeout);
- } catch (Error error) {
- debug ("Failed to create a discoverer. Doing basic extraction.");
- this.extract_basic_information (file, null, null);
-
- return;
- }
- this.file_hash.set (uri, file);
- this.discoverer.discovered.connect (on_done);
- this.discoverer.start ();
- this.discoverer.discover_uri_async (uri);
- this.guesser = new GUPnPDLNA.ProfileGuesser (true, true);
- } else {
+ if (!this.extract_metadata || content_type.has_prefix ("text/")) {
+ this.extract_basic_information (file, null, null);
+
+ return;
+ }
+
+ if (content_type == "application/x-cd-image") {
+ this.dvd_parser = new DVDParser (file);
+ this.dvd_parser.run.begin ();
+
+ return;
+ }
+
+ var uri = file.get_uri ();
+ try {
+ var gst_timeout = (ClockTime) (this.timeout * Gst.SECOND);
+
+ this.discoverer = new Discoverer (gst_timeout);
+ } catch (Error error) {
+ debug ("Failed to create a discoverer. Doing basic extraction.");
this.extract_basic_information (file, null, null);
+
+ return;
}
+
+ this.file_hash.set (uri, file);
+ this.discoverer.discovered.connect (on_done);
+ this.discoverer.start ();
+ this.discoverer.discover_uri_async (uri);
+ this.guesser = new GUPnPDLNA.ProfileGuesser (true, true);
}
private void on_done (DiscovererInfo info, GLib.Error err) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]