[tracker/wip/sam/resource: 8/18] tracker-extract: Use TrackerResource in some extractors



commit b4a5a379f03581f6fe1aa189fd1093b52d144713
Author: Sam Thursfield <ssssam gmail com>
Date:   Sat Mar 26 19:53:54 2016 +0000

    tracker-extract: Use TrackerResource in some extractors

 src/tracker-extract/tracker-extract-abw.c       |   51 +-
 src/tracker-extract/tracker-extract-bmp.c       |   18 +-
 src/tracker-extract/tracker-extract-dvi.c       |   17 +-
 src/tracker-extract/tracker-extract-epub.c      |  131 ++---
 src/tracker-extract/tracker-extract-gstreamer.c |  910 ++++++++---------------
 src/tracker-extract/tracker-extract-mp3.c       |  380 ++++-------
 6 files changed, 512 insertions(+), 995 deletions(-)
---
diff --git a/src/tracker-extract/tracker-extract-abw.c b/src/tracker-extract/tracker-extract-abw.c
index 621e534..644a1ff 100644
--- a/src/tracker-extract/tracker-extract-abw.c
+++ b/src/tracker-extract/tracker-extract-abw.c
@@ -47,8 +47,7 @@ typedef enum {
 } AbwParserTag;
 
 struct AbwParserData {
-       TrackerSparqlBuilder *metadata;
-       TrackerSparqlBuilder *preupdate;
+       TrackerResource *resource;
        GString *content;
        gchar *uri;
 
@@ -109,8 +108,7 @@ abw_parser_text (GMarkupParseContext *context,
                                   str, data->uri);
                } else {
                        data->has_title = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:title");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, str);
+                       tracker_resource_set_string (data->resource, "nie:title", str);
                }
                break;
        case ABW_PARSER_TAG_SUBJECT:
@@ -119,29 +117,27 @@ abw_parser_text (GMarkupParseContext *context,
                                   str, data->uri);
                } else {
                        data->has_subject = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:subject");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, str);
+                       tracker_resource_set_string (data->resource, "nie:subject", str);
                }
                break;
-       case ABW_PARSER_TAG_CREATOR:
-               tracker_sparql_builder_predicate (data->metadata, "nco:creator");
+       case ABW_PARSER_TAG_CREATOR: {
+               TrackerResource *creator;
+               creator = tracker_resource_new (NULL);
+               tracker_resource_set_uri (creator, "rdf:type", "nco:Contact");
+               tracker_resource_set_string (creator, "nco:fullname", str);
 
-               tracker_sparql_builder_object_blank_open (data->metadata);
-               tracker_sparql_builder_predicate (data->metadata, "a");
-               tracker_sparql_builder_object (data->metadata, "nco:Contact");
+               tracker_resource_set_relation (data->resource, "nco:creator", creator);
+               g_object_unref (creator);
 
-               tracker_sparql_builder_predicate (data->metadata, "nco:fullname");
-               tracker_sparql_builder_object_unvalidated (data->metadata, str);
-               tracker_sparql_builder_object_blank_close (data->metadata);
                break;
+       }
        case ABW_PARSER_TAG_DESCRIPTION:
                if (data->has_comment) {
                        g_warning ("Avoiding additional comment (%s) in Abiword document '%s'",
                                   str, data->uri);
                } else {
                        data->has_comment = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:comment");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, str);
+                       tracker_resource_set_string (data->resource, "nie:comment", str);
                }
                break;
        case ABW_PARSER_TAG_GENERATOR:
@@ -150,8 +146,7 @@ abw_parser_text (GMarkupParseContext *context,
                                   str, data->uri);
                } else {
                        data->has_generator = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:generator");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, str);
+                       tracker_resource_set_string (data->resource, "nie:generator", str);
                }
                break;
        case ABW_PARSER_TAG_KEYWORDS:
@@ -160,8 +155,7 @@ abw_parser_text (GMarkupParseContext *context,
 
                for (keyword = strtok_r (str, ",; ", &lasts); keyword;
                     keyword = strtok_r (NULL, ",; ", &lasts)) {
-                       tracker_sparql_builder_predicate (data->metadata, "nie:keyword");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, keyword);
+                       tracker_resource_add_string (data->resource, "nie:keyword", keyword);
                }
        }
                break;
@@ -191,7 +185,6 @@ static GMarkupParser parser = {
 G_MODULE_EXPORT gboolean
 tracker_extract_get_metadata (TrackerExtractInfo *info)
 {
-       TrackerSparqlBuilder *preupdate, *metadata;
        int fd;
        gchar *filename, *contents;
        gboolean retval = FALSE;
@@ -199,9 +192,6 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
        gsize len;
        struct stat st;
 
-       preupdate = tracker_extract_info_get_preupdate_builder (info);
-       metadata = tracker_extract_info_get_metadata_builder (info);
-
        f = tracker_extract_info_get_file (info);
        filename = g_file_get_path (f);
 
@@ -248,11 +238,9 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                AbwParserData data = { 0 };
 
                data.uri = g_file_get_uri (f);
-               data.metadata = metadata;
-               data.preupdate = preupdate;
+               data.resource = tracker_resource_new (NULL);
 
-               tracker_sparql_builder_predicate (metadata, "a");
-               tracker_sparql_builder_object (metadata, "nfo:Document");
+               tracker_resource_set_uri (data.resource, "rdf:type", "nfo:Document");
 
                context = g_markup_parse_context_new (&parser, 0, &data, NULL);
                g_markup_parse_context_parse (context, contents, len, &error);
@@ -262,8 +250,7 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                        g_error_free (error);
                } else {
                        if (data.content) {
-                               tracker_sparql_builder_predicate (metadata, "nie:plainTextContent");
-                               tracker_sparql_builder_object_unvalidated (metadata, data.content->str);
+                               tracker_resource_set_string (data.resource, "nie:plainTextContent", 
data.content->str);
                                g_string_free (data.content, TRUE);
                        }
 
@@ -272,8 +259,10 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
 
                g_markup_parse_context_free (context);
                g_free (data.uri);
-       }
 
+               tracker_extract_info_add_resource (info, data.resource);
+               g_object_unref (data.resource);
+       }
 
        if (contents) {
                munmap (contents, len);
diff --git a/src/tracker-extract/tracker-extract-bmp.c b/src/tracker-extract/tracker-extract-bmp.c
index 1f3e41e..7a46e4a 100644
--- a/src/tracker-extract/tracker-extract-bmp.c
+++ b/src/tracker-extract/tracker-extract-bmp.c
@@ -105,14 +105,12 @@ get_img_resolution (const GFile *file,
 G_MODULE_EXPORT gboolean
 tracker_extract_get_metadata (TrackerExtractInfo *info)
 {
-       TrackerSparqlBuilder *metadata;
+       TrackerResource *image;
        goffset size;
        gchar *filename;
        GFile *file;
        gint64 width = 0, height = 0;
 
-       metadata = tracker_extract_info_get_metadata_builder (info);
-
        file = tracker_extract_info_get_file (info);
        if (!file) {
                return FALSE;
@@ -127,21 +125,21 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                return FALSE;
        }
 
-       tracker_sparql_builder_predicate (metadata, "a");
-       tracker_sparql_builder_object (metadata, "nfo:Image");
-       tracker_sparql_builder_object (metadata, "nmm:Photo");
+       image = tracker_resource_new (NULL);
+       tracker_resource_set_uri (image, "rdf:type", "nfo:Image");
+       tracker_resource_add_uri (image, "rdf:type", "nmm:Photo");
 
        if (get_img_resolution (file, &width, &height)) {
                if (width > 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:width");
-                       tracker_sparql_builder_object_int64 (metadata, width);
+                       tracker_resource_set_int64 (image, "nfo:width", width);
                }
 
                if (height > 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:height");
-                       tracker_sparql_builder_object_int64 (metadata, height);
+                       tracker_resource_set_int64 (image, "nfo:height", height);
                }
        }
 
+       tracker_extract_info_add_resource (info, image);
+
        return TRUE;
 }
diff --git a/src/tracker-extract/tracker-extract-dvi.c b/src/tracker-extract/tracker-extract-dvi.c
index 355abdd..b3b2275 100644
--- a/src/tracker-extract/tracker-extract-dvi.c
+++ b/src/tracker-extract/tracker-extract-dvi.c
@@ -214,12 +214,11 @@ error:
 G_MODULE_EXPORT gboolean
 tracker_extract_get_metadata (TrackerExtractInfo *info)
 {
-       TrackerSparqlBuilder *metadata;
+       TrackerResource *resource;
        GFile *file;
        gchar *filename;
        DviContext *context;
 
-       metadata = tracker_extract_info_get_metadata_builder (info);
        file = tracker_extract_info_get_file (info);
        filename = g_file_get_path (file);
 
@@ -231,18 +230,20 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                return FALSE;
        }
 
-       tracker_sparql_builder_predicate (metadata, "a");
-       tracker_sparql_builder_object (metadata, "nfo:PaginatedTextDocument");
+       resource = tracker_resource_new (NULL);
 
-       tracker_sparql_builder_predicate (metadata, "nfo:pageCount");
-       tracker_sparql_builder_object_int64 (metadata, context->npages);
+       tracker_resource_set_uri (resource, "rdf:type", "nfo:PaginatedTextDocument");
+
+       tracker_resource_set_int64 (resource, "nfo:pageCount", context->npages);
 
        if (context->fileid) {
-               tracker_sparql_builder_predicate (metadata, "nie:comment");
-               tracker_sparql_builder_object_unvalidated (metadata, context->fileid);
+               tracker_resource_set_string (resource, "nie:comment", context->fileid);
        }
 
        mdvi_destroy_context (context);
 
+       tracker_extract_info_add_resource (info, resource);
+       g_object_unref (resource);
+
        return TRUE;
 }
diff --git a/src/tracker-extract/tracker-extract-epub.c b/src/tracker-extract/tracker-extract-epub.c
index fef8012..f389dda 100644
--- a/src/tracker-extract/tracker-extract-epub.c
+++ b/src/tracker-extract/tracker-extract-epub.c
@@ -46,9 +46,7 @@ typedef enum {
 } OPFTagType;
 
 typedef struct {
-       gchar *graph;
-       TrackerSparqlBuilder *preupdate;
-       TrackerSparqlBuilder *metadata;
+       TrackerResource *resource;
        gchar *uri;
 
        OPFTagType element;
@@ -71,21 +69,13 @@ typedef struct {
 } OPFContentData;
 
 static inline OPFData *
-opf_data_new (TrackerExtractInfo *info)
+opf_data_new (const char *uri,
+              TrackerResource *resource)
 {
        OPFData *data = g_slice_new0 (OPFData);
-       TrackerSparqlBuilder *builder;
-       GFile *file;
-
-       file = tracker_extract_info_get_file (info);
-       builder = tracker_extract_info_get_preupdate_builder (info);
-       data->preupdate = g_object_ref (builder);
 
-       builder = tracker_extract_info_get_metadata_builder (info);
-       data->metadata = g_object_ref (builder);
-
-       data->graph = g_strdup (tracker_extract_info_get_graph (info));
-       data->uri = g_file_get_uri (file);
+       data->uri = g_strdup (uri);
+       data->resource = g_object_ref (resource);
 
        return data;
 }
@@ -113,17 +103,9 @@ opf_data_free (OPFData *data)
        g_list_foreach (data->pages, (GFunc) g_free, NULL);
        g_list_free (data->pages);
 
-       g_free (data->graph);
+       g_object_unref (data->resource);
        g_free (data->uri);
 
-       if (data->metadata) {
-               g_object_unref (data->metadata);
-       }
-
-       if (data->preupdate) {
-               g_object_unref (data->preupdate);
-       }
-
        g_slice_free (OPFData, data);
 }
 
@@ -289,22 +271,22 @@ opf_xml_text_handler (GMarkupParseContext   *context,
                        g_warning ("Avoiding additional publisher (%s) in EPUB '%s'",
                                   text, data->uri);
                } else {
-                       data->has_publisher = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nco:publisher");
+                       TrackerResource *publisher;
+
+                       publisher = tracker_resource_new (NULL);
+                       tracker_resource_set_uri (publisher, "rdf:type", "nco:Contact");
+                       tracker_resource_set_string (publisher, "nco:fullname", text);
 
-                       tracker_sparql_builder_object_blank_open (data->metadata);
-                       tracker_sparql_builder_predicate (data->metadata, "a");
-                       tracker_sparql_builder_object (data->metadata, "nco:Contact");
+                       tracker_resource_set_relation (data->resource, "nco:publisher", publisher);
 
-                       tracker_sparql_builder_predicate (data->metadata, "nco:fullname");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, text);
-                       tracker_sparql_builder_object_blank_close (data->metadata);
+                       data->has_publisher = TRUE;
                }
                break;
        case OPF_TAG_TYPE_AUTHOR:
        case OPF_TAG_TYPE_EDITOR:
        case OPF_TAG_TYPE_ILLUSTRATOR:
        case OPF_TAG_TYPE_CONTRIBUTOR: {
+               TrackerResource *contact, *artist;
                gchar *fname, *gname, *oname;
                const gchar *fullname = NULL;
                gchar *role_uri = NULL;
@@ -411,56 +393,37 @@ opf_xml_text_handler (GMarkupParseContext   *context,
                }
 
                if (role_uri) {
-                       tracker_sparql_builder_insert_open (data->preupdate, NULL);
-                       if (data->graph) {
-                               tracker_sparql_builder_graph_open (data->preupdate, data->graph);
-                       }
-
-                       tracker_sparql_builder_subject_iri (data->preupdate, role_uri);
-                       tracker_sparql_builder_predicate (data->preupdate, "a");
-                       tracker_sparql_builder_object (data->preupdate, "nmm:Artist");
-                       tracker_sparql_builder_predicate (data->preupdate, "nmm:artistName");
-                       tracker_sparql_builder_object_unvalidated (data->preupdate, fullname);
-
-                       if (data->graph) {
-                               tracker_sparql_builder_graph_close (data->preupdate);
-                       }
-                       tracker_sparql_builder_insert_close (data->preupdate);
+                       artist = tracker_resource_new (role_uri);
+                       tracker_resource_set_uri (artist, "rdf:type", "nmm:Artist");
+                       tracker_resource_set_string (artist, "nmm:artistName", fullname);
                }
 
                /* Creator contact details */
-               tracker_sparql_builder_predicate (data->metadata, "nco:creator");
-               tracker_sparql_builder_object_blank_open (data->metadata);
-               tracker_sparql_builder_predicate (data->metadata, "a");
-               tracker_sparql_builder_object (data->metadata, "nco:PersonContact");
-               tracker_sparql_builder_predicate (data->metadata, "nco:fullname");
-               tracker_sparql_builder_object_unvalidated (data->metadata, fullname);
+               contact = tracker_resource_new (NULL);
+               tracker_resource_set_uri (contact, "rdf:type",  "nco:PersonContact");
+               tracker_resource_set_string (contact, "nco:fullname", fullname);
 
                if (fname) {
-                       tracker_sparql_builder_predicate (data->metadata, "nco:nameFamily");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, fname);
+                       tracker_resource_set_string (contact, "nco:nameFamily", fname);
                        g_free (fname);
                }
 
                if (gname) {
-                       tracker_sparql_builder_predicate (data->metadata, "nco:nameGiven");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, gname);
+                       tracker_resource_set_string (contact, "nco:nameGiven", gname);
                        g_free (gname);
                }
 
                if (oname) {
-                       tracker_sparql_builder_predicate (data->metadata, "nco:nameAdditional");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, oname);
+                       tracker_resource_set_string (contact, "nco:nameAdditional", oname);
                        g_free (oname);
                }
 
                if (role_uri) {
-                       tracker_sparql_builder_predicate (data->metadata, role_str);
-                       tracker_sparql_builder_object_iri (data->metadata, role_uri);
+                       tracker_resource_set_relation (contact, role_str, artist);
                        g_free (role_uri);
                }
 
