Re: [Tracker] [PATCH] Read XMP Sidecar
- From: Jason Kivlighn <jkivlighn gmail com>
- To: jamie <jamiemcc blueyonder co uk>
- Cc: CC Developer Mailing List <cc-devel lists ibiblio org>, tracker-list gnome org
- Subject: Re: [Tracker] [PATCH] Read XMP Sidecar
- Date: Mon, 02 Jul 2007 17:32:19 -0700
Here's an updated patch. When a sidecar file is modified, it now checks
for any master files (plural) and updates those accordingly. This
should handle any situation, such that sidecar/master file(s) are always
in sync.
-Jason
On Mon, 2007-06-11 at 21:12 -0700, Jason Kivlighn wrote:
Here's a patch to have Tracker read XMP sidecar files. It adds a
configure check for Exempi, enabling reading XMP if found.
looks good other than minor styling issues and memory leak as I pointed
out before - can you correct these please?
One problem I see is how to handle updating the associated file when
it's sidecar file is updated.
you will need to handle the case when the xmp file changes - suggest
changing the filename extension to the master filename if its xmp when a
file is queued for processing
let me know if you need help with this
thanks
jamie
Index: src/trackerd/tracker-db.c
===================================================================
--- src/trackerd/tracker-db.c (revision 623)
+++ src/trackerd/tracker-db.c (working copy)
@@ -1,5 +1,7 @@
/* Tracker - indexer and metadata database engine
* Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
+ * Copyright (C) 2007, Jason Kivlighn (jkivlighn gmail com)
+ * Copyright (C) 2007, Creative Commons (http://creativecommons.org)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
@@ -29,6 +31,7 @@
extern Tracker *tracker;
+#define XMP_MIME_TYPE "application/rdf+xml"
typedef struct {
DBConnection *db_con;
@@ -834,7 +837,41 @@
}
+void
+tracker_db_index_master_files (DBConnection *db_con, const gchar *dirname, const gchar *basename, const
gchar *filename)
+{
+ GDir* dir = g_dir_open (dirname, 0, NULL);
+ if (dir) {
+ const gchar *curr_ext;
+ const gchar *curr_filename;
+ FileInfo *master_info;
+ gchar *master_uri;
+
+ while ((curr_filename = g_dir_read_name (dir)) != NULL) {
+ curr_ext = strrchr (curr_filename, '.');
+ if (!curr_ext) {
+ curr_ext = &curr_filename[strlen (curr_filename)];
+ }
+
+ if (strncmp (basename, curr_filename, curr_ext-curr_filename) == 0 &&
+ strcmp (curr_ext+1, "xmp") != 0 &&
+ !g_str_has_suffix (curr_ext+1, "~")) {
+ tracker_debug ("master file, %s, about to be updated", curr_filename);
+
+ master_uri = g_build_filename (dirname, curr_filename, NULL);
+ master_info = tracker_create_file_info (master_uri,
TRACKER_ACTION_EXTRACT_METADATA, 0, 0);
+ master_info = tracker_db_get_file_info (db_con, master_info);
+ g_free (master_uri);
+
+ tracker_db_index_file (db_con, master_info, NULL, NULL);
+ }
+ }
+ g_dir_close (dir);
+ }
+}
+
+
void
tracker_db_index_file (DBConnection *db_con, FileInfo *info, const char *attachment_uri, const char
*attachment_service)
{
@@ -844,8 +881,9 @@
GHashTable *meta_table;
const char *ext;
+ char *filename, *dirname;
char *str_link_uri, *service_name;
- gboolean is_file_indexable, service_has_metadata, is_external_service, service_has_fulltext,
service_has_thumbs;
+ gboolean is_file_indexable, service_has_metadata, is_external_service, service_has_fulltext,
service_has_thumbs, is_sidecar;
const char *uri;
@@ -888,15 +926,20 @@
tracker_add_metadata_to_table (meta_table, g_strdup ("File:NameDelimited"), g_strdup (uri));
- ext = strrchr (uri, '.');
+ dirname = g_path_get_dirname (uri);
+ filename = g_path_get_basename (uri);
+ ext = strrchr (filename, '.');
if (ext) {
ext++;
tracker_debug ("file extension is %s", ext);
tracker_add_metadata_to_table (meta_table, g_strdup ("File:Ext"), g_strdup (ext));
+ is_sidecar = strcmp("xmp",ext) == 0;
+ } else {
+ is_sidecar = FALSE;
}
- tracker_add_metadata_to_table (meta_table, g_strdup ("File:Path"), g_path_get_dirname (uri));
- tracker_add_metadata_to_table (meta_table, g_strdup ("File:Name"), g_path_get_basename
(uri));
+ tracker_add_metadata_to_table (meta_table, g_strdup ("File:Path"), g_strdup (dirname));
+ tracker_add_metadata_to_table (meta_table, g_strdup ("File:Name"), g_strdup (filename));
if (str_link_uri) {
tracker_add_metadata_to_table (meta_table, g_strdup ("File:Link"), str_link_uri);
@@ -911,18 +954,46 @@
is_file_indexable = (!info->is_directory && (strcmp (info->mime, "unknown") != 0) && (strcmp
(info->mime, "symlink") != 0) && tracker_file_is_indexable (info->uri));
service_has_metadata = (is_external_service ||
- (is_file_indexable && (tracker_str_in_array (service_name,
services_with_metadata) != -1)));
+ (is_file_indexable && (tracker_str_in_array (service_name,
services_with_metadata) != -1))) && !is_sidecar;
service_has_fulltext = (is_external_service ||
- (is_file_indexable && (tracker_str_in_array (service_name,
services_with_text) != -1)));
+ (is_file_indexable && (tracker_str_in_array (service_name,
services_with_text) != -1))) && !is_sidecar;
service_has_thumbs = (is_external_service ||
(is_file_indexable && (tracker_str_in_array (service_name,
services_with_thumbs) != -1)));
+ #ifdef HAVE_EXEMPI
+ if (!info->is_directory) {
+ gchar *basename;
+ if (ext) {
+ basename = g_strndup (filename, ext-filename-1);
+ }
+ else {
+ basename = g_strdup (filename);
+ }
+ if (is_sidecar) {
+ tracker_db_index_master_files (db_con, dirname, basename, filename);
+ } else {
+ gchar *sidecar_filename = g_strconcat (basename, ".xmp", NULL);
+ gchar *sidecar_uri = g_build_filename (dirname, sidecar_filename, NULL);
+
+ if (g_file_test (sidecar_uri, G_FILE_TEST_EXISTS)) {
+ tracker_debug ("xmp sidecar found for %s", uri);
+ tracker_metadata_get_embedded (sidecar_uri, XMP_MIME_TYPE,
meta_table);
+ }
+
+ g_free (sidecar_filename);
+ g_free (sidecar_uri);
+ }
+ g_free (basename);
+ }
+ #endif
tracker_debug ("file %s has fulltext %d with service %s", info->uri, service_has_fulltext,
service_name);
tracker_db_index_service (db_con, info, service_name, meta_table, uri, attachment_service,
service_has_metadata, service_has_fulltext, service_has_thumbs);
g_hash_table_destroy (meta_table);
+ g_free(filename);
+ g_free(dirname);
} else {
tracker_db_index_service (db_con, info, service_name, NULL, uri, NULL, FALSE, FALSE, FALSE);
Index: configure.ac
===================================================================
--- configure.ac (revision 623)
+++ configure.ac (working copy)
@@ -722,7 +722,7 @@
exif (jpeg): $have_libexif
gsf: $have_libgsf
video files: $videos_are_handled ($videos_handler)
- embedded xmp: $have_exempi
+ embedded/sidecar xmp: $have_exempi
"
if test "x$enable_external_sqlite" = "xyes"; then
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]