From 88d3dbbd12d17056323f40effe00ce8ab8180691 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 16 Apr 2021 20:09:02 +0200 Subject: Add mangakatana --- plugins/MangaGeneric.hpp | 51 +++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 22 deletions(-) (limited to 'plugins/MangaGeneric.hpp') diff --git a/plugins/MangaGeneric.hpp b/plugins/MangaGeneric.hpp index 7d63622..d58672a 100644 --- a/plugins/MangaGeneric.hpp +++ b/plugins/MangaGeneric.hpp @@ -5,8 +5,7 @@ namespace QuickMedia { struct SearchQuery { - const char *search_prefix = nullptr; - const char *page_prefix = nullptr; + const char *search_template = nullptr; int page_start = 0; }; @@ -42,13 +41,9 @@ namespace QuickMedia { ListPageImagesQueryPost post_handler = nullptr; }; - // Return the actual number of pages - using ListPagePaginationPagesPost = std::function; struct ListPagePaginationQuery { const char *pages_html_query = nullptr; const char *pages_field_name = nullptr; - const char *pages_field_contains = nullptr; - ListPagePaginationPagesPost pages_post_handler = nullptr; const char *image_html_query = nullptr; const char *image_field_name = nullptr; @@ -59,15 +54,23 @@ namespace QuickMedia { const char *next_page_field_contains = nullptr; }; + // Return the image sources + using ListPageCustomHandler = std::function(const std::string &html_source)>; + struct ListPageCustomQuery { + ListPageCustomHandler handler; + }; + enum class ListPageQueryType { IMAGES, - PAGINATION + PAGINATION, + CUSTOM }; struct ListPageQuery { ListPageQueryType type = ListPageQueryType::IMAGES; ListPageImagesQuery images_query; ListPagePaginationQuery pagination_query; + ListPageCustomQuery custom_query; }; struct MangaIdExtractor { @@ -77,7 +80,7 @@ namespace QuickMedia { class MangaGenericSearchPage : public Page { public: - MangaGenericSearchPage(Program *program, const char *service_name, const char *website_url); + MangaGenericSearchPage(Program *program, const char *service_name, const char *website_url, bool fail_on_http_error = true); const char* get_title() const override { return "All"; } bool search_is_filter() override { return false; } SearchResult search(const std::string &str, BodyItems &result_items) override; @@ -85,12 +88,10 @@ namespace QuickMedia { PluginResult submit(const std::string &title, const std::string &url, std::vector &result_tabs) override; sf::Vector2i get_thumbnail_max_size() override { return sf::Vector2i(101, 141); }; - // Add a %s where the query or page number should be inserted into |search_prefix| and |page_prefix|, for example: - // search_prefix: example.com/search?q=%s - // page_prefix: &page=%s - // |page_start| is the first page, so the result page is |page_start| + |page| where page is the current page we are navigating on. + // Add a %s where the search query should be inserted into |search_template| and add a %p where the page number should be inserted, for example: + // example.com/search?q=%s&page=%p // This is required. - MangaGenericSearchPage& search_handler(const char *search_prefix, const char *page_prefix, int page_start); + MangaGenericSearchPage& search_handler(const char *search_template, int page_start); // If |url_contains| is null, then any matching query is added. If |title_field| is "text", then the inner text is used. // This is required. MangaGenericSearchPage& text_handler(const char *html_query, const char *title_field, const char *url_field, const char *url_contains); @@ -106,16 +107,20 @@ namespace QuickMedia { MangaGenericSearchPage& list_chapters_uploaded_time_handler(const char *html_query, const char *field_name, const char *field_contains); // If |field_contains| is null, then any matching query is added. If |field_name| is "text", then the inner text is used. - // This or |list_page_images_pagination_handler| is required. + // This or |list_page_images_pagination_handler| or |list_page_images_custom_handler| is required. MangaGenericSearchPage& list_page_images_handler(const char *html_query, const char *field_name, const char *field_contains, ListPageImagesQueryPost post_handler = nullptr); - // If |pages_field_contains| or |image_field_contains| is null, then any matching query is added. If |pages_field_name| or |image_field_name| is "text", then the inner text is used. - // This or |list_page_images_handler| is required. + // If |image_field_contains| is null, then any matching query is added. If |pages_field_name| or |image_field_name| is "text", then the inner text is used. + // The last matching pages html query item is chosen as the number of pages. + // This or |list_page_images_handler| or |list_page_images_custom_handler| is required. MangaGenericSearchPage& list_page_images_pagination_handler( - const char *pages_html_query, const char *pages_field_name, const char *pages_field_contains, ListPagePaginationPagesPost pages_post_handler, + const char *pages_html_query, const char *pages_field_name, const char *image_html_query, const char *image_field_name, const char *image_field_contains, const char *next_page_html_query, const char *next_page_field_name, const char *next_page_field_contains); + // This or |list_page_images_handler| or |list_page_images_pagination_handler| is required. + MangaGenericSearchPage& list_page_images_custom_handler(ListPageCustomHandler handler); + // For example: mangasite.com/manga/204353&f=23 // /manga/ here would be the |prefix| and & would be |end|. |end| is optional. // The goal is to extract 204353 from the manga chapter page url. @@ -123,6 +128,7 @@ namespace QuickMedia { private: const char *service_name; std::string website_url; + bool fail_on_http_error; SearchQuery search_query; TextQuery text_query; ThumbnailQuery thumbnail_query; @@ -133,8 +139,8 @@ namespace QuickMedia { class MangaGenericChaptersPage : public MangaChaptersPage { public: - MangaGenericChaptersPage(Program *program, std::string manga_name, std::string manga_url, const MangaIdExtractor &manga_id_extractor, const char *service_name, const std::string &website_url, const ListPageQuery *list_page_query) : - MangaChaptersPage(program, std::move(manga_name), std::move(manga_url)), manga_id_extractor(manga_id_extractor), service_name(service_name), website_url(website_url), list_page_query(list_page_query) {} + MangaGenericChaptersPage(Program *program, std::string manga_name, std::string manga_url, const MangaIdExtractor &manga_id_extractor, const char *service_name, const std::string &website_url, const ListPageQuery *list_page_query, bool fail_on_http_error) : + MangaChaptersPage(program, std::move(manga_name), std::move(manga_url)), manga_id_extractor(manga_id_extractor), service_name(service_name), website_url(website_url), list_page_query(list_page_query), fail_on_http_error(fail_on_http_error) {} PluginResult submit(const std::string &title, const std::string &url, std::vector &result_tabs) override; protected: bool extract_id_from_url(const std::string &url, std::string &manga_id) const override; @@ -144,12 +150,13 @@ namespace QuickMedia { const char *service_name; std::string website_url; const ListPageQuery *list_page_query; + bool fail_on_http_error; }; class MangaGenericImagesPage : public MangaImagesPage { public: - MangaGenericImagesPage(Program *program, std::string manga_name, std::string chapter_name, std::string url, const char *service_name, const std::string &website_url, const ListPageQuery *list_page_query) : - MangaImagesPage(program, std::move(manga_name), std::move(chapter_name), std::move(url)), service_name(service_name), website_url(website_url), list_page_query(list_page_query) {} + MangaGenericImagesPage(Program *program, std::string manga_name, std::string chapter_name, std::string url, const char *service_name, const std::string &website_url, const ListPageQuery *list_page_query, bool fail_on_http_error) : + MangaImagesPage(program, std::move(manga_name), std::move(chapter_name), std::move(url)), service_name(service_name), website_url(website_url), list_page_query(list_page_query), fail_on_http_error(fail_on_http_error) {} ImageResult get_number_of_images(int &num_images) override; ImageResult for_each_page_in_chapter(PageCallback callback) override; const char* get_service_name() const override { return service_name; } @@ -159,7 +166,7 @@ namespace QuickMedia { const char *service_name; std::string website_url; const ListPageQuery *list_page_query; - std::string prev_chapter_url; + bool fail_on_http_error; std::string current_image_url; std::string next_page_url; }; -- cgit v1.2.3