static void download_banner(GtChannel* self) { GtChannelPrivate* priv = gt_channel_get_instance_private(self); if (priv->video_banner_url) { GdkPixbuf* banner = NULL; if (!g_file_test(priv->cache_filename, G_FILE_TEST_EXISTS)) g_info("{GtChannel} Cache miss for channel '%s'", priv->name); else { g_info("{GtChannel} Cache hit for channel '%s'", priv->name); banner = gdk_pixbuf_new_from_file(priv->cache_filename, NULL); priv->cache_timestamp = utils_timestamp_file(priv->cache_filename); } if (!banner) gt_twitch_download_picture_async(main_app->twitch, priv->video_banner_url, 0, priv->cancel, download_banner_cb, self); else { g_thread_pool_push(cache_update_pool, self, NULL); set_banner(self, banner, FALSE, TRUE); priv->updating = FALSE; g_object_notify_by_pspec(G_OBJECT(self), props[PROP_UPDATING]); } } else { set_banner(self, gdk_pixbuf_new_from_resource("/com/gnome-twitch/icons/offline.png", NULL), FALSE, TRUE); priv->updating = FALSE; g_object_notify_by_pspec(G_OBJECT(self), props[PROP_UPDATING]); } }
/* FIXME: Throw error */ static GdkPixbuf* download_image(GtResourceDownloader* self, const gchar* uri, const gchar* name, SoupMessage* msg, GInputStream* istream, gboolean* from_file, GError** error) { RETURN_VAL_IF_FAIL(GT_IS_RESOURCE_DOWNLOADER(self), NULL); RETURN_VAL_IF_FAIL(!utils_str_empty(uri), NULL); RETURN_VAL_IF_FAIL(SOUP_IS_MESSAGE(msg), NULL); RETURN_VAL_IF_FAIL(G_IS_INPUT_STREAM(istream), NULL); GtResourceDownloaderPrivate* priv = gt_resource_downloader_get_instance_private(self); g_autofree gchar* filename = NULL; gint64 file_timestamp = 0; gboolean file_exists = FALSE; g_autoptr(GdkPixbuf) ret = NULL; g_autoptr(GError) err = NULL; /* NOTE: If we aren't supplied a filename, we'll just create one by hashing the uri */ if (utils_str_empty(name)) { gchar hash_str[15]; guint hash = 0; hash = g_str_hash(uri); /* TODO: Replace this with murmur3 hash */ g_sprintf(hash_str, "%ud", hash); filename = g_build_filename(priv->filepath, hash_str, NULL); } else filename = g_build_filename(priv->filepath, name, NULL); if (priv->filepath && (file_exists = g_file_test(filename, G_FILE_TEST_EXISTS))) { file_timestamp = utils_timestamp_file(filename, NULL); } if (SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { const gchar* last_modified_str = NULL; DEBUG("Successful return code from uri '%s'", uri); last_modified_str = soup_message_headers_get_one(msg->response_headers, "Last-Modified"); if (utils_str_empty(last_modified_str)) { DEBUG("No 'Last-Modified' header in response from uri '%s'", uri); goto download; } else if (utils_http_full_date_to_timestamp(last_modified_str) < file_timestamp) { DEBUG("No new image at uri '%s'", uri); if (file_exists) { DEBUG("Loading image from file '%s'", filename); ret = gdk_pixbuf_new_from_file(filename, NULL); if (from_file) *from_file = TRUE; } else { DEBUG("Image doesn't exist locally"); goto download; } } else { download: DEBUG("New image at uri '%s'", uri); ret = gdk_pixbuf_new_from_stream(istream, NULL, &err); if (err) { WARNING("Unable to download image from uri '%s' because: %s", uri, err->message); g_propagate_prefixed_error(error, g_steal_pointer(&err), "Unable to download image from uri '%s' because: ", uri); return NULL; } if (priv->filepath && STRING_EQUALS(priv->image_filetype, GT_IMAGE_FILETYPE_JPEG)) { gdk_pixbuf_save(ret, filename, priv->image_filetype, NULL, "quality", "100", NULL); } else if (priv->filepath) { gdk_pixbuf_save(ret, filename, priv->image_filetype, NULL, NULL); } if (from_file) *from_file = FALSE; } } return g_steal_pointer(&ret); }