aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Manganelo.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-10-23 07:26:39 +0200
committerdec05eba <dec05eba@protonmail.com>2020-10-23 07:26:39 +0200
commit261b0263f34ffcbe439d68b2e901fd3abbfc1eaf (patch)
tree735d49f2050b52a414766675e4226f3fa8ef0d08 /src/plugins/Manganelo.cpp
parent05ce6bac22d498fb2827df72f4c2b86d02826042 (diff)
Re-add creators page
Diffstat (limited to 'src/plugins/Manganelo.cpp')
-rw-r--r--src/plugins/Manganelo.cpp159
1 files changed, 101 insertions, 58 deletions
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<Tab> &result_tabs) {
+ static PluginResult submit_manga(Page *page, const std::string &title, const std::string &url, std::vector<Tab> &result_tabs, bool use_tor) {
BodyItems chapters_items;
std::vector<Creator> 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<ManganeloChaptersPage>(program, title, url), create_search_bar("Search...", SEARCH_DELAY_FILTER)});
+ result_tabs.push_back(Tab{std::move(chapters_body), std::make_unique<ManganeloChaptersPage>(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<ManganeloCreatorPage>(program, std::move(creator)), create_search_bar("Search...", SEARCH_DELAY_FILTER)});
+ result_tabs.push_back(Tab{page->create_body(), std::make_unique<ManganeloCreatorPage>(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<Tab> &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<Tab> &result_tabs) {
+ result_tabs.push_back(Tab{create_body(), std::make_unique<ManganeloImagesPage>(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<Tab> &result_tabs) {
- result_tabs.push_back(Tab{create_body(), std::make_unique<ManganeloImagesPage>(program, content_title, title, url), nullptr});
- return PluginResult::OK;
+ PluginResult ManganeloCreatorPage::submit(const std::string &title, const std::string &url, std::vector<Tab> &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<Tab> &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) {