diff options
author | dec05eba <dec05eba@protonmail.com> | 2020-10-19 14:44:55 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2020-10-19 14:44:55 +0200 |
commit | 1569d02aa38baa53d5442b3babdbf1a3aaa3aaa0 (patch) | |
tree | e2d58b2ad86168c238f996e699097ca1d3991a47 /include | |
parent | 1ea92d1aa4656160fee3059500c405ce4260bce7 (diff) |
Load thumbnails with multiple threads, use sha256 for saving image to path instead of base64 (filename limit is 256 on linux...)
Diffstat (limited to 'include')
-rw-r--r-- | include/AsyncImageLoader.hpp | 32 | ||||
-rw-r--r-- | include/DownloadUtils.hpp | 1 | ||||
-rw-r--r-- | include/QuickMedia.hpp | 1 |
3 files changed, 30 insertions, 4 deletions
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 <string> +#include "../include/Storage.hpp" #include <SFML/System/Vector2.hpp> #include <SFML/Graphics/Texture.hpp> #include <SFML/System/Clock.hpp> +#include <string> +#include <vector> #include <memory> #include <thread> +#include <mutex> +#include <condition_variable> +#include <deque> 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<ThumbnailData> thumbnail_data); + void load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr<ThumbnailData> thumbnail_data); + private: + struct ThumbnailLoadData { + Path path; + Path thumbnail_path; + bool local; + std::shared_ptr<ThumbnailData> 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<ThumbnailLoadData> 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<CommandArg> &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<CommandArg> &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<CommandArg> &additional_args, bool use_tor, bool use_browser_useragent = false); DownloadResult download_to_json(const std::string &url, rapidjson::Document &result, const std::vector<CommandArg> &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<std::string> selected_files; |