summaryrefslogtreecommitdiff
path: root/src/tracker-extract/tracker-extract-jpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tracker-extract/tracker-extract-jpeg.c')
-rw-r--r--src/tracker-extract/tracker-extract-jpeg.c372
1 files changed, 74 insertions, 298 deletions
diff --git a/src/tracker-extract/tracker-extract-jpeg.c b/src/tracker-extract/tracker-extract-jpeg.c
index a9f8f6edd..03ab26987 100644
--- a/src/tracker-extract/tracker-extract-jpeg.c
+++ b/src/tracker-extract/tracker-extract-jpeg.c
@@ -135,7 +135,7 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
struct jpeg_decompress_struct cinfo;
struct tej_error_mgr tejerr;
struct jpeg_marker_struct *marker;
- TrackerSparqlBuilder *preupdate, *metadata;
+ TrackerResource *metadata;
TrackerXmpData *xd = NULL;
TrackerExifData *ed = NULL;
TrackerIptcData *id = NULL;
@@ -145,16 +145,11 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
goffset size;
gchar *filename, *uri;
gchar *comment = NULL;
- const gchar *dlna_profile, *dlna_mimetype, *graph, *urn;
+ const gchar *dlna_profile, *dlna_mimetype;
GPtrArray *keywords;
gboolean success = TRUE;
guint i;
- metadata = tracker_extract_info_get_metadata_builder (info);
- preupdate = tracker_extract_info_get_preupdate_builder (info);
- graph = tracker_extract_info_get_graph (info);
- urn = tracker_extract_info_get_urn (info);
-
file = tracker_extract_info_get_file (info);
filename = g_file_get_path (file);
@@ -174,11 +169,6 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
uri = g_file_get_uri (file);
- tracker_sparql_builder_predicate (metadata, "a");
- tracker_sparql_builder_object (metadata, "nfo:Image");
- tracker_sparql_builder_predicate (metadata, "a");
- tracker_sparql_builder_object (metadata, "nmm:Photo");
-
cinfo.err = jpeg_std_error (&tejerr.jpeg);
tejerr.jpeg.error_exit = extract_jpeg_error_exit;
if (setjmp (tejerr.setjmp_buffer)) {
@@ -186,6 +176,10 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
goto fail;
}
+ metadata = tracker_resource_new (NULL);
+ tracker_resource_add_uri (metadata, "rdf:type", "nfo:Image");
+ tracker_resource_add_uri (metadata, "rdf:type", "nmm:Photo");
+
jpeg_create_decompress (&cinfo);
jpeg_save_markers (&cinfo, JPEG_COM, 0xFFFF);
@@ -304,43 +298,18 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
md.model = tracker_coalesce_strip (2, xd->model, ed->model);
/* Prioritize on native dimention in all cases */
- tracker_sparql_builder_predicate (metadata, "nfo:width");
- tracker_sparql_builder_object_int64 (metadata, cinfo.image_width);
-
- /* TODO: add ontology and store ed->software */
-
- tracker_sparql_builder_predicate (metadata, "nfo:height");
- tracker_sparql_builder_object_int64 (metadata, cinfo.image_height);
+ tracker_resource_set_int64 (metadata, "nfo:width", cinfo.image_width);
+ tracker_resource_set_int64 (metadata, "nfo:height", cinfo.image_height);
if (guess_dlna_profile (cinfo.image_width, cinfo.image_height, &dlna_profile, &dlna_mimetype)) {
- tracker_sparql_builder_predicate (metadata, "nmm:dlnaProfile");
- tracker_sparql_builder_object_string (metadata, dlna_profile);
- tracker_sparql_builder_predicate (metadata, "nmm:dlnaMime");
- tracker_sparql_builder_object_string (metadata, dlna_mimetype);
+ tracker_resource_set_string (metadata, "nmm:dlnaProfile", dlna_profile);
+ tracker_resource_set_string (metadata, "nmm:dlnaMime", dlna_mimetype);
}
if (id->contact) {
- gchar *uri = tracker_sparql_escape_uri_printf ("urn:contact:%s", id->contact);
-
- tracker_sparql_builder_insert_open (preupdate, NULL);
- if (graph) {
- tracker_sparql_builder_graph_open (preupdate, graph);
- }
-
- tracker_sparql_builder_subject_iri (preupdate, uri);
- tracker_sparql_builder_predicate (preupdate, "a");
- tracker_sparql_builder_object (preupdate, "nco:Contact");
- tracker_sparql_builder_predicate (preupdate, "nco:fullname");
- tracker_sparql_builder_object_unvalidated (preupdate, id->contact);
-
- if (graph) {
- tracker_sparql_builder_graph_close (preupdate);
- }
- tracker_sparql_builder_insert_close (preupdate);
-
- tracker_sparql_builder_predicate (metadata, "nco:contributor");
- tracker_sparql_builder_object_iri (metadata, uri);
- g_free (uri);
+ TrackerResource *contact = tracker_extract_new_contact (id->contact);
+ tracker_resource_add_relation (metadata, "nco:contributor", contact);
+ g_object_unref (contact);
}
keywords = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
@@ -358,274 +327,147 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
}
if (xd->publisher) {
- gchar *uri = tracker_sparql_escape_uri_printf ("urn:contact:%s", xd->publisher);
-
- tracker_sparql_builder_insert_open (preupdate, NULL);
- if (graph) {
- tracker_sparql_builder_graph_open (preupdate, graph);
- }
-
- tracker_sparql_builder_subject_iri (preupdate, uri);
- tracker_sparql_builder_predicate (preupdate, "a");
- tracker_sparql_builder_object (preupdate, "nco:Contact");
- tracker_sparql_builder_predicate (preupdate, "nco:fullname");
- tracker_sparql_builder_object_unvalidated (preupdate, xd->publisher);
-
- if (graph) {
- tracker_sparql_builder_graph_close (preupdate);
- }
- tracker_sparql_builder_insert_close (preupdate);
-
- tracker_sparql_builder_predicate (metadata, "nco:publisher");
- tracker_sparql_builder_object_iri (metadata, uri);
- g_free (uri);
+ TrackerResource *publisher = tracker_extract_new_contact (xd->publisher);
+ tracker_resource_add_relation (metadata, "nco:publisher", publisher);
+ g_object_unref (publisher);
}
if (xd->type) {
- tracker_sparql_builder_predicate (metadata, "dc:type");
- tracker_sparql_builder_object_unvalidated (metadata, xd->type);
+ tracker_resource_set_string (metadata, "dc:type", xd->type);
}
if (xd->rating) {
- tracker_sparql_builder_predicate (metadata, "nao:numericRating");
- tracker_sparql_builder_object_unvalidated (metadata, xd->rating);
+ tracker_resource_set_string (metadata, "nao:numericRating", xd->rating);
}
if (xd->format) {
- tracker_sparql_builder_predicate (metadata, "dc:format");
- tracker_sparql_builder_object_unvalidated (metadata, xd->format);
+ tracker_resource_set_string (metadata, "dc:format", xd->format);
}
if (xd->identifier) {
- tracker_sparql_builder_predicate (metadata, "dc:identifier");
- tracker_sparql_builder_object_unvalidated (metadata, xd->identifier);
+ tracker_resource_set_string (metadata, "dc:identifier", xd->identifier);
}
if (xd->source) {
- tracker_sparql_builder_predicate (metadata, "dc:source");
- tracker_sparql_builder_object_unvalidated (metadata, xd->source);
+ tracker_resource_set_string (metadata, "dc:source", xd->source);
}
if (xd->language) {
- tracker_sparql_builder_predicate (metadata, "dc:language");
- tracker_sparql_builder_object_unvalidated (metadata, xd->language);
+ tracker_resource_set_string (metadata, "dc:language", xd->language);
}
if (xd->relation) {
- tracker_sparql_builder_predicate (metadata, "dc:relation");
- tracker_sparql_builder_object_unvalidated (metadata, xd->relation);
+ tracker_resource_set_string (metadata, "dc:relation", xd->relation);
}
if (xd->coverage) {
- tracker_sparql_builder_predicate (metadata, "dc:coverage");
- tracker_sparql_builder_object_unvalidated (metadata, xd->coverage);
+ tracker_resource_set_string (metadata, "dc:coverage", xd->coverage);
}
if (xd->license) {
- tracker_sparql_builder_predicate (metadata, "nie:license");
- tracker_sparql_builder_object_unvalidated (metadata, xd->license);
+ tracker_resource_set_string (metadata, "nie:license", xd->license);
}
- if (xd->regions) {
- tracker_xmp_apply_regions (preupdate, metadata, graph, xd);
- }
+ if (xd->regions) {
+ tracker_xmp_apply_regions_to_resource (metadata, xd);
+ }
if (id->keywords) {
tracker_keywords_parse (keywords, id->keywords);
}
for (i = 0; i < keywords->len; i++) {
- gchar *escaped, *subject;
+ TrackerResource *tag;
const gchar *p;
p = g_ptr_array_index (keywords, i);
- escaped = tracker_sparql_escape_string (p);
- subject = g_strdup_printf ("_:tag%d", i + 1);
-
- /* ensure tag with specified label exists */
- tracker_sparql_builder_insert_open (preupdate, graph);
- tracker_sparql_builder_subject (preupdate, subject);
- tracker_sparql_builder_predicate (preupdate, "a");
- tracker_sparql_builder_object (preupdate, "nao:Tag");
- tracker_sparql_builder_predicate (preupdate, "nao:prefLabel");
- tracker_sparql_builder_object_unvalidated (preupdate, escaped);
- tracker_sparql_builder_insert_close (preupdate);
- tracker_sparql_builder_append (preupdate,
- "WHERE { FILTER (NOT EXISTS { "
- "?tag a nao:Tag ; nao:prefLabel \"");
- tracker_sparql_builder_append (preupdate, escaped);
- tracker_sparql_builder_append (preupdate,
- "\" }) }\n");
-
- /* associate file with tag */
- tracker_sparql_builder_insert_open (preupdate, graph);
- tracker_sparql_builder_subject_iri (preupdate, urn);
- tracker_sparql_builder_predicate (preupdate, "nao:hasTag");
- tracker_sparql_builder_object (preupdate, "?tag");
- tracker_sparql_builder_insert_close (preupdate);
- tracker_sparql_builder_where_open (preupdate);
- tracker_sparql_builder_subject (preupdate, "?tag");
- tracker_sparql_builder_predicate (preupdate, "a");
- tracker_sparql_builder_object (preupdate, "nao:Tag");
- tracker_sparql_builder_predicate (preupdate, "nao:prefLabel");
- tracker_sparql_builder_object_unvalidated (preupdate, escaped);
- tracker_sparql_builder_where_close (preupdate);
-
- g_free (subject);
- g_free (escaped);
+ tag = tracker_extract_new_tag (p);
+
+ tracker_resource_add_relation (metadata, "nao:hasTag", tag);
+
+ g_object_unref (tag);
}
g_ptr_array_free (keywords, TRUE);
if (md.make || md.model) {
- gchar *equip_uri;
-
- equip_uri = tracker_sparql_escape_uri_printf ("urn:equipment:%s:%s:",
- md.make ? md.make : "",
- md.model ? md.model : "");
-
- tracker_sparql_builder_insert_open (preupdate, NULL);
- if (graph) {
- tracker_sparql_builder_graph_open (preupdate, graph);
- }
-
- tracker_sparql_builder_subject_iri (preupdate, equip_uri);
- tracker_sparql_builder_predicate (preupdate, "a");
- tracker_sparql_builder_object (preupdate, "nfo:Equipment");
-
- if (md.make) {
- tracker_sparql_builder_predicate (preupdate, "nfo:manufacturer");
- tracker_sparql_builder_object_unvalidated (preupdate, md.make);
- }
- if (md.model) {
- tracker_sparql_builder_predicate (preupdate, "nfo:model");
- tracker_sparql_builder_object_unvalidated (preupdate, md.model);
- }
-
- if (graph) {
- tracker_sparql_builder_graph_close (preupdate);
- }
- tracker_sparql_builder_insert_close (preupdate);
-
- tracker_sparql_builder_predicate (metadata, "nfo:equipment");
- tracker_sparql_builder_object_iri (metadata, equip_uri);
- g_free (equip_uri);
+ TrackerResource *equipment = tracker_extract_new_equipment (md.make, md.model);
+ tracker_resource_add_relation (metadata, "nfo:equipment", equipment);
+ g_object_unref (equipment);
}
- tracker_guarantee_title_from_file (metadata,
- "nie:title",
- md.title,
- uri,
- NULL);
+ tracker_guarantee_resource_title_from_file (metadata,
+ "nie:title",
+ md.title,
+ uri,
+ NULL);
if (md.orientation) {
- tracker_sparql_builder_predicate (metadata, "nfo:orientation");
- tracker_sparql_builder_object (metadata, md.orientation);
+ tracker_resource_set_string (metadata, "nfo:orientation", md.orientation);
}
if (md.copyright) {
- tracker_sparql_builder_predicate (metadata, "nie:copyright");
- tracker_sparql_builder_object_unvalidated (metadata, md.copyright);
+ tracker_resource_set_string (metadata, "nie:copyright", md.copyright);
}
if (md.white_balance) {
- tracker_sparql_builder_predicate (metadata, "nmm:whiteBalance");
- tracker_sparql_builder_object (metadata, md.white_balance);
+ tracker_resource_set_string (metadata, "nmm:whiteBalance", md.white_balance);
}
if (md.fnumber) {
gdouble value;
value = g_strtod (md.fnumber, NULL);
- tracker_sparql_builder_predicate (metadata, "nmm:fnumber");
- tracker_sparql_builder_object_double (metadata, value);
+ tracker_resource_set_double (metadata, "nmm:fnumber", value);
}
if (md.flash) {
- tracker_sparql_builder_predicate (metadata, "nmm:flash");
- tracker_sparql_builder_object (metadata, md.flash);
+ tracker_resource_set_string (metadata, "nmm:flash", md.flash);
}
if (md.focal_length) {
gdouble value;
value = g_strtod (md.focal_length, NULL);
- tracker_sparql_builder_predicate (metadata, "nmm:focalLength");
- tracker_sparql_builder_object_double (metadata, value);
+ tracker_resource_set_double (metadata, "nmm:focalLength", value);
}
if (md.artist) {
- gchar *uri = tracker_sparql_escape_uri_printf ("urn:contact:%s", md.artist);
-
- tracker_sparql_builder_insert_open (preupdate, NULL);
- if (graph) {
- tracker_sparql_builder_graph_open (preupdate, graph);
- }
-
- tracker_sparql_builder_subject_iri (preupdate, uri);
- tracker_sparql_builder_predicate (preupdate, "a");
- tracker_sparql_builder_object (preupdate, "nco:Contact");
- tracker_sparql_builder_predicate (preupdate, "nco:fullname");
- tracker_sparql_builder_object_unvalidated (preupdate, md.artist);
-
- if (graph) {
- tracker_sparql_builder_graph_close (preupdate);
- }
- tracker_sparql_builder_insert_close (preupdate);
-
- tracker_sparql_builder_predicate (metadata, "nco:contributor");
- tracker_sparql_builder_object_iri (metadata, uri);
- g_free (uri);
+ TrackerResource *artist = tracker_extract_new_contact (md.artist);
+ tracker_resource_add_relation (metadata, "nco:contributor", artist);
+ g_object_unref (artist);
}
if (md.exposure_time) {
gdouble value;
value = g_strtod (md.exposure_time, NULL);
- tracker_sparql_builder_predicate (metadata, "nmm:exposureTime");
- tracker_sparql_builder_object_double (metadata, value);
+ tracker_resource_set_double (metadata, "nmm:exposureTime", value);
}
if (md.iso_speed_ratings) {
gdouble value;
value = g_strtod (md.iso_speed_ratings, NULL);
- tracker_sparql_builder_predicate (metadata, "nmm:isoSpeed");
- tracker_sparql_builder_object_double (metadata, value);
+ tracker_resource_set_double (metadata, "nmm:isoSpeed", value);
}
- tracker_guarantee_date_from_file_mtime (metadata,
- "nie:contentCreated",
- md.date,
- uri);
+ tracker_guarantee_resource_date_from_file_mtime (metadata,
+ "nie:contentCreated",
+ md.date,
+ uri);
if (md.description) {
- tracker_sparql_builder_predicate (metadata, "nie:description");
- tracker_sparql_builder_object_unvalidated (metadata, md.description);
+ tracker_resource_set_string(metadata, "nie:description", md.description);
}
if (md.metering_mode) {
- tracker_sparql_builder_predicate (metadata, "nmm:meteringMode");
- tracker_sparql_builder_object (metadata, md.metering_mode);
+ tracker_resource_set_string(metadata, "nmm:meteringMode", md.metering_mode);
}
if (md.creator) {
- gchar *uri = tracker_sparql_escape_uri_printf ("urn:contact:%s", md.creator);
-
- tracker_sparql_builder_insert_open (preupdate, NULL);
- if (graph) {
- tracker_sparql_builder_graph_open (preupdate, graph);
- }
-
- tracker_sparql_builder_subject_iri (preupdate, uri);
- tracker_sparql_builder_predicate (preupdate, "a");
- tracker_sparql_builder_object (preupdate, "nco:Contact");
- tracker_sparql_builder_predicate (preupdate, "nco:fullname");
- tracker_sparql_builder_object_unvalidated (preupdate, md.creator);
-
- if (graph) {
- tracker_sparql_builder_graph_close (preupdate);
- }
- tracker_sparql_builder_insert_close (preupdate);
+ TrackerResource *creator = tracker_extract_new_contact (md.creator);
+ tracker_resource_add_relation (metadata, "nco:creator", creator);
+ g_object_unref (creator);
/* NOTE: We only have affiliation with
* nco:PersonContact and we are using
@@ -649,93 +491,26 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
/* tracker_sparql_builder_predicate (preupdate, "nco:hasAffiliation"); */
/* tracker_sparql_builder_object (preupdate, "_:affiliation_by_line"); */
/* } */
-
- tracker_sparql_builder_predicate (metadata, "nco:creator");
- tracker_sparql_builder_object_iri (metadata, uri);
- g_free (uri);
}
if (md.comment) {
- tracker_sparql_builder_predicate (metadata, "nie:comment");
- tracker_sparql_builder_object_unvalidated (metadata, md.comment);
+ tracker_resource_set_string (metadata, "nie:comment", md.comment);
}
if (md.address || md.state || md.country || md.city ||
md.gps_altitude || md.gps_latitude || md.gps_longitude) {
- tracker_sparql_builder_predicate (metadata, "slo:location");
-
- tracker_sparql_builder_object_blank_open (metadata); /* GeoPoint */
- tracker_sparql_builder_predicate (metadata, "a");
- tracker_sparql_builder_object (metadata, "slo:GeoLocation");
-
- if (md.address || md.state || md.country || md.city) {
- gchar *addruri;
-
- addruri = tracker_sparql_get_uuid_urn ();
-
- tracker_sparql_builder_predicate (metadata, "slo:postalAddress");
- tracker_sparql_builder_object_iri (metadata, addruri);
-
- tracker_sparql_builder_insert_open (preupdate, NULL);
- if (graph) {
- tracker_sparql_builder_graph_open (preupdate, graph);
- }
-
- tracker_sparql_builder_subject_iri (preupdate, addruri);
-
- g_free (addruri);
-
- tracker_sparql_builder_predicate (preupdate, "a");
- tracker_sparql_builder_object (preupdate, "nco:PostalAddress");
+ TrackerResource *location = tracker_extract_new_location (md.address,
+ md.state, md.city, md.country, md.gps_altitude,
+ md.gps_latitude, md.gps_longitude);
- if (md.address) {
- tracker_sparql_builder_predicate (preupdate, "nco:streetAddress");
- tracker_sparql_builder_object_unvalidated (preupdate, md.address);
- }
-
- if (md.state) {
- tracker_sparql_builder_predicate (preupdate, "nco:region");
- tracker_sparql_builder_object_unvalidated (preupdate, md.state);
- }
-
- if (md.city) {
- tracker_sparql_builder_predicate (preupdate, "nco:locality");
- tracker_sparql_builder_object_unvalidated (preupdate, md.city);
- }
+ tracker_resource_add_relation (metadata, "slo:location", location);
- if (md.country) {
- tracker_sparql_builder_predicate (preupdate, "nco:country");
- tracker_sparql_builder_object_unvalidated (preupdate, md.country);
- }
-
- if (graph) {
- tracker_sparql_builder_graph_close (preupdate);
- }
- tracker_sparql_builder_insert_close (preupdate);
- }
-
- if (md.gps_altitude) {
- tracker_sparql_builder_predicate (metadata, "slo:altitude");
- tracker_sparql_builder_object_unvalidated (metadata, md.gps_altitude);
- }
-
- if (md.gps_latitude) {
- tracker_sparql_builder_predicate (metadata, "slo:latitude");
- tracker_sparql_builder_object_unvalidated (metadata, md.gps_latitude);
- }
-
- if (md.gps_longitude) {
- tracker_sparql_builder_predicate (metadata, "slo:longitude");
- tracker_sparql_builder_object_unvalidated (metadata, md.gps_longitude);
- }
-
- tracker_sparql_builder_object_blank_close (metadata); /* GeoLocation */
+ g_object_unref (location);
}
if (md.gps_direction) {
- tracker_sparql_builder_predicate (metadata, "nfo:heading");
- tracker_sparql_builder_object_unvalidated (metadata, md.gps_direction);
+ tracker_resource_set_string (metadata, "nfo:heading", md.gps_direction);
}
if (cinfo.density_unit != 0 || ed->x_resolution) {
@@ -753,8 +528,7 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
value = cinfo.X_density * CM_TO_INCH;
}
- tracker_sparql_builder_predicate (metadata, "nfo:horizontalResolution");
- tracker_sparql_builder_object_double (metadata, value);
+ tracker_resource_set_double (metadata, "nfo:horizontalResolution", value);
}
if (cinfo.density_unit != 0 || ed->y_resolution) {
@@ -772,8 +546,7 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
value = cinfo.Y_density * CM_TO_INCH;
}
- tracker_sparql_builder_predicate (metadata, "nfo:verticalResolution");
- tracker_sparql_builder_object_double (metadata, value);
+ tracker_resource_set_double (metadata, "nfo:verticalResolution", value);
}
jpeg_destroy_decompress (&cinfo);
@@ -783,6 +556,9 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
tracker_iptc_free (id);
g_free (comment);
+ tracker_extract_info_set_resource (info, metadata);
+ g_object_unref (metadata);
+
fail:
tracker_file_close (f, FALSE);
g_free (uri);