-               tracker_sparql_builder_object_blank_close (data->metadata);
+               tracker_resource_set_relation (data->resource, "nco:creator", contact);
 
                break;
        }
@@ -470,8 +433,7 @@ opf_xml_text_handler (GMarkupParseContext   *context,
                                   text, data->uri);
                } else {
                        data->has_title = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:title");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, text);
+                       tracker_resource_set_string (data->resource, "nie:title", text);
                }
                break;
        case OPF_TAG_TYPE_CREATED: {
@@ -483,8 +445,7 @@ opf_xml_text_handler (GMarkupParseContext   *context,
 
                        if (date) {
                                data->has_content_created = TRUE;
-                               tracker_sparql_builder_predicate (data->metadata, "nie:contentCreated");
-                               tracker_sparql_builder_object_unvalidated (data->metadata, date);
+                               tracker_resource_set_string (data->resource, "nie:contentCreated", date);
                                g_free (date);
                        } else {
                                g_warning ("Could not parse creation time (%s) in EPUB '%s'",
@@ -499,8 +460,7 @@ opf_xml_text_handler (GMarkupParseContext   *context,
                                   text, data->uri);
                } else {
                        data->has_language = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:language");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, text);
+                       tracker_resource_set_string (data->resource, "nie:language", text);
                }
                break;
        case OPF_TAG_TYPE_SUBJECT:
@@ -509,8 +469,7 @@ opf_xml_text_handler (GMarkupParseContext   *context,
                                   text, data->uri);
                } else {
                        data->has_subject = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:subject");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, text);
+                       tracker_resource_set_string (data->resource, "nie:subject", text);
                }
                break;
        case OPF_TAG_TYPE_DESCRIPTION:
@@ -519,8 +478,7 @@ opf_xml_text_handler (GMarkupParseContext   *context,
                                   text, data->uri);
                } else {
                        data->has_description = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:description");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, text);
+                       tracker_resource_set_string (data->resource, "nie:description", text);
                }
                break;
        case OPF_TAG_TYPE_UUID:
@@ -530,8 +488,7 @@ opf_xml_text_handler (GMarkupParseContext   *context,
                                   text, data->uri);
                } else {
                        data->has_identifier = TRUE;
-                       tracker_sparql_builder_predicate (data->metadata, "nie:identifier");
-                       tracker_sparql_builder_object_unvalidated (data->metadata, text);
+                       tracker_resource_set_string (data->resource, "nie:identifier", text);
                }
                break;
        /* case OPF_TAG_TYPE_RATING: */
@@ -650,11 +607,11 @@ extract_opf_contents (const gchar *uri,
        return g_string_free (content_data.contents, FALSE);
 }
 
-static gboolean
+static TrackerResource *
 extract_opf (const gchar          *uri,
-             const gchar          *opf_path,
-             TrackerExtractInfo   *info)
+             const gchar          *opf_path)
 {
+       TrackerResource *ebook;
        GMarkupParseContext *context;
        OPFData *data = NULL;
        GError *error = NULL;
@@ -668,10 +625,10 @@ extract_opf (const gchar          *uri,
 
        g_debug ("Extracting OPF file contents from EPUB '%s'", uri);
 
-       data = opf_data_new (info);
+       ebook = tracker_resource_new (NULL);
+       tracker_resource_set_uri (ebook, "rdf:type", "nfo:EBook");
 
-       tracker_sparql_builder_predicate (data->metadata, "a");
-       tracker_sparql_builder_object (data->metadata, "nfo:EBook");
+       data = opf_data_new (uri, ebook);
 
        /* Create parsing context */
        context = g_markup_parse_context_new (&opf_parser, 0, data, NULL);
@@ -687,7 +644,8 @@ extract_opf (const gchar          *uri,
                           (error) ? error->message : "No error provided");
                g_error_free (error);
                opf_data_free (data);
-               return FALSE;
+               g_object_unref (ebook);
+               return NULL;
        }
 
        dirname = g_path_get_dirname (opf_path);
@@ -695,19 +653,19 @@ extract_opf (const gchar          *uri,
        g_free (dirname);
 
        if (contents && *contents) {
-               tracker_sparql_builder_predicate (data->metadata, "nie:plainTextContent");
-               tracker_sparql_builder_object_unvalidated (data->metadata, contents);
+               tracker_resource_set_string (ebook, "nie:plainTextContent", contents);
        }
 
        opf_data_free (data);
        g_free (contents);
 
-       return TRUE;
+       return ebook;
 }
 
 G_MODULE_EXPORT gboolean
 tracker_extract_get_metadata (TrackerExtractInfo *info)
 {
+       TrackerResource *ebook;
        gchar *opf_path, *uri;
        GFile *file;
 
@@ -721,9 +679,12 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                return FALSE;
        }
 
-       extract_opf (uri, opf_path, info);
+       ebook = extract_opf (uri, opf_path);
        g_free (opf_path);
        g_free (uri);
 
+       tracker_extract_info_add_resource (info, ebook);
+       g_object_unref (ebook);
+
        return TRUE;
 }
diff --git a/src/tracker-extract/tracker-extract-gstreamer.c b/src/tracker-extract/tracker-extract-gstreamer.c
index a419b54..4a94f23 100644
--- a/src/tracker-extract/tracker-extract-gstreamer.c
+++ b/src/tracker-extract/tracker-extract-gstreamer.c
@@ -2,6 +2,7 @@
  * Copyright (C) 2006, Laurent Aguerreche <laurent aguerreche free fr>
  * Copyright (C) 2007, Jamie McCracken <jamiemcc gnome org>
  * Copyright (C) 2008, Nokia <ivan frade nokia com>
+ * Copyright (C) 2016, Sam Thursfield <sam afuera me uk>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -151,95 +152,47 @@ typedef struct {
 
 static void common_extract_stream_metadata (MetadataExtractor    *extractor,
                                             const gchar          *uri,
-                                            TrackerSparqlBuilder *metadata);
+                                            TrackerResource      *resource);
 
