Esempio n. 1
0
/* When the MexContent set on the queue button is a directory we
 * try to add the children of the directory and mark the directory
 * as queued. When the child items are added to the queue model they
 * are marked as queued via the controller
 */
static void
_add_from_directory (MexQueueButton *q_button, gboolean add)
{
  MexQueueButtonPrivate *priv = q_button->priv;
  MexFeed *feed;
  GrlSource *source;
  GList *metadata_keys;
  GList *query_keys;

  const gchar *filter;
  const gchar *stream_uri;

  /* check if this content is a group */
  if (MEX_IS_GROUP_ITEM (priv->content))
    {
      MexModel *model;

      model = mex_group_item_get_model (MEX_GROUP_ITEM (priv->content));

      _add_remove_recursive (priv->queue_model,
                             g_object_ref (model),
                             add);

      /* _add_remove_recursive will unref feed */

      mex_content_set_metadata (priv->content, MEX_CONTENT_METADATA_QUEUED,
                                (add) ? "yes" : NULL);

      return;
    }


  if (!MEX_IS_GRILO_PROGRAM (priv->content))
    return;

  g_object_get (priv->content, "feed", &feed, NULL);

  if (MEX_IS_GRILO_FEED (feed))
    {
      g_object_get (feed,
                    "grilo-source", &source,
                    "grilo-query-keys", &query_keys,
                    "grilo-metadata-keys", &metadata_keys,
                    NULL);

      stream_uri =
        mex_content_get_metadata (priv->content, MEX_CONTENT_METADATA_STREAM);

      /* tracker filesystem feed */
      if (MEX_IS_GRILO_TRACKER_FEED (feed))
        {
          gchar *orig_filter;
          g_object_get (feed, "tracker-filter", &orig_filter, NULL);

                   filter =
            g_strdup_printf("FILTER(fn:starts-with(nie:url(?urn), '%s'))",
                            stream_uri);

          feed = mex_grilo_tracker_feed_new (source,
                                             query_keys,
                                             metadata_keys,
                                             filter, NULL);

          mex_grilo_feed_query (MEX_GRILO_FEED (feed), orig_filter, 0,
                                G_MAXINT);
          if (orig_filter)
            g_free (orig_filter);
        }
      /* We already know that the content is ia MexGriloProgram
       * box provides the root Grlio media content.
       * filesystem grilo feed
       */
      else
        {
          GrlMedia *box;
          g_object_get (priv->content, "grilo-media", &box, NULL);

          feed = mex_grilo_feed_new (source, query_keys, metadata_keys, box);
          mex_grilo_feed_browse (MEX_GRILO_FEED (feed), 0, G_MAXINT);
          g_object_unref (box);
        }
      /* unref/free the stuff we g_object_get'ed */
      if (source)
        g_object_unref (source);
      if (query_keys)
        g_list_free (query_keys);
      if (metadata_keys)
        g_list_free (metadata_keys);

      /* we don't actually want to add the priv->content into the queue model,
       * only it's children, which is where the QUEUED flag is usually set
       */

      if (add)
        {
          g_signal_connect (feed, "notify::completed",
                            G_CALLBACK (_add_directory_query_complete_cb),
                            q_button);

          mex_content_set_metadata (priv->content, MEX_CONTENT_METADATA_QUEUED,
                                    "yes");
        }
      else
        {
          g_signal_connect (feed, "notify::completed",
                            G_CALLBACK (_remove_directory_query_complete_cb),
                            q_button);

          mex_content_set_metadata (priv->content, MEX_CONTENT_METADATA_QUEUED,
                                    NULL);
        }
    }
  else
    {
      /* We're not working with a grilo feed therefore we can't help :( */
      return;
    }
}
Esempio n. 2
0
static void
add_model (MexTrackerPlugin *self,
           GrlMediaPlugin *plugin,
           MexTrackerCategory category)
{
  GList *metadata_keys, *query_keys;
  MexFeed *feed, *dir_feed;
  GrlMedia *box;
  gchar *query, *cat_name;
  GHashTable *models;
  const gchar *source_name = grl_metadata_source_get_name (GRL_METADATA_SOURCE (plugin));
  gint priority;

  switch (category)
    {
    case MEX_TRACKER_CATEGORY_IMAGE:
      cat_name = "pictures";
      query = "?urn a nfo:FileDataObject . "
              "?urn tracker:available true . "
              "FILTER (fn:starts-with(nie:mimeType(?urn),'image/'))";
      models = self->priv->image_models;
      metadata_keys = self->priv->image_keys;
      query_keys = self->priv->query_image_keys;
      box = grl_media_image_new ();
      break;

    case MEX_TRACKER_CATEGORY_VIDEO:
      cat_name = "videos";
      query = "?urn a nfo:FileDataObject . "
              "?urn tracker:available true . "
              "FILTER (fn:starts-with(nie:mimeType(?urn),'video/'))";
      models = self->priv->video_models;
      metadata_keys = self->priv->video_keys;
      query_keys = self->priv->query_video_keys;
      box = grl_media_video_new ();
      break;

    case MEX_TRACKER_CATEGORY_MUSIC:
      cat_name = "music";
      query = "?urn a nfo:FileDataObject . "
              "?urn tracker:available true . "
              "FILTER (fn:starts-with(nie:mimeType(?urn),'audio/'))";
      models = self->priv->music_models;
      metadata_keys = self->priv->music_keys;
      query_keys = self->priv->query_music_keys;
      box = grl_media_audio_new ();
      break;
    }

  grl_media_set_id (GRL_MEDIA (box), NULL);
  feed = mex_grilo_tracker_feed_new (GRL_MEDIA_SOURCE (plugin),
                                     query_keys,
                                     metadata_keys,
                                     NULL, box);
  mex_model_set_sort_func (MEX_MODEL (feed),
                           mex_model_sort_time_cb,
                           GINT_TO_POINTER (TRUE));
  mex_grilo_feed_query (MEX_GRILO_FEED (feed), query, 0, MAX_TRACKER_RESULTS);

  g_hash_table_insert (models, plugin, feed);

  /* set the local files source to appear first */
  if (!g_strcmp0 (source_name, "Local files"))
    priority = -100;
  else
    priority = 0;

  dir_feed = mex_grilo_tracker_feed_new (GRL_MEDIA_SOURCE (plugin),
                                         query_keys,
                                         metadata_keys,
                                         query, NULL);
  mex_model_set_sort_func (MEX_MODEL (dir_feed),
                           mex_model_sort_alpha_cb,
                           GINT_TO_POINTER (FALSE));
  mex_grilo_feed_browse (MEX_GRILO_FEED (dir_feed), 0, G_MAXINT);

  g_object_set (G_OBJECT (feed),
                "category", cat_name,
                "priority", priority,
                "alt-model", dir_feed,
                "alt-model-string", _("Show Folders"),
                NULL);

  mex_model_manager_add_model (self->priv->manager, MEX_MODEL (feed));
}
Esempio n. 3
0
static void
mex_search_plugin_search (MexSearchPlugin *self,
                          const gchar     *search)
{
  GList *s, *sources;
  MexSearchPluginPrivate *priv = self->priv;

  /* Kill the last search */
  if (priv->search_model)
    {
      g_object_unref (priv->search_model);
      priv->search_model = NULL;
    }

  /* Create search model */
  priv->search_model = mex_aggregate_model_new ();
  g_object_set (G_OBJECT (priv->search_model), "title", "Search results", NULL);

  /* Iterate over searchable Grilo sources */
  sources = grl_plugin_registry_get_sources (grl_plugin_registry_get_default (),
                                             FALSE);

  /* find the local files source and place it first */
  for (s = sources; s; s = s->next)
    {
      GrlMetadataSource *meta_src = s->data;
      const gchar *name = grl_metadata_source_get_name (meta_src);

      if (!GRL_IS_METADATA_SOURCE (meta_src))
        continue;

      if (name && !strcmp (name, "Local files"))
        {
          sources = g_list_remove_link (sources, s);
          sources = g_list_concat (sources, s);
          break;
        }
    }


  for (s = sources; s; s = s->next)
    {
      const gchar *source_id;
      GrlSupportedOps supported;
      GrlMetadataSource *meta_src = s->data;

      if (!GRL_IS_METADATA_SOURCE (meta_src))
        continue;

      /* only search upnp and tracker sources */
      source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src));

      supported = grl_metadata_source_supported_operations (meta_src);
      if ((supported & GRL_OP_SEARCH) || (supported & GRL_OP_QUERY))
        {
          MexFeed *feed;

          if (g_str_equal (source_id, "grl-tracker"))
            feed =
              mex_grilo_tracker_feed_new (GRL_MEDIA_SOURCE (meta_src), NULL, NULL, NULL, NULL);
          else
            feed =
              mex_grilo_feed_new (GRL_MEDIA_SOURCE (meta_src), NULL, NULL, NULL);
          g_object_set (G_OBJECT (feed), "placeholder-text",
                        _("No videos found"), NULL);
          GController *controller = mex_model_get_controller (MEX_MODEL (feed));

          /* Attach to the changed signal so that we can alter the
           * mime-type of content if necessary.
           */
          g_signal_connect (controller, "changed",
                            G_CALLBACK (mex_search_plugin_model_changed_cb),
                            feed);

          mex_aggregate_model_add_model (
            MEX_AGGREGATE_MODEL (priv->search_model), MEX_MODEL (feed));

          /* FIXME: Arbitrary 50 item limit... */
          mex_grilo_feed_search (MEX_GRILO_FEED (feed), search, 0, 50);
        }
    }
  g_list_free (sources);
}
static void
mex_search_plugin_search (MexSearchPlugin *self,
                          const gchar     *search)
{
  GList *l, *list;
  MexSearchPluginPrivate *priv = self->priv;
  MexModelManager *manager = mex_model_manager_get_default ();
  gboolean have_tracker = FALSE;

  if (!priv->search_model)
    {
      /* Create search model */
      priv->search_model = mex_aggregate_model_new ();
      g_object_set (G_OBJECT (priv->search_model),
                    "title", _("Search results"), NULL);
    }

  /* Kill the last search */
  list = (GList *) mex_aggregate_model_get_models (
                       MEX_AGGREGATE_MODEL (priv->search_model));
  for (l = list; l; l = l->next)
    mex_model_manager_remove_model (manager, l->data);
  mex_aggregate_model_clear (MEX_AGGREGATE_MODEL (priv->search_model));

  /* Iterate over searchable Grilo sources */
  list = grl_plugin_registry_get_sources (grl_plugin_registry_get_default (),
                                             FALSE);

  /* find the local files source and place it first */
  for (l = list; l; l = l->next)
    {
      GrlMetadataSource *meta_src = l->data;
      const gchar *name = grl_metadata_source_get_name (meta_src);
      const gchar *source_id;

      if (!GRL_IS_METADATA_SOURCE (meta_src))
        continue;

      source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src));

      if (source_id && g_str_equal (source_id, "grl-tracker"))
        have_tracker = TRUE;

      if (name && !strcmp (name, "Local files"))
        {
          list = g_list_remove_link (list, l);
          list = g_list_concat (list, l);
          break;
        }
    }

  /* prefer tracker over the filesystem plugin by removing it from the list if
   * tracker is available */
  if (have_tracker)
    {
      for (l = list; l; l = l->next)
        {
          GrlMetadataSource *meta_src = l->data;
          const gchar *source_id;

          if (!GRL_IS_METADATA_SOURCE (meta_src))
            continue;

          source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src));

          if (source_id && g_str_equal (source_id, "grl-filesystem"))
            {
              list = g_list_delete_link (list, l);
              break;
            }
        }
    }


  for (l = list; l; l = l->next)
    {
      const gchar *source_id;
      GrlSupportedOps supported;
      GrlMetadataSource *meta_src = l->data;

      if (!GRL_IS_METADATA_SOURCE (meta_src))
        continue;

      /* only search upnp and tracker sources */
      source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src));

      supported = grl_metadata_source_supported_operations (meta_src);
      if ((supported & GRL_OP_SEARCH) || (supported & GRL_OP_QUERY))
        {
          MexFeed *feed;
          GController *controller;

          if (g_str_equal (source_id, "grl-tracker"))
            feed = mex_grilo_tracker_feed_new (GRL_MEDIA_SOURCE (meta_src),
                                               NULL, NULL, NULL, NULL);
          else
            feed =
              mex_grilo_feed_new (GRL_MEDIA_SOURCE (meta_src), NULL, NULL, NULL);
          mex_model_set_sort_func (MEX_MODEL (feed),
                                   mex_model_sort_time_cb,
                                   GINT_TO_POINTER (TRUE));

          g_object_set (G_OBJECT (feed),
                        "category", "search-results",
                        "placeholder-text", _("No videos found"),
                        NULL);
          mex_model_manager_add_model (manager, MEX_MODEL (feed));

          controller = mex_model_get_controller (MEX_MODEL (feed));

          /* Attach to the changed signal so that we can alter the
           * mime-type of content if necessary.
           */
          g_signal_connect (controller, "changed",
                            G_CALLBACK (mex_search_plugin_model_changed_cb),
                            feed);

          mex_aggregate_model_add_model (
            MEX_AGGREGATE_MODEL (priv->search_model), MEX_MODEL (feed));

          /* FIXME: Arbitrary 50 item limit... */
          mex_grilo_feed_search (MEX_GRILO_FEED (feed), search, 0, 50);

          g_object_unref (G_OBJECT (feed));
        }
    }
  g_list_free (list);
}