[grilo-plugins/wip/carlosg/tracker3: 2/4] tracker3: Implement filtering and resolution of medias in content changes




commit 160a3d9dc99f49befda6537221933198800bb504
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Aug 22 15:27:06 2020 +0200

    tracker3: Implement filtering and resolution of medias in content changes
    
    Query further data from GrlMedia in events, and filter out those GrlMedia
    that don't resolve properly (eg. other resources we get notifications about,
    but don't are a nie:InformationElement with a nie:isStoredAs relation).
    
    This avoids emission of GrlMedia that are actually irrelevant to grilo.
    
    Fixes: https://gitlab.gnome.org/GNOME/grilo-plugins/-/issues/73

 src/tracker3/grl-tracker-source-notif.c | 122 ++++++++++++++++++++++++++++----
 1 file changed, 110 insertions(+), 12 deletions(-)
---
diff --git a/src/tracker3/grl-tracker-source-notif.c b/src/tracker3/grl-tracker-source-notif.c
index f087e957..3d59288f 100644
--- a/src/tracker3/grl-tracker-source-notif.c
+++ b/src/tracker3/grl-tracker-source-notif.c
@@ -46,6 +46,15 @@ struct _GrlTrackerSourceNotify {
   guint events_signal_id;
 };
 
+typedef struct {
+  GrlTrackerSourceNotify *notify;
+  GPtrArray *events;
+  GPtrArray *medias;
+  GList *keys;
+  GrlOperationOptions *options;
+  guint cur_media;
+} GrlTrackerChangeBatch;
+
 enum {
   PROP_0,
   PROP_CONNECTION,
@@ -57,6 +66,8 @@ static GParamSpec *props[N_PROPS] = { 0, };
 
 G_DEFINE_TYPE (GrlTrackerSourceNotify, grl_tracker_source_notify, G_TYPE_OBJECT)
 
+static void resolve_medias (GrlTrackerChangeBatch *batch);
+
 static GrlMedia *
 media_for_event (GrlTrackerSourceNotify *self,
                  TrackerNotifierEvent   *event,
@@ -70,10 +81,31 @@ media_for_event (GrlTrackerSourceNotify *self,
   return media;
 }
 
+static GPtrArray *
+create_medias (GrlTrackerSourceNotify *self,
+               GPtrArray              *events,
+               GrlMediaType            media_type)
+{
+  TrackerNotifierEvent *event;
+  GPtrArray *medias;
+  GrlMedia *media;
+  gint i;
+
+  medias = g_ptr_array_new_with_free_func (g_object_unref);
+
+  for (i = 0; i < events->len; i++) {
+    event = g_ptr_array_index (events, i);
+    media = media_for_event (self, event, media_type);
+    g_ptr_array_add (medias, media);
+  }
+
+  return medias;
+}
+
 static void
 handle_changes (GrlTrackerSourceNotify   *self,
                 GPtrArray                *events,
-                GrlMediaType              media_type,
+                GPtrArray                *medias,
                 TrackerNotifierEventType  tracker_type,
                 GrlSourceChangeType       change_type)
 {
@@ -86,17 +118,83 @@ handle_changes (GrlTrackerSourceNotify   *self,
 
   for (i = 0; i < events->len; i++) {
     event = g_ptr_array_index (events, i);
+    media = g_ptr_array_index (medias, i);
+
     if (tracker_notifier_event_get_event_type (event) != tracker_type)
       continue;
+    if (grl_media_get_url (media) == NULL)
+      continue;
 
-    media = media_for_event (self, event, media_type);
-    g_ptr_array_add (change_list, media);
+    g_ptr_array_add (change_list, g_object_ref (media));
+  }
+
+  if (change_list->len == 0) {
+    g_ptr_array_unref (change_list);
+    return;
   }
 
   grl_source_notify_change_list (self->source, change_list,
                                  change_type, FALSE);
 }
 
+static void
+free_batch (GrlTrackerChangeBatch *batch)
+{
+  g_ptr_array_unref (batch->events);
+  g_ptr_array_unref (batch->medias);
+  g_list_free (batch->keys);
+  g_object_unref (batch->options);
+  g_free (batch);
+}
+
+static void
+resolve_event_cb (GrlSource    *source,
+                  guint         operation_id,
+                  GrlMedia     *media,
+                  gpointer      user_data,
+                  const GError *error)
+{
+  GrlTrackerChangeBatch *batch = user_data;
+
+  batch->cur_media++;
+  resolve_medias (batch);
+}
+
+static void
+resolve_medias (GrlTrackerChangeBatch *batch)
+{
+  GrlTrackerSourceNotify *self = batch->notify;
+  GrlMedia *media = NULL;
+
+  g_print ("resolve... %d\n", batch->cur_media);
+
+  if (batch->cur_media < batch->medias->len)
+    media = g_ptr_array_index (batch->medias, batch->cur_media);
+
+  if (media) {
+    grl_source_resolve (self->source,
+                        media,
+                        batch->keys,
+                        batch->options,
+                        resolve_event_cb,
+                        batch);
+  } else {
+    handle_changes (self,
+                    batch->events, batch->medias,
+                    TRACKER_NOTIFIER_EVENT_CREATE,
+                    GRL_CONTENT_ADDED);
+    handle_changes (self,
+                    batch->events, batch->medias,
+                    TRACKER_NOTIFIER_EVENT_UPDATE,
+                    GRL_CONTENT_CHANGED);
+    handle_changes (self,
+                    batch->events, batch->medias,
+                    TRACKER_NOTIFIER_EVENT_DELETE,
+                    GRL_CONTENT_REMOVED);
+    free_batch (batch);
+  }
+}
+
 static GrlMediaType
 media_type_from_graph (const gchar *graph)
 {
@@ -118,19 +216,19 @@ notifier_event_cb (GrlTrackerSourceNotify *self,
                    gpointer                user_data)
 {
   GrlMediaType type = media_type_from_graph (graph);
+  GrlTrackerChangeBatch *batch;
 
   if (type == GRL_MEDIA_TYPE_UNKNOWN)
     return;
 
-  handle_changes (self, events, type,
-                  TRACKER_NOTIFIER_EVENT_CREATE,
-                  GRL_CONTENT_ADDED);
-  handle_changes (self, events, type,
-                  TRACKER_NOTIFIER_EVENT_UPDATE,
-                  GRL_CONTENT_CHANGED);
-  handle_changes (self, events, type,
-                  TRACKER_NOTIFIER_EVENT_DELETE,
-                  GRL_CONTENT_REMOVED);
+  batch = g_new0 (GrlTrackerChangeBatch, 1);
+  batch->notify = g_object_ref (self);
+  batch->events = g_ptr_array_ref (events);
+  batch->medias = create_medias (self, events, type);
+  batch->keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, NULL);
+  batch->options = grl_operation_options_new (NULL);
+
+  resolve_medias (batch);
 }
 
 static void


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