[tracker/tracker-0.6] Add multivalue support for all image metadata formats



commit 255d2611dd7aa5cb065106803a2ca05798a7e0af
Author: Mikael Ottela <mikael ottela ixonos com>
Date:   Thu May 14 06:13:28 2009 +0300

    Add multivalue support for all image metadata formats
    
    Add support for multivalued fields in all image metadata formats and fix how
    HasKeywords is used.
    
    Fixes NB#110584.
---
 src/tracker-extract/tracker-extract-gstreamer.c |    3 -
 src/tracker-extract/tracker-extract-jpeg.c      |  115 +++++++++++++++------
 src/tracker-extract/tracker-extract-png.c       |   86 ++++++++++++---
 src/tracker-extract/tracker-extract-tiff.c      |  128 ++++++++++++++++-------
 src/tracker-extract/tracker-iptc.c              |    7 +-
 src/tracker-extract/tracker-xmp.c               |   18 +---
 6 files changed, 248 insertions(+), 109 deletions(-)

diff --git a/src/tracker-extract/tracker-extract-gstreamer.c b/src/tracker-extract/tracker-extract-gstreamer.c
index 90a498c..9b7323c 100644
--- a/src/tracker-extract/tracker-extract-gstreamer.c
+++ b/src/tracker-extract/tracker-extract-gstreamer.c
@@ -375,13 +375,10 @@ dbin_dpad_cb (GstElement* e, GstPad* pad, gboolean cont, gpointer data)
 	
 	g_value_init (&val, G_TYPE_INT);
 	g_value_set_int (&val, 50);
-
 	g_object_set_property (G_OBJECT (fsink), "preroll-queue-len", &val);
-
 	g_value_unset (&val);
 
 	extractor->fsinks = g_list_append (extractor->fsinks, fsink);
-	
 	gst_element_set_state (fsink, GST_STATE_PAUSED);
 	
 	gst_bin_add (GST_BIN (extractor->pipeline), fsink);
diff --git a/src/tracker-extract/tracker-extract-jpeg.c b/src/tracker-extract/tracker-extract-jpeg.c
index 42e8a8b..647e549 100644
--- a/src/tracker-extract/tracker-extract-jpeg.c
+++ b/src/tracker-extract/tracker-extract-jpeg.c
@@ -19,10 +19,6 @@
  * Boston, MA  02110-1301, USA.
  */
 
-/*
- * FIXME: We should try to get raw data (from libexif) to avoid processing.
- */
-
 #include "config.h"
 
 #include <stdio.h>
@@ -92,6 +88,7 @@ typedef gchar * (*PostProcessor) (const gchar*);
 typedef struct {
 	ExifTag       tag;
 	gchar	     *name;
+	gboolean      multi;
 	PostProcessor post;
 } TagType;
 
