aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/Fourchan.cpp7
-rw-r--r--src/plugins/MangaGeneric.cpp66
2 files changed, 64 insertions, 9 deletions
diff --git a/src/plugins/Fourchan.cpp b/src/plugins/Fourchan.cpp
index 5e6a970..34cb8bf 100644
--- a/src/plugins/Fourchan.cpp
+++ b/src/plugins/Fourchan.cpp
@@ -540,12 +540,15 @@ namespace QuickMedia {
PostResult FourchanThreadPage::post_comment(const std::string &captcha_id, const std::string &comment, const std::string &filepath) {
std::string url = "https://sys.4chan.org/" + board_id + "/post";
+ std::string comment_fixed = comment;
+ if(comment_fixed[0] == '@')
+ comment_fixed = "\\" + comment_fixed;
std::vector<CommandArg> additional_args = {
CommandArg{"-H", "Referer: https://boards.4chan.org/"},
CommandArg{"-H", "Origin: https://boards.4chan.org"},
CommandArg{"-F", "resto=" + thread_id},
- CommandArg{"-F", "com=" + comment},
+ CommandArg{"-F", "com=" + comment_fixed},
CommandArg{"-F", "mode=regist"}
};
@@ -583,6 +586,8 @@ namespace QuickMedia {
return PostResult::TRY_AGAIN;
if(response.find("Audio streams are not allowed") != std::string::npos)
return PostResult::FILE_TYPE_NOT_ALLOWED;
+ if(response.find("Error: Upload failed") != std::string::npos)
+ return PostResult::UPLOAD_FAILED;
return PostResult::ERR;
}
diff --git a/src/plugins/MangaGeneric.cpp b/src/plugins/MangaGeneric.cpp
index 48533b8..a6df1c1 100644
--- a/src/plugins/MangaGeneric.cpp
+++ b/src/plugins/MangaGeneric.cpp
@@ -162,11 +162,32 @@ namespace QuickMedia {
return plugin_result_to_search_result(get_page(str, 0, result_items));
}
- PluginResult MangaGenericSearchPage::get_page(const std::string &url, BodyItems &result_items) {
+ PluginResult MangaGenericSearchPage::get_page(const std::string &url, bool is_post, const std::vector<MangaFormDataStr> &form_data, BodyItems &result_items) {
std::vector<CommandArg> args;
if(!website_url.empty())
args.push_back({ "-H", "referer: " + website_url });
+ if(is_post) {
+ args.push_back({ "-X", "POST" });
+ args.push_back({ "-H", "x-requested-with: XMLHttpRequest" });
+ for(const MangaFormDataStr &form : form_data) {
+ std::string form_value = form.value;
+ if(form_value[0] == '@')
+ form_value = "\\" + form_value;
+ args.push_back({ "-F", std::string(form.key) + "=" + form_value });
+ }
+
+ assert(search_query.json_handler);
+ std::string err_msg;
+ Json::Value json_root;
+ if(download_json(json_root, url, args, true, fail_on_http_error ? nullptr : &err_msg) != DownloadResult::OK)
+ return PluginResult::NET_ERR;
+
+ result_items = search_query.json_handler(json_root);
+ body_items_prepend_website_url(result_items, website_url);
+ return PluginResult::OK;
+ }
+
std::string target_url;
std::string website_data;
if(download_to_string(url, website_data, args, true, fail_on_http_error) != DownloadResult::OK)
@@ -266,10 +287,27 @@ namespace QuickMedia {
}
PluginResult MangaGenericSearchPage::get_page(const std::string &str, int page, BodyItems &result_items) {
- std::string url = search_query.search_template;
- string_replace_all(url, "%s", url_param_encode(str));
- string_replace_all(url, "%p", std::to_string(search_query.page_start + page));
- return get_page(url, result_items);
+ if(search_query.is_post) {
+ if(page != 0)
+ return PluginResult::OK;
+
+ std::vector<MangaFormDataStr> form_data(search_query.form_data.size());
+ for(size_t i = 0; i < form_data.size(); ++i) {
+ MangaFormDataStr &form = form_data[i];
+ form.key = search_query.form_data[i].key;
+ form.value = search_query.form_data[i].value;
+ string_replace_all(form.value, "%s", str);
+ }
+ return get_page(search_query.search_template, search_query.is_post, form_data, result_items);
+ } else {
+ std::string url = search_query.search_template;
+ string_replace_all(url, "%s", url_param_encode(str));
+ size_t num_replaced = string_replace_all(url, "%p", std::to_string(search_query.page_start + page));
+ if(num_replaced == 0 && page != 0)
+ return PluginResult::OK;
+ else
+ return get_page(url, false, {}, result_items);
+ }
}
PluginResult MangaGenericSearchPage::submit(const std::string &title, const std::string &url, std::vector<Tab> &result_tabs) {
@@ -396,7 +434,7 @@ namespace QuickMedia {
}
PluginResult MangaGenericCreatorPage::lazy_fetch(BodyItems &result_items) {
- return search_page->get_page(creator.url, result_items);
+ return search_page->get_page(creator.url, false, {}, result_items);
}
static bool is_number(const char *str) {
@@ -680,6 +718,18 @@ namespace QuickMedia {
MangaGenericSearchPage& MangaGenericSearchPage::search_handler(const char *search_template, int page_start) {
search_query.search_template = search_template;
search_query.page_start = page_start;
+ search_query.form_data.clear();
+ search_query.is_post = false;
+ search_query.json_handler = nullptr;
+ return *this;
+ }
+
+ MangaGenericSearchPage& MangaGenericSearchPage::search_post_handler(const char *url, std::vector<MangaFormData> form_data, SearchQueryJsonHandler result_handler) {
+ search_query.search_template = url;
+ search_query.page_start = 1;
+ search_query.form_data = std::move(form_data);
+ search_query.is_post = true;
+ search_query.json_handler = std::move(result_handler);
return *this;
}
@@ -723,7 +773,7 @@ namespace QuickMedia {
list_page_query.images_query.html_query = html_query;
list_page_query.images_query.field_name = field_name;
list_page_query.images_query.field_contains = field_contains;
- list_page_query.images_query.post_handler = post_handler;
+ list_page_query.images_query.post_handler = std::move(post_handler);
return *this;
}
@@ -749,7 +799,7 @@ namespace QuickMedia {
MangaGenericSearchPage& MangaGenericSearchPage::list_page_images_custom_handler(ListPageCustomHandler handler) {
assert(handler);
list_page_query.type = ListPageQueryType::CUSTOM;
- list_page_query.custom_query.handler = handler;
+ list_page_query.custom_query.handler = std::move(handler);
return *this;
}