static void mex_aggregate_model_dispose (GObject *object) { MexAggregateModel *self = MEX_AGGREGATE_MODEL (object); MexAggregateModelPrivate *priv = self->priv; while (priv->models) { MexModel *model = priv->models->data; mex_aggregate_model_remove_model (self, model); } if (priv->controller_to_model) { g_hash_table_unref (priv->controller_to_model); priv->controller_to_model = NULL; } if (priv->content_to_model) { g_hash_table_unref (priv->content_to_model); priv->content_to_model = NULL; } G_OBJECT_CLASS (mex_aggregate_model_parent_class)->dispose (object); }
void mex_media_controls_set_content (MexMediaControls *self, MexContent *content, MexModel *context) { MexMediaControlsPrivate *priv = self->priv; gboolean show_description; g_return_if_fail (MEX_IS_CONTENT (content)); if (priv->model == context) { if (priv->content == content) return; if (priv->content) g_object_unref (priv->content); if (content) priv->content = g_object_ref_sink (content); mex_media_controls_focus_content (self, priv->content); mex_media_controls_update_header (self); return; } if (priv->model) { g_object_unref (priv->model); priv->model = NULL; } if (context) priv->model = g_object_ref_sink (context); if (priv->content) { g_object_unref (priv->content); priv->content = NULL; } if (content) priv->content = g_object_ref_sink (content); priv->is_queue_model = FALSE; mex_media_controls_update_header (self); /* We may not have a context if we're launched by something like SetUri*/ if (context) { MexModel *orig_model; orig_model = mex_model_get_model (context); g_object_set (G_OBJECT (priv->proxy_model), "model", orig_model, NULL); mex_view_model_set_start_content (priv->proxy_model, priv->content); mex_view_model_set_loop (priv->proxy_model, TRUE); /* Work out if the context was a queue FIXME unreliable */ /* From coloumn context = MexViewModel MexAggregateModel MexQueueModel */ /* From grid context = MexProxyModel MexProxyModel MexQueueModel */ if (MEX_IS_PROXY_MODEL (context)) { MexModel *model_from_proxy; model_from_proxy = mex_proxy_model_get_model (MEX_PROXY_MODEL (orig_model)); if (MEX_IS_QUEUE_MODEL (model_from_proxy)) priv->is_queue_model = TRUE; } else if (MEX_IS_AGGREGATE_MODEL (orig_model)) { MexModel *real_model; real_model = mex_aggregate_model_get_model_for_content (MEX_AGGREGATE_MODEL (orig_model), content); if (MEX_IS_QUEUE_MODEL (real_model)) priv->is_queue_model = TRUE; } } /* Update content on the queue button */ mex_content_view_set_content (MEX_CONTENT_VIEW (priv->queue_button), priv->content); /* show the description rather than the seek bar for certain content */ show_description = !g_strcmp0 ("x-mex/tv", mex_content_get_metadata (priv->content, MEX_CONTENT_METADATA_MIMETYPE)); mex_media_controls_show_description(self, show_description); }
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); }