aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Saucenao.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-05-06 13:31:21 +0200
committerdec05eba <dec05eba@protonmail.com>2021-05-06 13:31:21 +0200
commit75ca528807ae0eb77d3d11ab6075e256d0bfadd2 (patch)
tree820a857aadf5fdaf1305c41233ae9a5a240ef990 /src/plugins/Saucenao.cpp
parente66d24f74d5458241d869fb3df42b4f2a2ea69f4 (diff)
Add saucenao
Diffstat (limited to 'src/plugins/Saucenao.cpp')
-rw-r--r--src/plugins/Saucenao.cpp56
1 files changed, 56 insertions, 0 deletions
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 <quickmedia/HtmlSearch.h>
+
+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