From df95eccc5e8ef62ad9c83a925adc83926491dfb3 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 17 Aug 2021 14:55:10 +0200 Subject: AniList: separate anime and manga searches to different tabs --- plugins/AniList.hpp | 11 +++++++++-- src/QuickMedia.cpp | 3 ++- src/plugins/AniList.cpp | 33 ++++++--------------------------- 3 files changed, 17 insertions(+), 30 deletions(-) diff --git a/plugins/AniList.hpp b/plugins/AniList.hpp index c877b8e..5fc5eef 100644 --- a/plugins/AniList.hpp +++ b/plugins/AniList.hpp @@ -3,10 +3,15 @@ #include "Page.hpp" namespace QuickMedia { + enum class AniListMediaType { + ANIME, + MANGA + }; + class AniListSearchPage : public Page { public: - AniListSearchPage(Program *program) : Page(program) {} - const char* get_title() const override { return "Search for anime or manga"; } + AniListSearchPage(Program *program, AniListMediaType media_type) : Page(program), media_type(media_type) {} + const char* get_title() const override { return media_type == AniListMediaType::ANIME ? "Search for anime" : "Search for manga"; } bool search_is_filter() override { return false; } bool submit_is_async() const override { return false; } SearchResult search(const std::string &str, BodyItems &result_items) override; @@ -14,6 +19,8 @@ namespace QuickMedia { PluginResult get_page(const std::string &str, int page, BodyItems &result_items) override; private: SearchResult search_page(const std::string &str, int page, BodyItems &result_items); + private: + AniListMediaType media_type; }; class AniListRelatedPage : public LazyFetchPage { diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 79f6d51..6be7dab 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -1214,7 +1214,8 @@ namespace QuickMedia { body->set_items(std::move(body_items)); tabs.push_back(Tab{std::move(body), std::make_unique(this), create_search_bar("Search...", SEARCH_DELAY_FILTER)}); } else if(strcmp(plugin_name, "anilist") == 0) { - tabs.push_back(Tab{create_body(), std::make_unique(this), create_search_bar("Search...", 300)}); + tabs.push_back(Tab{create_body(), std::make_unique(this, AniListMediaType::ANIME), create_search_bar("Search...", 300)}); + tabs.push_back(Tab{create_body(), std::make_unique(this, AniListMediaType::MANGA), create_search_bar("Search...", 300)}); } else if(strcmp(plugin_name, "file-manager") == 0) { auto file_manager_page = std::make_unique(this, fm_mime_type, file_selection_handler); if(!file_manager_page->set_current_directory(file_manager_start_dir)) diff --git a/src/plugins/AniList.cpp b/src/plugins/AniList.cpp index fe9a62f..1523129 100644 --- a/src/plugins/AniList.cpp +++ b/src/plugins/AniList.cpp @@ -10,7 +10,7 @@ namespace QuickMedia { static const std::string search_query_graphql = R"END( query ($page: Int, $perPage: Int, $search: String) { Page (page: $page, perPage: $perPage) { - media (search: $search) { + media (search: $search, type: %TYPE%) { id type format @@ -152,11 +152,6 @@ query ($id: Int, $page: Int, $perPage: Int) { } )END"; - enum class AniListMediaType { - ANIME, - MANGA - }; - static const char *month_names[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; static bool in_range(int value, int min, int max) { return value >= min && value <= max; @@ -438,8 +433,11 @@ query ($id: Int, $page: Int, $perPage: Int) { variables_json["perPage"] = 20; variables_json["search"] = str; + std::string query = search_query_graphql; + string_replace_all(query, "%TYPE%", media_type == AniListMediaType::ANIME ? "ANIME" : "MANGA"); + Json::Value request_json(Json::objectValue); - request_json["query"] = search_query_graphql; + request_json["query"] = std::move(query); request_json["variables"] = std::move(variables_json); Json::StreamWriterBuilder json_builder; @@ -484,32 +482,13 @@ query ($id: Int, $page: Int, $perPage: Int) { if(!media_list_json.isArray()) return SearchResult::ERR; - BodyItems anime_items; - BodyItems manga_items; for(const Json::Value &media_json : media_list_json) { AniListMediaType media_type; auto body_item = media_json_to_body_item(media_json, ThumbnailSize::MEDIUM, media_type); if(!body_item) continue; - if(media_type == AniListMediaType::ANIME) - anime_items.push_back(std::move(body_item)); - else if(media_type == AniListMediaType::MANGA) - manga_items.push_back(std::move(body_item)); - } - - if(!anime_items.empty()) { - auto anime_title_item = BodyItem::create(""); - anime_title_item->set_author("------------------------ Anime ------------------------"); - result_items.push_back(std::move(anime_title_item)); - result_items.insert(result_items.end(), std::move_iterator(anime_items.begin()), std::move_iterator(anime_items.end())); - } - - if(!manga_items.empty()) { - auto manga_title_item = BodyItem::create(""); - manga_title_item->set_author("------------------------ Manga ------------------------"); - result_items.push_back(std::move(manga_title_item)); - result_items.insert(result_items.end(), std::move_iterator(manga_items.begin()), std::move_iterator(manga_items.end())); + result_items.push_back(std::move(body_item)); } return SearchResult::OK; -- cgit v1.2.3