void cb_media_downloader_load_async (CbMediaDownloader *downloader, CbMedia *media, GAsyncReadyCallback callback, gpointer user_data) { GTask *task; g_return_if_fail (CB_IS_MEDIA_DOWNLOADER (downloader)); g_return_if_fail (CB_IS_MEDIA (media)); task = g_task_new (downloader, NULL, callback, user_data); g_task_set_task_data (task, media, g_object_unref); g_task_run_in_thread (task, load_in_thread); g_object_unref (task); }
GtkWidget * cb_media_image_widget_new (CbMedia *media) { CbMediaImageWidget *self; g_return_val_if_fail (CB_IS_MEDIA (media), NULL); g_return_val_if_fail (!media->invalid, NULL); g_return_val_if_fail (media->texture != NULL, NULL); self = CB_MEDIA_IMAGE_WIDGET (g_object_new (CB_TYPE_MEDIA_IMAGE_WIDGET, NULL)); if (media->type == CB_MEDIA_TYPE_GIF) g_warning ("Maybe remove the GIF handling support!"); /*gtk_image_set_from_animation (GTK_IMAGE (self->image), media->animation);*/ else gtk_image_set_from_paintable(GTK_IMAGE (self->image), GDK_PAINTABLE (media->texture)); self->img_width = gdk_texture_get_width (media->texture); self->img_height = gdk_texture_get_height (media->texture); return GTK_WIDGET (self); }
static void cb_media_downloader_load_threaded (CbMediaDownloader *downloader, CbMedia *media) { const char *url; SoupMessage *msg; GInputStream *input_stream; g_return_if_fail (CB_IS_MEDIA_DOWNLOADER (downloader)); g_return_if_fail (CB_IS_MEDIA (media)); g_return_if_fail (media->url != NULL); g_object_ref (media); url = canonicalize_url (media->url); /* For these, we first need to download some html and get the real URL of the image we want to display */ if (g_str_has_prefix (url, "instagr.am") || g_str_has_prefix (url, "instagram.com/p/")) { cb_media_downloader_get_instagram_url (downloader, media); } else if (g_str_has_prefix (url, "ow.ly/i/") || g_str_has_prefix (url, "flickr.com/photos/") || g_str_has_prefix (url, "flic.kr/p/") || g_str_has_prefix (url, "flic.kr/s/") || g_str_has_prefix (url, "vine.co/v/")) { cb_media_downloader_load_real_url (downloader, media, "<meta property=\"og:image\" content=\"(.*?)\"", 1); } else if (g_str_has_prefix (url, "twitpic.com/")) { cb_media_downloader_load_real_url (downloader, media, "<meta name=\"twitter:image\" value=\"(.*?)\"", 1); } else if (g_str_has_suffix (url, "/photo/1")) { cb_media_downloader_load_twitter_video (downloader, media); } else if (g_str_has_prefix (url, "d.pr/i/")) { cb_media_downloader_load_real_url (downloader, media, "<meta property=\"og:image\"\\s+content=\"(.*?)\"", 1); } if (media->url == NULL) { g_warning ("Media is invalid."); mark_invalid (media); return; } msg = soup_message_new ("GET", media->thumb_url ? media->thumb_url : media->url); if (msg == NULL) { mark_invalid (media); g_warning ("soup_message_new failed for URI '%s'", media->thumb_url ? media->thumb_url : media->url); return; } g_signal_connect (msg, "got-chunk", G_CALLBACK (update_media_progress), media); soup_session_send_message (downloader->soup_session, msg); if (msg->status_code != SOUP_STATUS_OK) { g_debug ("Request on '%s' returned status '%s'", media->thumb_url ? media->thumb_url : media->url, soup_status_get_phrase (msg->status_code)); mark_invalid (media); g_object_unref (msg); return; } input_stream = g_memory_input_stream_new_from_data (msg->response_body->data, msg->response_body->length, NULL); load_animation (input_stream, media); g_input_stream_close (input_stream, NULL, NULL); g_object_unref (input_stream); g_object_unref (msg); }