1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
/*
* Handling multivalued elements in Grilo.
* Search all 'rock' content in Youtube, and for each one prints the available
* URLs.
*/
#include <grilo.h>
#include <string.h>
#define GRL_LOG_DOMAIN_DEFAULT example_log_domain
GRL_LOG_DOMAIN_STATIC(example_log_domain);
static void
search_cb (GrlSource *source,
guint browse_id,
GrlMedia *media,
guint remaining,
gpointer user_data,
const GError *error)
{
guint i;
GrlRelatedKeys *url_info;
if (error) {
g_error ("Search operation failed. Reason: %s", error->message);
}
if (media) {
/* Look through all available URLs for this video resource */
for (i = 0; i < grl_data_length (GRL_DATA (media), GRL_METADATA_KEY_URL); i++) {
/* Here we use the low-level GrlRelatedKeys API for demonstration purposes only,
but we could have just used the more convenient
grl_media_video_get_url_data_nth() API instead in this case */
url_info = grl_data_get_related_keys (GRL_DATA (media), GRL_METADATA_KEY_URL, i);
g_debug ("\t [%s] Got url '%s' and mime-type '%s'",
grl_media_get_id (media),
grl_related_keys_get_string (url_info, GRL_METADATA_KEY_URL),
grl_related_keys_get_string (url_info, GRL_METADATA_KEY_MIME));
}
}
if (remaining == 0) {
g_debug ("Search operation finished!");
}
g_object_unref (media);
}
static void
source_added_cb (GrlRegistry *registry, GrlSource *source, gpointer user_data)
{
const gchar *id;
GrlCaps *caps;
GrlOperationOptions *options;
GList * keys = grl_metadata_key_list_new (GRL_METADATA_KEY_TITLE,
GRL_METADATA_KEY_URL,
GRL_METADATA_KEY_MIME,
GRL_METADATA_KEY_INVALID);
/* Not interested if not searchable */
if (!(grl_source_supported_operations (source) & GRL_OP_SEARCH))
return;
g_debug ("Detected new searchable source available: '%s'",
grl_source_get_name (source));
/* Only interested in Youtube */
id = grl_source_get_id (source);
if (strcmp (id, "grl-youtube"))
return;
caps = grl_source_get_caps (source, GRL_OP_SEARCH);
options = grl_operation_options_new (caps);
grl_operation_options_set_skip (options, 0);
grl_operation_options_set_count (options, 5);
grl_operation_options_set_resolution_flags (options, GRL_RESOLVE_IDLE_RELAY);
g_debug ("Searching \"rock\" in Youtube");
grl_source_search (source,
"rock",
keys,
options,
search_cb,
NULL);
g_object_unref (options);
g_object_unref (caps);
g_list_free (keys);
}
static void
load_plugins (void)
{
GrlRegistry *registry;
GError *error = NULL;
registry = grl_registry_get_default ();
g_signal_connect (registry, "source-added",
G_CALLBACK (source_added_cb), NULL);
if (!grl_registry_load_all_plugins (registry, TRUE, &error)) {
g_error ("Failed to load plugins: %s", error->message);
}
}
static void
configure_plugins (void)
{
GrlConfig *config;
GrlRegistry *registry;
config = grl_config_new ("grl-youtube", NULL);
grl_config_set_api_key (config,
"AI39si4EfscPllSfUy1IwexMf__kntTL_G5dfSr2iUEVN45RHG"
"q92Aq0lX25OlnOkG6KTN-4soVAkAf67fWYXuHfVADZYr7S1A");
registry = grl_registry_get_default ();
grl_registry_add_config (registry, config, NULL);
}
gint
main (int argc, gchar *argv[])
{
GMainLoop *loop;
grl_init (&argc, &argv);
GRL_LOG_DOMAIN_INIT (example_log_domain, "example");
configure_plugins ();
load_plugins ();
loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (loop);
grl_deinit ();
return 0;
}
|