[tracker/functions] Added fields to IPTC extractors, for example support for locations



commit 81384001f89409d599471e77627ce7e6300c384a
Author: Philip Van Hoof <philip codeminded be>
Date:   Wed Dec 23 17:01:38 2009 +0100

    Added fields to IPTC extractors, for example support for locations

 src/tracker-extract/tracker-extract-jpeg.c |   62 +++++++++++++++++++------
 src/tracker-extract/tracker-extract-tiff.c |   67 ++++++++++++++++++++-------
 src/tracker-extract/tracker-iptc.c         |   48 ++++++++++++++++++++
 src/tracker-extract/tracker-iptc.h         |    4 +-
 4 files changed, 147 insertions(+), 34 deletions(-)
---
diff --git a/src/tracker-extract/tracker-extract-jpeg.c b/src/tracker-extract/tracker-extract-jpeg.c
index 8a215ea..b88458a 100644
--- a/src/tracker-extract/tracker-extract-jpeg.c
+++ b/src/tracker-extract/tracker-extract-jpeg.c
@@ -85,6 +85,10 @@ typedef struct {
 	gchar *metering_mode;
 	gchar *creator;
 	gchar *comment;
+	gchar *city;
+	gchar *state;
+	gchar *address;
+	gchar *country; 
 } MergeData;
 
 static void extract_jpeg (const gchar          *filename,
@@ -306,7 +310,13 @@ extract_jpeg (const gchar          *uri,
 		md.iso_speed_ratings =  tracker_coalesce (2, ed.iso_speed_ratings, xd.ISOSpeedRatings);
 		md.date =  tracker_coalesce (5, ed.time, xd.date, id.date_created, ed.time_original, xd.DateTimeOriginal);
 		md.description = tracker_coalesce (2, ed.description, xd.description);
-		md.metering_mode =  tracker_coalesce (2, ed.metering_mode, xd.MeteringMode);
+		md.metering_mode = tracker_coalesce (2, ed.metering_mode, xd.MeteringMode);
+
+		md.city = tracker_coalesce (2, id.city, xd.City);
+		md.state = tracker_coalesce (2, id.state, xd.State);
+		md.address = tracker_coalesce (2, id.sublocation, xd.Address);
+		md.country  = tracker_coalesce (2, id.countryname, xd.Country);
+
 		md.creator =  tracker_coalesce (3, id.byline, xd.creator, id.credit);
 		md.comment = tracker_coalesce (2, comment, ed.user_comment);
 
@@ -319,6 +329,28 @@ extract_jpeg (const gchar          *uri,
 		tracker_sparql_builder_object_int64 (metadata, cinfo.image_height);
 		g_free (ed.y_dimension);
 
+		if (id.contact) {
+			tracker_sparql_builder_predicate (metadata, "nco:representative");
+			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, id.contact);
+			tracker_sparql_builder_object_blank_close (metadata);
+			g_free (id.contact);
+		}
+
+		if (id.bylinetitle) {
+			tracker_sparql_builder_predicate (metadata, "nco:hasAffiliation");
+			tracker_sparql_builder_object_blank_open (metadata);
+			tracker_sparql_builder_predicate (metadata, "a");
+			tracker_sparql_builder_object (metadata, "nco:Affiliation");
+			tracker_sparql_builder_predicate (metadata, "nco:title");
+			tracker_sparql_builder_object_unvalidated (metadata, id.bylinetitle);
+			tracker_sparql_builder_object_blank_close (metadata);
+			g_free (id.bylinetitle);
+		}
+
 		if (xd.keywords) {
 			insert_keywords (metadata, xd.keywords);
 			g_free (xd.keywords);
@@ -516,35 +548,35 @@ extract_jpeg (const gchar          *uri,
 			g_free (md.comment);
 		}
 
-		if (xd.Address || xd.Country || xd.City) {
+		if (md.city || md.state || md.address || md.country) {
 			tracker_sparql_builder_predicate (metadata, "mlo:location");
-	
+
 			tracker_sparql_builder_object_blank_open (metadata);
 			tracker_sparql_builder_predicate (metadata, "a");
 			tracker_sparql_builder_object (metadata, "mlo:GeoPoint");
 	
-			if (xd.Address) {
+			if (md.address) {
 				tracker_sparql_builder_predicate (metadata, "mlo:address");
-				tracker_sparql_builder_object_unvalidated (metadata, xd.Address);
-				g_free (xd.Address);
+				tracker_sparql_builder_object_unvalidated (metadata, md.address);
+				g_free (md.address);
 			}
 	
-			if (xd.State) {
+			if (md.state) {
 				tracker_sparql_builder_predicate (metadata, "mlo:state");
-				tracker_sparql_builder_object_unvalidated (metadata, xd.State);
-				g_free (xd.State);
+				tracker_sparql_builder_object_unvalidated (metadata, md.state);
+				g_free (md.state);
 			}
 	
-			if (xd.City) {
+			if (md.city) {
 				tracker_sparql_builder_predicate (metadata, "mlo:city");
-				tracker_sparql_builder_object_unvalidated (metadata, xd.City);
-				g_free (xd.City);
+				tracker_sparql_builder_object_unvalidated (metadata, md.city);
+				g_free (md.city);
 			}
 	
-			if (xd.Country) {
+			if (md.country) {
 				tracker_sparql_builder_predicate (metadata, "mlo:country");
-				tracker_sparql_builder_object_unvalidated (metadata, xd.Country);
-				g_free (xd.Country);
+				tracker_sparql_builder_object_unvalidated (metadata, md.country);
+				g_free (md.country);
 			}
 		
 			tracker_sparql_builder_object_blank_close (metadata);
diff --git a/src/tracker-extract/tracker-extract-tiff.c b/src/tracker-extract/tracker-extract-tiff.c
index 240d463..99bc8dc 100644
--- a/src/tracker-extract/tracker-extract-tiff.c
+++ b/src/tracker-extract/tracker-extract-tiff.c
@@ -65,6 +65,10 @@ typedef struct {
 		*fnumber, *flash, *focal_length, *artist,
 		*exposure_time, *iso_speed_ratings, *date, *description,
 		*metering_mode, *creator, *x_dimension, *y_dimension;
+	gchar *city;
+	gchar *state;
+	gchar *address;
+	gchar *country; 
 } TiffNeedsMergeData;
 
 typedef struct {
@@ -434,6 +438,11 @@ extract_tiff (const gchar *uri, TrackerSparqlBuilder *metadata)
 	merge_data.metering_mode =  tracker_coalesce (2, exif_data.metering_mode,
 	                                              xmp_data.MeteringMode);
 
+	merge_data.city = tracker_coalesce (2, iptc_data.city, xmp_data.City);
+	merge_data.state = tracker_coalesce (2, iptc_data.state, xmp_data.State);
+	merge_data.address = tracker_coalesce (2, iptc_data.sublocation, xmp_data.Address);
+	merge_data.country  = tracker_coalesce (2, iptc_data.countryname, xmp_data.Country);
+
 	merge_data.creator =  tracker_coalesce (3, iptc_data.byline,
 	                                        xmp_data.creator,
 	                                        iptc_data.credit);
@@ -476,6 +485,28 @@ extract_tiff (const gchar *uri, TrackerSparqlBuilder *metadata)
 		g_free (xmp_data.subject);
 	}
 
+	if (iptc_data.contact) {
+		tracker_sparql_builder_predicate (metadata, "nco:representative");
+		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, iptc_data.contact);
+		tracker_sparql_builder_object_blank_close (metadata);
+		g_free (iptc_data.contact);
+	}
+
+	if (iptc_data.bylinetitle) {
+		tracker_sparql_builder_predicate (metadata, "nco:hasAffiliation");
+		tracker_sparql_builder_object_blank_open (metadata);
+		tracker_sparql_builder_predicate (metadata, "a");
+		tracker_sparql_builder_object (metadata, "nco:Affiliation");
+		tracker_sparql_builder_predicate (metadata, "nco:title");
+		tracker_sparql_builder_object_unvalidated (metadata, iptc_data.bylinetitle);
+		tracker_sparql_builder_object_blank_close (metadata);
+		g_free (iptc_data.bylinetitle);
+	}
+
 	if (xmp_data.publisher) {
 		tracker_sparql_builder_predicate (metadata, "nco:publisher");
 
@@ -537,37 +568,37 @@ extract_tiff (const gchar *uri, TrackerSparqlBuilder *metadata)
 		g_free (xmp_data.license);
 	}
 
-	if (xmp_data.Address || xmp_data.Country || xmp_data.City) {
+	if (merge_data.city || merge_data.state || merge_data.address || merge_data.country) {
 		tracker_sparql_builder_predicate (metadata, "mlo:location");
 
 		tracker_sparql_builder_object_blank_open (metadata);
 		tracker_sparql_builder_predicate (metadata, "a");
 		tracker_sparql_builder_object (metadata, "mlo:GeoPoint");
-
-		if (xmp_data.Address) {
+	
+		if (merge_data.address) {
 			tracker_sparql_builder_predicate (metadata, "mlo:address");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.Address);
-			g_free (xmp_data.Address);
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.address);
+			g_free (merge_data.address);
 		}
-
-		if (xmp_data.State) {
+	
+		if (merge_data.state) {
 			tracker_sparql_builder_predicate (metadata, "mlo:state");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.State);
-			g_free (xmp_data.State);
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.state);
+			g_free (merge_data.state);
 		}
-
-		if (xmp_data.City) {
+	
+		if (merge_data.city) {
 			tracker_sparql_builder_predicate (metadata, "mlo:city");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.City);
-			g_free (xmp_data.City);
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.city);
+			g_free (merge_data.city);
 		}
-
-		if (xmp_data.Country) {
+	
+		if (merge_data.country) {
 			tracker_sparql_builder_predicate (metadata, "mlo:country");
-			tracker_sparql_builder_object_unvalidated (metadata, xmp_data.Country);
-			g_free (xmp_data.Country);
+			tracker_sparql_builder_object_unvalidated (metadata, merge_data.country);
+			g_free (merge_data.country);
 		}
-	
+		
 		tracker_sparql_builder_object_blank_close (metadata);
 	}
 
diff --git a/src/tracker-extract/tracker-iptc.c b/src/tracker-extract/tracker-iptc.c
index cb3314e..774cff4 100644
--- a/src/tracker-extract/tracker-iptc.c
+++ b/src/tracker-extract/tracker-iptc.c
@@ -58,6 +58,7 @@ foreach_dataset (IptcDataSet *dataset, void *user_data)
 				data->keywords = g_strdup (mbuffer);
 			}
 			break;
+
 			case IPTC_TAG_DATE_CREATED:
 			if (!data->date_created) {
 				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
@@ -66,6 +67,7 @@ foreach_dataset (IptcDataSet *dataset, void *user_data)
 				data->date_created = tracker_date_format_to_iso8601 (mbuffer, IPTC_DATE_FORMAT);
 			}
 			break;
+
 			case IPTC_TAG_BYLINE:
 			if (!data->byline) {
 				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
@@ -78,11 +80,15 @@ foreach_dataset (IptcDataSet *dataset, void *user_data)
 				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
 				data->credit = g_strdup (mbuffer);
 			}
+			break;
+
 			case IPTC_TAG_COPYRIGHT_NOTICE:
 			if (!data->copyright_notice) {
 				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
 				data->copyright_notice = g_strdup (mbuffer);
 			}
+			break;
+
 			case IPTC_TAG_IMAGE_ORIENTATION:
 			if (!data->image_orientation) {
 				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
@@ -90,6 +96,48 @@ foreach_dataset (IptcDataSet *dataset, void *user_data)
 			}
 			break;
 
+			case IPTC_TAG_BYLINE_TITLE:
+			if (!data->bylinetitle) {
+				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
+				data->bylinetitle = g_strdup (mbuffer);
+			}
+			break;
+
+			case IPTC_TAG_CITY:
+			if (!data->city) {
+				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
+				data->city = g_strdup (mbuffer);
+			}
+			break;
+
+			case IPTC_TAG_STATE:
+			if (!data->state) {
+				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
+				data->state = g_strdup (mbuffer);
+			}
+			break;
+
+			case IPTC_TAG_SUBLOCATION:
+			if (!data->sublocation) {
+				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
+				data->sublocation = g_strdup (mbuffer);
+			}
+			break;
+
+			case IPTC_TAG_COUNTRY_NAME:
+			if (!data->countryname) {
+				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
+				data->countryname = g_strdup (mbuffer);
+			}
+			break;
+
+			case IPTC_TAG_CONTACT:
+			if (!data->contact) {
+				iptc_dataset_get_as_str (dataset, mbuffer, 1024);
+				data->contact = g_strdup (mbuffer);
+			}
+			break;
+
 			default:
 			break;
 	}
diff --git a/src/tracker-extract/tracker-iptc.h b/src/tracker-extract/tracker-iptc.h
index 724328a..416b0bd 100644
--- a/src/tracker-extract/tracker-iptc.h
+++ b/src/tracker-extract/tracker-iptc.h
@@ -26,9 +26,11 @@
 
 typedef struct {
 	gchar *keywords, *date_created, *byline, *credit, *copyright_notice,
-		*image_orientation;
+		*image_orientation, *bylinetitle, *city, *state, *sublocation,
+		*countryname, *contact;
 } TrackerIptcData;
 
+
 void tracker_read_iptc (const unsigned char *buffer,
                         size_t               len,
                         const gchar         *uri,



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