[grilo-plugins] tracker: Add media_from_uri operation



commit c705e77cb4eb914b6de55a1ebf145d1f078b361f
Author: Juan A. Suarez Romero <jasuarez igalia com>
Date:   Wed Jul 30 19:49:07 2014 +0000

    tracker: Add media_from_uri operation
    
    Given an URL, re-constructs the GrlMedia corresponding to that URL.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=678519

 src/tracker/grl-tracker-source-api.c |   98 ++++++++++++++++++++++++++++++++++
 src/tracker/grl-tracker-source-api.h |    3 +
 src/tracker/grl-tracker-source.c     |    1 +
 3 files changed, 102 insertions(+), 0 deletions(-)
---
diff --git a/src/tracker/grl-tracker-source-api.c b/src/tracker/grl-tracker-source-api.c
index 47d9245..a9264ab 100644
--- a/src/tracker/grl-tracker-source-api.c
+++ b/src/tracker/grl-tracker-source-api.c
@@ -179,6 +179,15 @@ GRL_LOG_DOMAIN_STATIC(tracker_source_result_log_domain);
   "FILTER (?type IN ( nfo:Media, nfo:Document ))"           \
   "}"
 
+#define TRACKER_MEDIA_FROM_URI_REQUEST          \
+  "SELECT rdf:type(?urn) %s "                   \
+  "WHERE "                                      \
+  "{ "                                          \
+  "?urn nie:url \"%s\" ; "                      \
+  "tracker:available ?tr . "                    \
+  "%s "                                         \
+  "} "                                          \
+
 /**/
 
 /**/
@@ -508,6 +517,64 @@ tracker_resolve_cb (GObject      *source_object,
 }
 
 static void
+tracker_media_from_uri_cb (GObject      *source_object,
+                           GAsyncResult *result,
+                           GrlTrackerOp *os)
+{
+  GrlSourceMediaFromUriSpec *mfus = (GrlSourceMediaFromUriSpec *) os->data;
+  GrlTrackerSourcePriv      *priv = GRL_TRACKER_SOURCE_GET_PRIVATE (mfus->source);
+  GError                    *tracker_error = NULL, *error = NULL;
+  GrlMedia                  *media;
+  TrackerSparqlCursor       *cursor;
+  const gchar               *sparql_type;
+  gint                       col;
+
+  GRL_ODEBUG ("%s", __FUNCTION__);
+
+  cursor = tracker_sparql_connection_query_finish (priv->tracker_connection,
+                                                   result, &tracker_error);
+
+  if (tracker_error) {
+    GRL_WARNING ("Could not execute sparql media from uri query : %s",
+                 tracker_error->message);
+
+    error = g_error_new (GRL_CORE_ERROR,
+                         GRL_CORE_ERROR_MEDIA_FROM_URI_FAILED,
+                         _("Failed to get media from uri: %s"),
+                         tracker_error->message);
+
+    mfus->callback (mfus->source, mfus->operation_id, NULL, mfus->user_data, error);
+
+    g_error_free (tracker_error);
+    g_error_free (error);
+
+    goto end_operation;
+  }
+
+
+  if (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+    /* Build grilo media */
+    sparql_type = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+    media = grl_tracker_build_grilo_media (sparql_type);
+
+    /* Translate Sparql result into Grilo result */
+    for (col = 0 ; col < tracker_sparql_cursor_get_n_columns (cursor) ; col++) {
+      fill_grilo_media_from_sparql (GRL_TRACKER_SOURCE (mfus->source),
+                                    media, cursor, col);
+    }
+
+    mfus->callback (mfus->source, mfus->operation_id, media, mfus->user_data, NULL);
+  } else {
+    mfus->callback (mfus->source, mfus->operation_id, NULL, mfus->user_data, NULL);
+  }
+
+ end_operation:
+  g_clear_object (&cursor);
+
+  grl_tracker_queue_done (grl_tracker_queue, os);
+}
+
+static void
 tracker_store_metadata_cb (GObject      *source_object,
                            GAsyncResult *result,
                            GrlTrackerOp *os)
@@ -1179,3 +1246,34 @@ grl_tracker_source_test_media_from_uri (GrlSource *source,
   return !empty;
 }
 
+void
+grl_tracker_source_get_media_from_uri (GrlSource *source,
+                                       GrlSourceMediaFromUriSpec *mfus)
+{
+  GrlTrackerSourcePriv *priv  = GRL_TRACKER_SOURCE_GET_PRIVATE (source);
+  gchar                *constraint;
+  gchar                *sparql_select;
+  gchar                *sparql_final;
+  GrlTrackerOp         *os;
+
+  GRL_IDEBUG ("%s: id=%u", __FUNCTION__, mfus->operation_id);
+
+  constraint = grl_tracker_source_get_device_constraint (priv);
+  sparql_select = grl_tracker_source_get_select_string (mfus->keys);
+  sparql_final = g_strdup_printf (TRACKER_MEDIA_FROM_URI_REQUEST,
+                                  sparql_select,
+                                  mfus->uri,
+                                  constraint);
+
+  GRL_IDEBUG ("\tselect: '%s'", sparql_final);
+
+  os = grl_tracker_op_initiate_metadata (sparql_final,
+                                         (GAsyncReadyCallback) tracker_media_from_uri_cb,
+                                         mfus);
+  os->keys  = mfus->keys;
+
+  grl_tracker_queue_push (grl_tracker_queue, os);
+
+  g_free (constraint);
+  g_free (sparql_select);
+}
diff --git a/src/tracker/grl-tracker-source-api.h b/src/tracker/grl-tracker-source-api.h
index 7814344..ef51090 100644
--- a/src/tracker/grl-tracker-source-api.h
+++ b/src/tracker/grl-tracker-source-api.h
@@ -69,4 +69,7 @@ GrlCaps *grl_tracker_source_get_caps (GrlSource *source,
 gboolean grl_tracker_source_test_media_from_uri (GrlSource *source,
                                                  const gchar *uri);
 
+void grl_tracker_source_get_media_from_uri (GrlSource *source,
+                                            GrlSourceMediaFromUriSpec *mfus);
+
 #endif /* _GRL_TRACKER_SOURCE_API_H_ */
diff --git a/src/tracker/grl-tracker-source.c b/src/tracker/grl-tracker-source.c
index 686ac14..53021c1 100644
--- a/src/tracker/grl-tracker-source.c
+++ b/src/tracker/grl-tracker-source.c
@@ -112,6 +112,7 @@ grl_tracker_source_class_init (GrlTrackerSourceClass * klass)
   source_class->notify_change_stop  = grl_tracker_source_change_stop;
   source_class->get_caps            = grl_tracker_source_get_caps;
   source_class->test_media_from_uri = grl_tracker_source_test_media_from_uri;
+  source_class->media_from_uri      = grl_tracker_source_get_media_from_uri;
 
   g_object_class_install_property (g_class,
                                    PROP_TRACKER_CONNECTION,


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