@@ -103,37 +100,87 @@ static gchar *fix_exposure_time (const gchar *et);
 static gchar *fix_orientation   (const gchar *orientation);
 
 static TagType tags[] = {
-	{ EXIF_TAG_PIXEL_Y_DIMENSION, "Image:Height", NULL },
-	{ EXIF_TAG_PIXEL_X_DIMENSION, "Image:Width", NULL },
-	{ EXIF_TAG_RELATED_IMAGE_WIDTH, "Image:Width", NULL },
-	{ EXIF_TAG_DOCUMENT_NAME, "Image:Title", NULL },
+	{ EXIF_TAG_PIXEL_Y_DIMENSION, "Image:Height", FALSE, NULL },
+	{ EXIF_TAG_PIXEL_X_DIMENSION, "Image:Width", FALSE, NULL },
+	{ EXIF_TAG_RELATED_IMAGE_WIDTH, "Image:Width", FALSE, NULL },
+	{ EXIF_TAG_DOCUMENT_NAME, "Image:Title", FALSE, NULL },
 	/* { -1, "Image:Album", NULL }, */
-	{ EXIF_TAG_DATE_TIME, "Image:Date", date_to_iso8601 },
-	{ EXIF_TAG_DATE_TIME_ORIGINAL, "Image:Date", date_to_iso8601 },
+	{ EXIF_TAG_DATE_TIME, "Image:Date", FALSE, date_to_iso8601, },
+	{ EXIF_TAG_DATE_TIME_ORIGINAL, "Image:Date", FALSE, date_to_iso8601, },
 	/* { -1, "Image:Keywords", NULL }, */
-	{ EXIF_TAG_ARTIST, "Image:Creator", NULL },
-	{ EXIF_TAG_USER_COMMENT, "Image:Comments", NULL },
-	{ EXIF_TAG_IMAGE_DESCRIPTION, "Image:Description", NULL },
-	{ EXIF_TAG_SOFTWARE, "Image:Software", NULL },
-	{ EXIF_TAG_MAKE, "Image:CameraMake", NULL },
-	{ EXIF_TAG_MODEL, "Image:CameraModel", NULL },
-	{ EXIF_TAG_ORIENTATION, "Image:Orientation", fix_orientation },
-	{ EXIF_TAG_EXPOSURE_PROGRAM, "Image:ExposureProgram", NULL },
-	{ EXIF_TAG_EXPOSURE_TIME, "Image:ExposureTime", fix_exposure_time },
-	{ EXIF_TAG_FNUMBER, "Image:FNumber", fix_fnumber },
-	{ EXIF_TAG_FLASH, "Image:Flash", fix_flash },
-	{ EXIF_TAG_FOCAL_LENGTH, "Image:FocalLength", fix_focal_length },
-	{ EXIF_TAG_ISO_SPEED_RATINGS, "Image:ISOSpeed", NULL },
-	{ EXIF_TAG_METERING_MODE, "Image:MeteringMode", NULL },
-	{ EXIF_TAG_WHITE_BALANCE, "Image:WhiteBalance", NULL },
-	{ EXIF_TAG_COPYRIGHT, "File:Copyright", NULL },
-	{ -1, NULL, NULL }
+	{ EXIF_TAG_ARTIST, "Image:Creator", FALSE, NULL },
+	{ EXIF_TAG_USER_COMMENT, "Image:Comments", FALSE, NULL },
+	{ EXIF_TAG_IMAGE_DESCRIPTION, "Image:Description", FALSE, NULL },
+	{ EXIF_TAG_SOFTWARE, "Image:Software", FALSE, NULL },
+	{ EXIF_TAG_MAKE, "Image:CameraMake", FALSE, NULL },
+	{ EXIF_TAG_MODEL, "Image:CameraModel", FALSE, NULL },
+	{ EXIF_TAG_ORIENTATION, "Image:Orientation", FALSE, fix_orientation },
+	{ EXIF_TAG_EXPOSURE_PROGRAM, "Image:ExposureProgram", FALSE, NULL },
+	{ EXIF_TAG_EXPOSURE_TIME, "Image:ExposureTime", FALSE, fix_exposure_time },
+	{ EXIF_TAG_FNUMBER, "Image:FNumber", FALSE, fix_fnumber },
+	{ EXIF_TAG_FLASH, "Image:Flash", FALSE, fix_flash },
+	{ EXIF_TAG_FOCAL_LENGTH, "Image:FocalLength", FALSE, fix_focal_length },
+	{ EXIF_TAG_ISO_SPEED_RATINGS, "Image:ISOSpeed", FALSE, NULL },
+	{ EXIF_TAG_METERING_MODE, "Image:MeteringMode", FALSE, NULL },
+	{ EXIF_TAG_WHITE_BALANCE, "Image:WhiteBalance", FALSE, NULL },
+	{ EXIF_TAG_COPYRIGHT, "File:Copyright", FALSE, NULL },
+	{ -1, NULL, FALSE, NULL }
 };
 
 #endif /* HAVE_EXIF */
 
 #ifdef HAVE_LIBEXIF
 
