From 5c27b5fbaa0f1693bf4605a3e6fc57d0f066c0ec Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 12 Nov 2021 22:37:23 +0100 Subject: Allow plugins to add their own tabs in ctrl+r instead of search, comments, related and channel --- plugins/ImageBoard.hpp | 4 ---- plugins/Lbry.hpp | 4 ---- plugins/Matrix.hpp | 6 ------ plugins/MediaGeneric.hpp | 6 +----- plugins/Page.hpp | 13 +++++++------ plugins/Peertube.hpp | 4 ---- plugins/Soundcloud.hpp | 2 -- plugins/Youtube.hpp | 5 +---- src/QuickMedia.cpp | 32 +++++++++----------------------- src/plugins/ImageBoard.cpp | 4 ---- src/plugins/Lbry.cpp | 12 ------------ src/plugins/MediaGeneric.cpp | 14 +++++--------- src/plugins/Peertube.cpp | 12 ------------ src/plugins/Youtube.cpp | 27 +++++++-------------------- 14 files changed, 30 insertions(+), 115 deletions(-) diff --git a/plugins/ImageBoard.hpp b/plugins/ImageBoard.hpp index 7914ef1..e7c4c5d 100644 --- a/plugins/ImageBoard.hpp +++ b/plugins/ImageBoard.hpp @@ -32,10 +32,6 @@ namespace QuickMedia { void copy_to_clipboard(const BodyItem *body_item) const override; bool autoplay_next_item() override { return true; } - std::unique_ptr create_related_videos_page(Program *program) override; - std::unique_ptr create_channels_page(Program*, const std::string&) override { - return nullptr; - } virtual PluginResult login(const std::string &token, const std::string &pin, std::string &response_msg); // If |filepath| is empty then no file is uploaded virtual PostResult post_comment(const std::string &captcha_id, const std::string &captcha_solution, const std::string &comment, const std::string &filepath = "") = 0; diff --git a/plugins/Lbry.hpp b/plugins/Lbry.hpp index ac7c4b4..1cddf56 100644 --- a/plugins/Lbry.hpp +++ b/plugins/Lbry.hpp @@ -38,10 +38,6 @@ namespace QuickMedia { LbryVideoPage(Program *program, std::string title, std::string url) : VideoPage(program, std::move(url)), title(std::move(title)) {} const char* get_title() const override { return ""; } //BodyItems get_related_media(const std::string &url) override; - //bool create_search_page(Program *program, Tab &tab) override; - std::unique_ptr create_comments_page(Program *program) override; - std::unique_ptr create_related_videos_page(Program *program) override; - std::unique_ptr create_channels_page(Program *program, const std::string &channel_url) override; std::string get_download_url(int max_height) override; std::string get_video_url(int max_height, bool &has_embedded_audio, std::string &ext) override; std::string get_audio_url(std::string &ext) override; diff --git a/plugins/Matrix.hpp b/plugins/Matrix.hpp index cd7bdce..680b8b6 100644 --- a/plugins/Matrix.hpp +++ b/plugins/Matrix.hpp @@ -416,12 +416,6 @@ namespace QuickMedia { public: MatrixVideoPage(Program *program) : VideoPage(program, "") {} const char* get_title() const override { return ""; } - std::unique_ptr create_related_videos_page(Program*) override { - return nullptr; - } - std::unique_ptr create_channels_page(Program*, const std::string&) override { - return nullptr; - } }; class MatrixChatPage : public Page { diff --git a/plugins/MediaGeneric.hpp b/plugins/MediaGeneric.hpp index ca111a4..61f1ad9 100644 --- a/plugins/MediaGeneric.hpp +++ b/plugins/MediaGeneric.hpp @@ -84,11 +84,7 @@ namespace QuickMedia { MediaGenericVideoPage(Program *program, MediaGenericSearchPage *search_page, const std::string &url) : VideoPage(program, url), search_page(search_page) {} const char* get_title() const override { return ""; } BodyItems get_related_media(const std::string &url) override; - bool create_search_page(Program *program, Tab &tab) override; - std::unique_ptr create_related_videos_page(Program *program) override; - std::unique_ptr create_channels_page(Program*, const std::string&) override { - return nullptr; - } + PluginResult get_related_pages(const BodyItems &related_videos, const std::string &channel_url, std::vector &result_tabs) override; private: MediaGenericSearchPage *search_page; }; diff --git a/plugins/Page.hpp b/plugins/Page.hpp index 4fed1c8..c07679d 100644 --- a/plugins/Page.hpp +++ b/plugins/Page.hpp @@ -129,12 +129,13 @@ namespace QuickMedia { virtual PageTypez get_type() const override { return PageTypez::VIDEO; } virtual bool autoplay_next_item() { return false; } virtual BodyItems get_related_media(const std::string &url) { (void)url; return {}; } - virtual bool create_search_page(Program *program, Tab &tab) { (void)program; (void)tab; return false; } - virtual std::unique_ptr create_comments_page(Program *program) { (void)program; return nullptr; } - // Return nullptr if the service doesn't support related videos page - virtual std::unique_ptr create_related_videos_page(Program *program) = 0; - // Return nullptr if the service doesn't support channels page - virtual std::unique_ptr create_channels_page(Program *program, const std::string &channel_url) = 0; + virtual PluginResult get_related_pages(const BodyItems &related_videos, const std::string &channel_url, std::vector &result_tabs) { + (void)related_videos; + (void)channel_url; + (void)result_tabs; + return PluginResult::OK; + } + virtual int get_related_pages_first_tab() { return 0; } virtual void set_url(std::string new_url) { url = std::move(new_url); } std::string get_url() { return url; } virtual std::string get_download_url(int max_height) { (void)max_height; return url; } diff --git a/plugins/Peertube.hpp b/plugins/Peertube.hpp index c8578f7..90453ee 100644 --- a/plugins/Peertube.hpp +++ b/plugins/Peertube.hpp @@ -78,10 +78,6 @@ namespace QuickMedia { PeertubeVideoPage(Program *program, std::string server, std::string url, bool autoplay_next) : VideoPage(program, std::move(url)), server(server), autoplay_next(autoplay_next) {} const char* get_title() const override { return ""; } //BodyItems get_related_media(const std::string &url) override; - //bool create_search_page(Program *program, Tab &tab) override; - std::unique_ptr create_comments_page(Program *program) override; - std::unique_ptr create_related_videos_page(Program *program) override; - std::unique_ptr create_channels_page(Program *program, const std::string &channel_url) override; std::string get_download_url(int max_height) override; std::string get_video_url(int max_height, bool &has_embedded_audio, std::string &ext) override; std::string get_audio_url(std::string &ext) override; diff --git a/plugins/Soundcloud.hpp b/plugins/Soundcloud.hpp index fa41e88..eeb1f46 100644 --- a/plugins/Soundcloud.hpp +++ b/plugins/Soundcloud.hpp @@ -61,8 +61,6 @@ namespace QuickMedia { SoundcloudAudioPage(Program *program, const std::string &url) : VideoPage(program, url) {} const char* get_title() const override { return ""; } bool autoplay_next_item() override { return true; } - std::unique_ptr create_related_videos_page(Program *) override { return nullptr; } - std::unique_ptr create_channels_page(Program *, const std::string &) override { return nullptr; } std::string url_get_playable_url(const std::string &url) override; bool video_should_be_skipped(const std::string &url) override { return url == "track" || url.find("/stream/users/") != std::string::npos; } }; diff --git a/plugins/Youtube.hpp b/plugins/Youtube.hpp index 97dea19..23f7e20 100644 --- a/plugins/Youtube.hpp +++ b/plugins/Youtube.hpp @@ -143,10 +143,7 @@ namespace QuickMedia { YoutubeVideoPage(Program *program, std::string url); const char* get_title() const override { return ""; } BodyItems get_related_media(const std::string &url) override; - bool create_search_page(Program *program, Tab &tab) override; - std::unique_ptr create_comments_page(Program *program) override; - std::unique_ptr create_related_videos_page(Program *program) override; - std::unique_ptr create_channels_page(Program *program, const std::string &channel_url) override; + PluginResult get_related_pages(const BodyItems &related_videos, const std::string &channel_url, std::vector &result_tabs) override; void set_url(std::string new_url) override; std::string get_url_timestamp() override { return timestamp; } std::string get_video_url(int max_height, bool &has_embedded_audio, std::string &ext) override; diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 091ce3b..29976ad 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -3082,34 +3082,20 @@ namespace QuickMedia { window.setMouseCursorVisible(true); cursor_visible = true; - Tab search_page_tab; - const bool search_page_created = video_page->create_search_page(this, search_page_tab); - auto comments_page = video_page->create_comments_page(this); - auto related_videos_page = video_page->create_related_videos_page(this); - auto channels_page = video_page->create_channels_page(this, channel_url); - if(search_page_created || related_videos_page || channels_page) { + std::vector related_pages; + TaskResult related_pages_result = run_task_with_loading_screen([&video_page, &related_videos, &channel_url, &related_pages]{ + return video_page->get_related_pages(related_videos, channel_url, related_pages) == PluginResult::OK; + }); + + if(related_pages_result == TaskResult::FALSE) { + show_notification("QuickMedia", "Failed to get related pages", Urgency::CRITICAL); + } else if(related_pages_result == TaskResult::TRUE) { XUnmapWindow(disp, video_player_window); XSync(disp, False); - std::vector tabs; - if(search_page_created) { - tabs.push_back(std::move(search_page_tab)); - } - if(comments_page) { - tabs.push_back(Tab{create_body(), std::move(comments_page), nullptr}); - } - if(related_videos_page) { - auto related_videos_body = create_body(false, true); - related_videos_body->set_items(related_videos); - tabs.push_back(Tab{std::move(related_videos_body), std::move(related_videos_page), create_search_bar("Search...", SEARCH_DELAY_FILTER)}); - } - if(channels_page) { - tabs.push_back(Tab{create_body(false, true), std::move(channels_page), create_search_bar("Search...", 350)}); - } - bool page_changed = false; double resume_start_time = 0.0; - page_loop(tabs, 1, [this, &page_changed, &resume_start_time, &youtube_video_media_proxy, &youtube_audio_media_proxy, &youtube_downloader_task](const std::vector &new_tabs) { + page_loop(related_pages, video_page->get_related_pages_first_tab(), [&](const std::vector &new_tabs) { if(!page_changed && new_tabs.size() == 1 && new_tabs[0].page->get_type() == PageTypez::VIDEO) { video_player->get_time_in_file(&resume_start_time); video_player.reset(); diff --git a/src/plugins/ImageBoard.cpp b/src/plugins/ImageBoard.cpp index f813068..b87e4bb 100644 --- a/src/plugins/ImageBoard.cpp +++ b/src/plugins/ImageBoard.cpp @@ -6,10 +6,6 @@ namespace QuickMedia { sf::Clipboard::setString(sf::String::fromUtf8(body_item->get_description().begin(), body_item->get_description().end())); } - std::unique_ptr ImageBoardThreadPage::create_related_videos_page(Program*) { - return nullptr; - } - PluginResult ImageBoardThreadPage::login(const std::string &token, const std::string &pin, std::string &response_msg) { (void)token; (void)pin; diff --git a/src/plugins/Lbry.cpp b/src/plugins/Lbry.cpp index 239a269..50da718 100644 --- a/src/plugins/Lbry.cpp +++ b/src/plugins/Lbry.cpp @@ -373,18 +373,6 @@ namespace QuickMedia { return PluginResult::OK; } - std::unique_ptr LbryVideoPage::create_comments_page(Program*) { - return nullptr; - } - - std::unique_ptr LbryVideoPage::create_related_videos_page(Program*) { - return nullptr; - } - - std::unique_ptr LbryVideoPage::create_channels_page(Program*, const std::string&) { - return nullptr; - } - // TODO: Support |max_height|. This can be done by gettin video source hash and checking for sd_hash and then resolution. // If max_height is below max resolution height then choose the sd_hash version (replace hash in video stream with sd hash for the lower quality version) std::string LbryVideoPage::get_download_url(int max_height) { diff --git a/src/plugins/MediaGeneric.cpp b/src/plugins/MediaGeneric.cpp index 713c7f7..dd70efc 100644 --- a/src/plugins/MediaGeneric.cpp +++ b/src/plugins/MediaGeneric.cpp @@ -193,14 +193,10 @@ namespace QuickMedia { return result_items; } - bool MediaGenericVideoPage::create_search_page(Program*, Tab &tab) { - tab.body = create_body(false, true); - tab.page = std::make_unique(*search_page); - tab.search_bar = create_search_bar("Search...", 500); // TODO: Make search delay configurable? - return true; - } - - std::unique_ptr MediaGenericVideoPage::create_related_videos_page(Program *program) { - return std::make_unique(program, search_page); + PluginResult MediaGenericVideoPage::get_related_pages(const BodyItems &related_videos, const std::string&, std::vector &result_tabs) { + auto related_page_body = create_body(false, true); + related_page_body->set_items(related_videos); + result_tabs.push_back(Tab{std::move(related_page_body), std::make_unique(program, search_page), create_search_bar("Search...", SEARCH_DELAY_FILTER)}); + return PluginResult::OK; } } \ No newline at end of file diff --git a/src/plugins/Peertube.cpp b/src/plugins/Peertube.cpp index b83daf5..2e7fec4 100644 --- a/src/plugins/Peertube.cpp +++ b/src/plugins/Peertube.cpp @@ -298,18 +298,6 @@ namespace QuickMedia { return get_page("", 0, result_items); } - std::unique_ptr PeertubeVideoPage::create_comments_page(Program*) { - return nullptr; - } - - std::unique_ptr PeertubeVideoPage::create_related_videos_page(Program*) { - return nullptr; - } - - std::unique_ptr PeertubeVideoPage::create_channels_page(Program*, const std::string&) { - return nullptr; - } - static std::string get_ext_from_url(const std::string &url) { const size_t dot_index = url.rfind('.'); if(dot_index == std::string::npos) diff --git a/src/plugins/Youtube.cpp b/src/plugins/Youtube.cpp index 40b6970..c7a9e5c 100644 --- a/src/plugins/Youtube.cpp +++ b/src/plugins/Youtube.cpp @@ -2167,26 +2167,13 @@ namespace QuickMedia { return result_items; } - bool YoutubeVideoPage::create_search_page(Program *program, Tab &tab) { - std::string video_id; - youtube_url_extract_id(url, video_id); - - tab.body = create_body(false, false); - tab.page = std::make_unique(program, std::move(video_id)); - tab.search_bar = create_search_bar("Search...", 100); - return true; - } - - std::unique_ptr YoutubeVideoPage::create_comments_page(Program *program) { - return std::make_unique(program, url, comments_continuation_token); - } - - std::unique_ptr YoutubeVideoPage::create_related_videos_page(Program *program) { - return std::make_unique(program); - } - - std::unique_ptr YoutubeVideoPage::create_channels_page(Program *program, const std::string &channel_url) { - return std::make_unique(program, channel_url, "", "Channel videos"); + PluginResult YoutubeVideoPage::get_related_pages(const BodyItems &related_videos, const std::string &channel_url, std::vector &result_tabs) { + auto related_page_body = create_body(false, true); + related_page_body->set_items(related_videos); + result_tabs.push_back(Tab{create_body(), std::make_unique(program, url, comments_continuation_token), nullptr}); + result_tabs.push_back(Tab{std::move(related_page_body), std::make_unique(program), create_search_bar("Search...", SEARCH_DELAY_FILTER)}); + result_tabs.push_back(Tab{create_body(false, true), std::make_unique(program, channel_url, "", "Channel videos"), create_search_bar("Search...", 350)}); + return PluginResult::OK; } static std::map http_params_parse(const std::string &http_params) { -- cgit v1.2.3