From 261b0263f34ffcbe439d68b2e901fd3abbfc1eaf Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 23 Oct 2020 07:26:39 +0200 Subject: Re-add creators page --- src/plugins/Manganelo.cpp | 159 +++++++++++++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 58 deletions(-) (limited to 'src/plugins/Manganelo.cpp') diff --git a/src/plugins/Manganelo.cpp b/src/plugins/Manganelo.cpp index b260dea..7f0a2f9 100644 --- a/src/plugins/Manganelo.cpp +++ b/src/plugins/Manganelo.cpp @@ -25,49 +25,12 @@ namespace QuickMedia { return true; } - SearchResult ManganeloSearchPage::search(const std::string &str, BodyItems &result_items) { - std::string url = "https://manganelo.com/getstorysearchjson"; - std::string search_term = "searchword="; - search_term += url_param_encode(str); - CommandArg data_arg = { "--data", std::move(search_term) }; - - Json::Value json_root; - DownloadResult result = download_json(json_root, url, {data_arg}, true); - if(result != DownloadResult::OK) return download_result_to_search_result(result); - - if(json_root.isNull()) - return SearchResult::OK; - - if(!json_root.isArray()) - return SearchResult::ERR; - - for(const Json::Value &child : json_root) { - if(!child.isObject()) - continue; - - Json::Value name = child.get("name", ""); - Json::Value nameunsigned = child.get("nameunsigned", ""); - if(name.isString() && name.asCString()[0] != '\0' && nameunsigned.isString() && nameunsigned.asCString()[0] != '\0') { - std::string name_str = name.asString(); - while(remove_html_span(name_str)) {} - auto item = BodyItem::create(strip(name_str)); - item->url = "https://manganelo.com/manga/" + url_param_encode(nameunsigned.asString()); - Json::Value image = child.get("image", ""); - if(image.isString() && image.asCString()[0] != '\0') - item->thumbnail_url = image.asString(); - result_items.push_back(std::move(item)); - } - } - - return SearchResult::OK; - } - - PluginResult ManganeloSearchPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { + static PluginResult submit_manga(Page *page, const std::string &title, const std::string &url, std::vector &result_tabs, bool use_tor) { BodyItems chapters_items; std::vector creators; std::string website_data; - if(download_to_string(url, website_data, {}, is_tor_enabled(), true) != DownloadResult::OK) + if(download_to_string(url, website_data, {}, use_tor, true) != DownloadResult::OK) return PluginResult::NET_ERR; QuickMediaHtmlSearch html_search; @@ -105,23 +68,64 @@ namespace QuickMedia { if(result != 0) return PluginResult::ERR; - auto chapters_body = create_body(); + auto chapters_body = page->create_body(); chapters_body->items = std::move(chapters_items); - result_tabs.push_back(Tab{std::move(chapters_body), std::make_unique(program, title, url), create_search_bar("Search...", SEARCH_DELAY_FILTER)}); + result_tabs.push_back(Tab{std::move(chapters_body), std::make_unique(page->program, title, url), page->create_search_bar("Search...", SEARCH_DELAY_FILTER)}); for(Creator &creator : creators) { - result_tabs.push_back(Tab{create_body(), std::make_unique(program, std::move(creator)), create_search_bar("Search...", SEARCH_DELAY_FILTER)}); + result_tabs.push_back(Tab{page->create_body(), std::make_unique(page->program, std::move(creator)), page->create_search_bar("Search...", SEARCH_DELAY_FILTER)}); } - std::string manga_id; - if(extract_id_from_url(url, manga_id)) { - if(load_manga_content_storage("manganelo", title, manga_id)) - return PluginResult::OK; + return PluginResult::OK; + } + + SearchResult ManganeloSearchPage::search(const std::string &str, BodyItems &result_items) { + std::string url = "https://manganelo.com/getstorysearchjson"; + std::string search_term = "searchword="; + search_term += url_param_encode(str); + CommandArg data_arg = { "--data", std::move(search_term) }; + + Json::Value json_root; + DownloadResult result = download_json(json_root, url, {data_arg}, true); + if(result != DownloadResult::OK) return download_result_to_search_result(result); + + if(json_root.isNull()) + return SearchResult::OK; + + if(!json_root.isArray()) + return SearchResult::ERR; + + for(const Json::Value &child : json_root) { + if(!child.isObject()) + continue; + + Json::Value name = child.get("name", ""); + Json::Value nameunsigned = child.get("nameunsigned", ""); + if(name.isString() && name.asCString()[0] != '\0' && nameunsigned.isString() && nameunsigned.asCString()[0] != '\0') { + std::string name_str = name.asString(); + while(remove_html_span(name_str)) {} + auto item = BodyItem::create(strip(name_str)); + item->url = "https://manganelo.com/manga/" + url_param_encode(nameunsigned.asString()); + Json::Value image = child.get("image", ""); + if(image.isString() && image.asCString()[0] != '\0') + item->thumbnail_url = image.asString(); + result_items.push_back(std::move(item)); + } } - return PluginResult::ERR; + + return SearchResult::OK; + } + + PluginResult ManganeloSearchPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { + return submit_manga(this, title, url, result_tabs, is_tor_enabled()); + } + + PluginResult ManganeloChaptersPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { + result_tabs.push_back(Tab{create_body(), std::make_unique(program, content_title, title, url), nullptr}); + return PluginResult::OK; } - - bool ManganeloSearchPage::extract_id_from_url(const std::string &url, std::string &manga_id) const { + + bool ManganeloChaptersPage::extract_id_from_url(const std::string &url, std::string &manga_id) const { bool manganelo_website = false; if(url.find("mangakakalot") != std::string::npos || url.find("manganelo") != std::string::npos) manganelo_website = true; @@ -154,17 +158,56 @@ namespace QuickMedia { } } - PluginResult ManganeloChaptersPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { - result_tabs.push_back(Tab{create_body(), std::make_unique(program, content_title, title, url), nullptr}); - return PluginResult::OK; + PluginResult ManganeloCreatorPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { + return submit_manga(this, title, url, result_tabs, is_tor_enabled()); } - PluginResult ManganeloCreatorPage::submit(const std::string &title, const std::string &url, std::vector &result_tabs) { - (void)title; - (void)url; - (void)result_tabs; - // TODO: Implement - return PluginResult::ERR; + PluginResult ManganeloCreatorPage::lazy_fetch(BodyItems &result_items) { + std::string website_data; + if(download_to_string(creator.url, website_data, {}, is_tor_enabled(), 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, "//div[class='search-story-item']//a[class='item-img']", + [](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 && strstr(href, "/manga/")) { + auto body_item = BodyItem::create(title); + body_item->url = href; + item_data->push_back(std::move(body_item)); + } + }, &result_items); + + if(result != 0) + goto cleanup; + + BodyItemImageContext 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, "//div[class='search-story-item']//a[class='item-img']//img", + [](QuickMediaHtmlNode *node, void *userdata) { + auto *item_data = (BodyItemImageContext*)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); + if(result != 0) { + result_items.clear(); + return PluginResult::ERR; + } + return PluginResult::OK; } ImageResult ManganeloImagesPage::get_number_of_images(int &num_images) { -- cgit v1.2.3