From 50afa93c577bed3eb9911d141d46f2e0d3ba2572 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 30 Apr 2021 21:04:47 +0200 Subject: Add 4chan file upload --- src/plugins/FileManager.cpp | 72 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 8 deletions(-) (limited to 'src/plugins/FileManager.cpp') diff --git a/src/plugins/FileManager.cpp b/src/plugins/FileManager.cpp index f15deae..814ee70 100644 --- a/src/plugins/FileManager.cpp +++ b/src/plugins/FileManager.cpp @@ -14,12 +14,31 @@ namespace QuickMedia { return ""; } - static std::filesystem::file_time_type file_get_filetime_or(const std::filesystem::directory_entry &path, std::filesystem::file_time_type default_value) { - try { - return path.last_write_time(); - } catch(const std::filesystem::filesystem_error &err) { + static std::filesystem::file_time_type file_get_last_modified_time(const std::filesystem::directory_entry &path, std::filesystem::file_time_type default_value) { + std::error_code err; + auto last_write_time = path.last_write_time(err); + if(err) return default_value; - } + else + return last_write_time; + } + + static std::string file_size_to_human_readable_string(size_t bytes) { + double kb = (double)bytes / 1024.0; + double mb = (double)bytes / 1024.0 / 1024.0; + double gb = (double)bytes / 1024.0 / 1024.0 / 1024.0; + char result[32]; + + if(gb >= 1.0) + snprintf(result, sizeof(result), "%.2f GiB", gb); + else if(mb >= 1.0) + snprintf(result, sizeof(result), "%.2f MiB", mb); + else if(kb >= 1.0) + snprintf(result, sizeof(result), "%.2f KiB", kb); + else + snprintf(result, sizeof(result), "%zu bytes", bytes); + + return result; } PluginResult FileManagerPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { @@ -71,7 +90,7 @@ namespace QuickMedia { } std::sort(paths.begin(), paths.end(), [](const std::filesystem::directory_entry &path1, std::filesystem::directory_entry &path2) { - return file_get_filetime_or(path1, std::filesystem::file_time_type::min()) > file_get_filetime_or(path2, std::filesystem::file_time_type::min()); + return file_get_last_modified_time(path1, std::filesystem::file_time_type::min()) > file_get_last_modified_time(path2, std::filesystem::file_time_type::min()); }); if(current_dir != "/") { @@ -79,14 +98,51 @@ namespace QuickMedia { result_items.push_back(std::move(parent_item)); } + char time_str[128] = {0}; for(auto &p : paths) { - auto body_item = BodyItem::create(p.path().filename().string()); + std::error_code regular_file_err; + bool is_regular_file = p.is_regular_file(regular_file_err); + if(regular_file_err) + is_regular_file = true; + // TODO: Check file magic number instead of extension? const char *ext = get_ext(p.path()); - if(p.is_regular_file() && (is_image_ext(ext) || is_video_ext(ext))) { + FileManagerMimeType file_mime_type = FILE_MANAGER_MIME_TYPE_OTHER; + if(is_regular_file) { + if(is_image_ext(ext)) + file_mime_type = FILE_MANAGER_MIME_TYPE_IMAGE; + else if(is_video_ext(ext)) + file_mime_type = FILE_MANAGER_MIME_TYPE_VIDEO; + } + + if(is_regular_file && !(mime_type & file_mime_type)) + continue; + + auto body_item = BodyItem::create(p.path().filename().string()); + if(file_mime_type == FILE_MANAGER_MIME_TYPE_IMAGE || file_mime_type == FILE_MANAGER_MIME_TYPE_VIDEO) { body_item->thumbnail_is_local = true; body_item->thumbnail_url = p.path().string(); } + + time_t last_modified_time = std::chrono::duration_cast(file_get_last_modified_time(p, std::filesystem::file_time_type::min()).time_since_epoch()).count(); + struct tm last_modified_tm; + localtime_r(&last_modified_time, &last_modified_tm); + strftime(time_str, sizeof(time_str) - 1, "%a %b %d %H:%M", &last_modified_tm); + + std::error_code file_size_err; + size_t file_size = p.file_size(file_size_err); + if(file_size_err) + file_size = 0; + + std::string description = "Modified: "; + description += time_str; + if(is_regular_file) { + description += "\n"; + description += "Size: " + file_size_to_human_readable_string(file_size); + } + body_item->set_description(std::move(description)); + body_item->set_description_color(sf::Color(179, 179, 179)); + result_items.push_back(std::move(body_item)); } -- cgit v1.2.3