-static void
-add_artist (MetadataExtractor     *extractor,
-            TrackerSparqlBuilder  *preupdate,
-            const gchar           *graph,
-            const gchar           *artist_name,
-            gchar                **p_artist_uri)
+static TrackerResource *
+intern_artist (MetadataExtractor     *extractor,
+               const gchar           *artist_name)
 {
-       g_return_if_fail (artist_name != NULL);
-
-       *p_artist_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", artist_name);
+       GSList *node;
+       TrackerResource *artist;
+       gchar *artist_uri;
 
-       /* Check if already added to the preupdate, to avoid sending 9 identical INSERTs */
-       if (g_slist_find_custom (extractor->artist_list, artist_name, (GCompareFunc) strcmp))
-               return;
-
-       tracker_sparql_builder_insert_open (preupdate, NULL);
-       if (graph) {
-               tracker_sparql_builder_graph_open (preupdate, graph);
-       }
+       g_return_val_if_fail (artist_name != NULL, NULL);
 
-       tracker_sparql_builder_subject_iri (preupdate, *p_artist_uri);
-       tracker_sparql_builder_predicate (preupdate, "a");
-       tracker_sparql_builder_object (preupdate, "nmm:Artist");
-       tracker_sparql_builder_predicate (preupdate, "nmm:artistName");
-       tracker_sparql_builder_object_unvalidated (preupdate, artist_name);
+       artist_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", artist_name);
 
-       if (graph) {
-               tracker_sparql_builder_graph_close (preupdate);
+       node = g_slist_find_custom (extractor->artist_list, artist_uri,
+                                   (GCompareFunc) tracker_resource_identifier_compare_func);
+       if (node) {
+               return node->data;
        }
-       tracker_sparql_builder_insert_close (preupdate);
-
-       extractor->artist_list = g_slist_prepend (extractor->artist_list, g_strdup (artist_name));
-}
-
-static void
-add_string_gst_tag (TrackerSparqlBuilder *metadata,
-                    const gchar          *key,
-                    GstTagList           *tag_list,
-                    const gchar          *tag)
-{
-       gchar *s;
-       gboolean ret;
-
-       s = NULL;
-       ret = gst_tag_list_get_string (tag_list, tag, &s);
-
-       if (s) {
-               if (ret && s[0] != '\0') {
-                       tracker_sparql_builder_predicate (metadata, key);
-                       tracker_sparql_builder_object_unvalidated (metadata, s);
-               }
 
-               g_free (s);
-       }
-}
+       artist = tracker_resource_new (artist_uri);
 
-static void
-add_uint_gst_tag (TrackerSparqlBuilder  *metadata,
-                  const gchar           *key,
-                  GstTagList            *tag_list,
-                  const gchar           *tag)
-{
-       gboolean ret;
-       guint n;
+       tracker_resource_set_uri(artist, "rdf:type", "nmm:Artist");
+       tracker_resource_set_string(artist, "nmm:artistName", artist_name);
 
-       ret = gst_tag_list_get_uint (tag_list, tag, &n);
+       extractor->artist_list = g_slist_prepend (extractor->artist_list, artist);
 
-       if (ret) {
-               tracker_sparql_builder_predicate (metadata, key);
-               tracker_sparql_builder_object_int64 (metadata, n);
-       }
+       return artist;
 }
 
 static void
-add_double_gst_tag (TrackerSparqlBuilder  *metadata,
-                    const gchar           *key,
-                    GstTagList            *tag_list,
-                    const gchar           *tag)
+set_property_from_gst_tag (TrackerResource *resource,
+                           const gchar     *property_uri,
+                           GstTagList      *tag_list,
+                           const gchar     *tag)
 {
-       gboolean ret;
-       gdouble n;
-
-       ret = gst_tag_list_get_double (tag_list, tag, &n);
+       GValue *value = NULL;
 
-       if (ret) {
-               tracker_sparql_builder_predicate (metadata, key);
-               tracker_sparql_builder_object_int64 (metadata, (gint64) n);
+       if (gst_tag_list_copy_value (value, tag_list, tag)) {
+               tracker_resource_set_gvalue (resource, property_uri, value);
+               g_value_unset (value);
        }
 }
 
@@ -311,12 +264,12 @@ get_gst_date_time_to_buf (GstDateTime *date_time,
 }
 
 static void
-add_date_time_gst_tag_with_mtime_fallback (TrackerSparqlBuilder  *metadata,
-                                           const gchar           *uri,
-                                           const gchar           *key,
-                                           GstTagList            *tag_list,
-                                           const gchar           *tag_date_time,
-                                           const gchar           *tag_date)
+add_date_time_gst_tag_with_mtime_fallback (TrackerResource *resource,
+                                           const gchar     *uri,
+                                           const gchar     *key,
+                                           GstTagList      *tag_list,
+                                           const gchar     *tag_date_time,
+                                           const gchar     *tag_date)
 {
        GstDateTime *date_time;
        GDate *date;
@@ -355,12 +308,12 @@ add_date_time_gst_tag_with_mtime_fallback (TrackerSparqlBuilder  *metadata,
                g_date_free (date);
        }
 
-       tracker_guarantee_date_from_file_mtime (metadata, key, buf, uri);
+       tracker_guarantee_resource_date_from_file_mtime (resource, key, buf, uri);
 }
 
 static void
-add_keywords_gst_tag (TrackerSparqlBuilder *metadata,
-                      GstTagList           *tag_list)
+set_keywords_from_gst_tag (TrackerResource *resource,
+                           GstTagList      *tag_list)
 {
        gboolean ret;
        gchar *str;
@@ -374,8 +327,7 @@ add_keywords_gst_tag (TrackerSparqlBuilder *metadata,
                keywords = g_strsplit_set (str, " ,", -1);
 
                while (keywords[i]) {
-                       tracker_sparql_builder_predicate (metadata, "nie:keyword");
-                       tracker_sparql_builder_object_unvalidated (metadata, g_strstrip (keywords[i]));
+                       tracker_resource_add_string (resource, "nie:keyword", g_strstrip (keywords[i]));
                        i++;
                }
 
@@ -384,49 +336,6 @@ add_keywords_gst_tag (TrackerSparqlBuilder *metadata,
        }
 }
 
-static void
-replace_double_gst_tag (TrackerSparqlBuilder  *preupdate,
-                        const gchar           *uri,
-                        const gchar           *key,
-                        GstTagList            *tag_list,
-                        const gchar           *tag,
-                        const gchar           *graph)
-{
-       gdouble  value;
-       gboolean has_it;
-
-       has_it = gst_tag_list_get_double (tag_list, tag, &value);
-
-       if (! has_it)
-               return;
-
-       tracker_sparql_builder_delete_open (preupdate, NULL);
-       tracker_sparql_builder_subject_iri (preupdate, uri);
-       tracker_sparql_builder_predicate (preupdate, key);
-       tracker_sparql_builder_object_variable (preupdate, "unknown");
-       tracker_sparql_builder_delete_close (preupdate);
-
-       tracker_sparql_builder_where_open (preupdate);
-       tracker_sparql_builder_subject_iri (preupdate, uri);
-       tracker_sparql_builder_predicate (preupdate, key);
-       tracker_sparql_builder_object_variable (preupdate, "unknown");
-       tracker_sparql_builder_where_close (preupdate);
-
-       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, key);
-       tracker_sparql_builder_object_double (preupdate, value);
-
-       if (graph) {
-               tracker_sparql_builder_graph_close (preupdate);
-       }
-       tracker_sparql_builder_insert_close (preupdate);
-}
-
 static gchar *
 get_embedded_cue_sheet_data (GstTagList *tag_list)
 {
@@ -531,95 +440,67 @@ get_embedded_media_art (MetadataExtractor *extractor)
 
 #endif
 
-static void
-extractor_apply_geolocation_metadata (MetadataExtractor     *extractor,
-                                      GstTagList            *tag_list,
-                                      TrackerSparqlBuilder  *preupdate,
-                                      TrackerSparqlBuilder  *metadata,
-                                      const gchar           *graph)
+static TrackerResource *
+extractor_get_geolocation (MetadataExtractor     *extractor,
+                           GstTagList            *tag_list)
 {
-       gchar *country = NULL, *city = NULL, *sublocation = NULL;
+       TrackerResource *location = NULL;
        gdouble lat, lon, alt;
        gboolean has_coords;
 
        g_debug ("Retrieving geolocation metadata...");
 
-       country = city = sublocation = NULL;
        has_coords = (gst_tag_list_get_double (tag_list, GST_TAG_GEO_LOCATION_LATITUDE, &lat) &&
                      gst_tag_list_get_double (tag_list, GST_TAG_GEO_LOCATION_LONGITUDE, &lon) &&
                      gst_tag_list_get_double (tag_list, GST_TAG_GEO_LOCATION_ELEVATION, &alt));
 
-       gst_tag_list_get_string (tag_list, GST_TAG_GEO_LOCATION_CITY, &city);
-       gst_tag_list_get_string (tag_list, GST_TAG_GEO_LOCATION_COUNTRY, &country);
-       gst_tag_list_get_string (tag_list, GST_TAG_GEO_LOCATION_SUBLOCATION, &sublocation);
-
-       if (city || country || sublocation || has_coords) {
-               gchar *address_uri = NULL;
-
-               /* Create postal address */
-               if (city || country || sublocation) {
-                       address_uri = tracker_sparql_get_uuid_urn ();
+       if (has_coords) {
+               location = tracker_resource_new (NULL);
+               tracker_resource_set_uri (location, "rdf:type", "slo:GeoLocation");
 
-                       tracker_sparql_builder_insert_open (preupdate, NULL);
-                       if (graph) {
-                               tracker_sparql_builder_graph_open (preupdate, graph);
-                       }
+               tracker_resource_set_double (location, "slo:latitude", lat);
+               tracker_resource_set_double (location, "slo:longitude", lon);
+               tracker_resource_set_double (location, "slo:altitude", alt);
+       }
 
-                       tracker_sparql_builder_subject_iri (preupdate, address_uri);
-                       tracker_sparql_builder_predicate (preupdate, "a");
-                       tracker_sparql_builder_object (preupdate, "nco:PostalAddress");
+       return location;
+}
 
-                       if (sublocation) {
-                               tracker_sparql_builder_predicate (preupdate, "nco:region");
-                               tracker_sparql_builder_object_unvalidated (preupdate, sublocation);
-                       }
+static TrackerResource *
+extractor_get_address (MetadataExtractor     *extractor,
+                       GstTagList            *tag_list)
+{
+       TrackerResource *address = NULL;
+       gchar *country = NULL, *city = NULL, *sublocation = NULL;
 
-                       if (city) {
-                               tracker_sparql_builder_predicate (preupdate, "nco:locality");
-                               tracker_sparql_builder_object_unvalidated (preupdate, city);
-                       }
+       g_debug ("Retrieving address metadata...");
 
-                       if (country) {
-                               tracker_sparql_builder_predicate (preupdate, "nco:country");
-                               tracker_sparql_builder_object_unvalidated (preupdate, country);
-                       }
+       gst_tag_list_get_string (tag_list, GST_TAG_GEO_LOCATION_CITY, &city);
+       gst_tag_list_get_string (tag_list, GST_TAG_GEO_LOCATION_COUNTRY, &country);
+       gst_tag_list_get_string (tag_list, GST_TAG_GEO_LOCATION_SUBLOCATION, &sublocation);
 
-                       if (graph) {
-                               tracker_sparql_builder_graph_close (preupdate);
-                       }
-                       tracker_sparql_builder_insert_close (preupdate);
-               }
+       if (city || country || sublocation) {
+               gchar *address_uri = NULL;
 
-               /* Create geolocation */
-               tracker_sparql_builder_predicate (metadata, "slo:location");
+               address_uri = tracker_sparql_get_uuid_urn ();
+               address = tracker_resource_new (address_uri);
 
-               tracker_sparql_builder_object_blank_open (metadata);
-               tracker_sparql_builder_predicate (metadata, "a");
-               tracker_sparql_builder_object (metadata, "slo:GeoLocation");
+               tracker_resource_set_string (address, "rdf:type", "nco:PostalAddress");
 
-               if (address_uri) {
-                       tracker_sparql_builder_predicate (metadata, "slo:postalAddress");
-                       tracker_sparql_builder_object_iri (metadata, address_uri);
+               if (sublocation) {
+                       tracker_resource_set_string (address, "nco:region", sublocation);
                }
 
-               if (has_coords) {
-                       tracker_sparql_builder_predicate (metadata, "slo:latitude");
-                       tracker_sparql_builder_object_double (metadata, lat);
-
-                       tracker_sparql_builder_predicate (metadata, "slo:longitude");
-                       tracker_sparql_builder_object_double (metadata, lon);
-
-                       tracker_sparql_builder_predicate (metadata, "slo:altitude");
-                       tracker_sparql_builder_object_double (metadata, alt);
+               if (city) {
+                       tracker_resource_set_string (address, "nco:locality", city);
                }
 
-               tracker_sparql_builder_object_blank_close (metadata);
-               g_free (address_uri);
+               if (country) {
+                       tracker_resource_set_string (address, "nco:country", country);
+               }
        }
 
-       g_free (city);
-       g_free (country);
-       g_free (sublocation);
+       return address;
 }
 
 static void
@@ -641,59 +522,59 @@ static void
 extractor_apply_general_metadata (MetadataExtractor     *extractor,
                                   GstTagList            *tag_list,
                                   const gchar           *file_url,
-                                  TrackerSparqlBuilder  *preupdate,
-                                  TrackerSparqlBuilder  *metadata,
-                                  const gchar           *graph,
-                                  gchar                **p_performer_uri,
-                                  gchar                **p_composer_uri)
+                                  TrackerResource       *resource,
+                                  TrackerResource      **p_performer,
+                                  TrackerResource      **p_composer)
 {
-       const gchar *performer = NULL;
+       const gchar *performer_name = NULL;
        gchar *performer_temp = NULL;
        gchar *artist_temp = NULL;
-       gchar *composer = NULL;
+       gchar *composer_name = NULL;
        gchar *genre = NULL;
        gchar *title = NULL;
        gchar *title_guaranteed = NULL;
 
+       *p_composer = NULL;
+       *p_performer = NULL;
+
        gst_tag_list_get_string (tag_list, GST_TAG_PERFORMER, &performer_temp);
        gst_tag_list_get_string (tag_list, GST_TAG_ARTIST, &artist_temp);
-       gst_tag_list_get_string (tag_list, GST_TAG_COMPOSER, &composer);
+       gst_tag_list_get_string (tag_list, GST_TAG_COMPOSER, &composer_name);
 
-       performer = tracker_coalesce_strip (2, performer_temp, artist_temp);
+       performer_name = tracker_coalesce_strip (2, performer_temp, artist_temp);
 
-       if (performer != NULL) {
-               add_artist (extractor, preupdate, graph, performer, p_performer_uri);
+       if (performer_name != NULL) {
+               *p_performer = intern_artist (extractor, performer_name);
        }
 
-       if (composer != NULL) {
-               add_artist (extractor, preupdate, graph, composer, p_composer_uri);
+       if (composer_name != NULL) {
+               *p_composer = intern_artist (extractor, composer_name);
        }
 
        gst_tag_list_get_string (tag_list, GST_TAG_GENRE, &genre);
        gst_tag_list_get_string (tag_list, GST_TAG_TITLE, &title);
 
        if (genre && g_strcmp0 (genre, "Unknown") != 0) {
-               tracker_sparql_builder_predicate (metadata, "nfo:genre");
-               tracker_sparql_builder_object_unvalidated (metadata, genre);
+               tracker_resource_add_string (resource, "nfo:genre", genre);
        }
 
-       tracker_guarantee_title_from_file (metadata,
-                                          "nie:title",
-                                          title,
-                                          file_url,
-                                          &title_guaranteed);
+       tracker_guarantee_resource_title_from_file (resource,
+                                                  "nie:title",
+                                                   title,
+                                                   file_url,
+                                                   &title_guaranteed);
 
-       add_date_time_gst_tag_with_mtime_fallback (metadata,
+       add_date_time_gst_tag_with_mtime_fallback (resource,
                                                   file_url,
                                                   "nie:contentCreated",
                                                   tag_list,
                                                   GST_TAG_DATE_TIME,
                                                   GST_TAG_DATE);
 
-       add_string_gst_tag (metadata, "nie:copyright", tag_list, GST_TAG_COPYRIGHT);
-       add_string_gst_tag (metadata, "nie:license", tag_list, GST_TAG_LICENSE);
-       add_string_gst_tag (metadata, "dc:coverage", tag_list, GST_TAG_LOCATION);
-       add_string_gst_tag (metadata, "nie:comment", tag_list, GST_TAG_COMMENT);
+       set_property_from_gst_tag (resource, "nie:copyright", tag_list, GST_TAG_COPYRIGHT);
+       set_property_from_gst_tag (resource, "nie:license", tag_list, GST_TAG_LICENSE);
+       set_property_from_gst_tag (resource, "dc:coverage", tag_list, GST_TAG_LOCATION);
+       set_property_from_gst_tag (resource, "nie:comment", tag_list, GST_TAG_COMMENT);
 
 #ifdef HAVE_LIBMEDIAART
        if (extractor->media_art_type == MEDIA_ART_VIDEO) {
@@ -707,169 +588,89 @@ extractor_apply_general_metadata (MetadataExtractor     *extractor,
 
        g_free (performer_temp);
        g_free (artist_temp);
-       g_free (composer);
+       g_free (composer_name);
        g_free (genre);
        g_free (title);
 }
 
-static void
-extractor_apply_album_metadata (MetadataExtractor     *extractor,
-                                GstTagList            *tag_list,
-                                TrackerSparqlBuilder  *preupdate,
-                                const gchar           *graph,
-                                gchar                **p_album_artist_uri,
-                                gchar                **p_album_uri,
-                                gchar                **p_album_disc_uri)
+static TrackerResource *
+extractor_get_album_disc (MetadataExtractor *extractor,
+                          GstTagList        *tag_list)
 {
-       gchar *album_artist;
+       TrackerResource *album = NULL, *album_artist = NULL, *album_disc = NULL;
+       gchar *album_uri, *album_disc_uri;
+       gchar *album_artist_name;
        gchar *album_title = NULL;
        gchar *album_artist_temp = NULL;
        gchar *track_artist_temp = NULL;
        gboolean has_it;
-       guint count;
+       guint volume_number;
 
        gst_tag_list_get_string (tag_list, GST_TAG_ALBUM, &album_title);
 
        if (!album_title)
-               return;
+               return NULL;
 
        gst_tag_list_get_string (tag_list, GST_TAG_ALBUM_ARTIST, &album_artist_temp);
        gst_tag_list_get_string (tag_list, GST_TAG_ARTIST, &track_artist_temp);
 
-       album_artist = g_strdup (tracker_coalesce_strip (2, album_artist_temp, track_artist_temp));
+       album_artist_name = g_strdup (tracker_coalesce_strip (2, album_artist_temp, track_artist_temp));
 
-        if (album_artist != NULL) {
-                add_artist (extractor, preupdate, graph, album_artist, p_album_artist_uri);
-                *p_album_uri = tracker_sparql_escape_uri_printf ("urn:album:%s:%s", album_title, 
album_artist);
+        if (album_artist_name != NULL) {
+                album_artist = intern_artist (extractor, album_artist_name);
+                album_uri = tracker_sparql_escape_uri_printf ("urn:album:%s:%s", album_title, album_artist);
         } else {
-                *p_album_uri = tracker_sparql_escape_uri_printf ("urn:album:%s", album_title);
+                album_uri = tracker_sparql_escape_uri_printf ("urn:album:%s", album_title);
         }
 
-       tracker_sparql_builder_insert_open (preupdate, NULL);
-       if (graph) {
-               tracker_sparql_builder_graph_open (preupdate, graph);
-       }
-
-       tracker_sparql_builder_subject_iri (preupdate, *p_album_uri);
-       tracker_sparql_builder_predicate (preupdate, "a");
-       tracker_sparql_builder_object (preupdate, "nmm:MusicAlbum");
-       /* FIXME: nmm:albumTitle is now deprecated
-        * tracker_sparql_builder_predicate (preupdate, "nie:title");
-        */
-       tracker_sparql_builder_predicate (preupdate, "nmm:albumTitle");
-       tracker_sparql_builder_object_unvalidated (preupdate, album_title);
+       album = tracker_resource_new (album_uri);
+       tracker_resource_set_uri (album, "rdf:type", "nmm:MusicAlbum");
 
-       if (*p_album_artist_uri) {
-               tracker_sparql_builder_predicate (preupdate, "nmm:albumArtist");
-               tracker_sparql_builder_object_iri (preupdate, *p_album_artist_uri);
-       }
+       /* FIXME: nmm:albumTitle is now deprecated, should use nie:title ??  */
+       tracker_resource_set_string (album, "nmm:albumTitle", album_title);
 
-       if (graph) {
-               tracker_sparql_builder_graph_close (preupdate);
+       if (album_artist) {
+               tracker_resource_set_relation (album, "nmm:albumArtist", album_artist);
        }
-       tracker_sparql_builder_insert_close (preupdate);
-
-       has_it = gst_tag_list_get_uint (tag_list, GST_TAG_TRACK_COUNT, &count);
-
-       if (has_it) {
-               tracker_sparql_builder_delete_open (preupdate, NULL);
-               tracker_sparql_builder_subject_iri (preupdate, *p_album_uri);
-               tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount");
-               tracker_sparql_builder_object_variable (preupdate, "unknown");
-               tracker_sparql_builder_delete_close (preupdate);
-               tracker_sparql_builder_where_open (preupdate);
-               tracker_sparql_builder_subject_iri (preupdate, *p_album_uri);
-               tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount");
-               tracker_sparql_builder_object_variable (preupdate, "unknown");
-               tracker_sparql_builder_where_close (preupdate);
-
-               tracker_sparql_builder_insert_open (preupdate, NULL);
-               if (graph) {
-                       tracker_sparql_builder_graph_open (preupdate, graph);
-               }
-
-               tracker_sparql_builder_subject_iri (preupdate, *p_album_uri);
-               tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount");
-               tracker_sparql_builder_object_int64 (preupdate, count);
 
-               if (graph) {
-                       tracker_sparql_builder_graph_close (preupdate);
-               }
-               tracker_sparql_builder_insert_close (preupdate);
-       }
+       set_property_from_gst_tag (album, "nmm:albumTrackCount", tag_list, GST_TAG_TRACK_COUNT);
 
-       has_it = gst_tag_list_get_uint (tag_list, GST_TAG_ALBUM_VOLUME_NUMBER, &count);
+       has_it = gst_tag_list_get_uint (tag_list, GST_TAG_ALBUM_VOLUME_NUMBER, &volume_number);
 
         if (album_artist) {
-                *p_album_disc_uri = tracker_sparql_escape_uri_printf ("urn:album-disc:%s:%s:Disc%d",
-                                                                      album_title, album_artist,
-                                                                      has_it ? count : 1);
+                album_disc_uri = tracker_sparql_escape_uri_printf ("urn:album-disc:%s:%s:Disc%d",
+                                                                   album_title, album_artist,
+                                                                   has_it ? volume_number : 1);
         } else {
-                *p_album_disc_uri = tracker_sparql_escape_uri_printf ("urn:album-disc:%s:Disc%d",
-                                                                      album_title,
-                                                                      has_it ? count : 1);
+                album_disc_uri = tracker_sparql_escape_uri_printf ("urn:album-disc:%s:Disc%d",
+                                                                   album_title,
+                                                                   has_it ? volume_number : 1);
         }
 
+       album_disc = tracker_resource_new (album_disc_uri);
+       tracker_resource_set_uri (album_disc, "rdf:type", "nmm:MusicAlbumDisc");
+       tracker_resource_set_int64 (album_disc, "nmm:setNumber", has_it ? volume_number : 1);
+       tracker_resource_set_relation (album_disc, "nmm:albumDiscAlbum", album);
 
-       tracker_sparql_builder_delete_open (preupdate, NULL);
-       tracker_sparql_builder_subject_iri (preupdate, *p_album_disc_uri);
-       tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
-       tracker_sparql_builder_object_variable (preupdate, "unknown");
-       tracker_sparql_builder_delete_close (preupdate);
-       tracker_sparql_builder_where_open (preupdate);
-       tracker_sparql_builder_subject_iri (preupdate, *p_album_disc_uri);
-       tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
-       tracker_sparql_builder_object_variable (preupdate, "unknown");
-       tracker_sparql_builder_where_close (preupdate);
-
-       tracker_sparql_builder_delete_open (preupdate, NULL);
-       tracker_sparql_builder_subject_iri (preupdate, *p_album_disc_uri);
-       tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
-       tracker_sparql_builder_object_variable (preupdate, "unknown");
-       tracker_sparql_builder_delete_close (preupdate);
-       tracker_sparql_builder_where_open (preupdate);
-       tracker_sparql_builder_subject_iri (preupdate, *p_album_disc_uri);
-       tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
-       tracker_sparql_builder_object_variable (preupdate, "unknown");
-       tracker_sparql_builder_where_close (preupdate);
-
-       tracker_sparql_builder_insert_open (preupdate, NULL);
-       if (graph) {
-               tracker_sparql_builder_graph_open (preupdate, graph);
-       }
-
-       tracker_sparql_builder_subject_iri (preupdate, *p_album_disc_uri);
-       tracker_sparql_builder_predicate (preupdate, "a");
-       tracker_sparql_builder_object (preupdate, "nmm:MusicAlbumDisc");
-       tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
-       tracker_sparql_builder_object_int64 (preupdate, has_it ? count : 1);
-       tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
-       tracker_sparql_builder_object_iri (preupdate, *p_album_uri);
-
-       if (graph) {
-               tracker_sparql_builder_graph_close (preupdate);
-       }
-       tracker_sparql_builder_insert_close (preupdate);
-
-       replace_double_gst_tag (preupdate, *p_album_uri, "nmm:albumGain", extractor->tagcache, 
GST_TAG_ALBUM_GAIN, graph);
-       replace_double_gst_tag (preupdate, *p_album_uri, "nmm:albumPeakGain", extractor->tagcache, 
GST_TAG_ALBUM_PEAK, graph);
+       set_property_from_gst_tag (album, "nmm:albumGain", extractor->tagcache, GST_TAG_ALBUM_GAIN);
+       set_property_from_gst_tag (album, "nmm:albumPeakGain", extractor->tagcache, GST_TAG_ALBUM_PEAK);
 
 #ifdef HAVE_LIBMEDIAART
-       extractor->media_art_artist = album_artist;
+       extractor->media_art_artist = album_artist_name;
        extractor->media_art_title = album_title;
 #endif
 
        g_free (album_artist_temp);
        g_free (track_artist_temp);
+
+       return album_disc;
 }
 
-static void
-extractor_apply_device_metadata (MetadataExtractor    *extractor,
-                                 GstTagList           *tag_list,
-                                 TrackerSparqlBuilder *preupdate,
-                                 TrackerSparqlBuilder *metadata,
-                                 const gchar          *graph)
+static TrackerResource *
+extractor_get_equipment (MetadataExtractor    *extractor,
+                         GstTagList           *tag_list)
 {
+       TrackerResource *equipment;
        gchar *equip_uri;
        gchar *model = NULL, *manuf = NULL;
 
@@ -877,142 +678,111 @@ extractor_apply_device_metadata (MetadataExtractor    *extractor,
        gst_tag_list_get_string (tag_list, GST_TAG_DEVICE_MANUFACTURER, &manuf);
 
        if (model == NULL && manuf == NULL)
-               return;
+               return NULL;
 
        equip_uri = tracker_sparql_escape_uri_printf ("urn:equipment:%s:%s:",
                                                      manuf ? manuf : "",
                                                      model ? model : "");
+       equipment = tracker_resource_new (equip_uri);
 
-       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");
+       tracker_resource_set_uri (equipment, "rdf:type", "nfo:Equipment");
 
        if (manuf) {
-               tracker_sparql_builder_predicate (preupdate, "nfo:manufacturer");
-               tracker_sparql_builder_object_unvalidated (preupdate, manuf);
+               tracker_resource_set_string (equipment, "nfo:manufacturer", manuf);
        }
        if (model) {
-               tracker_sparql_builder_predicate (preupdate, "nfo:model");
-               tracker_sparql_builder_object_unvalidated (preupdate, model);
-       }
-
-       if (graph) {
-               tracker_sparql_builder_graph_close (preupdate);
+               tracker_resource_set_string (equipment, "nfo:model", model);
        }
-       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);
        g_free (model);
        g_free (manuf);
+
+       return equipment;
 }
 
 static void
 extractor_apply_audio_metadata (MetadataExtractor     *extractor,
                                 GstTagList            *tag_list,
-                                TrackerSparqlBuilder  *metadata,
-                                const gchar           *performer_uri,
-                                const gchar           *composer_uri,
-                                const gchar           *album_uri,
-                                const gchar           *album_disc_uri)
+                                TrackerResource       *audio,
+                                TrackerResource       *performer,
+                                TrackerResource       *composer,
+                                TrackerResource       *album_disc)
 {
-       add_uint_gst_tag (metadata, "nmm:trackNumber", tag_list, GST_TAG_TRACK_NUMBER);
-       add_string_gst_tag (metadata, "nfo:codec", tag_list, GST_TAG_AUDIO_CODEC);
-       add_double_gst_tag (metadata, "nfo:gain", tag_list, GST_TAG_TRACK_GAIN);
-       add_double_gst_tag (metadata, "nfo:peakGain", tag_list, GST_TAG_TRACK_PEAK);
-
-       if (performer_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:performer");
-               tracker_sparql_builder_object_iri (metadata, performer_uri);
-       }
+       set_property_from_gst_tag (audio, "nmm:trackNumber", tag_list, GST_TAG_TRACK_NUMBER);
+       set_property_from_gst_tag (audio, "nfo:codec", tag_list, GST_TAG_AUDIO_CODEC);
+       set_property_from_gst_tag (audio, "nfo:gain", tag_list, GST_TAG_TRACK_GAIN);
+       set_property_from_gst_tag (audio, "nfo:peakGain", tag_list, GST_TAG_TRACK_PEAK);
 
-       if (composer_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:composer");
-               tracker_sparql_builder_object_iri (metadata, composer_uri);
+       if (performer) {
+               tracker_resource_set_relation (audio, "nmm:performer", performer);
        }
 
-       if (album_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:musicAlbum");
-               tracker_sparql_builder_object_iri (metadata, album_uri);
+       if (composer) {
+               tracker_resource_set_relation (audio, "nmm:composer", composer);
        }
 
-       if (album_disc_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:musicAlbumDisc");
-               tracker_sparql_builder_object_iri (metadata, album_disc_uri);
+       if (album_disc) {
+               TrackerResource *album;
+               album = tracker_resource_get_first_relation (album_disc, "nmm:albumDiscAlbum");
+
+               tracker_resource_set_relation (audio, "nmm:musicAlbumDisc", album_disc);
+               tracker_resource_set_relation (audio, "nmm:musicAlbum", album);
        }
 }
 
 static void
-extractor_apply_video_metadata (MetadataExtractor    *extractor,
-                                GstTagList           *tag_list,
-                                TrackerSparqlBuilder *metadata,
-                                const gchar          *performer_uri,
-                                const gchar          *composer_uri)
+extractor_apply_video_metadata (MetadataExtractor *extractor,
+                                GstTagList        *tag_list,
+                                TrackerResource   *video,
+                                TrackerResource   *performer,
+                                TrackerResource   *composer)
 {
-       add_string_gst_tag (metadata, "dc:source", tag_list, GST_TAG_CLASSIFICATION);
+       set_property_from_gst_tag (video, "dc:source", tag_list, GST_TAG_CLASSIFICATION);
 
-       if (performer_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:leadActor");
-               tracker_sparql_builder_object_iri (metadata, performer_uri);
+       if (performer) {
+               tracker_resource_set_relation (video, "nmm:leadActor", performer);
        }
 
-       if (composer_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:director");
-               tracker_sparql_builder_object_iri (metadata, composer_uri);
+       if (composer) {
+               tracker_resource_set_relation (video, "nmm:director", composer);
        }
 
-       add_keywords_gst_tag (metadata, tag_list);
+       set_keywords_from_gst_tag (video, tag_list);
 }
 
-static void
-extract_track_metadata (MetadataExtractor    *extractor,
-                        TrackerTocEntry      *toc_entry,
-                        const gchar          *file_url,
-                        TrackerSparqlBuilder *preupdate,
-                        TrackerSparqlBuilder *postupdate,
-                        const gchar          *graph,
-                        const gchar          *album_uri,
-                        const gchar          *album_disc_uri)
+static TrackerResource *
+extract_track (MetadataExtractor    *extractor,
+               TrackerTocEntry      *toc_entry,
+               const gchar          *file_url,
+               TrackerResource      *album_disc)
 {
-       gchar *track_performer_uri = NULL;
-       gchar *track_composer_uri = NULL;
+       TrackerResource *track;
+       TrackerResource *track_performer = NULL, *track_composer = NULL;
        gchar *track_uri;
 
        track_uri = tracker_sparql_get_uuid_urn ();
+       track = tracker_resource_new (track_uri);
 
-       tracker_sparql_builder_subject_iri (postupdate, track_uri);
-
-       tracker_sparql_builder_predicate (postupdate, "a");
-       tracker_sparql_builder_object (postupdate, "nmm:MusicPiece");
-       tracker_sparql_builder_object (postupdate, "nfo:Audio");
+       tracker_resource_add_uri (track, "rdf:type", "nmm:MusicPiece");
+       tracker_resource_add_uri (track, "rdf:type", "nfo:Audio");
 
        extractor_apply_general_metadata (extractor,
                                          toc_entry->tag_list,
                                          file_url,
-                                         preupdate,
-                                         postupdate,
-                                         graph,
-                                         &track_performer_uri,
-                                         &track_composer_uri);
+                                         track,
+                                         &track_performer,
+                                         &track_composer);
 
        extractor_apply_audio_metadata (extractor,
                                        toc_entry->tag_list,
-                                       postupdate,
-                                       track_performer_uri,
-                                       track_composer_uri,
-                                       album_uri,
-                                       album_disc_uri);
+                                       track,
+                                       track_performer,
+                                       track_composer,
+                                       album_disc);
 
        if (toc_entry->duration > 0) {
-               tracker_sparql_builder_predicate (postupdate, "nfo:duration");
-               tracker_sparql_builder_object_int64 (postupdate, (gint64)toc_entry->duration);
+               tracker_resource_set_int64 (track, "nfo:duration", (gint64)toc_entry->duration);
        } else if (extractor->toc->entry_list &&
                   toc_entry == g_list_last (extractor->toc->entry_list)->data) {
                /* The last element may not have a duration, because it depends
@@ -1020,58 +790,17 @@ extract_track_metadata (MetadataExtractor    *extractor,
                 * cue sheet. In this case figure the data out from the total
                 * duration.
                 */
-               tracker_sparql_builder_predicate (postupdate, "nfo:duration");
-               tracker_sparql_builder_object_int64 (postupdate,
-                                                    (gint64) extractor->duration - toc_entry->start);
+               tracker_resource_set_int64 (track, "nfo:duration", (gint64)extractor->duration - 
toc_entry->start);
        }
 
-       tracker_sparql_builder_predicate (postupdate, "nfo:audioOffset");
-       tracker_sparql_builder_object_double (postupdate, toc_entry->start);
-
-       /* Link the track to its container file. Since the file might not have been
-        * inserted yet, we use a WHERE clause based on its nie:url to refer to it.
-        */
-       tracker_sparql_builder_predicate (postupdate, "nie:isStoredAs");
-       tracker_sparql_builder_object_variable (postupdate, "file");
+       tracker_resource_set_double (track, "nfo:audioOffset", toc_entry->start);
 
-       g_free (track_performer_uri);
-       g_free (track_composer_uri);
+       g_object_unref (track_performer);
+       g_object_unref (track_composer);
 
        g_free (track_uri);
-}
 
-static void
-delete_existing_tracks (TrackerSparqlBuilder *postupdate,
-                        const gchar          *graph,
-                        const gchar          *file_url)
-{
-       gchar *sparql;
-
-       /* Delete existing tracks */
-
-       tracker_sparql_builder_delete_open (postupdate, NULL);
-       if (graph) {
-               tracker_sparql_builder_graph_open (postupdate, graph);
-       }
-
-       tracker_sparql_builder_subject_variable (postupdate, "track");
-       tracker_sparql_builder_predicate (postupdate, "a");
-       tracker_sparql_builder_object (postupdate, "nmm:MusicPiece");
-
-       if (graph) {
-               tracker_sparql_builder_graph_close (postupdate);
-       }
-       tracker_sparql_builder_delete_close (postupdate);
-
-       sparql = g_strdup_printf ("WHERE { "
-                                 "  ?track a nmm:MusicPiece . "
-                                 "  ?file a nfo:FileDataObject ; "
-                                 "        nie:url \"%s\" . "
-                                 "  ?track nie:isStoredAs ?file "
-                                 "} \n",
-                                 file_url);
-       tracker_sparql_builder_append (postupdate, sparql);
-       g_free (sparql);
+       return track;
 }
 
 #define CHUNK_N_BYTES (2 << 15)
@@ -1125,18 +854,15 @@ end:
        return 0;
 }
 
-static void
+static TrackerResource *
 extract_metadata (MetadataExtractor      *extractor,
-                  const gchar            *file_url,
-                  TrackerSparqlBuilder   *preupdate,
-                  TrackerSparqlBuilder   *postupdate,
-                  TrackerSparqlBuilder   *metadata,
-                  const gchar            *graph)
+                  const gchar            *file_url)
 {
-       g_return_if_fail (extractor != NULL);
-       g_return_if_fail (preupdate != NULL);
-       g_return_if_fail (postupdate != NULL);
-       g_return_if_fail (metadata != NULL);
+       TrackerResource *resource;
+
+       g_return_val_if_fail (extractor != NULL, NULL);
+
+       resource = tracker_resource_new (NULL);
 
 #ifdef HAVE_LIBMEDIAART
        extractor->media_art_type = MEDIA_ART_NONE;
@@ -1184,130 +910,109 @@ extract_metadata (MetadataExtractor      *extractor,
        if (extractor->mime == EXTRACT_MIME_GUESS) {
                g_warning ("Cannot guess real stream type if no tags were read! "
                           "Defaulting to Video.");
-               tracker_sparql_builder_predicate (metadata, "a");
-               tracker_sparql_builder_object (metadata, "nmm:Video");
+               tracker_resource_set_uri (resource, "rdf:type", "nmm:Video");
        } else {
-               tracker_sparql_builder_predicate (metadata, "a");
-
                if (extractor->mime == EXTRACT_MIME_AUDIO) {
                        /* Audio: don't make an nmm:MusicPiece for the file resource if it's
                         * actually a container for an entire album - we will make a
                         * nmm:MusicPiece for each of the tracks inside instead.
                         */
-                       tracker_sparql_builder_object (metadata, "nfo:Audio");
+                       tracker_resource_set_uri (resource, "rdf:type", "nfo:Audio");
 
                        if (extractor->toc == NULL || extractor->toc->entry_list == NULL)
-                               tracker_sparql_builder_object (metadata, "nmm:MusicPiece");
+                               tracker_resource_add_uri (resource, "rdf:type", "nfo:MusicPiece");
 
 #ifdef HAVE_LIBMEDIAART
                        extractor->media_art_type = MEDIA_ART_ALBUM;
 #endif
                } else if (extractor->mime == EXTRACT_MIME_VIDEO) {
-                       tracker_sparql_builder_object (metadata, "nmm:Video");
+                       tracker_resource_set_uri (resource, "rdf:type", "nmm:Video");
 
 #ifdef HAVE_LIBMEDIAART
                        extractor->media_art_type = MEDIA_ART_VIDEO;
 #endif
                } else {
-                       tracker_sparql_builder_object (metadata, "nfo:Image");
-                       tracker_sparql_builder_object (metadata, "nmm:Photo");
+                       tracker_resource_set_uri (resource, "rdf:type", "nfo:Image");
+                       tracker_resource_add_uri (resource, "rdf:type", "nmm:Photo");
                }
        }
 
        if (!gst_tag_list_is_empty (extractor->tagcache)) {
                GList *node;
-               gchar *performer_uri = NULL;
-               gchar *composer_uri = NULL;
-               gchar *album_artist_uri = NULL;
-               gchar *album_uri = NULL;
-               gchar *album_disc_uri = NULL;
+               TrackerResource *equipment;
+               TrackerResource *geolocation, *address;
+               TrackerResource *performer = NULL, *composer = NULL;
+               TrackerResource *album_disc;
 
                extractor_apply_general_metadata (extractor,
                                                  extractor->tagcache,
                                                  file_url,
-                                                 preupdate,
-                                                 metadata,
-                                                 graph,
-                                                 &performer_uri,
-                                                 &composer_uri);
-
-               extractor_apply_device_metadata (extractor,
-                                                extractor->tagcache,
-                                                preupdate,
-                                                metadata,
-                                                graph);
-
-               extractor_apply_geolocation_metadata (extractor,
-                                                     extractor->tagcache,
-                                                     preupdate,
-                                                     metadata,
-                                                     graph);
+                                                 resource,
+                                                 &performer,
+                                                 &composer);
+
+               equipment = extractor_get_equipment (extractor, extractor->tagcache);
+               if (equipment) {
+                       tracker_resource_set_relation (resource, "nfo:equipment", equipment);
+                       g_object_unref (equipment);
+               }
+
+               geolocation = extractor_get_geolocation (extractor, extractor->tagcache);
+               if (geolocation) {
+                       tracker_resource_set_relation (resource, "slo:location", geolocation);
+                       g_object_unref (geolocation);
+               }
+
+               address = extractor_get_address (extractor, extractor->tagcache);
+               if (address) {
+                       tracker_resource_set_relation (resource, "slo:postalAddress", address);
+                       g_object_unref (address);
+               }
 
                if (extractor->mime == EXTRACT_MIME_VIDEO) {
                        extractor_apply_video_metadata (extractor,
                                                        extractor->tagcache,
-                                                       metadata,
-                                                       performer_uri,
-                                                       composer_uri);
+                                                       resource,
+                                                       performer,
+                                                       composer);
                }
 
                if (extractor->mime == EXTRACT_MIME_AUDIO) {
-                       extractor_apply_album_metadata (extractor,
-                                                       extractor->tagcache,
-                                                       preupdate,
-                                                       graph,
-                                                       &album_artist_uri,
-                                                       &album_uri,
-                                                       &album_disc_uri);
+                       album_disc = extractor_get_album_disc (extractor, extractor->tagcache);
 
                        extractor_apply_audio_metadata (extractor,
                                                        extractor->tagcache,
-                                                       metadata,
-                                                       performer_uri,
-                                                       composer_uri,
-                                                       album_uri,
-                                                       album_disc_uri);
+                                                       resource,
+                                                       performer,
+                                                       composer,
+                                                       album_disc);
 
                        /* If the audio file contains multiple tracks, we create the tracks
                         * as abstract information element types and relate them to the
                         * concrete nfo:FileDataObject using nie:isStoredAs.
                         */
                        if (extractor->toc && g_list_length (extractor->toc->entry_list) > 1) {
-                               delete_existing_tracks (postupdate, graph, file_url);
+                               for (node = extractor->toc->entry_list; node; node = node->next) {
+                                       TrackerResource *track;
 
-                               tracker_sparql_builder_insert_open (postupdate, NULL);
-                               if (graph) {
-                                       tracker_sparql_builder_graph_open (postupdate, graph);
+                                       track = extract_track (extractor, node->data, file_url, album_disc);
+                                       tracker_resource_set_relation (track, "nie:isStoredAs", resource);
+                                       g_object_unref (track);
                                }
 
-                               for (node = extractor->toc->entry_list; node; node = node->next)
-                                       extract_track_metadata (extractor,
-                                                               node->data,
-                                                               file_url,
-                                                               preupdate,
-                                                               postupdate,
-                                                               graph,
-                                                               album_uri,
-                                                               album_disc_uri);
-
-                               if (graph) {
-                                       tracker_sparql_builder_graph_close (postupdate);
-                               }
-                               tracker_sparql_builder_insert_close (postupdate);
-
-                               tracker_sparql_builder_where_open (postupdate);
-                               tracker_sparql_builder_subject_variable (postupdate, "file");
-                               tracker_sparql_builder_predicate (postupdate, "nie:url");
-                               tracker_sparql_builder_object_string (postupdate, file_url);
-                               tracker_sparql_builder_where_close (postupdate);
+                               tracker_resource_set_string (resource, "nie:url", file_url);
                        }
+
+                       g_object_unref (album_disc);
+               }
+
+               if (performer) {
+                       g_object_unref (performer);
                }
 
-               g_free (performer_uri);
-               g_free (composer_uri);
-               g_free (album_uri);
-               g_free (album_disc_uri);
-               g_free (album_artist_uri);
+               if (composer) {
+                       g_object_unref (composer);
+               }
        }
 
        /* OpenSubtitles compatible hash */
@@ -1320,37 +1025,36 @@ extract_metadata (MetadataExtractor      *extractor,
                g_object_unref (file);
 
                if (hash) {
+                       TrackerResource *hash_resource;
                        char *hash_str;
 
-                       /* { <foo> a nfo:FileHash; nfo:hashValue "..."; nfo:hashAlgorithm "gibest" } */
-                       tracker_sparql_builder_predicate (metadata, "nfo:hasHash");
+                       hash_resource = tracker_resource_new (NULL);
+                       tracker_resource_set_uri (hash_resource, "rdf:type", "nfo:FileHash");
 
-                       tracker_sparql_builder_object_blank_open (metadata);
-                       tracker_sparql_builder_predicate (metadata, "a");
-                       tracker_sparql_builder_object (metadata, "nfo:FileHash");
-
-                       tracker_sparql_builder_predicate (metadata, "nfo:hashValue");
                        hash_str = g_strdup_printf ("%" G_GSIZE_MODIFIER "x", hash);
-                       tracker_sparql_builder_object_string (metadata, hash_str);
+                       tracker_resource_set_string (hash_resource, "nfo:hashValue", hash_str);
                        g_free (hash_str);
 
-                       tracker_sparql_builder_predicate (metadata, "nfo:hashAlgorithm");
-                       tracker_sparql_builder_object_string (metadata, "gibest");
+                       tracker_resource_set_string (resource, "nfo:hashAlgorithm", "gibest");
+
+                       tracker_resource_set_relation (resource, "nfo:hasHash", hash_resource);
 
-                       tracker_sparql_builder_object_blank_close (metadata);
+                       g_object_unref (hash_resource);
                }
        }
 
        /* If content was encrypted, set it. */
 /* #warning TODO: handle encrypted content with the Discoverer/GUPnP-DLNA backends */
 
-       common_extract_stream_metadata (extractor, file_url, metadata);
+       common_extract_stream_metadata (extractor, file_url, resource);
 
 #ifdef HAVE_LIBMEDIAART
        if (extractor->mime == EXTRACT_MIME_AUDIO) {
                get_embedded_media_art (extractor);
        }
 #endif
+
+       return resource;
 }
 
 #if defined(GSTREAMER_BACKEND_DISCOVERER) || \
@@ -1358,30 +1062,26 @@ extract_metadata (MetadataExtractor      *extractor,
 static void
 common_extract_stream_metadata (MetadataExtractor    *extractor,
                                 const gchar          *uri,
-                                TrackerSparqlBuilder *metadata)
+                                TrackerResource      *resource)
 {
        if (extractor->mime == EXTRACT_MIME_AUDIO ||
            extractor->mime == EXTRACT_MIME_VIDEO) {
                if (extractor->audio_channels >= 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:channels");
-                       tracker_sparql_builder_object_int64 (metadata, extractor->audio_channels);
+                       tracker_resource_set_int64 (resource, "nfo:channels", extractor->audio_channels);
                }
 
                if (extractor->audio_samplerate >= 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:sampleRate");
-                       tracker_sparql_builder_object_int64 (metadata, extractor->audio_samplerate);
+                       tracker_resource_set_int64 (resource, "nfo:sampleRate", extractor->audio_samplerate);
                }
 
                if (extractor->duration >= 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:duration");
-                       tracker_sparql_builder_object_int64 (metadata, extractor->duration);
+                       tracker_resource_set_int64 (resource, "nfo:duration", extractor->duration);
                }
        }
 
        if (extractor->mime == EXTRACT_MIME_VIDEO) {
                if (extractor->video_fps >= 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:frameRate");
-                       tracker_sparql_builder_object_double (metadata, (gdouble)extractor->video_fps);
+                       tracker_resource_set_double (resource, "nfo:frameRate", 
(gdouble)extractor->video_fps);
                }
        }
 
@@ -1389,32 +1089,27 @@ common_extract_stream_metadata (MetadataExtractor    *extractor,
            extractor->mime == EXTRACT_MIME_VIDEO) {
 
                if (extractor->width >= 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:width");
-                       tracker_sparql_builder_object_int64 (metadata, extractor->width);
+                       tracker_resource_set_int64 (resource, "nfo:width", extractor->width);
                }
 
                if (extractor->height >= 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:height");
-                       tracker_sparql_builder_object_int64 (metadata, extractor->height);
+                       tracker_resource_set_int64 (resource, "nfo:height", extractor->height);
                }
 
                if (extractor->aspect_ratio >= 0) {
-                       tracker_sparql_builder_predicate (metadata, "nfo:aspectRatio");
-                       tracker_sparql_builder_object_double (metadata, (gdouble)extractor->aspect_ratio);
+                       tracker_resource_set_double (resource, "nfo:aspectRatio", 
(gdouble)extractor->aspect_ratio);
                }
        }
 
 #if defined(GSTREAMER_BACKEND_GUPNP_DLNA)
        if (extractor->dlna_profile) {
-               tracker_sparql_builder_predicate (metadata, "nmm:dlnaProfile");
-               tracker_sparql_builder_object_string (metadata, extractor->dlna_profile);
+               tracker_resource_set_string (resource, "nmm:dlnaProfile", extractor->dlna_profile);
        } else {
                g_debug ("No DLNA profile found");
        }
 
        if (extractor->dlna_mime) {
-               tracker_sparql_builder_predicate (metadata, "nmm:dlnaMime");
-               tracker_sparql_builder_object_string (metadata, extractor->dlna_mime);
+               tracker_resource_set_string (resource, "nmm:dlnaMime", extractor->dlna_mime);
        } else {
                g_debug ("No DLNA mime found");
        }
@@ -1608,13 +1303,12 @@ discoverer_init_and_run (MetadataExtractor *extractor,
 #endif /* defined(GSTREAMER_BACKEND_DISCOVERER) || \
           defined(GSTREAMER_BACKEND_GUPNP_DLNA) */
 
-static void
+static TrackerResource *
 tracker_extract_gstreamer (const gchar          *uri,
                            TrackerExtractInfo   *info,
-                           ExtractMime           type,
-                           const gchar          *graph)
+                           ExtractMime           type)
 {
-       TrackerSparqlBuilder *metadata, *preupdate, *postupdate;
+       TrackerResource *main_resource = NULL;
        MetadataExtractor *extractor;
        GstBuffer *buffer;
        gchar *cue_sheet;
@@ -1624,14 +1318,7 @@ tracker_extract_gstreamer (const gchar          *uri,
        MediaArtProcess *media_art_process;
 #endif
 
-       g_return_if_fail (uri);
-
-       graph = tracker_extract_info_get_graph (info);
-       metadata = tracker_extract_info_get_metadata_builder (info);
-       preupdate = tracker_extract_info_get_preupdate_builder (info);
-       postupdate = tracker_extract_info_get_postupdate_builder (info);
-
-       g_return_if_fail (metadata);
+       g_return_val_if_fail (uri, NULL);
 
        gst_init (NULL, NULL);
 
@@ -1661,12 +1348,7 @@ tracker_extract_gstreamer (const gchar          *uri,
                        extractor->toc = tracker_cue_sheet_parse_uri (uri);
                }
 
-               extract_metadata (extractor,
-                                 uri,
-                                 preupdate,
-                                 postupdate,
-                                 metadata,
-                                 graph);
+               main_resource = extract_metadata (extractor, uri);
 
 #ifdef HAVE_LIBMEDIAART
                if (extractor->media_art_type != MEDIA_ART_NONE &&
@@ -1724,12 +1406,14 @@ tracker_extract_gstreamer (const gchar          *uri,
 
        tracker_toc_free (extractor->toc);
 
-       g_slist_foreach (extractor->artist_list, (GFunc)g_free, NULL);
+       g_slist_foreach (extractor->artist_list, (GFunc)g_object_unref, NULL);
        g_slist_free (extractor->artist_list);
 
        discoverer_shutdown (extractor);
 
        g_slice_free (MetadataExtractor, extractor);
+
+       return main_resource;
 }
 
 G_MODULE_EXPORT gboolean
@@ -1737,17 +1421,16 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
 {
        GFile *file;
        gchar *uri;
-       const gchar *graph;
        const gchar *mimetype;
+       TrackerResource *main_resource;
 
        file = tracker_extract_info_get_file (info);
        uri = g_file_get_uri (file);
-       graph = tracker_extract_info_get_graph (info);
        mimetype = tracker_extract_info_get_mimetype (info);
 
 #if defined(GSTREAMER_BACKEND_GUPNP_DLNA)
        if (g_str_has_prefix (mimetype, "dlna/")) {
-               tracker_extract_gstreamer (uri, info, EXTRACT_MIME_GUESS, graph);
+               main_resource = tracker_extract_gstreamer (uri, info, EXTRACT_MIME_GUESS);
        } else
 #endif /* GSTREAMER_BACKEND_GUPNP_DLNA */
 
@@ -1756,18 +1439,23 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                    strcmp (mimetype, "video/x-ms-asf") == 0 ||
                    strcmp (mimetype, "application/vnd.ms-asf") == 0 ||
                   strcmp (mimetype, "application/vnd.rn-realmedia") == 0) {
-               tracker_extract_gstreamer (uri, info, EXTRACT_MIME_GUESS, graph);
+               main_resource = tracker_extract_gstreamer (uri, info, EXTRACT_MIME_GUESS);
        } else if (g_str_has_prefix (mimetype, "audio/")) {
-               tracker_extract_gstreamer (uri, info, EXTRACT_MIME_AUDIO, graph);
+               main_resource = tracker_extract_gstreamer (uri, info, EXTRACT_MIME_AUDIO);
        } else if (g_str_has_prefix (mimetype, "video/")) {
-               tracker_extract_gstreamer (uri, info, EXTRACT_MIME_VIDEO, graph);
+               main_resource = tracker_extract_gstreamer (uri, info, EXTRACT_MIME_VIDEO);
        } else if (g_str_has_prefix (mimetype, "image/")) {
-               tracker_extract_gstreamer (uri, info, EXTRACT_MIME_IMAGE, graph);
+               main_resource = tracker_extract_gstreamer (uri, info, EXTRACT_MIME_IMAGE);
        } else {
                g_free (uri);
                return FALSE;
        }
 
+       if (main_resource) {
+               tracker_extract_info_add_resource (info, main_resource);
+               g_object_unref (main_resource);
+       }
+
        g_free (uri);
        return TRUE;
 }
diff --git a/src/tracker-extract/tracker-extract-mp3.c b/src/tracker-extract/tracker-extract-mp3.c
index 04c4c09..60819f2 100644
--- a/src/tracker-extract/tracker-extract-mp3.c
+++ b/src/tracker-extract/tracker-extract-mp3.c
@@ -151,12 +151,12 @@ typedef struct {
        size_t id3v2_size;
 
        const gchar *title;
-       const gchar *performer;
-       gchar *performer_uri;
-       const gchar *lyricist;
-       gchar *lyricist_uri;
-       const gchar *album;
-       gchar *album_uri;
+       const gchar *performer_name;
+       TrackerResource *performer;
+       const gchar *lyricist_name;
+       TrackerResource *lyricist;
+       const gchar *album_name;
+       TrackerResource *album;
        const gchar *genre;
        const gchar *text;
        const gchar *recording_time;
@@ -164,8 +164,8 @@ typedef struct {
        const gchar *copyright;
        const gchar *publisher;
        const gchar *comment;
-       const gchar *composer;
-       gchar *composer_uri;
+       const gchar *composer_name;
+       TrackerResource *composer;
        gint track_number;
        gint track_count;
        gint set_number;
@@ -854,7 +854,7 @@ mp3_parse_header (const gchar          *data,
                   size_t                size,
                   size_t                seek_pos,
                   const gchar          *uri,
-                  TrackerSparqlBuilder *metadata,
+                  TrackerResource      *resource,
                   MP3Data              *filedata)
 {
        const gchar *dlna_profile, *dlna_mimetype;
@@ -971,13 +971,11 @@ mp3_parse_header (const gchar          *data,
                return FALSE;
        }
 
-       tracker_sparql_builder_predicate (metadata, "nfo:codec");
-       tracker_sparql_builder_object_string (metadata, "MPEG");
+       tracker_resource_set_string (resource, "nfo:codec", "MPEG");
 
        n_channels = ((header & ch_mask) == ch_mask) ? 1 : 2;
 
-       tracker_sparql_builder_predicate (metadata, "nfo:channels");
-       tracker_sparql_builder_object_int64 (metadata, n_channels);
+       tracker_resource_set_int (resource, "nfo:channels", n_channels);
 
        avg_bps /= frames;
 
@@ -990,21 +988,15 @@ mp3_parse_header (const gchar          *data,
                length = spfp8 * 8 * frames / sample_rate;
        }
 
-       tracker_sparql_builder_predicate (metadata, "nfo:duration");
-       tracker_sparql_builder_object_int64 (metadata, length);
-
-       tracker_sparql_builder_predicate (metadata, "nfo:sampleRate");
-       tracker_sparql_builder_object_int64 (metadata, sample_rate);
-       tracker_sparql_builder_predicate (metadata, "nfo:averageBitrate");
-       tracker_sparql_builder_object_int64 (metadata, avg_bps*1000);
+       tracker_resource_set_int64 (resource, "nfo:duration", length);
+       tracker_resource_set_int64 (resource, "nfo:sampleRate", sample_rate);
+       tracker_resource_set_int64 (resource, "nfo:averageBitrate", avg_bps*1000);
 
        if (guess_dlna_profile (bitrate, sample_rate,
                                mpeg_ver, layer_ver, n_channels,
                                &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 (resource, "nmm:dlnaProfile", dlna_profile);
+               tracker_resource_set_string (resource, "nmm:dlnaMime", dlna_mimetype);
        }
 
        return TRUE;
@@ -1015,7 +1007,7 @@ mp3_parse (const gchar          *data,
            size_t                size,
            size_t                offset,
            const gchar          *uri,
-           TrackerSparqlBuilder *metadata,
+           TrackerResource      *resource,
            MP3Data              *filedata)
 {
        guint header;
@@ -1032,7 +1024,7 @@ mp3_parse (const gchar          *data,
 
                if ((header & sync_mask) == sync_mask) {
                        /* Found header sync */
-                       if (mp3_parse_header (data, size, pos, uri, metadata, filedata)) {
+                       if (mp3_parse_header (data, size, pos, uri, resource, filedata)) {
                                return TRUE;
                        }
                }
@@ -1244,7 +1236,7 @@ get_id3v24_tags (id3v24frame           frame,
                  size_t                csize,
                  id3tag               *info,
                  const gchar          *uri,
-                 TrackerSparqlBuilder *metadata,
+                 TrackerResource      *resource,
                  MP3Data              *filedata)
 {
        id3v2tag *tag = &filedata->id3v24;
@@ -1434,7 +1426,7 @@ get_id3v23_tags (id3v24frame           frame,
                  size_t                csize,
                  id3tag               *info,
                  const gchar          *uri,
-                 TrackerSparqlBuilder *metadata,
+                 TrackerResource      *resource,
                  MP3Data              *filedata)
 {
        id3v2tag *tag = &filedata->id3v23;
@@ -1619,7 +1611,7 @@ get_id3v20_tags (id3v2frame            frame,
                  size_t                csize,
                  id3tag               *info,
                  const gchar          *uri,
-                 TrackerSparqlBuilder *metadata,
+                 TrackerResource      *resource,
                  MP3Data              *filedata)
 {
        id3v2tag *tag = &filedata->id3v22;
@@ -1749,7 +1741,7 @@ parse_id3v24 (const gchar           *data,
               size_t                 size,
               id3tag                *info,
               const gchar           *uri,
-              TrackerSparqlBuilder  *metadata,
+              TrackerResource       *resource,
               MP3Data               *filedata,
               size_t                *offset_delta)
 {
@@ -1936,10 +1928,10 @@ parse_id3v24 (const gchar           *data,
                        gchar *body;
 
                        un_unsync (&data[pos], csize, (unsigned char **) &body, &unsync_size);
-                       get_id3v24_tags (frame, body, unsync_size, info, uri, metadata, filedata);
+                       get_id3v24_tags (frame, body, unsync_size, info, uri, resource, filedata);
                        g_free (body);
                } else {
-                       get_id3v24_tags (frame, &data[pos], csize, info, uri, metadata, filedata);
+                       get_id3v24_tags (frame, &data[pos], csize, info, uri, resource, filedata);
                }
 
                pos += csize;
@@ -1953,7 +1945,7 @@ parse_id3v23 (const gchar          *data,
               size_t                size,
               id3tag               *info,
               const gchar          *uri,
-              TrackerSparqlBuilder *metadata,
+              TrackerResource      *resource,
               MP3Data              *filedata,
               size_t               *offset_delta)
 {
@@ -2133,10 +2125,10 @@ parse_id3v23 (const gchar          *data,
                        gchar *body;
 
                        un_unsync (&data[pos], csize, (unsigned char **) &body, &unsync_size);
-                       get_id3v23_tags (frame, body, unsync_size, info, uri, metadata, filedata);
+                       get_id3v23_tags (frame, body, unsync_size, info, uri, resource, filedata);
                        g_free (body);
                } else {
-                       get_id3v23_tags (frame, &data[pos], csize, info, uri, metadata, filedata);
+                       get_id3v23_tags (frame, &data[pos], csize, info, uri, resource, filedata);
                }
 
                pos += csize;
@@ -2150,7 +2142,7 @@ parse_id3v20 (const gchar          *data,
               size_t                size,
               id3tag               *info,
               const gchar          *uri,
-              TrackerSparqlBuilder *metadata,
+              TrackerResource      *resource,
               MP3Data              *filedata,
               size_t               *offset_delta)
 {
@@ -2234,10 +2226,10 @@ parse_id3v20 (const gchar          *data,
                        gchar  *body;
 
                        un_unsync (&data[pos], csize, (unsigned char **) &body, &unsync_size);
-                       get_id3v20_tags (frame, body, unsync_size, info, uri, metadata, filedata);
+                       get_id3v20_tags (frame, body, unsync_size, info, uri, resource, filedata);
                        g_free (body);
                } else {
-                       get_id3v20_tags (frame, &data[pos], csize, info, uri, metadata, filedata);
+                       get_id3v20_tags (frame, &data[pos], csize, info, uri, resource, filedata);
                }
 
                pos += csize;
@@ -2251,7 +2243,7 @@ parse_id3v2 (const gchar          *data,
              size_t                size,
              id3tag               *info,
              const gchar          *uri,
-             TrackerSparqlBuilder *metadata,
+             TrackerResource      *resource,
              MP3Data              *filedata)
 {
        gboolean done = FALSE;
@@ -2259,9 +2251,9 @@ parse_id3v2 (const gchar          *data,
 
        do {
                size_t offset_delta = 0;
-               parse_id3v24 (data + offset, size - offset, info, uri, metadata, filedata, &offset_delta);
-               parse_id3v23 (data + offset, size - offset, info, uri, metadata, filedata, &offset_delta);
-               parse_id3v20 (data + offset, size - offset, info, uri, metadata, filedata, &offset_delta);
+               parse_id3v24 (data + offset, size - offset, info, uri, resource, filedata, &offset_delta);
+               parse_id3v23 (data + offset, size - offset, info, uri, resource, filedata, &offset_delta);
+               parse_id3v20 (data + offset, size - offset, info, uri, resource, filedata, &offset_delta);
 
                if (offset_delta == 0) {
                        done = TRUE;
@@ -2286,14 +2278,9 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
        goffset  buffer_size;
        goffset audio_offset;
        MP3Data md = { 0 };
-       TrackerSparqlBuilder *metadata, *preupdate;
        GFile *file;
-       const gchar *graph;
        gboolean parsed;
-
-       graph = tracker_extract_info_get_graph (info);
-       metadata = tracker_extract_info_get_metadata_builder (info);
-       preupdate = tracker_extract_info_get_preupdate_builder (info);
+       TrackerResource *main_resource;
 
        file = tracker_extract_info_get_file (info);
        filename = g_file_get_path (file);
@@ -2343,36 +2330,38 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
 
        g_free (id3v1_buffer);
 
+       main_resource = tracker_resource_new (NULL);
+
        /* Get other embedded tags */
        uri = g_file_get_uri (file);
-       audio_offset = parse_id3v2 (buffer, buffer_size, &md.id3v1, uri, metadata, &md);
+       audio_offset = parse_id3v2 (buffer, buffer_size, &md.id3v1, uri, main_resource, &md);
 
        md.title = tracker_coalesce_strip (4, md.id3v24.title2,
                                           md.id3v23.title2,
                                           md.id3v22.title2,
                                           md.id3v1.title);
 
-       md.lyricist = tracker_coalesce_strip (4, md.id3v24.text,
-                                             md.id3v23.toly,
-                                             md.id3v23.text,
-                                             md.id3v22.text);
+       md.lyricist_name = tracker_coalesce_strip (4, md.id3v24.text,
+                                                  md.id3v23.toly,
+                                                  md.id3v23.text,
+                                                  md.id3v22.text);
 
-       md.composer = tracker_coalesce_strip (3, md.id3v24.composer,
-                                             md.id3v23.composer,
-                                             md.id3v22.composer);
+       md.composer_name = tracker_coalesce_strip (3, md.id3v24.composer,
+                                                  md.id3v23.composer,
+                                                  md.id3v22.composer);
 
-       md.performer = tracker_coalesce_strip (7, md.id3v24.performer1,
-                                              md.id3v24.performer2,
-                                              md.id3v23.performer1,
-                                              md.id3v23.performer2,
-                                              md.id3v22.performer1,
-                                              md.id3v22.performer2,
-                                              md.id3v1.artist);
+       md.performer_name = tracker_coalesce_strip (7, md.id3v24.performer1,
+                                                   md.id3v24.performer2,
+                                                   md.id3v23.performer1,
+                                                   md.id3v23.performer2,
+                                                   md.id3v22.performer1,
+                                                   md.id3v22.performer2,
+                                                   md.id3v1.artist);
 
-       md.album = tracker_coalesce_strip (4, md.id3v24.album,
-                                          md.id3v23.album,
-                                          md.id3v22.album,
-                                          md.id3v1.album);
+       md.album_name = tracker_coalesce_strip (4, md.id3v24.album,
+                                               md.id3v23.album,
+                                               md.id3v22.album,
+                                               md.id3v1.album);
 
        md.genre = tracker_coalesce_strip (7, md.id3v24.content_type,
                                           md.id3v24.title1,
@@ -2444,251 +2433,137 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                md.set_count = md.id3v22.set_count;
        }
 
-       if (md.performer) {
-               md.performer_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", md.performer);
+       if (md.performer_name) {
+               char *performer_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", md.performer_name);
+               md.performer = tracker_resource_new (performer_uri);
 
-               tracker_sparql_builder_insert_open (preupdate, NULL);
-               if (graph) {
-                       tracker_sparql_builder_graph_open (preupdate, graph);
-               }
+               tracker_resource_set_uri (md.performer, "rdf:type", "nmm:Artist");
+               tracker_resource_set_string (md.performer, "nmm:artistName", md.performer_name);
 
-               tracker_sparql_builder_subject_iri (preupdate, md.performer_uri);
-               tracker_sparql_builder_predicate (preupdate, "a");
-               tracker_sparql_builder_object (preupdate, "nmm:Artist");
-               tracker_sparql_builder_predicate (preupdate, "nmm:artistName");
-               tracker_sparql_builder_object_unvalidated (preupdate, md.performer);
-
-               if (graph) {
-                       tracker_sparql_builder_graph_close (preupdate);
-               }
-               tracker_sparql_builder_insert_close (preupdate);
+               g_free (performer_uri);
        }
 
-       if (md.composer) {
-               md.composer_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", md.composer);
-
-               tracker_sparql_builder_insert_open (preupdate, NULL);
-               if (graph) {
-                       tracker_sparql_builder_graph_open (preupdate, graph);
-               }
+       if (md.composer_name) {
+               char *composer_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", md.composer_name);
+               md.composer = tracker_resource_new (composer_uri);
 
-               tracker_sparql_builder_subject_iri (preupdate, md.composer_uri);
-               tracker_sparql_builder_predicate (preupdate, "a");
-               tracker_sparql_builder_object (preupdate, "nmm:Artist");
-               tracker_sparql_builder_predicate (preupdate, "nmm:artistName");
-               tracker_sparql_builder_object_unvalidated (preupdate, md.composer);
+               tracker_resource_set_uri (md.composer, "rdf:type", "nmm:Artist");
+               tracker_resource_set_string (md.composer, "nmm:artistName", md.composer_name);
 
-               if (graph) {
-                       tracker_sparql_builder_graph_close (preupdate);
-               }
-               tracker_sparql_builder_insert_close (preupdate);
+               g_free (composer_uri);
        }
 
-       if (md.lyricist) {
-               md.lyricist_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", md.lyricist);
-
-               tracker_sparql_builder_insert_open (preupdate, NULL);
-               if (graph) {
-                       tracker_sparql_builder_graph_open (preupdate, graph);
-               }
+       if (md.lyricist_name) {
+               char *lyricist_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", md.lyricist_name);
+               md.lyricist = tracker_resource_new (lyricist_uri);
 
-               tracker_sparql_builder_subject_iri (preupdate, md.lyricist_uri);
-               tracker_sparql_builder_predicate (preupdate, "a");
-               tracker_sparql_builder_object (preupdate, "nmm:Artist");
-               tracker_sparql_builder_predicate (preupdate, "nmm:artistName");
-               tracker_sparql_builder_object_unvalidated (preupdate, md.lyricist);
+               tracker_resource_set_uri (md.lyricist, "rdf:type", "nmm:Artist");
+               tracker_resource_set_string (md.lyricist, "nmm:artistName", md.lyricist_name);
 
-               if (graph) {
-                       tracker_sparql_builder_graph_close (preupdate);
-               }
-               tracker_sparql_builder_insert_close (preupdate);
+               g_free (lyricist_uri);
        }
 
-       if (md.album) {
-               md.album_uri = tracker_sparql_escape_uri_printf ("urn:album:%s", md.album);
-
-               tracker_sparql_builder_insert_open (preupdate, NULL);
-               if (graph) {
-                       tracker_sparql_builder_graph_open (preupdate, graph);
-               }
+       if (md.album_name) {
+               char *album_uri = tracker_sparql_escape_uri_printf ("urn:album:%s", md.album_name);
+               md.album = tracker_resource_new (album_uri);
 
-               tracker_sparql_builder_subject_iri (preupdate, md.album_uri);
-               tracker_sparql_builder_predicate (preupdate, "a");
-               tracker_sparql_builder_object (preupdate, "nmm:MusicAlbum");
+               tracker_resource_set_uri (md.album, "rdf:type", "nmm:MusicAlbum");
                /* FIXME: nmm:albumTitle is now deprecated
                 * tracker_sparql_builder_predicate (preupdate, "nie:title");
                 */
-               tracker_sparql_builder_predicate (preupdate, "nmm:albumTitle");
-               tracker_sparql_builder_object_unvalidated (preupdate, md.album);
+               tracker_resource_set_string (md.album, "nmm:albumTitle", md.album_name);
 
-               if (md.performer_uri) {
-                       tracker_sparql_builder_predicate (preupdate, "nmm:albumArtist");
-                       tracker_sparql_builder_object_iri (preupdate, md.performer_uri);
+               if (md.performer) {
+                       tracker_resource_set_relation (md.album, "nmm:albumArtist", md.performer);
                }
 
-               if (graph) {
-                       tracker_sparql_builder_graph_close (preupdate);
-               }
-               tracker_sparql_builder_insert_close (preupdate);
-
                if (md.track_count > 0) {
-                       tracker_sparql_builder_delete_open (preupdate, NULL);
-                       tracker_sparql_builder_subject_iri (preupdate, md.album_uri);
-                       tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount");
-                       tracker_sparql_builder_object_variable (preupdate, "unknown");
-                       tracker_sparql_builder_delete_close (preupdate);
-                       tracker_sparql_builder_where_open (preupdate);
-                       tracker_sparql_builder_subject_iri (preupdate, md.album_uri);
-                       tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount");
-                       tracker_sparql_builder_object_variable (preupdate, "unknown");
-                       tracker_sparql_builder_where_close (preupdate);
-
-                       tracker_sparql_builder_insert_open (preupdate, NULL);
-                       if (graph) {
-                               tracker_sparql_builder_graph_open (preupdate, graph);
-                       }
-
-                       tracker_sparql_builder_subject_iri (preupdate, md.album_uri);
-                       tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount");
-                       tracker_sparql_builder_object_int64 (preupdate, md.track_count);
-
-                       if (graph) {
-                               tracker_sparql_builder_graph_close (preupdate);
-                       }
-                       tracker_sparql_builder_insert_close (preupdate);
+                       tracker_resource_set_int (md.album, "nmm:albumTrackCount", md.track_count);
                }
        }
 
-       tracker_sparql_builder_predicate (metadata, "a");
-       tracker_sparql_builder_object (metadata, "nmm:MusicPiece");
-       tracker_sparql_builder_object (metadata, "nfo:Audio");
+       tracker_resource_set_uri (main_resource, "rdf:type", "nmm:MusicPiece");
+       tracker_resource_add_uri (main_resource, "rdf:type", "nfo:Audio");
 
-       tracker_guarantee_title_from_file (metadata,
-                                          "nie:title",
-                                          md.title,
-                                          uri,
-                                          NULL);
+       tracker_guarantee_resource_title_from_file (main_resource,
+                                                   "nie:title",
+                                                   md.title,
+                                                   uri,
+                                                   NULL);
 
-       if (md.lyricist_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:lyricist");
-               tracker_sparql_builder_object_iri (metadata, md.lyricist_uri);
-               g_free (md.lyricist_uri);
+       if (md.lyricist) {
+               tracker_resource_set_relation (main_resource, "nmm:lyricist", md.lyricist);
+               g_object_unref (md.lyricist);
        }
 
-       if (md.performer_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:performer");
-               tracker_sparql_builder_object_iri (metadata, md.performer_uri);
-               g_free (md.performer_uri);
+       if (md.performer) {
+               tracker_resource_set_relation (main_resource, "nmm:performer", md.performer);
+               g_object_unref (md.performer);
        }
 
-       if (md.composer_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:composer");
-               tracker_sparql_builder_object_iri (metadata, md.composer_uri);
-               g_free (md.composer_uri);
+       if (md.composer) {
+               tracker_resource_set_relation (main_resource, "nmm:composer", md.composer);
+               g_object_unref (md.composer);
        }
 
-       if (md.album_uri) {
-               tracker_sparql_builder_predicate (metadata, "nmm:musicAlbum");
-               tracker_sparql_builder_object_iri (metadata, md.album_uri);
+       if (md.album) {
+               tracker_resource_set_relation (main_resource, "nmm:musicAlbum", md.album);
        }
 
        if (md.recording_time) {
-               tracker_sparql_builder_predicate (metadata, "nie:contentCreated");
-               tracker_sparql_builder_object_unvalidated (metadata, md.recording_time);
+               tracker_resource_set_string (main_resource, "nie:contentCreated", md.recording_time);
        }
 
        if (md.genre) {
-               tracker_sparql_builder_predicate (metadata, "nfo:genre");
-               tracker_sparql_builder_object_unvalidated (metadata, md.genre);
+               tracker_resource_set_string (main_resource, "nfo:genre", md.genre);
        }
 
        if (md.copyright) {
-               tracker_sparql_builder_predicate (metadata, "nie:copyright");
-               tracker_sparql_builder_object_unvalidated (metadata, md.copyright);
+               tracker_resource_set_string (main_resource, "nie:copyright", md.copyright);
        }
 
        if (md.comment) {
-               tracker_sparql_builder_predicate (metadata, "nie:comment");
-               tracker_sparql_builder_object_unvalidated (metadata, md.comment);
+               tracker_resource_set_string (main_resource, "nie:comment", md.comment);
        }
 
        if (md.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");
-               tracker_sparql_builder_predicate (metadata, "nco:fullname");
-               tracker_sparql_builder_object_unvalidated (metadata, md.publisher);
-               tracker_sparql_builder_object_blank_close (metadata);
+               TrackerResource *publisher = tracker_resource_new (NULL);
+               tracker_resource_set_uri (publisher, "rdf:type", "nmm:Contact");
+               tracker_resource_set_string (publisher, "nco:fullname", md.publisher);
+
+               tracker_resource_set_relation (main_resource, "nco:publisher", publisher);
+               g_object_unref(publisher);
        }
 
        if (md.encoded_by) {
-               tracker_sparql_builder_predicate (metadata, "nfo:encodedBy");
-               tracker_sparql_builder_object_unvalidated (metadata, md.encoded_by);
+               tracker_resource_set_string (main_resource,  "nfo:encodedBy", md.encoded_by);
        }
 
        if (md.track_number > 0) {
-               tracker_sparql_builder_predicate (metadata, "nmm:trackNumber");
-               tracker_sparql_builder_object_int64 (metadata, md.track_number);
+               tracker_resource_set_int (main_resource, "nmm:trackNumber", md.track_number);
        }
 
        if (md.album) {
+               TrackerResource *album_disc;
                gchar *album_disc_uri;
 
                album_disc_uri = tracker_sparql_escape_uri_printf ("urn:album-disc:%s:Disc%d",
-                                                                  md.album,
+                                                                  md.album_name,
                                                                   md.set_number > 0 ? md.set_number : 1);
 
-               tracker_sparql_builder_delete_open (preupdate, NULL);
-               tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
-               tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
-               tracker_sparql_builder_object_variable (preupdate, "unknown");
-               tracker_sparql_builder_delete_close (preupdate);
-               tracker_sparql_builder_where_open (preupdate);
-               tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
-               tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
-               tracker_sparql_builder_object_variable (preupdate, "unknown");
-               tracker_sparql_builder_where_close (preupdate);
-
-               tracker_sparql_builder_delete_open (preupdate, NULL);
-               tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
-               tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
-               tracker_sparql_builder_object_variable (preupdate, "unknown");
-               tracker_sparql_builder_delete_close (preupdate);
-               tracker_sparql_builder_where_open (preupdate);
-               tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
-               tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
-               tracker_sparql_builder_object_variable (preupdate, "unknown");
-               tracker_sparql_builder_where_close (preupdate);
-
-               tracker_sparql_builder_insert_open (preupdate, NULL);
-               if (graph) {
-                       tracker_sparql_builder_graph_open (preupdate, graph);
-               }
+               album_disc = tracker_resource_new (album_disc_uri);
+               tracker_resource_set_uri (album_disc, "rdf:type", "nmm:MusicAlbumDisc");
+               tracker_resource_set_int (album_disc, "nmm:setNumber", md.set_number > 0 ? md.set_number : 1);
+               tracker_resource_set_relation (album_disc, "nmm:albumDiscAlbum", md.album);
 
-               tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
-               tracker_sparql_builder_predicate (preupdate, "a");
-               tracker_sparql_builder_object (preupdate, "nmm:MusicAlbumDisc");
-               tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
-               tracker_sparql_builder_object_int64 (preupdate, md.set_number > 0 ? md.set_number : 1);
-               tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
-               tracker_sparql_builder_object_iri (preupdate, md.album_uri);
-
-               if (graph) {
-                       tracker_sparql_builder_graph_close (preupdate);
-               }
-               tracker_sparql_builder_insert_close (preupdate);
-
-               tracker_sparql_builder_predicate (metadata, "nmm:musicAlbumDisc");
-               tracker_sparql_builder_object_iri (metadata, album_disc_uri);
+               tracker_resource_set_relation (main_resource, "nmm:musicAlbumDisc", album_disc);
 
                g_free (album_disc_uri);
+               g_object_unref (md.album);
        }
 
-       g_free (md.album_uri);
-
        /* Get mp3 stream info */
-       parsed = mp3_parse (buffer, buffer_size, audio_offset, uri, metadata, &md);
+       parsed = mp3_parse (buffer, buffer_size, audio_offset, uri, main_resource, &md);
 
 #ifdef HAVE_LIBMEDIAART
        if (parsed && (md.performer || md.album)) {
@@ -2706,8 +2581,8 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                                                            md.media_art_data,
                                                            md.media_art_size,
                                                            md.media_art_mime,
-                                                           md.performer,
-                                                           md.album,
+                                                           md.performer_name,
+                                                           md.album_name,
                                                            NULL,
                                                            &error);
                } else {
@@ -2715,8 +2590,8 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                                                          MEDIA_ART_ALBUM,
                                                          MEDIA_ART_PROCESS_FLAGS_NONE,
                                                          file,
-                                                         md.performer,
-                                                         md.album,
+                                                         md.performer_name,
+                                                         md.album_name,
                                                          NULL,
                                                          &error);
                }
@@ -2741,6 +2616,11 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
        munmap (buffer, buffer_size);
 #endif
 
+       if (main_resource) {
+               tracker_extract_info_add_resource (info, main_resource);
+               g_object_unref (main_resource);
+       }
+
        g_free (filename);
        g_free (uri);
 


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