From 611d22bf269672ba56f98e12eb6b2a40efdaa5b9 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 3 Jul 2021 16:23:36 +0200 Subject: Remove dependency on tidy, fix ph, support all 4chan markup Go back to previous page when failing to fetch number of pages --- src/plugins/NyaaSi.cpp | 73 +++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 33 deletions(-) (limited to 'src/plugins/NyaaSi.cpp') diff --git a/src/plugins/NyaaSi.cpp b/src/plugins/NyaaSi.cpp index 5d9e41b..d4667af 100644 --- a/src/plugins/NyaaSi.cpp +++ b/src/plugins/NyaaSi.cpp @@ -291,17 +291,18 @@ namespace QuickMedia { return PluginResult::NET_ERR; QuickMediaHtmlSearch html_search; - int result = quickmedia_html_search_init(&html_search, website_data.c_str()); + int result = quickmedia_html_search_init(&html_search, website_data.c_str(), website_data.size()); if(result != 0) goto cleanup; result = quickmedia_html_find_nodes_xpath(&html_search, "//h3[class='panel-title']", - [](QuickMediaHtmlNode *node, void *userdata) { + [](QuickMediaMatchNode *node, void *userdata) { std::string *title = (std::string*)userdata; - const char *text = quickmedia_html_node_get_text(node); - if(title->empty() && text) { - *title = text; + QuickMediaStringView text = quickmedia_html_node_get_text(node); + if(title->empty() && text.data) { + title->assign(text.data, text.size); } + return 0; }, &title); if(result != 0) @@ -314,16 +315,17 @@ namespace QuickMedia { } result = quickmedia_html_find_nodes_xpath(&html_search, "//div[class='panel-body']//div[class='row']//a", - [](QuickMediaHtmlNode *node, void *userdata) { + [](QuickMediaMatchNode *node, void *userdata) { ResultItemExtra *item_data = (ResultItemExtra*)userdata; - const char *href = quickmedia_html_node_get_attribute_value(node, "href"); - const char *text = quickmedia_html_node_get_text(node); - if(item_data->result_items->empty() && href && text && strncmp(href, "/user/", 6) == 0) { + QuickMediaStringView href = quickmedia_html_node_get_attribute_value(node, "href"); + QuickMediaStringView text = quickmedia_html_node_get_text(node); + if(item_data->result_items->empty() && href.data && text.data && href.size >= 6 && memcmp(href.data, "/user/", 6) == 0) { auto body_item = BodyItem::create(""); - body_item->set_description("Submitter: " + strip(text)); - body_item->url = "https://" + *item_data->domain + "/" + std::string(href); + body_item->set_description("Submitter: " + std::string(text.data, text.size)); + body_item->url = "https://" + *item_data->domain + "/" + std::string(href.data, href.size); item_data->result_items->push_back(std::move(body_item)); } + return 0; }, &result_item_extra); if(result != 0) @@ -335,17 +337,18 @@ namespace QuickMedia { result_items.push_back(std::move(body_item)); } - result_items.front()->set_title(strip(title)); + result_items.front()->set_title(title); result = quickmedia_html_find_nodes_xpath(&html_search, "//div[id='torrent-description']", - [](QuickMediaHtmlNode *node, void *userdata) { + [](QuickMediaMatchNode *node, void *userdata) { std::string *description = (std::string*)userdata; - const char *text = quickmedia_html_node_get_text(node); - if(description->empty() && text) { - std::string desc = strip(text); + QuickMediaStringView text = quickmedia_html_node_get_text(node); + if(description->empty() && text.data) { + std::string desc(text.data, text.size); html_unescape_sequences(desc); *description = std::move(desc); } + return 0; }, &description); if(result != 0) @@ -355,12 +358,13 @@ namespace QuickMedia { result_items.front()->set_description(result_items.front()->get_description() + "\nDescription:\n" + description); result = quickmedia_html_find_nodes_xpath(&html_search, "//div[class='container']//a", - [](QuickMediaHtmlNode *node, void *userdata) { + [](QuickMediaMatchNode *node, void *userdata) { std::string *magnet_url = (std::string*)userdata; - const char *href = quickmedia_html_node_get_attribute_value(node, "href"); - if(magnet_url->empty() && href && strncmp(href, "magnet:?", 8) == 0) { - *magnet_url = href; + QuickMediaStringView href = quickmedia_html_node_get_attribute_value(node, "href"); + if(magnet_url->empty() && href.data && href.size >= 8 && memcmp(href.data, "magnet:?", 8) == 0) { + magnet_url->assign(href.data, href.size); } + return 0; }, &magnet_url); if(result != 0) @@ -377,15 +381,16 @@ namespace QuickMedia { comments_start_index = result_items.size(); result = quickmedia_html_find_nodes_xpath(&html_search, "//div[id='comments']//a", - [](QuickMediaHtmlNode *node, void *userdata) { + [](QuickMediaMatchNode *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, "/user/", 6) == 0) { - auto body_item = BodyItem::create(strip(text)); + QuickMediaStringView href = quickmedia_html_node_get_attribute_value(node, "href"); + QuickMediaStringView text = quickmedia_html_node_get_text(node); + if(href.data && text.data && href.size >= 6 && memcmp(href.data, "/user/", 6) == 0) { + auto body_item = BodyItem::create(std::string(text.data, text.size)); //body_item->url = "https://nyaa.si/" + std::string(href); item_data->push_back(std::move(body_item)); } + return 0; }, &result_items); if(result != 0 || result_items.size() == comments_start_index) @@ -396,14 +401,15 @@ namespace QuickMedia { body_item_image_context.index = comments_start_index; result = quickmedia_html_find_nodes_xpath(&html_search, "//div[id='comments']//img[class='avatar']", - [](QuickMediaHtmlNode *node, void *userdata) { + [](QuickMediaMatchNode *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; + QuickMediaStringView src = quickmedia_html_node_get_attribute_value(node, "src"); + if(src.data && item_data->index < item_data->body_items->size()) { + (*item_data->body_items)[item_data->index]->thumbnail_url.assign(src.data, src.size); (*item_data->body_items)[item_data->index]->thumbnail_size = sf::Vector2i(120, 120); item_data->index++; } + return 0; }, &body_item_image_context); if(result != 0) @@ -412,15 +418,16 @@ namespace QuickMedia { body_item_image_context.index = comments_start_index; result = quickmedia_html_find_nodes_xpath(&html_search, "//div[id='comments']//div[class='comment-content']", - [](QuickMediaHtmlNode *node, void *userdata) { + [](QuickMediaMatchNode *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 desc = strip(text); + QuickMediaStringView text = quickmedia_html_node_get_text(node); + if(text.data && item_data->index < item_data->body_items->size()) { + std::string desc(text.data, text.size); html_unescape_sequences(desc); (*item_data->body_items)[item_data->index]->set_description(std::move(desc)); item_data->index++; } + return 0; }, &body_item_image_context); cleanup: -- cgit v1.2.3