From 686adc5690c8507d25b080612f301c1aef594a19 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 16 Oct 2020 07:25:06 +0200 Subject: Mangadex: show search results in same order as website (not timestamp sorted) --- src/plugins/Mangadex.cpp | 71 ++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 41 deletions(-) (limited to 'src/plugins/Mangadex.cpp') 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 +#include #include #include 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> 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 &a, std::pair &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 ×tamp_json = chapter["timestamp"]; - if(timestamp_json.isInt64() && timestamp_json.asInt64() > time_now) + const rapidjson::Value ×tamp_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); -- cgit v1.2.3