+static void
+metadata_append (GHashTable *metadata, gchar *key, gchar *value, gboolean append)
+{
+	gchar   *new_value;
+	gchar   *orig;
+	gchar  **list;
+	gboolean found = FALSE;
+	guint    i;
+
+	if (append && (orig = g_hash_table_lookup (metadata, key))) {
+		gchar *escaped;
+		
+		escaped = tracker_escape_metadata (value);
+
+		list = g_strsplit (orig, "|", -1);			
+		for (i=0; list[i]; i++) {
+			if (strcmp (list[i], escaped) == 0) {
+				found = TRUE;
+				break;
+			}
+		}			
+		g_strfreev(list);
+
+		if (!found) {
+			new_value = g_strconcat (orig, "|", escaped, NULL);
+			g_hash_table_insert (metadata, g_strdup (key), new_value);
+		}
+
+		g_free (escaped);		
+	} else {
+		new_value = tracker_escape_metadata (value);
+		g_hash_table_insert (metadata, g_strdup (key), new_value);
+
+		/* FIXME Postprocessing is evil and should be elsewhere */
+		if (strcmp (key, "Image:Keywords") == 0) {
+			g_hash_table_insert (metadata,
+					     g_strdup ("Image:HasKeywords"),
+					     tracker_escape_metadata ("1"));			
+		}		
+	}
+
+	/* Adding certain fields also to HasKeywords FIXME Postprocessing is evil */
+	if ((strcmp (key, "Image:Title") == 0) ||
+	    (strcmp (key, "Image:Description") == 0) ) {
+		g_hash_table_insert (metadata,
+				     g_strdup ("Image:HasKeywords"),
+				     tracker_escape_metadata ("1"));
+	}
+}
+
 static gchar *
 date_to_iso8601 (const gchar *date)
 {
@@ -261,14 +308,16 @@ read_exif (const unsigned char *buffer,
 
 				str = (*p->post) (buffer);
 
-				g_hash_table_insert (metadata,
-						     g_strdup (p->name),
-						     tracker_escape_metadata (str));
+				metadata_append (metadata,
+						 g_strdup (p->name),
+						 tracker_escape_metadata (str),
+						 p->multi);
 				g_free (str);
 			} else {
-				g_hash_table_insert (metadata,
-						     g_strdup (p->name),
-						     tracker_escape_metadata (buffer));
+				metadata_append (metadata,
+						 g_strdup (p->name),
+						 tracker_escape_metadata (buffer),
+						 p->multi);
 			}
 		}
 	}
diff --git a/src/tracker-extract/tracker-extract-png.c b/src/tracker-extract/tracker-extract-png.c
index 114236f..22533dd 100644
--- a/src/tracker-extract/tracker-extract-png.c
+++ b/src/tracker-extract/tracker-extract-png.c
@@ -51,6 +51,7 @@ typedef gchar * (*PostProcessor) (gchar *);
 typedef struct {
 	const gchar   *name;
 	const gchar   *type;
+	gboolean       multi;
 	PostProcessor  post;
 } TagProcessors;
 
@@ -59,16 +60,16 @@ static void   extract_png	      (const gchar *filename,
 				       GHashTable  *metadata);
 
 static TagProcessors tag_processors[] = {
-	{ "Author",	   "Image:Creator",     NULL },
-	{ "Creator",	   "Image:Creator",     NULL },
-	{ "Description",   "Image:Description", NULL },
-	{ "Comment",	   "Image:Comments",    NULL },
-	{ "Copyright",	   "File:Copyright",    NULL },
-	{ "Creation Time", "Image:Date",	rfc1123_to_iso8601_date },
-	{ "Title",	   "Image:Title",	NULL },
-	{ "Software",	   "Image:Software",    NULL },
-	{ "Disclaimer",	   "File:License",      NULL },
-	{ NULL,		   NULL,		NULL },
+	{ "Author",	   "Image:Creator",     FALSE, NULL },
+	{ "Creator",	   "Image:Creator",     FALSE, NULL },
+	{ "Description",   "Image:Description", FALSE, NULL },
+	{ "Comment",	   "Image:Comments",    FALSE, NULL },
+	{ "Copyright",	   "File:Copyright",    FALSE, NULL },
+	{ "Creation Time", "Image:Date",	FALSE, rfc1123_to_iso8601_date },
+	{ "Title",	   "Image:Title",	FALSE, NULL },
+	{ "Software",	   "Image:Software",    FALSE, NULL },
+	{ "Disclaimer",	   "File:License",      FALSE, NULL },
+	{ NULL,		   NULL,		FALSE, NULL },
 };
 
 static TrackerExtractData data[] = {
@@ -87,6 +88,57 @@ rfc1123_to_iso8601_date (gchar *date)
 }
 
 static void
