From 1569d02aa38baa53d5442b3babdbf1a3aaa3aaa0 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 19 Oct 2020 14:44:55 +0200 Subject: Load thumbnails with multiple threads, use sha256 for saving image to path instead of base64 (filename limit is 256 on linux...) --- include/AsyncImageLoader.hpp | 32 +++++++++++++++++++++++++++++--- include/DownloadUtils.hpp | 1 + include/QuickMedia.hpp | 1 - 3 files changed, 30 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/AsyncImageLoader.hpp b/include/AsyncImageLoader.hpp index 0b3f4bf..3189565 100644 --- a/include/AsyncImageLoader.hpp +++ b/include/AsyncImageLoader.hpp @@ -1,11 +1,16 @@ #pragma once -#include +#include "../include/Storage.hpp" #include #include #include +#include +#include #include #include +#include +#include +#include namespace QuickMedia { enum class LoadingState { @@ -23,15 +28,36 @@ namespace QuickMedia { sf::Clock texture_applied_time; }; + constexpr int NUM_IMAGE_LOAD_THREADS = 4; + class AsyncImageLoader { public: + AsyncImageLoader(); + ~AsyncImageLoader(); // Returns false if the image loader is already loading an image. In that case, this function should be called again later. // set |resize_target_size| to {0, 0} to disable resizing. // |thumbnail_data.loading_state| has to be LoadingState::NOT_LOADED when calling this! // Note: this method is not thread-safe - bool load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr thumbnail_data); + void load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr thumbnail_data); + private: + struct ThumbnailLoadData { + Path path; + Path thumbnail_path; + bool local; + std::shared_ptr thumbnail_data; + sf::Vector2i resize_target_size; + }; + + // Returns -1 if all threads are busy + int get_free_load_index() const; private: - bool loading_image = false; + bool loading_image[NUM_IMAGE_LOAD_THREADS]; + // TODO: Use curl single-threaded multi-download feature instead + std::thread download_image_thread[NUM_IMAGE_LOAD_THREADS]; std::thread load_image_thread; + std::mutex load_image_mutex; + std::condition_variable load_image_cv; + std::deque images_to_load; + bool running = true; }; } \ No newline at end of file diff --git a/include/DownloadUtils.hpp b/include/DownloadUtils.hpp index 52c5b80..e1e71df 100644 --- a/include/DownloadUtils.hpp +++ b/include/DownloadUtils.hpp @@ -18,5 +18,6 @@ namespace QuickMedia { DownloadResult download_to_string(const std::string &url, std::string &result, const std::vector &additional_args, bool use_tor, bool use_browser_useragent = false, bool fail_on_error = true); DownloadResult download_to_string_cache(const std::string &url, std::string &result, const std::vector &additional_args, bool use_tor, bool use_browser_useragent = false); + DownloadResult download_to_file(const std::string &url, const std::string &destination_filepath, const std::vector &additional_args, bool use_tor, bool use_browser_useragent = false); DownloadResult download_to_json(const std::string &url, rapidjson::Document &result, const std::vector &additional_args, bool use_tor, bool use_browser_useragent = false, bool fail_on_error = true); } \ No newline at end of file diff --git a/include/QuickMedia.hpp b/include/QuickMedia.hpp index b7e6814..955fc9c 100644 --- a/include/QuickMedia.hpp +++ b/include/QuickMedia.hpp @@ -122,7 +122,6 @@ namespace QuickMedia { bool no_video = false; bool use_system_mpv_config = false; UpscaleImageAction upscale_image_action = UpscaleImageAction::NO; - bool running = false; // TODO: Save this to config file when switching modes ImageViewMode image_view_mode = ImageViewMode::SINGLE; std::vector selected_files; -- cgit v1.2.3