aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Mangadex.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-10-16 07:25:06 +0200
committerdec05eba <dec05eba@protonmail.com>2020-10-16 07:25:06 +0200
commit686adc5690c8507d25b080612f301c1aef594a19 (patch)
tree98a7004d358a1a7f6b3a660d6079ff0d4773f9ae /src/plugins/Mangadex.cpp
parent221522cf995cbcd39c956f66423a26bbccae8f72 (diff)
Mangadex: show search results in same order as website (not timestamp sorted)
Diffstat (limited to 'src/plugins/Mangadex.cpp')
-rw-r--r--src/plugins/Mangadex.cpp71
1 files changed, 30 insertions, 41 deletions
diff --git a/src/plugins/Mangadex.cpp b/src/plugins/Mangadex.cpp
index be2d342..f0e163e 100644
--- a/src/plugins/Mangadex.cpp
+++ b/src/plugins/Mangadex.cpp
@@ -2,11 +2,21 @@
#include "../../include/Storage.hpp"
#include "../../include/Notification.hpp"
#include "../../include/StringUtils.hpp"
+#include <rapidjson/document.h>
+#include <rapidjson/reader.h>
#include <quickmedia/HtmlSearch.h>
#include <json/reader.h>
static const std::string mangadex_url = "https://mangadex.org";
+static rapidjson::Value nullValue(rapidjson::kNullType);
+static const rapidjson::Value& GetMember(const rapidjson::Value &obj, const char *key) {
+ auto it = obj.FindMember(key);
+ if(it != obj.MemberEnd())
+ return it->value;
+ return nullValue;
+}
+
namespace QuickMedia {
static std::string title_url_extract_manga_id(const std::string &url) {
size_t find_index = url.find("/title/");
@@ -104,74 +114,53 @@ namespace QuickMedia {
std::string manga_id = title_url_extract_manga_id(url);
std::string request_url = "https://mangadex.org/api/?id=" + manga_id + "&type=manga";
- Json::Value json_root;
- DownloadResult result = download_json(json_root, request_url, {}, true);
+ rapidjson::Document json_root;
+ DownloadResult result = download_to_json(request_url, json_root, {}, is_tor_enabled(), true);
if(result != DownloadResult::OK) return download_result_to_plugin_result(result);
- if(!json_root.isObject())
+ if(!json_root.IsObject())
return PluginResult::ERR;
- Json::Value &status_json = json_root["status"];
- if(!status_json.isString() || status_json.asString() != "OK")
+ const rapidjson::Value &status_json = GetMember(json_root, "status");
+ if(!status_json.IsString() || strcmp(status_json.GetString(), "OK") != 0)
return PluginResult::ERR;
- Json::Value &chapter_json = json_root["chapter"];
- if(!chapter_json.isObject())
+ const rapidjson::Value &chapter_json = GetMember(json_root, "chapter");
+ if(!chapter_json.IsObject())
return PluginResult::ERR;
- std::vector<std::pair<std::string, Json::Value>> chapters(chapter_json.size());
- /* TODO: Optimize member access */
- for(auto &member_name : chapter_json.getMemberNames()) {
- Json::Value chapter = chapter_json[member_name];
- if(chapter.isObject())
- chapters.push_back(std::make_pair(member_name, std::move(chapter)));
- }
-
- std::sort(chapters.begin(), chapters.end(), [](std::pair<std::string, Json::Value> &a, std::pair<std::string, Json::Value> &b) {
- Json::Value &a_timestamp_json = a.second["timestamp"];
- Json::Value &b_timestamp_json = b.second["timestamp"];
- int64_t a_timestamp = 0;
- int64_t b_timestamp = 0;
- if(a_timestamp_json.isInt64())
- a_timestamp = a_timestamp_json.asInt64();
- if(b_timestamp_json.isInt64())
- b_timestamp = b_timestamp_json.asInt64();
- return a_timestamp > b_timestamp;
- });
-
time_t time_now = time(NULL);
-
auto body = create_body();
/* TODO: Pointer */
std::string prev_chapter_number;
- for(auto it = chapters.begin(); it != chapters.end(); ++it) {
- const std::string &chapter_id = it->first;
- Json::Value &chapter = it->second;
+ for(auto const &it : chapter_json.GetObject()) {
+ const std::string &chapter_id = it.name.GetString();
+ const rapidjson::Value &chapter = it.value;
- Json::Value &timestamp_json = chapter["timestamp"];
- if(timestamp_json.isInt64() && timestamp_json.asInt64() > time_now)
+ const rapidjson::Value &timestamp_json = chapter["timestamp"];
+ if(timestamp_json.IsNumber() && timestamp_json.GetInt64() > time_now)
continue;
- Json::Value &lang_code = chapter["lang_code"];
+ const rapidjson::Value &lang_code = chapter["lang_code"];
// TODO: Allow selecting other languages than english
- if(!lang_code.isString() || lang_code.asString() != "gb")
+ if(!lang_code.IsString() || strcmp(lang_code.GetString(), "gb") != 0)
continue;
- Json::Value &chapter_number_json = chapter["chapter"];
- if(!chapter_number_json.isString())
+ const rapidjson::Value &chapter_number_json = chapter["chapter"];
+ if(!chapter_number_json.IsString())
continue;
- std::string chapter_number_str = chapter_number_json.asString();
+ std::string chapter_number_str = chapter_number_json.GetString();
if(chapter_number_str == prev_chapter_number)
continue;
prev_chapter_number = chapter_number_str;
- Json::Value &chapter_title_json = chapter["title"];
+ const rapidjson::Value &chapter_title_json = chapter["title"];
std::string chapter_url = mangadex_url + "/chapter/" + chapter_id;
std::string chapter_name = std::string("Ch. ") + chapter_number_str;
- if(chapter_title_json.isString() && strlen(chapter_title_json.asCString()) > 0)
- chapter_name += std::string(" - ") + chapter_title_json.asCString();
+ if(chapter_title_json.IsString() && chapter_title_json.GetStringLength() > 0)
+ chapter_name += std::string(" - ") + chapter_title_json.GetString();
auto item = BodyItem::create(std::move(chapter_name));
item->url = std::move(chapter_url);