+metadata_append (GHashTable *metadata, gchar *key, gchar *value, gboolean append)
+{
+	gchar   *new_value;
+	gchar   *orig;
+	gchar  **list;
+	gboolean found = FALSE;
+	guint    i;
+
+	if (append && (orig = g_hash_table_lookup (metadata, key))) {
+		gchar *escaped;
+		
+		escaped = tracker_escape_metadata (value);
+
+		list = g_strsplit (orig, "|", -1);			
+		for (i=0; list[i]; i++) {
+			if (strcmp (list[i], escaped) == 0) {
+				found = TRUE;
+				break;
+			}
+		}			
+		g_strfreev(list);
+
+		if (!found) {
+			new_value = g_strconcat (orig, "|", escaped, NULL);
+			g_hash_table_insert (metadata, g_strdup (key), new_value);
+		}
+
+		g_free (escaped);		
+	} else {
+		new_value = tracker_escape_metadata (value);
+		g_hash_table_insert (metadata, g_strdup (key), new_value);
+
+		/* FIXME Postprocessing is evil and should be elsewhere */
+		if (strcmp (key, "Image:Keywords") == 0) {
+			g_hash_table_insert (metadata,
+					     g_strdup ("Image:HasKeywords"),
+					     tracker_escape_metadata ("1"));			
+		}		
+	}
+
+	/* Adding certain fields also to keywords FIXME Postprocessing is evil */
+	if ((strcmp (key, "Image:Title") == 0) ||
+	    (strcmp (key, "Image:Description") == 0) ) {
+		metadata_append (metadata, "Image:Keywords", value, TRUE);
+		g_hash_table_insert (metadata,
+				     g_strdup ("Image:HasKeywords"),
+				     tracker_escape_metadata ("1"));
+	}
+}
+
+static void
 read_metadata (png_structp  png_ptr, 
 	       png_infop    info_ptr, 
 	       GHashTable  *metadata)
@@ -123,15 +175,17 @@ read_metadata (png_structp  png_ptr,
 						
 						str = (*tag_processors[j].post) (text_ptr[i].text);
 						if (str) {
-							g_hash_table_insert (metadata,
-									     g_strdup (tag_processors[j].type),
-									     tracker_escape_metadata (str));
+							metadata_append (metadata,
+									 g_strdup (tag_processors[j].type),
+									 tracker_escape_metadata (str),
+									 tag_processors[j].multi);
 							g_free (str);
 						}
 					} else {
-						g_hash_table_insert (metadata,
-								     g_strdup (tag_processors[j].type),
-								     tracker_escape_metadata (text_ptr[i].text));
+						metadata_append (metadata,
+								 g_strdup (tag_processors[j].type),
+								 tracker_escape_metadata (text_ptr[i].text),
+								 tag_processors[j].multi);
 					}
 					
 					break;
diff --git a/src/tracker-extract/tracker-extract-tiff.c b/src/tracker-extract/tracker-extract-tiff.c
index 93d5567..e0e567a 100644
--- a/src/tracker-extract/tracker-extract-tiff.c
+++ b/src/tracker-extract/tracker-extract-tiff.c
@@ -23,6 +23,7 @@
 
 #include <glib.h>
 #include <glib/gstdio.h>
+#include <string.h>
 
 #include <tiff.h>
 #include <tiffio.h>
@@ -51,6 +52,7 @@ typedef struct {
 	guint	       tag;
 	gchar	      *name;
 	TagType        type;
+	gboolean       multi;
 	PostProcessor  post;
 } TiffTag;
  
