static void update_media (GrlMedia *media, GHashTable *video) { gchar *str; str = g_hash_table_lookup (video, VIMEO_VIDEO_ID); if (str) { char *external_url; grl_media_set_id (media, str); external_url = g_strdup_printf ("https://vimeo.com/%s", str); grl_media_set_external_url (media, external_url); g_free (external_url); } str = g_hash_table_lookup (video, VIMEO_VIDEO_TITLE); if (str) { grl_media_set_title (media, str); } str = g_hash_table_lookup (video, VIMEO_VIDEO_DESCRIPTION); if (str) { grl_media_set_description (media, str); } str = g_hash_table_lookup (video, VIMEO_VIDEO_DURATION); if (str) { grl_media_set_duration (media, str_to_gint (str)); } str = g_hash_table_lookup (video, VIMEO_VIDEO_OWNER_NAME); if (str) { grl_media_set_author (media, str); } str = g_hash_table_lookup (video, VIMEO_VIDEO_UPLOAD_DATE); if (str) { GDateTime *date = parse_date (str); if (date) { grl_media_set_publication_date (media, date); g_date_time_unref (date); } } str = g_hash_table_lookup (video, VIMEO_VIDEO_THUMBNAIL); if (str) { grl_media_set_thumbnail (media, str); } str = g_hash_table_lookup (video, VIMEO_VIDEO_WIDTH); if (str) { grl_media_set_width (media, str_to_gint (str)); } str = g_hash_table_lookup (video, VIMEO_VIDEO_HEIGHT); if (str) { grl_media_set_height (media, str_to_gint (str)); } }
static void proxy_call_resolve_grlnet_async_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { RaitvOperation *op = (RaitvOperation *) user_data; xmlDocPtr doc = NULL; xmlXPathContextPtr xpath = NULL; GError *wc_error = NULL; GError *error = NULL; gchar *content = NULL; gsize length; gchar *value; gchar *thumbnail; gchar **tokens; GDateTime *date; GRL_DEBUG ("Response id=%u", op->operation_id); if (g_cancellable_is_cancelled (op->cancellable)) { goto finalize; } if (!grl_net_wc_request_finish (GRL_NET_WC (source_object), res, &content, &length, &wc_error)) { error = g_error_new (GRL_CORE_ERROR, GRL_CORE_ERROR_SEARCH_FAILED, _("Failed to resolve: %s"), wc_error->message); op->resolveCb (op->source, op->operation_id, op->media, op->user_data, error); g_error_free (wc_error); g_error_free (error); return; } doc = xmlRecoverMemory (content, (gint) length); if (!doc) { GRL_DEBUG ("Doc failed"); goto finalize; } xpath = xmlXPathNewContext (doc); if (!xpath) { GRL_DEBUG ("Xpath failed"); goto finalize; } if (!grl_data_has_key (GRL_DATA (op->media), GRL_METADATA_KEY_URL)) { value = eval_xquery ("/html/head/meta[@name='videourl']", xpath); if (value) { grl_media_set_url (op->media, value); g_free (value); } } if (!grl_data_has_key (GRL_DATA (op->media), GRL_METADATA_KEY_TITLE)) { value = eval_xquery ("/html/head/meta[@name='title']", xpath); if (value) { grl_media_set_title (op->media, value); g_free (value); } } if (!grl_data_has_key (GRL_DATA (op->media), GRL_METADATA_KEY_PUBLICATION_DATE)) { value = eval_xquery ("/html/head/meta[@name='itemDate']", xpath); if (value) { tokens = g_strsplit (value, "/", -1); if (g_strv_length (tokens) >= 3) { date = g_date_time_new_local (atoi (tokens[2]), atoi (tokens[1]), atoi (tokens[0]), 0, 0, 0); grl_media_set_publication_date (op->media, date); g_date_time_unref (date); } g_strfreev (tokens); g_free (value); } } if (!grl_data_has_key (GRL_DATA (op->media), GRL_METADATA_KEY_THUMBNAIL)) { value = eval_xquery ("/html/head/meta[@name='vod-image']", xpath); if (value) { /* Sometimes thumbnail doesn't report a complete url */ if (value[0] == '/') { thumbnail = g_strconcat ("http://www.rai.tv", value, NULL); g_free (value); } else { thumbnail = value; } grl_media_set_thumbnail (op->media, thumbnail); g_free (thumbnail); } } finalize: op->resolveCb (op->source, op->operation_id, op->media, op->user_data, NULL); g_clear_pointer (&xpath, xmlXPathFreeContext); g_clear_pointer (&doc, xmlFreeDoc); }