[tracker/writeback: 16/23] Added writeback module for XMP
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/writeback: 16/23] Added writeback module for XMP
- Date: Sun, 22 Nov 2009 12:40:52 +0000 (UTC)
commit 80305121e9f9168b385f034223060360d1ec414e
Author: Philip Van Hoof <philip codeminded be>
Date: Wed Nov 18 12:54:16 2009 +0100
Added writeback module for XMP
src/tracker-writeback/Makefile.am | 13 ++-
src/tracker-writeback/tracker-writeback-mp3.c | 29 +++--
src/tracker-writeback/tracker-writeback-xmp.c | 175 +++++++++++++++++++++++++
3 files changed, 202 insertions(+), 15 deletions(-)
---
diff --git a/src/tracker-writeback/Makefile.am b/src/tracker-writeback/Makefile.am
index bc47048..8ba7a20 100644
--- a/src/tracker-writeback/Makefile.am
+++ b/src/tracker-writeback/Makefile.am
@@ -15,18 +15,27 @@ INCLUDES = \
$(GCOV_CFLAGS) \
$(GMODULE_CFLAGS) \
$(DBUS_CFLAGS) \
- $(ID3LIB_CFLAGS)
+ $(ID3LIB_CFLAGS) \
+ $(EXEMPI_CFLAGS)
modules_LTLIBRARIES =
# MP3
if HAVE_ID3LIB
-modules_LTLIBRARIES+=libwriteback-mp3.la
+modules_LTLIBRARIES += libwriteback-mp3.la
libwriteback_mp3_la_SOURCES = tracker-writeback-mp3.c
libwriteback_mp3_la_LDFLAGS = $(module_flags)
libwriteback_mp3_la_LIBADD = $(GLIB2_LIBS) $(GCOV_LIBS) $(ID3LIB_LIBS)
endif
+# XMP
+if HAVE_EXEMPI
+modules_LTLIBRARIES += libwriteback-xmp.la
+libwriteback_xmp_la_SOURCES = tracker-writeback-xmp.c
+libwriteback_xmp_la_LDFLAGS = $(module_flags)
+libwriteback_xmp_la_LIBADD = $(GLIB2_LIBS) $(GCOV_LIBS) $(EXEMPI_LIBS)
+endif
+
#
# Binaries
#
diff --git a/src/tracker-writeback/tracker-writeback-mp3.c b/src/tracker-writeback/tracker-writeback-mp3.c
index b67d43e..ec2a34b 100644
--- a/src/tracker-writeback/tracker-writeback-mp3.c
+++ b/src/tracker-writeback/tracker-writeback-mp3.c
@@ -32,26 +32,26 @@ typedef struct TrackerWritebackMP3 TrackerWritebackMP3;
typedef struct TrackerWritebackMP3Class TrackerWritebackMP3Class;
struct TrackerWritebackMP3 {
- TrackerWritebackFile parent_instance;
+ TrackerWritebackFile parent_instance;
};
struct TrackerWritebackMP3Class {
- TrackerWritebackFileClass parent_class;
+ TrackerWritebackFileClass parent_class;
};
-static GType tracker_writeback_mp3_get_type (void) G_GNUC_CONST;
+static GType tracker_writeback_mp3_get_type (void) G_GNUC_CONST;
static gboolean tracker_writeback_mp3_update_file_metadata (TrackerWritebackFile *writeback_file,
- GFile *file,
- GPtrArray *values);
+ GFile *file,
+ GPtrArray *values);
G_DEFINE_DYNAMIC_TYPE (TrackerWritebackMP3, tracker_writeback_mp3, TRACKER_TYPE_WRITEBACK_FILE);
static void
tracker_writeback_mp3_class_init (TrackerWritebackMP3Class *klass)
{
- TrackerWritebackFileClass *writeback_file_class = TRACKER_WRITEBACK_FILE_CLASS (klass);
+ TrackerWritebackFileClass *writeback_file_class = TRACKER_WRITEBACK_FILE_CLASS (klass);
- writeback_file_class->update_file_metadata = tracker_writeback_mp3_update_file_metadata;
+ writeback_file_class->update_file_metadata = tracker_writeback_mp3_update_file_metadata;
}
static void
@@ -75,21 +75,22 @@ tracker_writeback_mp3_update_file_metadata (TrackerWritebackFile *writeback_file
guint n;
file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
- NULL, NULL);
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ NULL, NULL);
if (!file_info) {
return FALSE;
}
mime_type = g_file_info_get_content_type (file_info);
- g_object_unref (file_info);
if (g_strcmp0 (mime_type, "audio/mpeg") != 0 &&
g_strcmp0 (mime_type, "audio/x-mp3") != 0) {
+ g_object_unref (file_info);
return FALSE;
}
+ g_object_unref (file_info);
path = g_file_get_path (file);
for (n = 0; n < values->len; n++) {
@@ -115,9 +116,12 @@ tracker_writeback_mp3_update_file_metadata (TrackerWritebackFile *writeback_file
}
ID3Tag_Update (tag);
- // ID3Frame_Delete (frame);
+ /* Apparently this ain't needed (and crashes)
+ * ID3Frame_Delete (frame); */
ID3Tag_Delete (tag);
}
+
+ /* TODO: Add more */
}
g_free (path);
@@ -136,8 +140,7 @@ writeback_module_create (GTypeModule *module)
const gchar**
writeback_module_get_rdftypes (void)
{
- static const gchar *rdftypes[] = { TRACKER_NFO_PREFIX "Document",
- TRACKER_NMM_PREFIX "MusicPiece",
+ static const gchar *rdftypes[] = { TRACKER_NMM_PREFIX "MusicPiece",
NULL };
return rdftypes;
diff --git a/src/tracker-writeback/tracker-writeback-xmp.c b/src/tracker-writeback/tracker-writeback-xmp.c
new file mode 100644
index 0000000..e8f5009
--- /dev/null
+++ b/src/tracker-writeback/tracker-writeback-xmp.c
@@ -0,0 +1,175 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Authors: Philip Van Hoof <philip codeminded be>
+ */
+
+#include "config.h"
+
+#include <locale.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#include <libtracker-common/tracker-ontology.h>
+
+#include "tracker-writeback-file.h"
+
+#ifdef HAVE_EXEMPI
+
+#include <exempi/xmp.h>
+#include <exempi/xmpconsts.h>
+
+#define TRACKER_TYPE_WRITEBACK_XMP (tracker_writeback_xmp_get_type ())
+
+typedef struct TrackerWritebackXMP TrackerWritebackXMP;
+typedef struct TrackerWritebackXMPClass TrackerWritebackXMPClass;
+
+struct TrackerWritebackXMP {
+ TrackerWritebackFile parent_instance;
+};
+
+struct TrackerWritebackXMPClass {
+ TrackerWritebackFileClass parent_class;
+};
+
+
+static GType tracker_writeback_xmp_get_type (void) G_GNUC_CONST;
+static gboolean tracker_writeback_xmp_update_file_metadata (TrackerWritebackFile *writeback_file,
+ GFile *file,
+ GPtrArray *values);
+
+G_DEFINE_DYNAMIC_TYPE (TrackerWritebackXMP, tracker_writeback_xmp, TRACKER_TYPE_WRITEBACK_FILE);
+
+static void
+tracker_writeback_xmp_class_init (TrackerWritebackXMPClass *klass)
+{
+ TrackerWritebackFileClass *writeback_file_class = TRACKER_WRITEBACK_FILE_CLASS (klass);
+
+ xmp_init ();
+ writeback_file_class->update_file_metadata = tracker_writeback_xmp_update_file_metadata;
+}
+
+static void
+tracker_writeback_xmp_class_finalize (TrackerWritebackXMPClass *klass)
+{
+ xmp_terminate ();
+}
+
+static void
+tracker_writeback_xmp_init (TrackerWritebackXMP *xmp)
+{
+}
+
+static gboolean
+tracker_writeback_xmp_update_file_metadata (TrackerWritebackFile *writeback_file,
+ GFile *file,
+ GPtrArray *values)
+{
+ GFileInfo *file_info;
+ const gchar *mime_type;
+ gchar *path;
+ guint n;
+ XmpFilePtr xmp_files;
+ XmpPtr xmp;
+
+ file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ NULL, NULL);
+
+ if (!file_info) {
+ return FALSE;
+ }
+
+ mime_type = g_file_info_get_content_type (file_info);
+
+ if (g_strcmp0 (mime_type, "application/rdf+xml") != 0 && /* .xmp files */
+ g_strcmp0 (mime_type, "application/pdf") != 0 && /* .pdf files */
+ g_strcmp0 (mime_type, "image/png") != 0 && /* .png files */
+ g_strcmp0 (mime_type, "sketch/png") != 0 && /* .sketch.png files on Maemo*/
+ g_strcmp0 (mime_type, "image/jpeg") != 0 && /* .jpg & .jpeg files */
+ g_strcmp0 (mime_type, "image/tiff") != 0 /* .tiff & .tif files */) {
+ g_object_unref (file_info);
+ return FALSE;
+ }
+
+ g_object_unref (file_info);
+ path = g_file_get_path (file);
+
+ xmp_files = xmp_files_open_new (path, XMP_OPEN_FORUPDATE);
+
+ if (!xmp_files) {
+ g_free (path);
+ return FALSE;
+ }
+
+ xmp = xmp_files_get_new_xmp (xmp_files);
+
+ if (!xmp) {
+ g_free (path);
+ return FALSE;
+ }
+
+ for (n = 0; n < values->len; n++) {
+ const GStrv row = g_ptr_array_index (values, n);
+
+ if (g_strcmp0 (row[1], TRACKER_NIE_PREFIX "title") == 0) {
+ xmp_set_property(xmp, NS_EXIF, "Title", row[2], 0);
+ }
+
+ /* TODO: Add more */
+ }
+
+ /* I don't know why, but it looks like it ain't being written to the
+ * file at all :( */
+
+ if (xmp_files_can_put_xmp(xmp_files, xmp)) {
+ xmp_files_put_xmp(xmp_files, xmp);
+ }
+
+ xmp_files_close (xmp_files, XMP_CLOSE_SAFEUPDATE);
+
+ xmp_free (xmp);
+ xmp_files_free (xmp_files);
+ g_free (path);
+
+ return TRUE;
+}
+
+TrackerWriteback *
+writeback_module_create (GTypeModule *module)
+{
+ tracker_writeback_xmp_register_type (module);
+
+ return g_object_new (TRACKER_TYPE_WRITEBACK_XMP, NULL);
+}
+
+const gchar**
+writeback_module_get_rdftypes (void)
+{
+ static const gchar *rdftypes[] = { TRACKER_NFO_PREFIX "Image",
+ NULL };
+
+ return rdftypes;
+}
+
+#endif /* HAVE_EXEMPI */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]