@@ -65,33 +67,33 @@ static TrackerExtractData data[] = {
 
 /* FIXME: We are missing some */
 static TiffTag tags[] = {
-	{ TIFFTAG_ARTIST, "Image:Creator", TIFF_TAGTYPE_STRING, NULL },
-	{ TIFFTAG_COPYRIGHT, "File:Copyright", TIFF_TAGTYPE_STRING, NULL },
-	{ TIFFTAG_DATETIME, "Image:Date", TIFF_TAGTYPE_STRING, NULL },
-	{ TIFFTAG_DOCUMENTNAME, "Image:Title", TIFF_TAGTYPE_STRING, NULL },
-	{ TIFFTAG_IMAGEDESCRIPTION, "Image:Comments", TIFF_TAGTYPE_STRING, NULL },
-	{ TIFFTAG_IMAGEWIDTH, "Image:Width", TIFF_TAGTYPE_UINT32, NULL },
-	{ TIFFTAG_IMAGELENGTH, "Image:Height", TIFF_TAGTYPE_UINT32, NULL },
-	{ TIFFTAG_MAKE, "Image:CameraMake", TIFF_TAGTYPE_STRING, NULL },
-	{ TIFFTAG_MODEL, "Image:CameraModel", TIFF_TAGTYPE_STRING, NULL },
-	{ TIFFTAG_ORIENTATION, "Image:Orientation", TIFF_TAGTYPE_UINT16, NULL },
-	{ TIFFTAG_SOFTWARE, "Image:Software", TIFF_TAGTYPE_STRING, NULL },
-	{ -1, NULL, TIFF_TAGTYPE_UNDEFINED, NULL }
+	{ TIFFTAG_ARTIST, "Image:Creator", TIFF_TAGTYPE_STRING, FALSE, NULL },
+	{ TIFFTAG_COPYRIGHT, "File:Copyright", TIFF_TAGTYPE_STRING, FALSE, NULL },
+	{ TIFFTAG_DATETIME, "Image:Date", TIFF_TAGTYPE_STRING, FALSE, NULL },
+	{ TIFFTAG_DOCUMENTNAME, "Image:Title", TIFF_TAGTYPE_STRING, FALSE, NULL },
+	{ TIFFTAG_IMAGEDESCRIPTION, "Image:Comments", TIFF_TAGTYPE_STRING, FALSE, NULL },
+	{ TIFFTAG_IMAGEWIDTH, "Image:Width", TIFF_TAGTYPE_UINT32, FALSE, NULL },
+	{ TIFFTAG_IMAGELENGTH, "Image:Height", TIFF_TAGTYPE_UINT32, FALSE, NULL },
+	{ TIFFTAG_MAKE, "Image:CameraMake", TIFF_TAGTYPE_STRING, FALSE, NULL },
+	{ TIFFTAG_MODEL, "Image:CameraModel", TIFF_TAGTYPE_STRING, FALSE, NULL },
+	{ TIFFTAG_ORIENTATION, "Image:Orientation", TIFF_TAGTYPE_UINT16, FALSE, NULL },
+	{ TIFFTAG_SOFTWARE, "Image:Software", TIFF_TAGTYPE_STRING, FALSE, NULL },
+	{ -1, NULL, TIFF_TAGTYPE_UNDEFINED, FALSE, NULL }
 };
 
 static TiffTag exiftags[] = {
-	{ EXIFTAG_EXPOSURETIME, "Image:ExposureTime", TIFF_TAGTYPE_DOUBLE, NULL},
-	{ EXIFTAG_FNUMBER, "Image:FNumber", TIFF_TAGTYPE_DOUBLE, NULL},
-	{ EXIFTAG_EXPOSUREPROGRAM, "Image:ExposureProgram", TIFF_TAGTYPE_UINT16, NULL },
-	{ EXIFTAG_ISOSPEEDRATINGS, "Image:ISOSpeed", TIFF_TAGTYPE_C16_UINT16, NULL},
-	{ EXIFTAG_DATETIMEORIGINAL, "Image:Date", TIFF_TAGTYPE_STRING, date_to_iso8601 },
-	{ EXIFTAG_METERINGMODE, "Image:MeteringMode", TIFF_TAGTYPE_UINT16, NULL},
-	{ EXIFTAG_FLASH, "Image:Flash", TIFF_TAGTYPE_UINT16, NULL},
-	{ EXIFTAG_FOCALLENGTH, "Image:FocalLength", TIFF_TAGTYPE_DOUBLE, NULL},
-	{ EXIFTAG_PIXELXDIMENSION, "Image:Width", TIFF_TAGTYPE_UINT32, NULL},
-	{ EXIFTAG_PIXELYDIMENSION, "Image:Height", TIFF_TAGTYPE_UINT32, NULL},
-	{ EXIFTAG_WHITEBALANCE, "Image:WhiteBalance", TIFF_TAGTYPE_UINT16, NULL},
-	{ -1, NULL, TIFF_TAGTYPE_UNDEFINED, NULL }
+	{ EXIFTAG_EXPOSURETIME, "Image:ExposureTime", TIFF_TAGTYPE_DOUBLE, FALSE, NULL},
+	{ EXIFTAG_FNUMBER, "Image:FNumber", TIFF_TAGTYPE_DOUBLE, FALSE, NULL},
+	{ EXIFTAG_EXPOSUREPROGRAM, "Image:ExposureProgram", TIFF_TAGTYPE_UINT16, FALSE, NULL },
+	{ EXIFTAG_ISOSPEEDRATINGS, "Image:ISOSpeed", TIFF_TAGTYPE_C16_UINT16, FALSE, NULL},
+	{ EXIFTAG_DATETIMEORIGINAL, "Image:Date", TIFF_TAGTYPE_STRING, FALSE, date_to_iso8601 },
+	{ EXIFTAG_METERINGMODE, "Image:MeteringMode", TIFF_TAGTYPE_UINT16, FALSE, NULL},
+	{ EXIFTAG_FLASH, "Image:Flash", TIFF_TAGTYPE_UINT16, FALSE, NULL},
+	{ EXIFTAG_FOCALLENGTH, "Image:FocalLength", TIFF_TAGTYPE_DOUBLE, FALSE, NULL},
+	{ EXIFTAG_PIXELXDIMENSION, "Image:Width", TIFF_TAGTYPE_UINT32, FALSE, NULL},
+	{ EXIFTAG_PIXELYDIMENSION, "Image:Height", TIFF_TAGTYPE_UINT32, FALSE, NULL},
+	{ EXIFTAG_WHITEBALANCE, "Image:WhiteBalance", TIFF_TAGTYPE_UINT16, FALSE, NULL},
+	{ -1, NULL, TIFF_TAGTYPE_UNDEFINED, FALSE, NULL }
 };
 
 static gchar *
@@ -105,6 +107,56 @@ date_to_iso8601 (gchar *date)
 }
 
 static void
