From d1f1683bc44ebc51b45083280adabf60d0dd27d7 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 2 May 2021 01:01:39 +0200 Subject: Make submit async, sort manga combined view by manga service name, show correct timeout, use youtube thumbnail without black bars at top and bottom --- TODO | 3 ++- plugins/MangaCombined.hpp | 4 ++- src/QuickMedia.cpp | 25 ++++++++++++------- src/plugins/MangaCombined.cpp | 58 ++++++++++++++++++++++++------------------- src/plugins/Youtube.cpp | 8 +++--- 5 files changed, 58 insertions(+), 40 deletions(-) diff --git a/TODO b/TODO index 28708b6..853ba71 100644 --- a/TODO +++ b/TODO @@ -136,4 +136,5 @@ Update subscriptions page either with f5 and automatically update it when adding Update room name and topic text in ui when they change. Support webp directly without using ffmpeg to convert it to a png. Add client side 4chan file size limit (note, webm has different limit than images). -Add client side 4chan max comment chars limit. \ No newline at end of file +Add client side 4chan max comment chars limit. +Use a directory icon and a file icon for non-media files in the file manager. \ No newline at end of file diff --git a/plugins/MangaCombined.hpp b/plugins/MangaCombined.hpp index 8d310f8..6999eb4 100644 --- a/plugins/MangaCombined.hpp +++ b/plugins/MangaCombined.hpp @@ -13,6 +13,8 @@ namespace QuickMedia { std::string logo_path; }; + using MangaCombinedSearchThread = std::pair>; + class MangaCombinedSearchPage : public Page { public: MangaCombinedSearchPage(Program *program, std::vector search_pages); @@ -24,6 +26,6 @@ namespace QuickMedia { sf::Vector2i get_thumbnail_max_size() override { return sf::Vector2i(101, 141); }; private: std::vector search_pages; - std::vector>> search_threads; // TODO: Use async task pool + std::vector search_threads; // TODO: Use async task pool }; } \ No newline at end of file diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index b9f0bc8..64f326b 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -354,8 +354,8 @@ namespace QuickMedia { auto body_item = BodyItem::create(recommended_title_json.asString()); body_item->url = "https://www.youtube.com/watch?v=" + recommended_item_id; - body_item->thumbnail_url = "https://img.youtube.com/vi/" + recommended_item_id + "/hqdefault.jpg"; - body_item->thumbnail_size = sf::Vector2i(175, 131); + body_item->thumbnail_url = "https://img.youtube.com/vi/" + recommended_item_id + "/mqdefault.jpg"; + body_item->thumbnail_size = sf::Vector2i(192, 108); body_items.push_back(std::move(body_item)); // We dont want more than 150 recommendations @@ -765,7 +765,7 @@ namespace QuickMedia { } static void add_mangatown_handlers(MangaGenericSearchPage *manga_generic_search_page) { - manga_generic_search_page->search_handler("https://mangatown.com/search?name=%s&page=%p", 1) + manga_generic_search_page->search_handler("https://www.mangatown.com/search?name=%s&page=%p", 1) .text_handler({{"//p[class='title']/a", "title", "href", "/manga/"}}) .thumbnail_handler({{"//a[class='manga_cover']/img", "src", nullptr}}) .authors_handler({ @@ -1182,9 +1182,10 @@ namespace QuickMedia { auto body_item = BodyItem::create(std::move(title_str)); body_item->url = "https://www.youtube.com/watch?v=" + video_id_str; - body_item->thumbnail_url = "https://img.youtube.com/vi/" + video_id_str + "/hqdefault.jpg"; + body_item->thumbnail_url = "https://img.youtube.com/vi/" + video_id_str + "/mqdefault.jpg"; body_item->set_description("Watched " + seconds_to_relative_time_str(time_now - timestamp.asInt64())); - body_item->thumbnail_size = sf::Vector2i(175, 131); + body_item->set_description_color(sf::Color(179, 179, 179)); + body_item->thumbnail_size = sf::Vector2i(192, 108); body_items.push_back(std::move(body_item)); } @@ -1458,12 +1459,20 @@ namespace QuickMedia { auto selected_item = tabs[selected_tab].body->get_selected_shared(); if(!selected_item && !tabs[selected_tab].page->allow_submit_no_selection()) return; + + hide_virtual_keyboard(); std::vector new_tabs; auto prev_selected_item = tabs[selected_tab].page->submit_body_item; tabs[selected_tab].page->submit_body_item = selected_item; - PluginResult submit_result = tabs[selected_tab].page->submit(selected_item ? selected_item->get_title() : search_text, selected_item ? selected_item->url : "", new_tabs); - if(submit_result != PluginResult::OK) { + TaskResult submit_result = run_task_with_loading_screen([&tabs, selected_tab, &selected_item, &search_text, &new_tabs](){ + PluginResult submit_result = tabs[selected_tab].page->submit(selected_item ? selected_item->get_title() : search_text, selected_item ? selected_item->url : "", new_tabs); + return submit_result == PluginResult::OK; + }); + + if(submit_result == TaskResult::CANCEL) { + return; + } else if(submit_result != TaskResult::TRUE) { // TODO: Show the exact cause of error (get error message from curl). show_notification("QuickMedia", std::string("Submit failed for page ") + tabs[selected_tab].page->get_title(), Urgency::CRITICAL); return; @@ -1502,8 +1511,6 @@ namespace QuickMedia { tab.body->clear_cache(); } - hide_virtual_keyboard(); - if(tabs[selected_tab].page->allow_submit_no_selection()) { page_loop(new_tabs, 0, after_submit_handler); } else if(new_tabs.size() == 1 && new_tabs[0].page->get_type() == PageTypez::MANGA_IMAGES) { diff --git a/src/plugins/MangaCombined.cpp b/src/plugins/MangaCombined.cpp index ea6188c..1745ee0 100644 --- a/src/plugins/MangaCombined.cpp +++ b/src/plugins/MangaCombined.cpp @@ -1,7 +1,7 @@ #include "../../plugins/MangaCombined.hpp" namespace QuickMedia { - static const int SEARCH_TIMEOUT_MILLISECONDS = 6000; + static const int SEARCH_TIMEOUT_MILLISECONDS = 5000; MangaCombinedSearchPage::MangaCombinedSearchPage(Program *program, std::vector search_pages) : Page(program), search_pages(std::move(search_pages)) @@ -9,43 +9,35 @@ namespace QuickMedia { } - static void result_items_add_thread_results(std::vector>> &search_threads, BodyItems &result_items) { - std::vector> plugin_finished_state(search_threads.size()); + using PluginFinishedState = std::pair>; + static void result_items_add_thread_results(std::vector &search_threads, BodyItems &result_items) { + std::sort(search_threads.begin(), search_threads.end(), [](const MangaCombinedSearchThread &plugin1, const MangaCombinedSearchThread &plugin2){ + return plugin1.first->title < plugin2.first->title; + }); + + std::vector plugin_finished_state(search_threads.size()); for(size_t i = 0; i < plugin_finished_state.size(); ++i) { plugin_finished_state[i].first = search_threads[i].first; + plugin_finished_state[i].second = nullptr; } int accumulated_sleep_time = 0; while(true) { - size_t finshed_plugin_index = 0; - for(auto &f : plugin_finished_state) { - f.second = false; - } - - for(auto &search_thread : search_threads) { - if(!search_thread.second.valid()) { - plugin_finished_state[finshed_plugin_index].second = true; - ++finshed_plugin_index; + for(size_t i = 0; i < search_threads.size(); ++i) { + auto &search_thread = search_threads[i]; + if(!search_thread.second.valid()) continue; - } if(!search_thread.second.ready()) continue; - BodyItems search_page_body_items = search_thread.second.get(); - plugin_finished_state[finshed_plugin_index].second = true; - ++finshed_plugin_index; - if(search_page_body_items.empty()) + plugin_finished_state[i].second = std::make_unique(search_thread.second.get()); + if(plugin_finished_state[i].second->empty()) continue; - auto title_item = BodyItem::create(""); - title_item->set_author("------------------------ " + search_thread.first->title + " ------------------------"); - result_items.push_back(std::move(title_item)); - - for(auto &new_body_item : search_page_body_items) { + for(auto &new_body_item : *plugin_finished_state[i].second) { new_body_item->userdata = search_thread.first->page.get(); } - result_items.insert(result_items.end(), std::move_iterator(search_page_body_items.begin()), std::move_iterator(search_page_body_items.end())); } size_t num_finished_plugins = 0; @@ -54,15 +46,31 @@ namespace QuickMedia { ++num_finished_plugins; } - if(num_finished_plugins == search_threads.size()) + if(num_finished_plugins == search_threads.size()) { + for(auto &f : plugin_finished_state) { + if(f.second && !f.second->empty()) { + auto title_item = BodyItem::create(""); + title_item->set_author("------------------------ " + f.first->title + " ------------------------"); + result_items.push_back(std::move(title_item)); + result_items.insert(result_items.end(), std::move_iterator(f.second->begin()), std::move_iterator(f.second->end())); + } + } break; + } int sleep_time_ms = 200; std::this_thread::sleep_for(std::chrono::milliseconds(sleep_time_ms)); accumulated_sleep_time += sleep_time_ms; if(accumulated_sleep_time >= SEARCH_TIMEOUT_MILLISECONDS) { for(auto &f : plugin_finished_state) { - if(!f.second) { + if(f.second) { + if(!f.second->empty()) { + auto title_item = BodyItem::create(""); + title_item->set_author("------------------------ " + f.first->title + " ------------------------"); + result_items.push_back(std::move(title_item)); + result_items.insert(result_items.end(), std::move_iterator(f.second->begin()), std::move_iterator(f.second->end())); + } + } else { auto title_item = BodyItem::create(""); title_item->set_author("------------------------ " + f.first->title + " timed out ------------------------"); result_items.push_back(std::move(title_item)); diff --git a/src/plugins/Youtube.cpp b/src/plugins/Youtube.cpp index cf3bbe4..6149b84 100644 --- a/src/plugins/Youtube.cpp +++ b/src/plugins/Youtube.cpp @@ -196,8 +196,8 @@ namespace QuickMedia { if(scheduled_text.empty()) body_item->url = "https://www.youtube.com/watch?v=" + video_id_str; - body_item->thumbnail_url = "https://img.youtube.com/vi/" + video_id_str + "/hqdefault.jpg"; - body_item->thumbnail_size = sf::Vector2i(175, 131); + body_item->thumbnail_url = "https://img.youtube.com/vi/" + video_id_str + "/mqdefault.jpg"; + body_item->thumbnail_size = sf::Vector2i(192, 108); added_videos.insert(video_id_str); return body_item; @@ -1345,8 +1345,8 @@ namespace QuickMedia { body_item->set_description("Uploaded " + seconds_to_relative_time_str(time_now - subscription_data.subscription_entry.published)); body_item->set_description_color(sf::Color(179, 179, 179)); body_item->url = "https://www.youtube.com/watch?v=" + subscription_data.subscription_entry.video_id; - body_item->thumbnail_url = "https://img.youtube.com/vi/" + subscription_data.subscription_entry.video_id + "/hqdefault.jpg"; - body_item->thumbnail_size = sf::Vector2i(175, 131); + body_item->thumbnail_url = "https://img.youtube.com/vi/" + subscription_data.subscription_entry.video_id + "/mqdefault.jpg"; + body_item->thumbnail_size = sf::Vector2i(192, 108); results.push_back({std::move(body_item), subscription_data.subscription_entry.published}); } return results; -- cgit v1.2.3