comparison src/services/anilist.cc @ 334:948955c3ba81

services: use fmt for setting the status bar this should make localization easier
author Paper <paper@paper.us.eu.org>
date Mon, 17 Jun 2024 20:35:31 -0400
parents b5d6c27c308f
children f81bed4e04ac
comparison
equal deleted inserted replaced
333:5980a960f3e1 334:948955c3ba81
18 #include <QUrl> 18 #include <QUrl>
19 19
20 #include <chrono> 20 #include <chrono>
21 #include <exception> 21 #include <exception>
22 #include <string_view> 22 #include <string_view>
23
24 #include <fmt/core.h>
23 25
24 #include <iostream> 26 #include <iostream>
25 27
26 namespace Services { 28 namespace Services {
27 namespace AniList { 29 namespace AniList {
73 return (auth.user_id && !auth.auth_token.empty()); 75 return (auth.user_id && !auth.auth_token.empty());
74 } 76 }
75 77
76 static std::optional<nlohmann::json> SendJSONRequest(const nlohmann::json& data) { 78 static std::optional<nlohmann::json> SendJSONRequest(const nlohmann::json& data) {
77 if (!AccountIsValid()) { 79 if (!AccountIsValid()) {
78 session.SetStatusBar("AniList: Account isn't valid! (unauthorized?)"); 80 session.SetStatusBar(Strings::Translate("AniList: Account isn't valid! (unauthorized?)"));
79 return std::nullopt; 81 return std::nullopt;
80 } 82 }
81 83
82 const auto& auth = session.config.auth.anilist; 84 const auto& auth = session.config.auth.anilist;
83 85
87 "Content-Type: application/json", 89 "Content-Type: application/json",
88 }; 90 };
89 91
90 const std::string response = Strings::ToUtf8String(HTTP::Request("https://graphql.anilist.co", headers, data.dump(), HTTP::Type::Post)); 92 const std::string response = Strings::ToUtf8String(HTTP::Request("https://graphql.anilist.co", headers, data.dump(), HTTP::Type::Post));
91 if (response.empty()) { 93 if (response.empty()) {
92 session.SetStatusBar("AniList: JSON request returned an empty result!"); 94 session.SetStatusBar(Strings::Translate("AniList: JSON request returned an empty result!"));
93 return std::nullopt; 95 return std::nullopt;
94 } 96 }
95 97
96 nlohmann::json out; 98 nlohmann::json out;
97 99
98 try { 100 try {
99 out = nlohmann::json::parse(response); 101 out = nlohmann::json::parse(response);
100 } catch (const std::exception& ex) { 102 } catch (const std::exception& ex) {
101 session.SetStatusBar("AniList: Failed to parse request JSON with error!"); 103 session.SetStatusBar(fmt::format(Strings::Translate("AniList: Failed to parse request JSON with error \"{}\"!"), ex.what()));
102 return std::nullopt; 104 return std::nullopt;
103 } 105 }
104 106
105 if (out.contains("/errors"_json_pointer) && out.at("/errors"_json_pointer).is_array()) { 107 if (out.contains("/errors"_json_pointer) && out.at("/errors"_json_pointer).is_array()) {
106 for (const auto& error : out.at("/errors"_json_pointer)) 108 for (const auto& error : out.at("/errors"_json_pointer))
107 std::cerr << "AniList: Received an error in response: " 109 std::cerr << "AniList: Received an error in response: "
108 << JSON::GetString<std::string>(error, "/message"_json_pointer, "") << std::endl; 110 << JSON::GetString<std::string>(error, "/message"_json_pointer, "") << std::endl;
109 111
110 session.SetStatusBar("AniList: Received an error in response!"); 112 session.SetStatusBar(Strings::Translate("AniList: Received an error in response!"));
111 return std::nullopt; 113 return std::nullopt;
112 } 114 }
113 115
114 return out; 116 return out;
115 } 117 }
163 anime.SetTitle(language, json[ptr]); 165 anime.SetTitle(language, json[ptr]);
164 } 166 }
165 167
166 static int ParseMediaJson(const nlohmann::json& json) { 168 static int ParseMediaJson(const nlohmann::json& json) {
167 if (!json.contains("/id"_json_pointer) || !json["/id"_json_pointer].is_number()) { 169 if (!json.contains("/id"_json_pointer) || !json["/id"_json_pointer].is_number()) {
168 session.SetStatusBar("AniList: Failed to parse anime object!"); 170 session.SetStatusBar(Strings::Translate("AniList: Failed to parse anime object!"));
169 return 0; 171 return 0;
170 } 172 }
171 173
172 std::string service_id = Strings::ToUtf8String(json["/id"_json_pointer].get<int>()); 174 std::string service_id = Strings::ToUtf8String(json["/id"_json_pointer].get<int>());
173 175
174 int id = Anime::db.LookupServiceIdOrUnused(Anime::Service::AniList, service_id); 176 int id = Anime::db.LookupServiceIdOrUnused(Anime::Service::AniList, service_id);
175 if (!id) { 177 if (!id) {
176 session.SetStatusBar("AniList: Failed to parse anime object!"); 178 session.SetStatusBar(Strings::Translate("AniList: Failed to parse anime object!"));
177 return 0; 179 return 0;
178 } 180 }
179 181
180 Anime::Anime& anime = Anime::db.items[id]; 182 Anime::Anime& anime = Anime::db.items[id];
181 anime.SetId(id); 183 anime.SetId(id);
297 {"id", auth.user_id} 299 {"id", auth.user_id}
298 }} 300 }}
299 }; 301 };
300 // clang-format on 302 // clang-format on
301 303
302 session.SetStatusBar("AniList: Parsing anime list..."); 304 session.SetStatusBar(Strings::Translate("AniList: Parsing anime list..."));
303 305
304 const std::optional<nlohmann::json> response = SendJSONRequest(request); 306 const std::optional<nlohmann::json> response = SendJSONRequest(request);
305 if (!response) 307 if (!response)
306 return 0; 308 return 0;
307 309
314 for (const auto& list : json["data"]["MediaListCollection"]["lists"].items()) 316 for (const auto& list : json["data"]["MediaListCollection"]["lists"].items())
315 if (!ParseList(list.value())) 317 if (!ParseList(list.value()))
316 success = false; 318 success = false;
317 319
318 if (success) 320 if (success)
319 session.SetStatusBar("AniList: Retrieved anime list successfully!"); 321 session.SetStatusBar(Strings::Translate("AniList: Retrieved anime list successfully!"));
320 322
321 return 1; 323 return 1;
322 } 324 }
323 325
324 /* return is a vector of anime ids */ 326 /* return is a vector of anime ids */
441 if (!res) 443 if (!res)
442 return 0; 444 return 0;
443 445
444 const nlohmann::json& result = res.value(); 446 const nlohmann::json& result = res.value();
445 447
446 session.SetStatusBar("AniList: Anime entry updated successfully!"); 448 session.SetStatusBar(Strings::Translate("AniList: Anime entry updated successfully!"));
447 449
448 return JSON::GetNumber(result, "/data/SaveMediaListEntry/id"_json_pointer, 0); 450 return JSON::GetNumber(result, "/data/SaveMediaListEntry/id"_json_pointer, 0);
449 } 451 }
450 452
451 static int ParseUser(const nlohmann::json& json) { 453 static int ParseUser(const nlohmann::json& json) {
469 if (!ok || token.isEmpty()) 471 if (!ok || token.isEmpty())
470 return false; 472 return false;
471 473
472 auth.auth_token = Strings::ToUtf8String(token); 474 auth.auth_token = Strings::ToUtf8String(token);
473 475
474 session.SetStatusBar("AniList: Requesting user ID..."); 476 session.SetStatusBar(Strings::Translate("AniList: Requesting user ID..."));
475 477
476 static constexpr std::string_view query = 478 static constexpr std::string_view query =
477 "query {\n" 479 "query {\n"
478 " Viewer {\n" 480 " Viewer {\n"
479 " id\n" 481 " id\n"
490 return 0; 492 return 0;
491 493
492 const nlohmann::json& result = ret.value(); 494 const nlohmann::json& result = ret.value();
493 495
494 if (ParseUser(result["data"]["Viewer"])) 496 if (ParseUser(result["data"]["Viewer"]))
495 session.SetStatusBar("AniList: Successfully retrieved user data!"); 497 session.SetStatusBar(Strings::Translate("AniList: Successfully retrieved user data!"));
496 else 498 else
497 session.SetStatusBar("AniList: Failed to retrieve user ID!"); 499 session.SetStatusBar(Strings::Translate("AniList: Failed to retrieve user ID!"));
498 500
499 return true; 501 return true;
500 } 502 }
501 503
502 } // namespace AniList 504 } // namespace AniList