+metadata_append (GHashTable *metadata, gchar *key, gchar *value, gboolean append)
+{
+	gchar   *new_value;
+	gchar   *orig;
+	gchar  **list;
+	gboolean found = FALSE;
+	guint    i;
+
+	if (append && (orig = g_hash_table_lookup (metadata, key))) {
+		gchar *escaped;
+		
+		escaped = tracker_escape_metadata (value);
+
+		list = g_strsplit (orig, "|", -1);			
+		for (i=0; list[i]; i++) {
+			if (strcmp (list[i], escaped) == 0) {
+				found = TRUE;
+				break;
+			}
+		}			
+		g_strfreev(list);
+
+		if (!found) {
+			new_value = g_strconcat (orig, "|", escaped, NULL);
+			g_hash_table_insert (metadata, g_strdup (key), new_value);
+		}
+
+		g_free (escaped);		
+	} else {
+		new_value = tracker_escape_metadata (value);
+		g_hash_table_insert (metadata, g_strdup (key), new_value);
+
+		/* FIXME Postprocessing is evil and should be elsewhere */
+		if (strcmp (key, "Image:Keywords") == 0) {
+			g_hash_table_insert (metadata,
+					     g_strdup ("Image:HasKeywords"),
+					     tracker_escape_metadata ("1"));			
+		}		
+	}
+
+	/* Adding certain fields also to keywords FIXME Postprocessing is evil */
+	if ((strcmp (key, "Image:Title") == 0) ||
+	    (strcmp (key, "Image:Description") == 0) ) {
+		g_hash_table_insert (metadata,
+				     g_strdup ("Image:HasKeywords"),
+				     tracker_escape_metadata ("1"));
+	}
+}
+
+static void
 extract_tiff (const gchar *filename, 
 	      GHashTable  *metadata)
 {
@@ -205,13 +257,15 @@ extract_tiff (const gchar *filename,
 				}
 
 				if (tag->post) {
-					g_hash_table_insert (metadata,
-							     g_strdup (tag->name),
-							     tracker_escape_metadata ((*tag->post) (buffer)));
+					metadata_append (metadata,
+							 g_strdup (tag->name),
+							 tracker_escape_metadata ((*tag->post) (buffer)),
+							 tag->multi);
 				} else {
-					g_hash_table_insert (metadata, 
-							     g_strdup (tag->name),
-							     tracker_escape_metadata (buffer));
+					metadata_append (metadata, 
+							 g_strdup (tag->name),
+							 tracker_escape_metadata (buffer),
+							 tag->multi);
 				}
 			}
 		}
@@ -254,13 +308,15 @@ extract_tiff (const gchar *filename,
 			}
 
 		if (tag->post) {
-			g_hash_table_insert (metadata, 
-					     g_strdup (tag->name),
-					     tracker_escape_metadata ((*tag->post) (buffer)));
+			metadata_append (metadata, 
+					 g_strdup (tag->name),
+					 tracker_escape_metadata ((*tag->post) (buffer)),
+					 tag->multi);
 		} else {
-			g_hash_table_insert (metadata, 
-					     g_strdup (tag->name),
-					     tracker_escape_metadata (buffer));
+			metadata_append (metadata, 
+					 g_strdup (tag->name),
+					 tracker_escape_metadata (buffer),
+					 tag->multi);
 		}
 	}
 
