From 75ca528807ae0eb77d3d11ab6075e256d0bfadd2 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Thu, 6 May 2021 13:31:21 +0200 Subject: Add saucenao --- src/plugins/Saucenao.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/plugins/Saucenao.cpp (limited to 'src/plugins/Saucenao.cpp') diff --git a/src/plugins/Saucenao.cpp b/src/plugins/Saucenao.cpp new file mode 100644 index 0000000..302f25e --- /dev/null +++ b/src/plugins/Saucenao.cpp @@ -0,0 +1,56 @@ +#include "../../plugins/Saucenao.hpp" +#include "../../include/StringUtils.hpp" +#include + +namespace QuickMedia { + PluginResult SaucenaoPage::lazy_fetch(BodyItems &result_items) { + std::string website_data; + DownloadResult download_result = download_to_string("https://saucenao.com/search.php", website_data, {{ "-F", "file=@" + upload_filepath }}, true); + if(download_result != DownloadResult::OK) return download_result_to_plugin_result(download_result); + + 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, "//td[class='resulttablecontent']", + [](QuickMediaHtmlNode *node, void *userdata) { + BodyItems *item_data = (BodyItems*)userdata; + const char *text = quickmedia_html_node_get_text(node); + if(text) { + std::string title = text; + size_t p_index = title.find("%"); + if(p_index != std::string::npos) + title = title.erase(0, p_index + 1); + auto item = BodyItem::create(strip(title)); + item_data->push_back(std::move(item)); + } + }, &result_items); + + BodyItemContext body_item_context; + body_item_context.body_items = &result_items; + body_item_context.index = 0; + + quickmedia_html_find_nodes_xpath(&html_search, "//td[class='resulttableimage']//img", + [](QuickMediaHtmlNode *node, void *userdata) { + BodyItemContext *item_data = (BodyItemContext*)userdata; + const char *src = quickmedia_html_node_get_attribute_value(node, "src"); + const char *data_src = quickmedia_html_node_get_attribute_value(node, "data-src"); + const char *image_url = data_src ? data_src : src; + if(image_url && item_data->index < item_data->body_items->size()) { + (*item_data->body_items)[item_data->index]->thumbnail_url = strip(image_url); + (*item_data->body_items)[item_data->index]->thumbnail_size = sf::Vector2i(150, 147); + item_data->index++; + } + }, &body_item_context); + + cleanup: + quickmedia_html_search_deinit(&html_search); + if(result != 0) { + result_items.clear(); + return PluginResult::ERR; + } + + return PluginResult::OK; + } +} \ No newline at end of file -- cgit v1.2.3