From ba4e62d55156f9b94b569b56b6382bbcf94b7d86 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 16 Apr 2021 09:37:53 +0200 Subject: Convert mangatown and manganelos into a generic manga plugin Revert for_each_page.. processing of manga instead of getting all pages. Mangatown requires you to navigate page by page, cant predict what a specific pages image url will be. --- src/plugins/Mangatown.cpp | 217 ---------------------------------------------- 1 file changed, 217 deletions(-) delete mode 100644 src/plugins/Mangatown.cpp (limited to 'src/plugins/Mangatown.cpp') diff --git a/src/plugins/Mangatown.cpp b/src/plugins/Mangatown.cpp deleted file mode 100644 index 4db1ebc..0000000 --- a/src/plugins/Mangatown.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include "../../plugins/Mangatown.hpp" -#include "../../include/Notification.hpp" -#include "../../include/StringUtils.hpp" -#include "../../include/NetUtils.hpp" -#include - -static const std::string mangatown_url = "https://www.mangatown.com"; - -namespace QuickMedia { - static bool is_number_with_zero_fill(const char *str) { - while(*str == '0') { ++str; } - return atoi(str) != 0; - } - - static SearchResult search_page(const std::string &str, int page, BodyItems &result_items) { - std::string url = "https://www.mangatown.com/search?name="; - url += url_param_encode(str); - url += "&page=" + std::to_string(page); - - std::string website_data; - if(download_to_string(url, website_data, {}, true) != DownloadResult::OK) - return SearchResult::NET_ERR; - - if(website_data.empty()) - return SearchResult::OK; - - QuickMediaHtmlSearch html_search; - int result = quickmedia_html_search_init(&html_search, website_data.c_str()); - if(result != 0) - goto cleanup; - - result = quickmedia_html_find_nodes_xpath(&html_search, "//p[class='title']/a", - [](QuickMediaHtmlNode *node, void *userdata) { - auto *item_data = (BodyItems*)userdata; - const char *href = quickmedia_html_node_get_attribute_value(node, "href"); - const char *title = quickmedia_html_node_get_attribute_value(node, "title"); - if(href && title && strncmp(href, "/manga/", 7) == 0) { - auto item = BodyItem::create(strip(title)); - item->url = mangatown_url + strip(href); - item_data->push_back(std::move(item)); - } - }, &result_items); - - BodyItemContext body_item_image_context; - body_item_image_context.body_items = &result_items; - body_item_image_context.index = 0; - - result = quickmedia_html_find_nodes_xpath(&html_search, "//a[class='manga_cover']/img", - [](QuickMediaHtmlNode *node, void *userdata) { - auto *item_data = (BodyItemContext*)userdata; - const char *src = quickmedia_html_node_get_attribute_value(node, "src"); - if(src && item_data->index < item_data->body_items->size()) { - (*item_data->body_items)[item_data->index]->thumbnail_url = src; - item_data->index++; - } - }, &body_item_image_context); - - cleanup: - quickmedia_html_search_deinit(&html_search); - return SearchResult::OK; - } - - SearchResult MangatownSearchPage::search(const std::string &str, BodyItems &result_items) { - return search_page(str, 1, result_items); - } - - PluginResult MangatownSearchPage::get_page(const std::string &str, int page, BodyItems &result_items) { - return search_result_to_plugin_result(search_page(str, 1 + page, result_items)); - } - - PluginResult MangatownSearchPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { - BodyItems chapters_items; - - std::string website_data; - if(download_to_string(url, website_data, {}, true) != DownloadResult::OK) - return PluginResult::NET_ERR; - - QuickMediaHtmlSearch html_search; - int result = quickmedia_html_search_init(&html_search, website_data.c_str()); - if(result != 0) - goto cleanup; - - result = quickmedia_html_find_nodes_xpath(&html_search, "//ul[class='chapter_list']//a", - [](QuickMediaHtmlNode *node, void *userdata) { - auto *item_data = (BodyItems*)userdata; - const char *href = quickmedia_html_node_get_attribute_value(node, "href"); - const char *text = quickmedia_html_node_get_text(node); - if(href && text && strncmp(href, "/manga/", 7) == 0) { - auto item = BodyItem::create(strip(text)); - item->url = mangatown_url + strip(href); - item_data->push_back(std::move(item)); - } - }, &chapters_items); - - BodyItemContext body_item_context; - body_item_context.body_items = &chapters_items; - body_item_context.index = 0; - - quickmedia_html_find_nodes_xpath(&html_search, "//ul[class='chapter_list']//span[class='time']", - [](QuickMediaHtmlNode *node, void *userdata) { - auto *item_data = (BodyItemContext*)userdata; - const char *text = quickmedia_html_node_get_text(node); - if(text && item_data->index < item_data->body_items->size()) { - std::string uploaded_date = strip(text); - (*item_data->body_items)[item_data->index]->set_description("Uploaded: " + uploaded_date); - item_data->index++; - } - }, &body_item_context); - - cleanup: - quickmedia_html_search_deinit(&html_search); - if(result != 0) - return PluginResult::ERR; - - auto body = create_body(); - body->items = std::move(chapters_items); - result_tabs.push_back(Tab{std::move(body), std::make_unique(program, title, url), create_search_bar("Search...", SEARCH_DELAY_FILTER)}); - return PluginResult::OK; - } - - PluginResult MangatownChaptersPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { - result_tabs.push_back(Tab{nullptr, std::make_unique(program, content_title, title, url), nullptr}); - return PluginResult::OK; - } - - bool MangatownChaptersPage::extract_id_from_url(const std::string &url, std::string &manga_id) const { - size_t start_index = url.find("/manga/"); - if(start_index == std::string::npos) - return false; - - start_index += 7; - size_t end_index = url.find("/", start_index); - if(end_index == std::string::npos) { - manga_id = url.substr(start_index); - return true; - } - - manga_id = url.substr(start_index, end_index - start_index); - return true; - } - - // First page = 0 - static std::string first_image_url_to_page_image_url(const std::string &image_url, int page) { - size_t slash_index = image_url.rfind('/'); - if(slash_index == std::string::npos) - return ""; - - size_t dot_index = image_url.rfind('.'); - if(dot_index == std::string::npos || dot_index <= slash_index) - return ""; - - std::string filename_without_ext = image_url.substr(slash_index + 1, dot_index - (slash_index + 1)); - if(!filename_without_ext.empty() && filename_without_ext.back() == '1') - ++page; - - std::string page_str = std::to_string(page); - if(page_str.size() > filename_without_ext.size()) - return ""; - - filename_without_ext.replace(filename_without_ext.size() - page_str.size(), page_str.size(), page_str); - return image_url.substr(0, slash_index) + '/' + filename_without_ext + image_url.substr(dot_index); - } - - ImageResult MangatownImagesPage::get_page_image_urls(std::vector &urls) { - std::string image_src; - int num_pages = 0; - - std::string website_data; - if(download_to_string(url, website_data, {}, true) != DownloadResult::OK) - return ImageResult::NET_ERR; - - QuickMediaHtmlSearch html_search; - int result = quickmedia_html_search_init(&html_search, website_data.c_str()); - if(result != 0) - goto cleanup; - - result = quickmedia_html_find_nodes_xpath(&html_search, "//div[id='viewer']//img", - [](QuickMediaHtmlNode *node, void *userdata) { - std::string *image_src = (std::string*)userdata; - const char *src = quickmedia_html_node_get_attribute_value(node, "src"); - if(src && strstr(src, "/store/manga/")) { - if(strncmp(src, "//", 2) == 0) - *image_src = strip(src + 2); - else - *image_src = strip(src); - } - }, &image_src); - - if(result != 0 || image_src.empty()) - goto cleanup; - - result = quickmedia_html_find_nodes_xpath(&html_search, "//div[class='page_select']//option", - [](QuickMediaHtmlNode *node, void *userdata) { - int *last_num_pages = (int*)userdata; - const char *value = quickmedia_html_node_get_attribute_value(node, "value"); - const char *text = quickmedia_html_node_get_text(node); - if(value && strncmp(value, "/manga/", 7) == 0) { - if(is_number_with_zero_fill(text)) { - (*last_num_pages)++; - } - } - }, &num_pages); - - num_pages /= 2; - - cleanup: - quickmedia_html_search_deinit(&html_search); - if(result != 0 || image_src.empty() || num_pages == 0) - return ImageResult::ERR; - - for(int i = 0; i < num_pages; ++i) { - urls.push_back(first_image_url_to_page_image_url(image_src, i)); - } - - return ImageResult::OK; - } -} \ No newline at end of file -- cgit v1.2.3