diff options
Diffstat (limited to 'src/tracker-extract/tracker-extract-jpeg.c')
-rw-r--r-- | src/tracker-extract/tracker-extract-jpeg.c | 372 |
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); |