[tracker/functions] Added fields to IPTC extractors, for example support for locations
- From: Mikael Ottela <mottela src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/functions] Added fields to IPTC extractors, for example support for locations
- Date: Thu, 14 Jan 2010 09:07:46 +0000 (UTC)
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]