[tracker-miners/wip/carlosg/split-dataobject-informationelement: 37/38] libtracker-extract: Add XMP helper to extract from sidecar



commit 7c4ad24201943590b64d247430d9421c6ba22677
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Apr 30 12:44:40 2020 +0200

    libtracker-extract: Add XMP helper to extract from sidecar
    
    This will look up a sidecar file, and load the XMP data if it
    exists.

 src/libtracker-extract/tracker-xmp.c | 61 ++++++++++++++++++++++++++++++++++++
 src/libtracker-extract/tracker-xmp.h |  3 ++
 2 files changed, 64 insertions(+)
---
diff --git a/src/libtracker-extract/tracker-xmp.c b/src/libtracker-extract/tracker-xmp.c
index af45436ab..65d75ad64 100644
--- a/src/libtracker-extract/tracker-xmp.c
+++ b/src/libtracker-extract/tracker-xmp.c
@@ -20,6 +20,7 @@
 #include "config-miners.h"
 
 #include <locale.h>
+#include <string.h>
 
 #include <libtracker-miners-common/tracker-utils.h>
 
@@ -789,6 +790,66 @@ tracker_xmp_new (const gchar *buffer,
        return data;
 }
 
+gchar *
+replace_extension (gchar *path)
+{
+       const gchar *dot;
+       gchar *prefix, *xmp_path;
+
+       dot = strrchr (path, '.');
+       if (!dot)
+               return NULL;
+
+       prefix = g_strndup (path, dot - path);
+       xmp_path = g_strdup_printf ("%s.xmp", prefix);
+       g_free (prefix);
+
+       return xmp_path;
+}
+
+TrackerXmpData *
+tracker_xmp_new_from_sidecar (GFile  *orig_file,
+                              gchar **sidecar_uri)
+{
+       GMappedFile *mapped_file;
+       TrackerXmpData *xmp_data;
+       gchar *path, *xmp_path, *uri;
+       GBytes *bytes;
+
+       if (sidecar_uri)
+               *sidecar_uri = NULL;
+
+       path = g_file_get_path (orig_file);
+       xmp_path = replace_extension (path);
+       if (!xmp_path)
+               return NULL;
+
+       if (!g_file_test (xmp_path, G_FILE_TEST_IS_REGULAR))
+               return NULL;
+
+       mapped_file = g_mapped_file_new (xmp_path, FALSE, NULL);
+       if (!mapped_file) {
+               g_free (xmp_path);
+               return NULL;
+       }
+
+       bytes = g_mapped_file_get_bytes (mapped_file);
+       uri = g_file_get_uri (orig_file);
+       xmp_data = tracker_xmp_new (g_bytes_get_data (bytes, NULL),
+                                   g_bytes_get_size (bytes),
+                                   uri);
+       g_bytes_unref (bytes);
+       g_mapped_file_unref (mapped_file);
+       g_free (uri);
+
+       if (sidecar_uri)
+               *sidecar_uri = g_filename_to_uri (xmp_path, NULL, NULL);
+
+       g_free (xmp_path);
+
+       return xmp_data;
+}
+
 /**
  * tracker_xmp_free:
  * @data: a #TrackerXmpData struct
diff --git a/src/libtracker-extract/tracker-xmp.h b/src/libtracker-extract/tracker-xmp.h
index 3a3016d75..c5ef4a751 100644
--- a/src/libtracker-extract/tracker-xmp.h
+++ b/src/libtracker-extract/tracker-xmp.h
@@ -170,8 +170,11 @@ typedef struct {
 TrackerXmpData *tracker_xmp_new           (const gchar          *buffer,
                                            gsize                 len,
                                            const gchar          *uri);
+TrackerXmpData *tracker_xmp_new_from_sidecar (GFile             *orig_file,
+                                              gchar            **sidecar_uri);
 void            tracker_xmp_free          (TrackerXmpData       *data);
 
+
 gboolean        tracker_xmp_apply_to_resource         (TrackerResource *resource,
                                                        TrackerXmpData  *data);
 gboolean        tracker_xmp_apply_regions_to_resource (TrackerResource *resource,


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