Mercurial > minori
comparison src/services/anilist.cc @ 319:d928ec7b6a0d
services/kitsu: implement GetAnimeList()
it finally works!
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Wed, 12 Jun 2024 17:52:26 -0400 |
parents | b1f4d1867ab1 |
children | 1b5c04268d6a |
comparison
equal
deleted
inserted
replaced
318:3b355fa948c7 | 319:d928ec7b6a0d |
---|---|
148 if (json.contains(ptr) && json[ptr].is_string()) | 148 if (json.contains(ptr) && json[ptr].is_string()) |
149 anime.SetTitle(language, json[ptr]); | 149 anime.SetTitle(language, json[ptr]); |
150 } | 150 } |
151 | 151 |
152 static int ParseMediaJson(const nlohmann::json& json) { | 152 static int ParseMediaJson(const nlohmann::json& json) { |
153 if (!json.contains("/id"_json_pointer) || !json["/id"_json_pointer].is_number()) | 153 if (!json.contains("/id"_json_pointer) || !json["/id"_json_pointer].is_number()) { |
154 return 0; | 154 session.SetStatusBar("AniList: Failed to parse anime object!"); |
155 return 0; | |
156 } | |
155 | 157 |
156 std::string service_id = Strings::ToUtf8String(json["/id"_json_pointer].get<int>()); | 158 std::string service_id = Strings::ToUtf8String(json["/id"_json_pointer].get<int>()); |
157 | 159 |
158 int id = Anime::db.LookupServiceIdOrUnused(Anime::Service::AniList, service_id); | 160 int id = Anime::db.LookupServiceIdOrUnused(Anime::Service::AniList, service_id); |
161 if (!id) { | |
162 session.SetStatusBar("AniList: Failed to parse anime object!"); | |
163 return 0; | |
164 } | |
159 | 165 |
160 Anime::Anime& anime = Anime::db.items[id]; | 166 Anime::Anime& anime = Anime::db.items[id]; |
161 anime.SetId(id); | 167 anime.SetId(id); |
162 anime.SetServiceId(Anime::Service::AniList, service_id); | 168 anime.SetServiceId(Anime::Service::AniList, service_id); |
163 | 169 |
189 | 195 |
190 return id; | 196 return id; |
191 } | 197 } |
192 | 198 |
193 static int ParseListItem(const nlohmann::json& json) { | 199 static int ParseListItem(const nlohmann::json& json) { |
194 int id = ParseMediaJson(json); | 200 int id = ParseMediaJson(json["/media"_json_pointer]); |
195 if (!id) | 201 if (!id) |
196 return 0; | 202 return 0; |
197 | 203 |
198 Anime::Anime& anime = Anime::db.items[id]; | 204 Anime::Anime& anime = Anime::db.items[id]; |
199 | 205 |
210 anime.SetUserTimeUpdated(JSON::GetNumber(json, "/updatedAt"_json_pointer, 0)); | 216 anime.SetUserTimeUpdated(JSON::GetNumber(json, "/updatedAt"_json_pointer, 0)); |
211 | 217 |
212 return id; | 218 return id; |
213 } | 219 } |
214 | 220 |
215 static int ParseList(const nlohmann::json& json) { | 221 static bool ParseList(const nlohmann::json& json) { |
222 bool success = true; | |
223 | |
216 for (const auto& entry : json["entries"].items()) | 224 for (const auto& entry : json["entries"].items()) |
217 ParseListItem(entry.value()); | 225 if (!ParseListItem(entry.value())) |
218 | 226 success = false; |
219 return 1; | 227 |
228 return success; | |
220 } | 229 } |
221 | 230 |
222 int GetAnimeList() { | 231 int GetAnimeList() { |
223 if (!account.IsValid()) { | 232 if (!account.IsValid()) { |
224 session.SetStatusBar("AniList: Account isn't valid! (unauthorized?)"); | 233 session.SetStatusBar("AniList: Account isn't valid! (unauthorized?)"); |
269 nlohmann::json result; | 278 nlohmann::json result; |
270 const bool res = SendJSONRequest(json, result); | 279 const bool res = SendJSONRequest(json, result); |
271 if (!res) | 280 if (!res) |
272 return 0; | 281 return 0; |
273 | 282 |
283 bool success = true; | |
284 | |
285 Anime::db.RemoveAllUserData(); | |
286 | |
274 for (const auto& list : result["data"]["MediaListCollection"]["lists"].items()) | 287 for (const auto& list : result["data"]["MediaListCollection"]["lists"].items()) |
275 ParseList(list.value()); | 288 if (!ParseList(list.value())) |
276 | 289 success = false; |
277 session.SetStatusBar("AniList: Retrieved anime list successfully!"); | 290 |
291 if (success) | |
292 session.SetStatusBar("AniList: Retrieved anime list successfully!"); | |
278 | 293 |
279 return 1; | 294 return 1; |
280 } | 295 } |
281 | 296 |
282 /* return is a vector of anime ids */ | 297 /* return is a vector of anime ids */ |
447 session.SetStatusBar("AniList: Requesting user ID..."); | 462 session.SetStatusBar("AniList: Requesting user ID..."); |
448 | 463 |
449 constexpr std::string_view query = "query {\n" | 464 constexpr std::string_view query = "query {\n" |
450 " Viewer {\n" | 465 " Viewer {\n" |
451 " id\n" | 466 " id\n" |
452 " name\n" | |
453 " mediaListOptions {\n" | |
454 " scoreFormat\n" // this will be used... eventually | |
455 " }\n" | |
456 " }\n" | 467 " }\n" |
457 "}\n"; | 468 "}\n"; |
458 nlohmann::json json = { | 469 nlohmann::json json = { |
459 {"query", query} | 470 {"query", query} |
460 }; | 471 }; |
463 nlohmann::json result; | 474 nlohmann::json result; |
464 const bool ret = SendJSONRequest(json, result); | 475 const bool ret = SendJSONRequest(json, result); |
465 if (!ret) | 476 if (!ret) |
466 return 0; | 477 return 0; |
467 | 478 |
468 session.SetStatusBar("AniList: Successfully retrieved user data!"); | 479 if (ParseUser(result["data"]["Viewer"])) |
469 | 480 session.SetStatusBar("AniList: Successfully retrieved user data!"); |
470 ParseUser(ret["data"]["Viewer"]); | 481 else |
482 session.SetStatusBar("AniList: Failed to retrieve user ID!"); | |
483 | |
471 return true; | 484 return true; |
472 } | 485 } |
473 | 486 |
474 } // namespace AniList | 487 } // namespace AniList |
475 } // namespace Services | 488 } // namespace Services |