[shotwell/wip/phako/external-gstreamer: 40/43] WIP



commit 8bdef17912e9313d0c8c88be4dd1c04f75964539
Author: Jens Georg <mail jensge org>
Date:   Sat May 18 12:03:49 2019 +0200

    WIP

 src/video-support/AVIMetadataLoader.vala          |  4 +-
 src/video-support/QuicktimeMetdataLoader.vala     |  4 +-
 src/video-support/VideoMetadata.vala              | 34 +++++++--------
 src/video-support/VideoMetadataInterface.vala     |  1 +
 src/video-support/VideoMetadataReaderProcess.vala | 51 ++++++++++++++++++++---
 src/video-support/VideoReader.vala                | 34 +++++++++------
 src/video-support/meson.build                     |  7 +++-
 7 files changed, 95 insertions(+), 40 deletions(-)
---
diff --git a/src/video-support/AVIMetadataLoader.vala b/src/video-support/AVIMetadataLoader.vala
index 7ba6fe88..037afde0 100644
--- a/src/video-support/AVIMetadataLoader.vala
+++ b/src/video-support/AVIMetadataLoader.vala
@@ -15,8 +15,8 @@ public class AVIMetadataLoader {
         this.file = file;
     }
 
-    public MetadataDateTime? get_creation_date_time() {
-        return new MetadataDateTime((time_t) get_creation_date_time_for_avi());
+    public string get_creation_date_time() {
+        return get_creation_date_time_for_avi().to_string();
     }
 
     public string? get_title() {
diff --git a/src/video-support/QuicktimeMetdataLoader.vala b/src/video-support/QuicktimeMetdataLoader.vala
index 4a9eec33..4da84efc 100644
--- a/src/video-support/QuicktimeMetdataLoader.vala
+++ b/src/video-support/QuicktimeMetdataLoader.vala
@@ -10,8 +10,8 @@ public class QuickTimeMetadataLoader {
         this.file = file;
     }
 
-    public MetadataDateTime? get_creation_date_time() {
-        return new MetadataDateTime((time_t) get_creation_date_time_for_quicktime());
+    public string get_creation_date_time() {
+        return get_creation_date_time_for_quicktime().to_string();
     }
 
     public string? get_title() {
diff --git a/src/video-support/VideoMetadata.vala b/src/video-support/VideoMetadata.vala
index 02580f80..f6d20b88 100644
--- a/src/video-support/VideoMetadata.vala
+++ b/src/video-support/VideoMetadata.vala
@@ -17,23 +17,23 @@ public class VideoMetadata : MediaMetadata {
     }
 
     public override void read_from_file(File file) throws Error {
-        QuickTimeMetadataLoader quicktime = new QuickTimeMetadataLoader(file);
-        if (quicktime.is_supported()) {
-            timestamp = quicktime.get_creation_date_time();
-            title = quicktime.get_title();
-               // TODO: is there an quicktime.get_comment ??
-            comment = null;
-            return;
-        }
-        AVIMetadataLoader avi = new AVIMetadataLoader(file);
-        if (avi.is_supported()) {
-            timestamp = avi.get_creation_date_time();
-            title = avi.get_title();
-            comment = null;
-            return;
-        }
-
-        throw new IOError.NOT_SUPPORTED("File %s is not a supported video format", file.get_path());
+        var reader = VideoMetadataReader.get_instance();
+
+        var context = new MainContext();
+        context.push_thread_default();
+        var loop = new MainLoop(context, false);
+        AsyncResult result = null;
+
+        reader.read_metadata.begin(file.get_uri(), (obj, res) => {
+                result = res;
+                loop.quit();
+        });
+        loop.run();
+        var values = reader.read_metadata.end(result);
+        context.pop_thread_default();
+        timestamp = new MetadataDateTime((time_t) ulong.parse(values[0]));
+        title = values[1];
+        comment = values[2];
     }
 
     public override MetadataDateTime? get_creation_date_time() {
diff --git a/src/video-support/VideoMetadataInterface.vala b/src/video-support/VideoMetadataInterface.vala
index 7d25a2a8..1d8ba628 100644
--- a/src/video-support/VideoMetadataInterface.vala
+++ b/src/video-support/VideoMetadataInterface.vala
@@ -1,4 +1,5 @@
 [DBus (name = "org.gnome.Shotwell.VideoMetadata1")]
 public interface VideoMetadataReaderInterface : Object {
     public abstract async uint64 get_duration(string uri) throws Error;
+    public abstract async string[] read_metadata(string uri) throws Error;
 }
diff --git a/src/video-support/VideoMetadataReaderProcess.vala 
b/src/video-support/VideoMetadataReaderProcess.vala
index 59ec2223..1373c759 100644
--- a/src/video-support/VideoMetadataReaderProcess.vala
+++ b/src/video-support/VideoMetadataReaderProcess.vala
@@ -2,10 +2,11 @@ using Gst;
 using Gst.PbUtils;
 
 static string address;
+static string uri;
 static MainLoop loop;
 
 const OptionEntry[] options = {
-    { "address", 'a', 0, OptionArg.STRING, ref address, "Address of private bus", "ADDRESS" },
+    { "address", 'a', 0, OptionArg.STRING, ref address, "ADDRESS of private bus", "ADDRESS" },
     { null }
 };
 
@@ -62,6 +63,38 @@ internal class MetadataReader : GLib.Object {
         return info.get_duration();
     }
 
+    public async string[] read_metadata(string uri) throws Error {
+        string[] return_values = { null, null, null, null };
+        var file = File.new_for_uri(uri);
+        var path = file.get_path();
+
+        if (path != null) {
+            uri = Filename.to_uri(path);
+        }
+
+        var quicktime = new QuickTimeMetadataLoader(File.new_for_uri(uri));
+        if (quicktime.is_supported()) {
+            return_values[0] = quicktime.get_creation_date_time().to_string();
+            return_values[1] = quicktime.get_title();
+            Idle.add(() => { read_metadata.callback(); return false; });
+            yield;
+            return return_values;
+        }
+
+        var avi = new AVIMetadataLoader(File.new_for_uri(uri));
+        if (avi.is_supported()) {
+            return_values[0] = avi.get_creation_date_time().to_string();
+            return_values[1] = avi.get_title();
+            Idle.add(() => { read_metadata.callback(); return false; });
+            yield;
+            return return_values;
+        }
+
+        Idle.add(() => { read_metadata.callback(); return false; });
+        yield;
+        throw new IOError.NOT_SUPPORTED("File %s is not a supported video format", file.get_path());
+    }
+
     private void setup_reader() throws Error {
         discoverer = new Gst.PbUtils.Discoverer (Gst.SECOND * 5);
         discoverer.start();
@@ -99,11 +132,17 @@ int main(string[] args) {
     try {
         option_context.parse (ref args);
 
-        var observer = new DBusAuthObserver();
-        observer.authorize_authenticated_peer.connect(on_authorize_peer);
-        var connection = new DBusConnection.for_address_sync(address, 
DBusConnectionFlags.AUTHENTICATION_CLIENT,
-                                                         observer, null);
-        connection.register_object ("/org/gnome/Shotwell/VideoMetadata1", new MetadataReader());
+        if (address == null && uri == null) {
+            error("Must either provide --uri or --address");
+        }
+
+        if (address != null) {
+            var observer = new DBusAuthObserver();
+            observer.authorize_authenticated_peer.connect(on_authorize_peer);
+            var connection = new DBusConnection.for_address_sync(address, 
DBusConnectionFlags.AUTHENTICATION_CLIENT,
+                    observer, null);
+            connection.register_object ("/org/gnome/Shotwell/VideoMetadata1", new MetadataReader());
+        }
 
         loop = new MainLoop(null, false);
         loop.run();
diff --git a/src/video-support/VideoReader.vala b/src/video-support/VideoReader.vala
index 75cb90a0..677ede21 100644
--- a/src/video-support/VideoReader.vala
+++ b/src/video-support/VideoReader.vala
@@ -13,17 +13,36 @@ public errordomain VideoError {
 }
 
 internal class VideoMetadataReader : ExternalProxy<VideoMetadataReaderInterface>, 
VideoMetadataReaderInterface {
-    public VideoMetadataReader() throws Error {
+    private static VideoMetadataReader instance;
+
+    public static VideoMetadataReader get_instance() {
+        if (instance == null) {
+            try {
+                instance = new VideoMetadataReader();
+            } catch (Error error) {
+                critical ("Failed to create VideoMetadataReader: %s", error.message);
+            }
+        }
+
+        return instance;
+    }
+
+    protected VideoMetadataReader() throws Error {
         Object(dbus_path : "/org/gnome/Shotwell/VideoMetadata1", remote_helper_path : 
AppDirs.get_metadata_helper().get_path());
         init();
     }
 
     public async uint64 get_duration(string uri) throws Error {
-        print("Getting the duration of %s: \n", uri);
         var r = yield get_remote();
 
         return yield r.get_duration(uri);
     }
+
+    public async string[] read_metadata(string uri) throws Error {
+        var r = yield get_remote();
+
+        return yield r.read_metadata(uri);
+    }
 }
 
 public class VideoReader {
@@ -43,8 +62,6 @@ public class VideoReader {
         this.file = file;
      }
 
-    private static VideoMetadataReader reader;
-
     public static bool is_supported_video_file(File file) {
         var mime_type = ContentType.guess(file.get_basename(), new uchar[0], null);
         // special case: deep-check content-type of files ending with .ogg
@@ -196,14 +213,7 @@ public class VideoReader {
             throw new VideoError.FILE("video file '%s' does not exist or is inaccessible".printf(
                 file.get_path()));
 
-        if (VideoReader.reader == null) {
-            try {
-                VideoReader.reader = new VideoMetadataReader();
-            } catch (Error error) {
-                critical("Failed to create Videometadataeader: %s", error.message);
-            }
-        }
-
+        var reader = VideoMetadataReader.get_instance();
         try {
             var context = new MainContext();
             context.push_thread_default();
diff --git a/src/video-support/meson.build b/src/video-support/meson.build
index da3f9d73..93079e47 100644
--- a/src/video-support/meson.build
+++ b/src/video-support/meson.build
@@ -1,7 +1,12 @@
 executable(
     'shotwell-video-metadata-handler',
     [
-        'VideoMetadataReaderProcess.vala'
+        'VideoMetadataReaderProcess.vala',
+        'QuicktimeMetdataLoader.vala',
+        'AVIMetadataLoader.vala',
+        'AVIChunk.vala',
+        'QuickTimeAtom.vala',
+        'util.vala'
     ],
     dependencies : [
         gio,


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