diff options
Diffstat (limited to 'src/libtracker-extract/tracker-xmp.c')
-rw-r--r-- | src/libtracker-extract/tracker-xmp.c | 422 |
1 files changed, 118 insertions, 304 deletions
diff --git a/src/libtracker-extract/tracker-xmp.c b/src/libtracker-extract/tracker-xmp.c index dda836835..76110ff94 100644 --- a/src/libtracker-extract/tracker-xmp.c +++ b/src/libtracker-extract/tracker-xmp.c @@ -23,6 +23,7 @@ #include <libtracker-common/tracker-utils.h> +#include "tracker-resource-helpers.h" #include "tracker-xmp.h" #include "tracker-utils.h" @@ -867,40 +868,28 @@ fix_region_type (const gchar *region_type) /** - * tracker_xmp_apply: - * @preupdate: the preupdate object to apply XMP data to. - * @metadata: the metadata object to apply XMP data to. - * @graph: the graph to apply XMP data to. - * @where: the where object. - * @uri: the URI this is related to. - * @data: the data to push into @metadata. - * - * This function applies all data in @data to @metadata. + * tracker_xmp_apply_to_resource: + * @resource: the #TrackerResource to apply XMP data to. + * @data: the data to push into @resource. * - * The @graph parameter was added in 0.12. + * This function applies all data in @data to @resource. * - * This function also calls tracker_xmp_apply_regions(), so there is - * no need to call both functions. + * This function also calls tracker_xmp_apply_regions_to_resource(), so there + * is no need to call both functions. * - * Returns: %TRUE if the @data was applied to @metadata successfully, + * Returns: %TRUE if the @data was applied to @resource successfully, * otherwise %FALSE is returned. * - * Since: 0.8 + * Since: 1.10 **/ gboolean -tracker_xmp_apply (TrackerSparqlBuilder *preupdate, - TrackerSparqlBuilder *metadata, - const gchar *graph, - GString *where, - const gchar *uri, - TrackerXmpData *data) +tracker_xmp_apply_to_resource (TrackerResource *resource, + TrackerXmpData *data) { GPtrArray *keywords; guint i; - g_return_val_if_fail (TRACKER_SPARQL_IS_BUILDER (preupdate), FALSE); - g_return_val_if_fail (TRACKER_SPARQL_IS_BUILDER (metadata), FALSE); - g_return_val_if_fail (uri != NULL, FALSE); + g_return_val_if_fail (TRACKER_IS_RESOURCE (resource), FALSE); g_return_val_if_fail (data != NULL, FALSE); keywords = g_ptr_array_new (); @@ -918,133 +907,65 @@ tracker_xmp_apply (TrackerSparqlBuilder *preupdate, } for (i = 0; i < keywords->len; i++) { - gchar *p, *escaped, *var; + TrackerResource *label; + gchar *p; p = g_ptr_array_index (keywords, i); - escaped = tracker_sparql_escape_string (p); - var = g_strdup_printf ("tag%d", i + 1); - - /* ensure tag with specified label exists */ - tracker_sparql_builder_append (preupdate, - "INSERT { "); - - if (graph) { - tracker_sparql_builder_append (preupdate, "GRAPH <"); - tracker_sparql_builder_append (preupdate, graph); - tracker_sparql_builder_append (preupdate, "> { "); - } - - tracker_sparql_builder_append (preupdate,"_:tag a nao:Tag ; nao:prefLabel \""); - tracker_sparql_builder_append (preupdate, escaped); - - if (graph) { - tracker_sparql_builder_append (preupdate, " } "); - } + label = tracker_extract_new_tag (p); - tracker_sparql_builder_append (preupdate, - "\" }\nWHERE { FILTER (NOT EXISTS { " - "?tag a nao:Tag ; nao:prefLabel \""); - tracker_sparql_builder_append (preupdate, escaped); - tracker_sparql_builder_append (preupdate, - "\" }) }\n"); + tracker_resource_set_relation (resource, "nao:hasTag", label); - /* associate file with tag */ - tracker_sparql_builder_predicate (metadata, "nao:hasTag"); - tracker_sparql_builder_object_variable (metadata, var); - - g_string_append_printf (where, "?%s a nao:Tag ; nao:prefLabel \"%s\" .\n", var, escaped); - - g_free (var); - g_free (escaped); g_free (p); + g_object_unref (label); } g_ptr_array_free (keywords, TRUE); if (data->publisher) { - tracker_sparql_builder_predicate (metadata, "nco:publisher"); - - tracker_sparql_builder_object_blank_open (metadata); - tracker_sparql_builder_predicate (metadata, "a"); - tracker_sparql_builder_object (metadata, "nco:Contact"); + TrackerResource *publisher; - tracker_sparql_builder_predicate (metadata, "nco:fullname"); - tracker_sparql_builder_object_unvalidated (metadata, data->publisher); - tracker_sparql_builder_object_blank_close (metadata); + publisher = tracker_extract_new_contact (data->publisher); + tracker_resource_set_relation (resource, "nco:publisher", publisher); + g_object_unref (publisher); } if (data->type) { - tracker_sparql_builder_predicate (metadata, "dc:type"); - tracker_sparql_builder_object_unvalidated (metadata, data->type); + tracker_resource_set_string (resource, "dc:type", data->type); } if (data->format) { - tracker_sparql_builder_predicate (metadata, "dc:format"); - tracker_sparql_builder_object_unvalidated (metadata, data->format); + tracker_resource_set_string (resource, "dc:format", data->format); } if (data->identifier) { - tracker_sparql_builder_predicate (metadata, "dc:identifier"); - tracker_sparql_builder_object_unvalidated (metadata, data->identifier); + tracker_resource_set_string (resource, "dc:identifier", data->identifier); } if (data->source) { - tracker_sparql_builder_predicate (metadata, "dc:source"); - tracker_sparql_builder_object_unvalidated (metadata, data->source); + tracker_resource_set_string (resource, "dc:source", data->source); } if (data->language) { - tracker_sparql_builder_predicate (metadata, "dc:language"); - tracker_sparql_builder_object_unvalidated (metadata, data->language); + tracker_resource_set_string (resource, "dc:language", data->language); } if (data->relation) { - tracker_sparql_builder_predicate (metadata, "dc:relation"); - tracker_sparql_builder_object_unvalidated (metadata, data->relation); + tracker_resource_set_string (resource, "dc:relation", data->relation); } if (data->coverage) { - tracker_sparql_builder_predicate (metadata, "dc:coverage"); - tracker_sparql_builder_object_unvalidated (metadata, data->coverage); + tracker_resource_set_string (resource, "dc:coverage", data->coverage); } if (data->license) { - tracker_sparql_builder_predicate (metadata, "dc:license"); - tracker_sparql_builder_object_unvalidated (metadata, data->license); + tracker_resource_set_string (resource, "dc:license", data->license); } if (data->make || data->model) { - gchar *equip_uri; - - equip_uri = tracker_sparql_escape_uri_printf ("urn:equipment:%s:%s:", - data->make ? data->make : "", - data->model ? data->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 (data->make) { - tracker_sparql_builder_predicate (preupdate, "nfo:manufacturer"); - tracker_sparql_builder_object_unvalidated (preupdate, data->make); - } - if (data->model) { - tracker_sparql_builder_predicate (preupdate, "nfo:model"); - tracker_sparql_builder_object_unvalidated (preupdate, data->model); - } + TrackerResource *equipment; - 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); + equipment = tracker_extract_new_equipment (data->make, data->model); + tracker_resource_set_relation (resource, "nfo:equipment", equipment); + g_object_unref (equipment); } if (data->title || data->title2 || data->pdf_title) { @@ -1052,283 +973,176 @@ tracker_xmp_apply (TrackerSparqlBuilder *preupdate, data->title2, data->pdf_title); - tracker_sparql_builder_predicate (metadata, "nie:title"); - tracker_sparql_builder_object_unvalidated (metadata, final_title); + tracker_resource_set_string (resource, "nie:title", final_title); } if (data->orientation) { - tracker_sparql_builder_predicate (metadata, "nfo:orientation"); - tracker_sparql_builder_object_unvalidated (metadata, data->orientation); + tracker_resource_set_string (resource, "nfo:orientation", data->orientation); } if (data->rights || data->copyright) { const gchar *final_rights = tracker_coalesce_strip (2, data->copyright, data->rights); - tracker_sparql_builder_predicate (metadata, "nie:copyright"); - tracker_sparql_builder_object_unvalidated (metadata, final_rights); + tracker_resource_set_string (resource, "nie:copyright", final_rights); } if (data->white_balance) { - tracker_sparql_builder_predicate (metadata, "nmm:whiteBalance"); - tracker_sparql_builder_object_unvalidated (metadata, data->white_balance); + tracker_resource_set_string (resource, "nmm:whiteBalance", data->white_balance); } if (data->fnumber) { - tracker_sparql_builder_predicate (metadata, "nmm:fnumber"); - tracker_sparql_builder_object_unvalidated (metadata, data->fnumber); + tracker_resource_set_string (resource, "nmm:fnumber", data->fnumber); } if (data->flash) { - tracker_sparql_builder_predicate (metadata, "nmm:flash"); - tracker_sparql_builder_object_unvalidated (metadata, data->flash); + tracker_resource_set_string (resource, "nmm:flash", data->flash); } if (data->focal_length) { - tracker_sparql_builder_predicate (metadata, "nmm:focalLength"); - tracker_sparql_builder_object_unvalidated (metadata, data->focal_length); + tracker_resource_set_string (resource, "nmm:focalLength", data->focal_length); } if (data->artist || data->contributor) { + TrackerResource *contributor; const gchar *final_artist = tracker_coalesce_strip (2, data->artist, 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); + contributor = tracker_extract_new_contact (final_artist); + tracker_resource_set_relation (resource, "nco:contributor", contributor); + g_object_unref (contributor); } if (data->exposure_time) { - tracker_sparql_builder_predicate (metadata, "nmm:exposureTime"); - tracker_sparql_builder_object_unvalidated (metadata, data->exposure_time); + tracker_resource_set_string (resource, "nmm:exposureTime", data->exposure_time); } if (data->iso_speed_ratings) { - tracker_sparql_builder_predicate (metadata, "nmm:isoSpeed"); - tracker_sparql_builder_object_unvalidated (metadata, data->iso_speed_ratings); + tracker_resource_set_string (resource, "nmm:isoSpeed", data->iso_speed_ratings); } if (data->date || data->time_original) { const gchar *final_date = tracker_coalesce_strip (2, data->date, data->time_original); - tracker_sparql_builder_predicate (metadata, "nie:contentCreated"); - tracker_sparql_builder_object_unvalidated (metadata, final_date); + tracker_resource_set_string (resource, "nie:contentCreated", final_date); } if (data->description) { - tracker_sparql_builder_predicate (metadata, "nie:description"); - tracker_sparql_builder_object_unvalidated (metadata, data->description); + tracker_resource_set_string (resource, "nie:description", data->description); } if (data->metering_mode) { - tracker_sparql_builder_predicate (metadata, "nmm:meteringMode"); - tracker_sparql_builder_object_unvalidated (metadata, data->metering_mode); + tracker_resource_set_string (resource, "nmm:meteringMode", data->metering_mode); } if (data->creator) { - tracker_sparql_builder_predicate (metadata, "nco:creator"); - - tracker_sparql_builder_object_blank_open (metadata); - tracker_sparql_builder_predicate (metadata, "a"); - tracker_sparql_builder_object (metadata, "nco:Contact"); + TrackerResource *creator; - tracker_sparql_builder_predicate (metadata, "nco:fullname"); - tracker_sparql_builder_object_unvalidated (metadata, data->creator); - tracker_sparql_builder_object_blank_close (metadata); + creator = tracker_extract_new_contact (data->creator); + tracker_resource_set_relation (resource, "nco:creator", creator); + g_object_unref (creator); } if (data->address || data->state || data->country || data->city || data->gps_altitude || data->gps_latitude || data->gps_longitude) { + TrackerResource *geopoint; - 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 (data->address || data->state || data->country || data->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); - tracker_sparql_builder_subject_iri (preupdate, addruri); - - g_free (addruri); - - tracker_sparql_builder_predicate (preupdate, "a"); - tracker_sparql_builder_object (preupdate, "nco:PostalAddress"); - - if (data->address) { - tracker_sparql_builder_predicate (preupdate, "nco:streetAddress"); - tracker_sparql_builder_object_unvalidated (preupdate, data->address); - } - - if (data->state) { - tracker_sparql_builder_predicate (preupdate, "nco:region"); - tracker_sparql_builder_object_unvalidated (preupdate, data->state); - } - - if (data->city) { - tracker_sparql_builder_predicate (preupdate, "nco:locality"); - tracker_sparql_builder_object_unvalidated (preupdate, data->city); - } - - if (data->country) { - tracker_sparql_builder_predicate (preupdate, "nco:country"); - tracker_sparql_builder_object_unvalidated (preupdate, data->country); - } - - tracker_sparql_builder_insert_close (preupdate); - } - - /* FIXME We are not handling the altitude ref here */ - - if (data->gps_altitude) { - tracker_sparql_builder_predicate (metadata, "slo:altitude"); - tracker_sparql_builder_object_unvalidated (metadata, data->gps_altitude); - } - - if (data->gps_latitude) { - tracker_sparql_builder_predicate (metadata, "slo:latitude"); - tracker_sparql_builder_object_unvalidated (metadata, data->gps_latitude); - } - - if (data->gps_longitude) { - tracker_sparql_builder_predicate (metadata, "slo:longitude"); - tracker_sparql_builder_object_unvalidated (metadata, data->gps_longitude); - } - - tracker_sparql_builder_object_blank_close (metadata); /* GeoLocation */ + geopoint = tracker_extract_new_location (data->address, data->state, data->city, + data->country, data->gps_altitude, data->gps_latitude, data->gps_longitude); + tracker_resource_set_relation (resource, "slo:location", geopoint); + g_object_unref (geopoint); } if (data->gps_direction) { - tracker_sparql_builder_predicate (metadata, "nfo:heading"); - tracker_sparql_builder_object_unvalidated (metadata, data->gps_direction); + tracker_resource_set_string (resource, "nfo:heading", data->gps_direction); } - - if (data->regions) { - tracker_xmp_apply_regions (preupdate, metadata, graph, data); - } + if (data->regions) { + tracker_xmp_apply_regions_to_resource (resource, data); + } return TRUE; } /** - * tracker_xmp_apply_regions: - * @preupdate: the preupdate object to apply XMP data to. - * @metadata: the metadata object to apply XMP data to. - * @graph: the graph to apply XMP data to. - * @data: the data to push into @preupdate and @metadata. + * tracker_xmp_apply_regions_to_resource: + * @resource: the #TrackerResource object to apply XMP data to. + * @data: the data to push into @resource * - * This function applies all regional @data to @preupdate and - * @metadata. Regional data exists for image formats like JPEG, PNG, - * etc. where parts of the image refer to areas of interest. This can - * be people's faces, places to focus, barcodes, etc. The regional - * data describes the title, height, width, X, Y and can occur - * multiple times in a given file. + * This function applies all regional @data to @resource. Regional data exists + * for image formats like JPEG, PNG, etc. where parts of the image refer to + * areas of interest. This can be people's faces, places to focus, barcodes, + * etc. The regional data describes the title, height, width, X, Y and can + * occur multiple times in a given file. * * This data usually is standardized between image formats and that's - * what makes this function different to tracker_xmp_apply() which is - * useful for XMP files only. + * what makes this function different to tracker_xmp_apply_to_resource() which + * is useful for XMP files only. * - * Returns: %TRUE if the @data was applied to @preupdate and @metadata - * successfully, otherwise %FALSE is returned. + * Returns: %TRUE if the @data was applied to @resource successfully, otherwise + * %FALSE is returned. * - * Since: 0.12 + * Since: 1.10 **/ gboolean -tracker_xmp_apply_regions (TrackerSparqlBuilder *preupdate, - TrackerSparqlBuilder *metadata, - const gchar *graph, - TrackerXmpData *data) +tracker_xmp_apply_regions_to_resource (TrackerResource *resource, + TrackerXmpData *data) { - GSList *iter; + GSList *iter; - g_return_val_if_fail (TRACKER_SPARQL_IS_BUILDER (preupdate), FALSE); - g_return_val_if_fail (TRACKER_SPARQL_IS_BUILDER (metadata), FALSE); - g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (TRACKER_IS_RESOURCE (resource), FALSE); + g_return_val_if_fail (data != NULL, FALSE); - if (!data->regions) { - return TRUE; - } + if (!data->regions) { + return TRUE; + } - for (iter = data->regions; iter != NULL; iter = iter->next) { - TrackerXmpRegion *region; - gchar *uuid; + for (iter = data->regions; iter != NULL; iter = iter->next) { + TrackerResource *region_resource; + TrackerXmpRegion *region; + gchar *uuid; - region = (TrackerXmpRegion *) iter->data; - uuid = tracker_sparql_get_uuid_urn (); + region = (TrackerXmpRegion *) iter->data; + uuid = tracker_sparql_get_uuid_urn (); - tracker_sparql_builder_insert_open (preupdate, NULL); - if (graph) { - tracker_sparql_builder_graph_open (preupdate, graph); - } + region_resource = tracker_resource_new (uuid); + tracker_resource_set_uri (region_resource, "rdf:type", "nfo:RegionOfInterest"); - tracker_sparql_builder_subject_iri (preupdate, uuid); - tracker_sparql_builder_predicate (preupdate, "a"); - tracker_sparql_builder_object (preupdate, "nfo:RegionOfInterest"); + g_free (uuid); - if (region->title) { - tracker_sparql_builder_predicate (preupdate, "nie:title"); - tracker_sparql_builder_object_string (preupdate, region->title); - } - - if (region->description) { - tracker_sparql_builder_predicate (preupdate, "nie:description"); - tracker_sparql_builder_object_string (preupdate, region->description); - } - - if (region->type) { - tracker_sparql_builder_predicate (preupdate, "nfo:regionOfInterestType"); - tracker_sparql_builder_object (preupdate, fix_region_type (region->type)); - } + if (region->title) { + tracker_resource_set_string (region_resource, "nie:title", region->title); + } - if (region->x) { - tracker_sparql_builder_predicate (preupdate, "nfo:regionOfInterestX"); - tracker_sparql_builder_object_unvalidated (preupdate, region->x); - } + if (region->description) { + tracker_resource_set_string (region_resource, "nie:description", region->description); + } - if (region->y) { - tracker_sparql_builder_predicate (preupdate, "nfo:regionOfInterestY"); - tracker_sparql_builder_object_unvalidated (preupdate, region->y); - } + if (region->type) { + tracker_resource_set_string (region_resource, "nfo:regionOfInterestType", fix_region_type (region->type)); + } - if (region->width) { - tracker_sparql_builder_predicate (preupdate, "nfo:regionOfInterestWidth"); - tracker_sparql_builder_object_unvalidated (preupdate, region->width); - } + if (region->x) { + tracker_resource_set_string (region_resource, "nfo:regionOfInterestX", region->x); + } - if (region->height) { - tracker_sparql_builder_predicate (preupdate, "nfo:regionOfInterestHeight"); - tracker_sparql_builder_object_unvalidated (preupdate, region->height); - } + if (region->y) { + tracker_resource_set_string (region_resource, "nfo:regionOfInterestY", region->y); + } - if (region->link_uri && region->link_class) { - tracker_sparql_builder_predicate (preupdate, "nfo:roiRefersTo"); - tracker_sparql_builder_object_iri (preupdate, region->link_uri); - } + if (region->width) { + tracker_resource_set_string (region_resource, "nfo:regionOfInterestWidth", region->width); + } - if (graph) { - tracker_sparql_builder_graph_close (preupdate); + if (region->height) { + tracker_resource_set_string (region_resource, "nfo:regionOfInterestHeight", region->height); } - tracker_sparql_builder_insert_close (preupdate); - /* Handle non-preupdate metadata */ - tracker_sparql_builder_predicate (metadata, "nfo:hasRegionOfInterest"); - tracker_sparql_builder_object_iri (metadata, uuid); + if (region->link_uri && region->link_class) { + tracker_resource_set_string (region_resource, "nfo:roiRefersTo", region->link_uri); + } - g_free (uuid); - } + tracker_resource_add_relation (resource, "nfo:hasRegionOfInterest", region_resource); + } - return TRUE; + return TRUE; } |