aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-10-19 14:44:55 +0200
committerdec05eba <dec05eba@protonmail.com>2020-10-19 14:44:55 +0200
commit1569d02aa38baa53d5442b3babdbf1a3aaa3aaa0 (patch)
treee2d58b2ad86168c238f996e699097ca1d3991a47 /include
parent1ea92d1aa4656160fee3059500c405ce4260bce7 (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.hpp32
-rw-r--r--include/DownloadUtils.hpp1
-rw-r--r--include/QuickMedia.hpp1
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;