[tracker] Fixed a bug in the XMP parser, added EXIF to PNG extractor



commit 3343c94de92a8a972326e183f8b0c0bda31dd006
Author: Philip Van Hoof <philip codeminded be>
Date:   Tue Feb 2 15:13:06 2010 +0100

    Fixed a bug in the XMP parser, added EXIF to PNG extractor

 src/libtracker-extract/tracker-xmp.c      |    2 +-
 src/tracker-extract/tracker-extract-png.c |  256 +++++++++++++++++++----------
 2 files changed, 173 insertions(+), 85 deletions(-)
---
diff --git a/src/libtracker-extract/tracker-xmp.c b/src/libtracker-extract/tracker-xmp.c
index 6d0d9ee..f753aa2 100644
--- a/src/libtracker-extract/tracker-xmp.c
+++ b/src/libtracker-extract/tracker-xmp.c
@@ -351,7 +351,7 @@ iterate_simple (const gchar    *uri,
 
 		/* Photoshop TODO: is this needed anyway? */
 	} else if (g_ascii_strcasecmp (schema,  NS_PHOTOSHOP) == 0) {
-		if (data->city && g_ascii_strcasecmp (name, "City") == 0) {
+		if (!data->city && g_ascii_strcasecmp (name, "City") == 0) {
 			data->city = g_strdup (value);
 		} else if (!data->country && g_ascii_strcasecmp (name, "Country") == 0) {
 			data->country = g_strdup (value);
diff --git a/src/tracker-extract/tracker-extract-png.c b/src/tracker-extract/tracker-extract-png.c
index 54986e6..2729983 100644
--- a/src/tracker-extract/tracker-extract-png.c
+++ b/src/tracker-extract/tracker-extract-png.c
@@ -43,6 +43,7 @@
 
 #include <libtracker-extract/tracker-extract.h>
 #include <libtracker-extract/tracker-xmp.h>
+#include <libtracker-extract/tracker-exif.h>
 
 #define RFC1123_DATE_FORMAT "%d %B %Y %H:%M:%S %z"
 
@@ -56,6 +57,21 @@
 
 typedef struct {
 	gchar *title, *copyright, *creator, *description, *date, *license;
+	gchar *artist;
+	gchar *camera;
+	gchar *orientation;
+	gchar *white_balance;
+	gchar *fnumber;
+	gchar *flash;
+	gchar *focal_length;
+	gchar *exposure_time;
+	gchar *iso_speed_ratings;
+	gchar *metering_mode;
+	gchar *comment;
+	gchar *city;
+	gchar *state;
+	gchar *address;
+	gchar *country;
 } PngNeedsMergeData;
 
 typedef struct {
@@ -121,6 +137,7 @@ read_metadata (png_structp png_ptr, png_infop info_ptr, const gchar *uri, Tracke
 	png_textp    text_ptr;
 	PngNeedsMergeData merge_data = { 0 };
 	PngData png_data = { 0 };
+	TrackerExifData exif_data = { 0 };
 	TrackerXmpData xmp_data = { 0 };
 
 	if (png_get_text (png_ptr, info_ptr, &text_ptr, &num_text) > 0) {
@@ -140,8 +157,8 @@ read_metadata (png_structp png_ptr, png_infop info_ptr, const gchar *uri, Tracke
 				 * multiple times, keep it that way as here it's
 				 * theoretically possible that the function gets
 				 * called multiple times */
-
-				tracker_read_xmp (text_ptr[i].text,
+printf ("--\n%s\n--",text_ptr[i].text);
+				tracker_xmp_read (text_ptr[i].text,
 				                  text_ptr[i].itxt_length,
 				                  uri, &xmp_data);
 
@@ -149,6 +166,18 @@ read_metadata (png_structp png_ptr, png_infop info_ptr, const gchar *uri, Tracke
 			}
 #endif
 
+#if defined(HAVE_LIBEXIF) && defined(PNG_iTXt_SUPPORTED)
+
+			/* TODO: I'm not certain this is the key for EXIF */
+
+			if (g_strcmp0 ("EXIF", text_ptr[i].key) == 0) {
+				tracker_exif_read (text_ptr[i].text,
+				                   text_ptr[i].itxt_length, 
+				                   uri, &exif_data);
+				continue;
+			}
+#endif /* HAVE_LIBEXIF */
+
 			if (g_strcmp0 (text_ptr[i].key, "Author") == 0) {
 				png_data.author = g_strdup (text_ptr[i].text);
 				continue;
@@ -190,33 +219,92 @@ read_metadata (png_structp png_ptr, png_infop info_ptr, const gchar *uri, Tracke
 			}
 		}
 
+		/* Don't merge if the make is in the model */
+		if ((xmp_data.make == NULL || xmp_data.model == NULL) ||
+		    (xmp_data.make && xmp_data.model && strstr (xmp_data.model, xmp_data.make) == NULL)) {
+			merge_data.camera = tracker_merge (" ", 2, xmp_data.make, xmp_data.model);
+		} else {
+			merge_data.camera = g_strdup (xmp_data.model);
+			g_free (xmp_data.model);
+			g_free (xmp_data.make);
+		}
+
+		if (!merge_data.camera) {
+			if ((exif_data.make == NULL || exif_data.model == NULL) ||
+			    (exif_data.make && exif_data.model && strstr (exif_data.model, exif_data.make) == NULL)) {
+				merge_data.camera = tracker_merge (" ", 2, exif_data.make, exif_data.model);
+			} else {
+				merge_data.camera = g_strdup (exif_data.model);
+				g_free (exif_data.model);
+				g_free (exif_data.make);
+			}
+		} else {
+			g_free (exif_data.model);
+			g_free (exif_data.make);
+		}
+
 		merge_data.creator = tracker_coalesce (3, png_data.creator,
 		                                       png_data.author,
 		                                       xmp_data.creator);
 
-		merge_data.title = tracker_coalesce (4, png_data.title,
+		merge_data.title = tracker_coalesce (5, png_data.title,
 		                                     xmp_data.title, 
 		                                     xmp_data.title,
-		                                     xmp_data.pdf_title);
+		                                     xmp_data.pdf_title,
+		                                     exif_data.document_name);
 
-		merge_data.copyright = tracker_coalesce (2, png_data.copyright,
-		                                         xmp_data.rights);
+		merge_data.copyright = tracker_coalesce (3, png_data.copyright,
+		                                         xmp_data.rights,
+		                                         exif_data.copyright);
 
 		merge_data.license = tracker_coalesce (2, png_data.disclaimer,
 		                                       xmp_data.license);
 
-		merge_data.description = tracker_coalesce (2, png_data.description,
-		                                           xmp_data.description);
+		merge_data.description = tracker_coalesce (3, png_data.description,
+		                                           xmp_data.description,
+		                                           exif_data.description);
 
-		merge_data.date = tracker_coalesce (3, png_data.creation_time,
+		merge_data.date = tracker_coalesce (5, png_data.creation_time,
 		                                    xmp_data.date,
-		                                    xmp_data.time_original);
+		                                    xmp_data.time_original,
+		                                    exif_data.time,
+		                                    exif_data.time_original);
+
+		merge_data.comment = tracker_coalesce (2, png_data.comment,
+		                                       exif_data.user_comment);
+
+		merge_data.artist = tracker_coalesce (3, xmp_data.artist,
+		                                      xmp_data.contributor,
+		                                      exif_data.artist);
+
+		merge_data.orientation = tracker_coalesce (2, exif_data.orientation, 
+		                                           xmp_data.orientation);
 
+		merge_data.exposure_time = tracker_coalesce (2, exif_data.exposure_time, 
+		                                             xmp_data.exposure_time);
 
-		if (png_data.comment) {
+		merge_data.iso_speed_ratings = tracker_coalesce (2, exif_data.iso_speed_ratings, 
+		                                                 xmp_data.iso_speed_ratings);
+
+		merge_data.fnumber = tracker_coalesce (2, exif_data.fnumber, 
+		                                       xmp_data.fnumber);
+
+		merge_data.flash = tracker_coalesce (2, exif_data.flash, 
+		                                     xmp_data.flash);
+
+		merge_data.focal_length = tracker_coalesce (2, exif_data.focal_length, 
+		                                            xmp_data.focal_length);
+
+		merge_data.metering_mode = tracker_coalesce (2, exif_data.metering_mode, 
+		                                             xmp_data.metering_mode);
+
+		merge_data.white_balance = tracker_coalesce (2, exif_data.white_balance, 
+		                                             xmp_data.white_balance);
+
+		if (merge_data.comment) {
 			tracker_sparql_builder_predicate (metadata, "nie:comment");
-			tracker_sparql_builder_object_unvalidated (metadata, png_data.comment);
-			g_free (png_data.comment);
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.comment);
+			g_free (merge_data.comment);
 		}
 
 		if (merge_data.license) {
@@ -225,6 +313,10 @@ read_metadata (png_structp png_ptr, png_infop info_ptr, const gchar *uri, Tracke
 			g_free (merge_data.license);
 		}
 
+		g_free (exif_data.x_dimension);
+		g_free (exif_data.y_dimension);
+		g_free (exif_data.image_width);
+
 		if (merge_data.creator) {
 			tracker_sparql_builder_predicate (metadata, "nco:creator");
 
@@ -262,6 +354,73 @@ read_metadata (png_structp png_ptr, png_infop info_ptr, const gchar *uri, Tracke
 			g_free (merge_data.title);
 		}
 
+		if (merge_data.camera) {
+			tracker_sparql_builder_predicate (metadata, "nmm:camera");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.camera);
+			g_free (merge_data.camera);
+		}
+
+		if (merge_data.artist) {
+			tracker_sparql_builder_predicate (metadata, "nco:contributor");
+
+			tracker_sparql_builder_object_blank_open (metadata);
+			tracker_sparql_builder_predicate (metadata, "a");
+			tracker_sparql_builder_object (metadata, "nco:Contact");
+
+			tracker_sparql_builder_predicate (metadata, "nco:fullname");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.artist);
+			tracker_sparql_builder_object_blank_close (metadata);
+			g_free (merge_data.artist);
+		}
+
+		if (merge_data.orientation) {
+			tracker_sparql_builder_predicate (metadata, "nfo:orientation");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.orientation);
+			g_free (merge_data.orientation);
+		}
+
+		if (merge_data.exposure_time) {
+			tracker_sparql_builder_predicate (metadata, "nmm:exposureTime");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.exposure_time);
+			g_free (merge_data.exposure_time);
+		}
+
+		if (merge_data.iso_speed_ratings) {
+			tracker_sparql_builder_predicate (metadata, "nmm:isoSpeed");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.iso_speed_ratings);
+			g_free (merge_data.iso_speed_ratings);
+		}
+
+		if (merge_data.white_balance) {
+			tracker_sparql_builder_predicate (metadata, "nmm:whiteBalance");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.white_balance);
+			g_free (merge_data.white_balance);
+		}
+
+		if (merge_data.fnumber) {
+			tracker_sparql_builder_predicate (metadata, "nmm:fnumber");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.fnumber);
+			g_free (merge_data.fnumber);
+		}
+
+		if (merge_data.flash) {
+			tracker_sparql_builder_predicate (metadata, "nmm:flash");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.flash);
+			g_free (merge_data.flash);
+		}
+
+		if (merge_data.focal_length) {
+			tracker_sparql_builder_predicate (metadata, "nmm:focalLength");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.focal_length);
+			g_free (merge_data.focal_length);
+		}
+
+		if (merge_data.metering_mode) {
+			tracker_sparql_builder_predicate (metadata, "nmm:meteringMode");
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.metering_mode);
+			g_free (merge_data.metering_mode);
+		}
+
 
 		if (xmp_data.keywords) {
 			insert_keywords (metadata, uri, xmp_data.keywords);
@@ -333,77 +492,6 @@ read_metadata (png_structp png_ptr, png_infop info_ptr, const gchar *uri, Tracke
 			g_free (xmp_data.coverage);
 		}
 
-		if (xmp_data.make || xmp_data.model) {
-			gchar *final_camera = tracker_merge (" ", 2, xmp_data.make, xmp_data.model);
-
-			tracker_sparql_builder_predicate (metadata, "nmm:camera");
-			tracker_sparql_builder_object_unvalidated (metadata, final_camera);
-			g_free (final_camera);
-		}
-
-		if (xmp_data.orientation) {
-			tracker_sparql_builder_predicate (metadata, "nfo:orientation");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.orientation);
-			g_free (xmp_data.orientation);
-		}
-
-		if (xmp_data.white_balance) {
-			tracker_sparql_builder_predicate (metadata, "nmm:whiteBalance");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.white_balance);
-			g_free (xmp_data.white_balance);
-		}
-
-		if (xmp_data.fnumber) {
-			tracker_sparql_builder_predicate (metadata, "nmm:fnumber");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.fnumber);
-			g_free (xmp_data.fnumber);
-		}
-
-		if (xmp_data.flash) {
-			tracker_sparql_builder_predicate (metadata, "nmm:flash");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.flash);
-			g_free (xmp_data.flash);
-		}
-
-		if (xmp_data.focal_length) {
-			tracker_sparql_builder_predicate (metadata, "nmm:focalLength");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.focal_length);
-			g_free (xmp_data.focal_length);
-		}
-
-		if (xmp_data.artist || xmp_data.contributor) {
-			gchar *final_artist =  tracker_coalesce (2, xmp_data.artist, xmp_data.contributor);
-
-			tracker_sparql_builder_predicate (metadata, "nco:contributor");
-
-			tracker_sparql_builder_object_blank_open (metadata);
-			tracker_sparql_builder_predicate (metadata, "a");
-			tracker_sparql_builder_object (metadata, "nco:Contact");
-
-			tracker_sparql_builder_predicate (metadata, "nco:fullname");
-			tracker_sparql_builder_object_unvalidated (metadata, final_artist);
-			tracker_sparql_builder_object_blank_close (metadata);
-			g_free (final_artist);
-		}
-
-		if (xmp_data.exposure_time) {
-			tracker_sparql_builder_predicate (metadata, "nmm:exposureTime");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.exposure_time);
-			g_free (xmp_data.exposure_time);
-		}
-
-		if (xmp_data.iso_speed_ratings) {
-			tracker_sparql_builder_predicate (metadata, "nmm:isoSpeed");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.iso_speed_ratings);
-			g_free (xmp_data.iso_speed_ratings);
-		}
-
-		if (xmp_data.metering_mode) {
-			tracker_sparql_builder_predicate (metadata, "nmm:meteringMode");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.metering_mode);
-			g_free (xmp_data.metering_mode);
-		}
-	
 		if (xmp_data.address || xmp_data.country || xmp_data.city) {
 			tracker_sparql_builder_predicate (metadata, "mlo:location");
 	



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