[tracker-miners/wip/carlosg/split-dataobject-informationelement: 37/38] libtracker-extract: Add XMP helper to extract from sidecar
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker-miners/wip/carlosg/split-dataobject-informationelement: 37/38] libtracker-extract: Add XMP helper to extract from sidecar
- Date: Thu, 30 Apr 2020 11:18:42 +0000 (UTC)
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]