diff --git a/src/tracker-extract/tracker-iptc.c b/src/tracker-extract/tracker-iptc.c
index 88d98a3..44efab7 100644
--- a/src/tracker-extract/tracker-iptc.c
+++ b/src/tracker-extract/tracker-iptc.c
@@ -100,11 +100,8 @@ metadata_append (GHashTable *metadata, gchar *key, gchar *value, gboolean append
 	}
 
 	/* Adding certain fields also to keywords FIXME Postprocessing is evil */
-	if ((strcmp (key, "Image:Location") == 0) ||
-	    (strcmp (key, "Image:Sublocation") == 0) ||
-	    (strcmp (key, "Image:Country") == 0) ||
-	    (strcmp (key, "Image:City") == 0) ) {
-		metadata_append (metadata, "Image:Keywords", value, TRUE);
+	if ((strcmp (key, "Image:Title") == 0) ||
+	    (strcmp (key, "Image:Description") == 0) ) {
 		g_hash_table_insert (metadata,
 				     g_strdup ("Image:HasKeywords"),
 				     tracker_escape_metadata ("1"));
diff --git a/src/tracker-extract/tracker-xmp.c b/src/tracker-extract/tracker-xmp.c
index c9d9282..5b4a5a1 100644
--- a/src/tracker-extract/tracker-xmp.c
+++ b/src/tracker-extract/tracker-xmp.c
@@ -261,6 +261,7 @@ tracker_xmp_iter_simple (GHashTable  *metadata,
 	if (strcmp (schema, NS_DC) == 0) {
 		if (strcmp (name, "title") == 0) {
 			tracker_append_string_to_hash_table (metadata, "Image:Title", value, append, FALSE);
+			tracker_append_string_to_hash_table (metadata, "Image:HasKeywords", "1", FALSE, FALSE);
 		}
 		else if (strcmp (name, "rights") == 0) {
 			tracker_append_string_to_hash_table (metadata, "File:Copyright", value, append, FALSE);
@@ -270,6 +271,7 @@ tracker_xmp_iter_simple (GHashTable  *metadata,
 		}
 		else if (strcmp (name, "description") == 0) {
 			tracker_append_string_to_hash_table (metadata, "Image:Description", value, append, FALSE);
+			tracker_append_string_to_hash_table (metadata, "Image:HasKeywords", "1", FALSE, FALSE);
 		}
 		else if (strcmp (name, "date") == 0) {
 			/* exempi considers this an array while we want a single value */
@@ -395,34 +397,18 @@ tracker_xmp_iter_simple (GHashTable  *metadata,
 	else if (strcmp (schema,  NS_IPTC4XMP) == 0) {
 	        if (strcmp (name, "Location") == 0) {
 		        tracker_append_string_to_hash_table (metadata, "Image:Location", value, append, FALSE);
-
-			/* Added to the valid keywords */
-		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE, FALSE);
-			tracker_append_string_to_hash_table (metadata, "Image:HasKeywords", "1", FALSE, FALSE);
 		}
 		if (strcmp (name, "Sublocation") == 0) {
 		        tracker_append_string_to_hash_table (metadata, "Image:Sublocation", value, append, FALSE);
-			
-			/* Added to the valid keywords */
-		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE, FALSE);
-			tracker_append_string_to_hash_table (metadata, "Image:HasKeywords", "1", FALSE, FALSE);
 		}
 	}
 	/* Photoshop scheme */
 	else if (strcmp (schema,  NS_PHOTOSHOP) == 0) {
 	        if (strcmp (name, "City") == 0) {
 		        tracker_append_string_to_hash_table (metadata, "Image:City", value, append, FALSE);
-
-			/* Added to the valid keywords */
-		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE, FALSE);
-			tracker_append_string_to_hash_table (metadata, "Image:HasKeywords", "1", FALSE, FALSE);
 		}
 		else if (strcmp (name, "Country") == 0) {
 			tracker_append_string_to_hash_table (metadata, "Image:Country", value, append, FALSE);
-
-			/* Added to the valid keywords */
-		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE, FALSE);
-			tracker_append_string_to_hash_table (metadata, "Image:HasKeywords", "1", FALSE, FALSE);			
 		}
 	}
 



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