static void test_preconditions (void) { GrlMedia *local_media = NULL; GrlMedia *media = NULL; GError *error = NULL; GrlOperationOptions *options = NULL; test_setup_tmdb (); local_media = grl_media_audio_new (); GrlSource *source = test_get_source(); g_assert (source); options = grl_operation_options_new (NULL); g_assert (options != NULL); grl_source_resolve_sync (source, local_media, grl_source_supported_keys (source), options, &error); /* Check that the plugin didn't even try to resolve data, otherwise the mock * file would have resulted in an error */ g_assert_no_error (error); g_object_unref (local_media); local_media = grl_media_image_new (); grl_source_resolve_sync (source, local_media, grl_source_supported_keys (source), options, &error); /* Check that the plugin didn't even try to resolve data, otherwise the * empty mock file would have resulted in an error */ g_assert (error == NULL); g_object_unref (local_media); /* Check the same for title-less video */ media = grl_media_video_new (); g_assert (media != NULL); grl_source_resolve_sync (source, media, grl_source_supported_keys (source), options, &error); g_assert_no_error (error); g_object_unref (media); media = NULL; g_object_unref (options); options = NULL; test_shutdown_tmdb (); }
static void test_missing_configuration (void) { GrlMedia *media = NULL; GrlOperationOptions *options = NULL; GError *error = NULL; test_setup_tmdb (); /* Doesn't matter. We just need to get it to resolve */ media = grl_media_video_new (); g_assert (media != NULL); grl_media_set_title (media, "Non-Empty"); GrlSource *source = test_get_source(); g_assert (source); options = grl_operation_options_new (NULL); g_assert (options != NULL); grl_source_resolve_sync (source, media, grl_source_supported_keys (source), options, &error); /* Check that the plugin didn't even try to resolve data, otherwise the mock * file would have resulted in an error */ g_assert (error != NULL); g_clear_object (&media); g_clear_object (&options); g_clear_error (&error); test_shutdown_tmdb (); }
static void grilo_source_added_cb (GrlRegistry *registry, GrlSource *grilo_source, RBGriloPlugin *plugin) { GrlPlugin *grilo_plugin; GrlSupportedOps ops; const GList *keys; RBSource *source; RBShell *shell; int i; if (!(grl_source_get_supported_media (grilo_source) & GRL_MEDIA_TYPE_AUDIO)) { rb_debug ("grilo source %s doesn't support audio", grl_source_get_name (grilo_source)); goto ignore; } grilo_plugin = grl_source_get_plugin (grilo_source); for (i = 0; i < G_N_ELEMENTS (ignored_plugins); i++) { if (g_str_equal (ignored_plugins[i], grl_plugin_get_id (grilo_plugin))) { rb_debug ("grilo source %s is blacklisted", grl_source_get_name (grilo_source)); goto ignore; } } ops = grl_source_supported_operations (grilo_source); if (((ops & GRL_OP_BROWSE) == 0) && ((ops & GRL_OP_SEARCH) == 0)) { rb_debug ("grilo source %s is not interesting", grl_source_get_name (grilo_source)); goto ignore; } keys = grl_source_supported_keys (grilo_source); if (g_list_find ((GList *)keys, GINT_TO_POINTER (GRL_METADATA_KEY_URL)) == NULL) { rb_debug ("grilo source %s doesn't do urls", grl_source_get_name (grilo_source)); goto ignore; } rb_debug ("new grilo source: %s", grl_source_get_name (grilo_source)); source = rb_grilo_source_new (G_OBJECT (plugin), grilo_source); g_hash_table_insert (plugin->sources, g_object_ref (grilo_source), g_object_ref_sink (source)); /* probably put some sources under 'shared', some under 'stores'? */ g_object_get (plugin, "object", &shell, NULL); rb_shell_append_display_page (shell, RB_DISPLAY_PAGE (source), RB_DISPLAY_PAGE_GROUP_SHARED); g_object_unref (shell); return; ignore: grl_registry_unregister_source (registry, grilo_source, NULL); }
QVariantList GriloQuery::supportedKeys() const { if (m_source.isEmpty() || !m_registry) { return QVariantList(); } GrlSource *src = m_registry->lookupSource(m_source); if (src) { return listToVariantList(grl_source_supported_keys(src)); } return QVariantList(); }
static void rb_grilo_source_constructed (GObject *object) { RBGriloSource *source; RBShell *shell; RBShellPlayer *shell_player; const GList *source_keys; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkWidget *scrolled; GtkWidget *browserbox; GtkWidget *vbox; GtkWidget *mainbox; GtkAdjustment *adjustment; RB_CHAIN_GOBJECT_METHOD (rb_grilo_source_parent_class, constructed, object); source = RB_GRILO_SOURCE (object); g_object_get (source, "shell", &shell, NULL); g_object_get (shell, "db", &source->priv->db, "shell-player", &shell_player, NULL); g_object_unref (shell); g_object_get (source, "entry-type", &source->priv->entry_type, NULL); source->priv->entry_view = rb_entry_view_new (source->priv->db, G_OBJECT (shell_player), TRUE, FALSE); g_object_unref (shell_player); g_signal_connect (source->priv->entry_view, "notify::sort-order", G_CALLBACK (notify_sort_order_cb), source); source_keys = grl_source_supported_keys (source->priv->grilo_source); if (g_list_find ((GList *)source_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_TRACK_NUMBER))) { rb_entry_view_append_column (source->priv->entry_view, RB_ENTRY_VIEW_COL_TRACK_NUMBER, FALSE); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_TRACK_NUMBER)); } if (g_list_find ((GList *)source_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_TITLE))) { rb_entry_view_append_column (source->priv->entry_view, RB_ENTRY_VIEW_COL_TITLE, TRUE); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_TITLE)); } if (g_list_find ((GList *)source_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_GENRE))) { rb_entry_view_append_column (source->priv->entry_view, RB_ENTRY_VIEW_COL_GENRE, FALSE); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_GENRE)); } if (g_list_find ((GList *)source_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_ARTIST))) { rb_entry_view_append_column (source->priv->entry_view, RB_ENTRY_VIEW_COL_ARTIST, FALSE); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_ARTIST)); } if (g_list_find ((GList *)source_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_ALBUM))) { rb_entry_view_append_column (source->priv->entry_view, RB_ENTRY_VIEW_COL_ALBUM, FALSE); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_ALBUM)); } /* if (g_list_find ((GList *)source_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_DATE))) { rb_entry_view_append_column (source->priv->entry_view, RB_ENTRY_VIEW_COL_YEAR, FALSE); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_DATE)); } */ if (g_list_find ((GList *)source_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_DURATION))) { rb_entry_view_append_column (source->priv->entry_view, RB_ENTRY_VIEW_COL_DURATION, FALSE); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_DURATION)); } source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_CHILDCOUNT)); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_URL)); source->priv->grilo_keys = g_list_prepend (source->priv->grilo_keys, GUINT_TO_POINTER(GRL_METADATA_KEY_THUMBNAIL)); /* probably add an image column too? */ source->priv->browser_model = gtk_tree_store_new (4, GRL_TYPE_MEDIA, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); source->priv->browser_view = gtk_tree_view_new (); gtk_tree_view_set_model (GTK_TREE_VIEW (source->priv->browser_view), GTK_TREE_MODEL (source->priv->browser_model)); column = gtk_tree_view_column_new (); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_set_title (column, _("Browse")); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_add_attribute (column, renderer, "text", 1); gtk_tree_view_column_set_expand (column, TRUE); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (GTK_TREE_VIEW (source->priv->browser_view), column); gtk_tree_view_set_show_expanders (GTK_TREE_VIEW (source->priv->browser_view), TRUE); gtk_tree_view_set_expander_column (GTK_TREE_VIEW (source->priv->browser_view), column); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (source->priv->browser_view), TRUE); gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (source->priv->browser_view), TRUE); g_signal_connect (source->priv->browser_view, "row-expanded", G_CALLBACK (browser_row_expanded_cb), source); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (source->priv->browser_view)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); /* should be multiple eventually */ g_signal_connect (selection, "changed", G_CALLBACK (browser_selection_changed_cb), source); scrolled = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN); adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled)); g_signal_connect (adjustment, "changed", G_CALLBACK (scroll_adjust_changed_cb), source); g_signal_connect (adjustment, "value-changed", G_CALLBACK (scroll_adjust_value_changed_cb), source); browserbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); /* search bar (if the source supports searching) */ if (grl_source_supported_operations (source->priv->grilo_source) & GRL_OP_SEARCH) { source->priv->search_entry = rb_search_entry_new (FALSE); g_object_set (source->priv->search_entry, "explicit-mode", TRUE, NULL); g_signal_connect (source->priv->search_entry, "search", G_CALLBACK (search_cb), source); g_signal_connect (source->priv->search_entry, "activate", G_CALLBACK (search_cb), source); gtk_box_pack_start (GTK_BOX (browserbox), GTK_WIDGET (source->priv->search_entry), FALSE, FALSE, 6); } gtk_container_add (GTK_CONTAINER (scrolled), source->priv->browser_view); gtk_box_pack_start (GTK_BOX (browserbox), scrolled, TRUE, TRUE, 0); mainbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_box_pack_start (GTK_BOX (source), mainbox, TRUE, TRUE, 0); /* info bar */ source->priv->info_bar_label = gtk_label_new (""); source->priv->info_bar = gtk_info_bar_new (); gtk_info_bar_set_message_type (GTK_INFO_BAR (source->priv->info_bar), GTK_MESSAGE_INFO); gtk_info_bar_add_button (GTK_INFO_BAR (source->priv->info_bar), _("Fetch more tracks"), GTK_RESPONSE_OK); gtk_container_add (GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (source->priv->info_bar))), source->priv->info_bar_label); gtk_widget_show (GTK_WIDGET (source->priv->info_bar_label)); gtk_widget_set_no_show_all (GTK_WIDGET (source->priv->info_bar), TRUE); g_signal_connect (source->priv->info_bar, "response", G_CALLBACK (fetch_more_cb), source); /* don't allow the browser to be hidden? */ source->priv->paned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); rb_source_bind_settings (RB_SOURCE (source), GTK_WIDGET (source->priv->entry_view), source->priv->paned, NULL); gtk_paned_pack1 (GTK_PANED (source->priv->paned), browserbox, FALSE, FALSE); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (source->priv->entry_view), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), source->priv->info_bar, FALSE, FALSE, 0); gtk_paned_pack2 (GTK_PANED (source->priv->paned), vbox, TRUE, FALSE); gtk_box_pack_start (GTK_BOX (mainbox), source->priv->paned, TRUE, TRUE, 0); gtk_widget_show_all (GTK_WIDGET (source)); }
int main (int argc, char *argv[]) { #if !GLIB_CHECK_VERSION(2,35,0) g_type_init (); #endif grl_init (&argc, &argv); /* * Set the TMDB API key: * You must use your own TMDB API key in your own application. */ GrlRegistry *reg = grl_registry_get_default (); GrlConfig *config = grl_config_new (TMDB_PLUGIN_ID, NULL); grl_config_set_api_key (config, TMDB_KEY); grl_registry_add_config (reg, config, NULL); /* * Get the plugin: */ GError *error = NULL; gboolean plugin_loaded = grl_registry_load_plugin_by_id (reg, TMDB_PLUGIN_ID, &error); g_assert (plugin_loaded); g_assert_no_error (error); /* * Get the Grilo source: */ GrlSource *src = grl_registry_lookup_source (reg, TMDB_PLUGIN_ID); /* * Check that it has the expected capability: */ g_assert (grl_source_supported_operations (src) & GRL_OP_RESOLVE); GrlCaps *caps = grl_source_get_caps (src, GRL_OP_RESOLVE); g_assert (caps); GrlOperationOptions *options = grl_operation_options_new (caps); /* * A media item that we will give to the TMDB plugin, * to discover its details. */ GrlMedia *media = grl_media_video_new (); grl_media_set_title (media, "Sherlock Holmes"); /* * Discover what keys are provided by the source: */ const GList *keys = grl_source_supported_keys (src); const GList* l = NULL; for (l = keys; l != NULL; l = l->next) { GrlKeyID id = GPOINTER_TO_INT (l->data); g_assert (id); const gchar *name = grl_metadata_key_get_name (id); printf ("Supported key: %s\n", name); /* * Remember this for later use: * You may instead use grl_registry_lookup_metadata_key_name(). */ if (g_strcmp0 (name, "tmdb-director") == 0) { director_key = id; } } /* * Ask the TMDB plugin for the media item's details, * from the TMDB online service: */ grl_source_resolve (src, media, keys, options, resolve_cb, NULL); /* * Start the main loop so our callback can be called: */ loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); /* * Release objects: */ g_object_unref (media); g_object_unref (config); g_object_unref (options); /* * Deinitialize Grilo: */ grl_deinit (); }