[grilo-plugins] tracker: Add media_from_uri operation
- From: Juan A. Suarez Romero <jasuarez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grilo-plugins] tracker: Add media_from_uri operation
- Date: Fri, 8 Aug 2014 23:56:27 +0000 (UTC)
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]