Mercurial > minori
annotate src/services/anilist.cc @ 337:a7d4e5107531
dep/animone: REFACTOR ALL THE THINGS
1: animone now has its own syntax divergent from anisthesia,
making different platforms actually have their own sections
2: process names in animone are now called `comm' (this will
probably break things). this is what its called in bsd/linux
so I'm just going to use it everywhere
3: the X11 code now checks for the existence of a UTF-8 window title
and passes it if available
4: ANYTHING THATS NOT LINUX IS 100% UNTESTED AND CAN AND WILL BREAK!
I still actually need to test the bsd code. to be honest I'm probably
going to move all of the bsds into separate files because they're
all essentially different operating systems at this point
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Wed, 19 Jun 2024 12:51:15 -0400 |
parents | 948955c3ba81 |
children | f81bed4e04ac |
rev | line source |
---|---|
9 | 1 #include "services/anilist.h" |
2 #include "core/anime.h" | |
10 | 3 #include "core/anime_db.h" |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
4 #include "core/date.h" |
9 | 5 #include "core/config.h" |
76 | 6 #include "core/http.h" |
9 | 7 #include "core/json.h" |
8 #include "core/session.h" | |
9 #include "core/strings.h" | |
15 | 10 #include "gui/translate/anilist.h" |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
185
diff
changeset
|
11 |
258 | 12 #include <QByteArray> |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
185
diff
changeset
|
13 #include <QDate> |
9 | 14 #include <QDesktopServices> |
15 #include <QInputDialog> | |
16 #include <QLineEdit> | |
17 #include <QMessageBox> | |
10 | 18 #include <QUrl> |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
185
diff
changeset
|
19 |
9 | 20 #include <chrono> |
21 #include <exception> | |
291 | 22 #include <string_view> |
175 | 23 |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
24 #include <fmt/core.h> |
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
25 |
175 | 26 #include <iostream> |
27 | |
63 | 28 namespace Services { |
29 namespace AniList { | |
9 | 30 |
291 | 31 static constexpr std::string_view CLIENT_ID = "13706"; |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
32 |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
33 /* This is used in multiple queries, so just put it here I guess. */ |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
34 #define MEDIA_FIELDS \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
35 "coverImage {\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
36 " large\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
37 "}\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
38 "id\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
39 "title {\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
40 " romaji\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
41 " english\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
42 " native\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
43 "}\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
44 "format\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
45 "status\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
46 "averageScore\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
47 "season\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
48 "startDate {\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
49 " year\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
50 " month\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
51 " day\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
52 "}\n" \ |
324
5d3c9b31aa6e
anime: add completed date member
Paper <paper@paper.us.eu.org>
parents:
323
diff
changeset
|
53 "endDate {\n" \ |
5d3c9b31aa6e
anime: add completed date member
Paper <paper@paper.us.eu.org>
parents:
323
diff
changeset
|
54 " year\n" \ |
5d3c9b31aa6e
anime: add completed date member
Paper <paper@paper.us.eu.org>
parents:
323
diff
changeset
|
55 " month\n" \ |
5d3c9b31aa6e
anime: add completed date member
Paper <paper@paper.us.eu.org>
parents:
323
diff
changeset
|
56 " day\n" \ |
5d3c9b31aa6e
anime: add completed date member
Paper <paper@paper.us.eu.org>
parents:
323
diff
changeset
|
57 "}\n" \ |
321
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
58 "studios {\n" \ |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
59 " edges {\n" \ |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
60 " node {\n" \ |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
61 " name\n" \ |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
62 " }\n" \ |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
63 " }\n" \ |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
64 "}\n" \ |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
65 "genres\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
66 "episodes\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
67 "duration\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
68 "synonyms\n" \ |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
69 "description(asHtml: false)\n" |
185
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
184
diff
changeset
|
70 |
317
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
71 /* FIXME: why is this here */ |
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
72 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
73 static bool AccountIsValid() { |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
74 const auto& auth = session.config.auth.anilist; |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
75 return (auth.user_id && !auth.auth_token.empty()); |
9 | 76 } |
77 | |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
78 static std::optional<nlohmann::json> SendJSONRequest(const nlohmann::json& data) { |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
79 if (!AccountIsValid()) { |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
80 session.SetStatusBar(Strings::Translate("AniList: Account isn't valid! (unauthorized?)")); |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
81 return std::nullopt; |
175 | 82 } |
83 | |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
84 const auto& auth = session.config.auth.anilist; |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
85 |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
86 const std::vector<std::string> headers = { |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
87 "Authorization: Bearer " + auth.auth_token, |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
88 "Accept: application/json", |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
89 "Content-Type: application/json", |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
90 }; |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
91 |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
92 const std::string response = Strings::ToUtf8String(HTTP::Request("https://graphql.anilist.co", headers, data.dump(), HTTP::Type::Post)); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
93 if (response.empty()) { |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
94 session.SetStatusBar(Strings::Translate("AniList: JSON request returned an empty result!")); |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
95 return std::nullopt; |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
96 } |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
97 |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
98 nlohmann::json out; |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
99 |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
100 try { |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
101 out = nlohmann::json::parse(response); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
102 } catch (const std::exception& ex) { |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
103 session.SetStatusBar(fmt::format(Strings::Translate("AniList: Failed to parse request JSON with error \"{}\"!"), ex.what())); |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
104 return std::nullopt; |
175 | 105 } |
106 | |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
107 if (out.contains("/errors"_json_pointer) && out.at("/errors"_json_pointer).is_array()) { |
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
108 for (const auto& error : out.at("/errors"_json_pointer)) |
317
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
109 std::cerr << "AniList: Received an error in response: " |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
110 << JSON::GetString<std::string>(error, "/message"_json_pointer, "") << std::endl; |
175 | 111 |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
112 session.SetStatusBar(Strings::Translate("AniList: Received an error in response!")); |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
113 return std::nullopt; |
175 | 114 } |
115 | |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
116 return out; |
175 | 117 } |
118 | |
291 | 119 static void ParseListStatus(std::string status, Anime::Anime& anime) { |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
185
diff
changeset
|
120 static const std::unordered_map<std::string, Anime::ListStatus> map = { |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
121 {"CURRENT", Anime::ListStatus::Current }, |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
122 {"PLANNING", Anime::ListStatus::Planning }, |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
123 {"COMPLETED", Anime::ListStatus::Completed}, |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
124 {"DROPPED", Anime::ListStatus::Dropped }, |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
125 {"PAUSED", Anime::ListStatus::Paused } |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
126 }; |
9 | 127 |
15 | 128 if (status == "REPEATING") { |
129 anime.SetUserIsRewatching(true); | |
279 | 130 anime.SetUserStatus(Anime::ListStatus::Current); |
15 | 131 return; |
132 } | |
9 | 133 |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
44
diff
changeset
|
134 if (map.find(status) == map.end()) { |
279 | 135 anime.SetUserStatus(Anime::ListStatus::NotInList); |
15 | 136 return; |
137 } | |
9 | 138 |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
185
diff
changeset
|
139 anime.SetUserStatus(map.at(status)); |
15 | 140 } |
9 | 141 |
291 | 142 static std::string ListStatusToString(const Anime::Anime& anime) { |
279 | 143 if (anime.GetUserIsRewatching() && anime.GetUserStatus() == Anime::ListStatus::Current) |
15 | 144 return "REWATCHING"; |
145 | |
70
64e5f427c6a2
services/anilist: remove unordered_map usage for enum classes
Paper <mrpapersonic@gmail.com>
parents:
66
diff
changeset
|
146 switch (anime.GetUserStatus()) { |
279 | 147 case Anime::ListStatus::Planning: return "PLANNING"; |
148 case Anime::ListStatus::Completed: return "COMPLETED"; | |
149 case Anime::ListStatus::Dropped: return "DROPPED"; | |
150 case Anime::ListStatus::Paused: return "PAUSED"; | |
76 | 151 default: break; |
70
64e5f427c6a2
services/anilist: remove unordered_map usage for enum classes
Paper <mrpapersonic@gmail.com>
parents:
66
diff
changeset
|
152 } |
64e5f427c6a2
services/anilist: remove unordered_map usage for enum classes
Paper <mrpapersonic@gmail.com>
parents:
66
diff
changeset
|
153 return "CURRENT"; |
15 | 154 } |
9 | 155 |
291 | 156 static void ParseTitle(const nlohmann::json& json, Anime::Anime& anime) { |
305
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
304
diff
changeset
|
157 static const std::unordered_map<Anime::TitleLanguage, nlohmann::json::json_pointer> map = { |
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
304
diff
changeset
|
158 {Anime::TitleLanguage::Native, "/native"_json_pointer}, |
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
304
diff
changeset
|
159 {Anime::TitleLanguage::English, "/english"_json_pointer}, |
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
304
diff
changeset
|
160 {Anime::TitleLanguage::Romaji, "/romaji"_json_pointer}, |
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
304
diff
changeset
|
161 }; |
284
e66ffc338d82
anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents:
279
diff
changeset
|
162 |
305
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
304
diff
changeset
|
163 for (const auto& [language, ptr] : map) |
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
304
diff
changeset
|
164 if (json.contains(ptr) && json[ptr].is_string()) |
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
304
diff
changeset
|
165 anime.SetTitle(language, json[ptr]); |
9 | 166 } |
167 | |
291 | 168 static int ParseMediaJson(const nlohmann::json& json) { |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
169 if (!json.contains("/id"_json_pointer) || !json["/id"_json_pointer].is_number()) { |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
170 session.SetStatusBar(Strings::Translate("AniList: Failed to parse anime object!")); |
9 | 171 return 0; |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
172 } |
175 | 173 |
317
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
174 std::string service_id = Strings::ToUtf8String(json["/id"_json_pointer].get<int>()); |
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
175 |
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
176 int id = Anime::db.LookupServiceIdOrUnused(Anime::Service::AniList, service_id); |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
177 if (!id) { |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
178 session.SetStatusBar(Strings::Translate("AniList: Failed to parse anime object!")); |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
179 return 0; |
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
180 } |
317
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
181 |
9 | 182 Anime::Anime& anime = Anime::db.items[id]; |
183 anime.SetId(id); | |
317
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
184 anime.SetServiceId(Anime::Service::AniList, service_id); |
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
185 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
186 if (json.contains("/idMal"_json_pointer) && json["/idMal"_json_pointer].is_number()) |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
187 anime.SetServiceId(Anime::Service::MyAnimeList, Strings::ToUtf8String(json["/idMal"_json_pointer].get<int>())); |
9 | 188 |
11 | 189 ParseTitle(json.at("/title"_json_pointer), anime); |
9 | 190 |
175 | 191 anime.SetEpisodes(JSON::GetNumber(json, "/episodes"_json_pointer, 0)); |
192 anime.SetFormat(Translate::AniList::ToSeriesFormat(JSON::GetString<std::string>(json, "/format"_json_pointer, ""))); | |
9 | 193 |
258 | 194 anime.SetAiringStatus( |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
195 Translate::AniList::ToSeriesStatus(JSON::GetString<std::string>(json, "/status"_json_pointer, ""))); |
9 | 196 |
324
5d3c9b31aa6e
anime: add completed date member
Paper <paper@paper.us.eu.org>
parents:
323
diff
changeset
|
197 if (json.contains("/startDate"_json_pointer) && json["/startDate"_json_pointer].is_object()) |
5d3c9b31aa6e
anime: add completed date member
Paper <paper@paper.us.eu.org>
parents:
323
diff
changeset
|
198 anime.SetStartedDate(Date(json["/startDate"_json_pointer])); |
5d3c9b31aa6e
anime: add completed date member
Paper <paper@paper.us.eu.org>
parents:
323
diff
changeset
|
199 |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
200 anime.SetCompletedDate(json.contains("/endDate"_json_pointer) && json["/endDate"_json_pointer].is_object() |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
201 ? Date(json["/endDate"_json_pointer]) |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
202 : anime.GetStartedDate()); |
9 | 203 |
175 | 204 anime.SetPosterUrl(JSON::GetString<std::string>(json, "/coverImage/large"_json_pointer, "")); |
66
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
65
diff
changeset
|
205 |
175 | 206 anime.SetAudienceScore(JSON::GetNumber(json, "/averageScore"_json_pointer, 0)); |
279 | 207 // anime.SetSeason(Translate::AniList::ToSeriesSeason(JSON::GetString<std::string>(json, "/season"_json_pointer, ""))); |
175 | 208 anime.SetDuration(JSON::GetNumber(json, "/duration"_json_pointer, 0)); |
260
dd211ff68b36
pages/seasons: add initial functionality
Paper <paper@paper.us.eu.org>
parents:
258
diff
changeset
|
209 |
dd211ff68b36
pages/seasons: add initial functionality
Paper <paper@paper.us.eu.org>
parents:
258
diff
changeset
|
210 std::string synopsis = JSON::GetString<std::string>(json, "/description"_json_pointer, ""); |
dd211ff68b36
pages/seasons: add initial functionality
Paper <paper@paper.us.eu.org>
parents:
258
diff
changeset
|
211 Strings::TextifySynopsis(synopsis); |
dd211ff68b36
pages/seasons: add initial functionality
Paper <paper@paper.us.eu.org>
parents:
258
diff
changeset
|
212 anime.SetSynopsis(synopsis); |
9 | 213 |
175 | 214 anime.SetGenres(JSON::GetArray<std::vector<std::string>>(json, "/genres"_json_pointer, {})); |
215 anime.SetTitleSynonyms(JSON::GetArray<std::vector<std::string>>(json, "/synonyms"_json_pointer, {})); | |
216 | |
321
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
217 { |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
218 std::vector<std::string> producers; |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
219 |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
220 if (json.contains("/studios/edges"_json_pointer) && json["/studios/edges"_json_pointer].is_array()) |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
221 for (const auto& edge : json["/studios/edges"_json_pointer]) |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
222 if (edge.contains("/node/name"_json_pointer) && edge["/node/name"_json_pointer].is_string()) |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
223 producers.push_back(edge["/node/name"_json_pointer].get<std::string>()); |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
224 |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
225 anime.SetProducers(producers); |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
226 } |
8141f409d52c
services/anilist: fix getting producers
Paper <paper@paper.us.eu.org>
parents:
320
diff
changeset
|
227 |
10 | 228 return id; |
9 | 229 } |
230 | |
291 | 231 static int ParseListItem(const nlohmann::json& json) { |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
232 int id = ParseMediaJson(json["/media"_json_pointer]); |
317
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
233 if (!id) |
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
234 return 0; |
10 | 235 |
236 Anime::Anime& anime = Anime::db.items[id]; | |
237 | |
238 anime.AddToUserList(); | |
9 | 239 |
175 | 240 anime.SetUserScore(JSON::GetNumber(json, "/score"_json_pointer, 0)); |
241 anime.SetUserProgress(JSON::GetNumber(json, "/progress"_json_pointer, 0)); | |
242 ParseListStatus(JSON::GetString<std::string>(json, "/status"_json_pointer, ""), anime); | |
243 anime.SetUserNotes(JSON::GetString<std::string>(json, "/notes"_json_pointer, "")); | |
9 | 244 |
175 | 245 anime.SetUserDateStarted(Date(json["/startedAt"_json_pointer])); |
246 anime.SetUserDateCompleted(Date(json["/completedAt"_json_pointer])); | |
9 | 247 |
175 | 248 anime.SetUserTimeUpdated(JSON::GetNumber(json, "/updatedAt"_json_pointer, 0)); |
10 | 249 |
250 return id; | |
9 | 251 } |
252 | |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
253 static bool ParseList(const nlohmann::json& json) { |
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
254 bool success = true; |
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
255 |
317
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
256 for (const auto& entry : json["entries"].items()) |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
257 if (!ParseListItem(entry.value())) |
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
258 success = false; |
317
b1f4d1867ab1
services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents:
315
diff
changeset
|
259 |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
260 return success; |
9 | 261 } |
262 | |
10 | 263 int GetAnimeList() { |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
264 auto& auth = session.config.auth.anilist; |
175 | 265 |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
266 static constexpr std::string_view query = |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
267 "query ($id: Int) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
268 " MediaListCollection (userId: $id, type: ANIME) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
269 " lists {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
270 " name\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
271 " entries {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
272 " score\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
273 " notes\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
274 " status\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
275 " progress\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
276 " startedAt {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
277 " year\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
278 " month\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
279 " day\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
280 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
281 " completedAt {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
282 " year\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
283 " month\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
284 " day\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
285 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
286 " updatedAt\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
287 " media {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
288 MEDIA_FIELDS |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
289 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
290 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
291 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
292 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
293 "}\n"; |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
294 |
9 | 295 // clang-format off |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
296 nlohmann::json request = { |
9 | 297 {"query", query}, |
298 {"variables", { | |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
299 {"id", auth.user_id} |
9 | 300 }} |
301 }; | |
302 // clang-format on | |
175 | 303 |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
304 session.SetStatusBar(Strings::Translate("AniList: Parsing anime list...")); |
175 | 305 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
306 const std::optional<nlohmann::json> response = SendJSONRequest(request); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
307 if (!response) |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
308 return 0; |
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
309 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
310 Anime::db.RemoveAllUserData(); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
311 |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
312 const nlohmann::json& json = response.value(); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
313 |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
314 bool success = true; |
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
315 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
316 for (const auto& list : json["data"]["MediaListCollection"]["lists"].items()) |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
317 if (!ParseList(list.value())) |
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
318 success = false; |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
319 |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
320 if (success) |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
321 session.SetStatusBar(Strings::Translate("AniList: Retrieved anime list successfully!")); |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
322 |
9 | 323 return 1; |
324 } | |
325 | |
250 | 326 /* return is a vector of anime ids */ |
327 std::vector<int> Search(const std::string& search) { | |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
328 static constexpr std::string_view query = |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
329 "query ($search: String) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
330 " Page (page: 1, perPage: 50) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
331 " media (search: $search, type: ANIME) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
332 MEDIA_FIELDS |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
333 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
334 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
335 "}\n"; |
250 | 336 |
337 // clang-format off | |
338 nlohmann::json json = { | |
339 {"query", query}, | |
340 {"variables", { | |
341 {"search", search} | |
342 }} | |
343 }; | |
344 // clang-format on | |
345 | |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
346 const std::optional<nlohmann::json> response = SendJSONRequest(json); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
347 if (!response) |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
348 return {}; |
250 | 349 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
350 const nlohmann::json& result = response.value(); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
351 |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
352 /* FIXME: error handling here */ |
250 | 353 std::vector<int> ret; |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
354 ret.reserve(result["/data/Page/media"_json_pointer].size()); |
250 | 355 |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
356 for (const auto& media : result["/data/Page/media"_json_pointer].items()) |
250 | 357 ret.push_back(ParseMediaJson(media.value())); |
358 | |
359 return ret; | |
360 } | |
361 | |
327
b5d6c27c308f
anime: refactor Anime::SeriesSeason to Season class
Paper <paper@paper.us.eu.org>
parents:
325
diff
changeset
|
362 bool GetSeason(Anime::Season season) { |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
363 static constexpr std::string_view query = |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
364 "query ($season: MediaSeason!, $season_year: Int!, $page: Int) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
365 " Page(page: $page) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
366 " media(season: $season, seasonYear: $season_year, type: ANIME, sort: START_DATE) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
367 MEDIA_FIELDS |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
368 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
369 " pageInfo {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
370 " total\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
371 " perPage\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
372 " currentPage\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
373 " lastPage\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
374 " hasNextPage\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
375 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
376 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
377 "}\n"; |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
378 |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
379 int page = 0; |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
380 bool has_next_page = true; |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
381 |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
382 while (has_next_page) { |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
383 nlohmann::json json = { |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
384 {"query", query}, |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
385 {"variables", { |
327
b5d6c27c308f
anime: refactor Anime::SeriesSeason to Season class
Paper <paper@paper.us.eu.org>
parents:
325
diff
changeset
|
386 {"season", Translate::AniList::ToString(season.season)}, |
b5d6c27c308f
anime: refactor Anime::SeriesSeason to Season class
Paper <paper@paper.us.eu.org>
parents:
325
diff
changeset
|
387 {"season_year", Strings::ToUtf8String(season.year)}, |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
388 {"page", page}, |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
389 }}, |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
390 }; |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
391 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
392 const std::optional<nlohmann::json> res = SendJSONRequest(json); |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
393 if (!res) |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
394 return false; |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
395 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
396 const nlohmann::json& result = res.value(); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
397 |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
398 for (const auto& media : result["/data/Page/media"_json_pointer].items()) |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
399 ParseMediaJson(media.value()); |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
400 |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
401 has_next_page = JSON::GetBoolean(result, "/data/Page/pageInfo/hasNextPage"_json_pointer, false); |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
402 if (has_next_page) |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
403 page++; |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
404 } |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
405 |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
406 return true; |
304
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
407 } |
2115488eb302
*: add very early season searcher
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
408 |
52
0c4138de2ea7
anime list: we are finally read-write
Paper <mrpapersonic@gmail.com>
parents:
48
diff
changeset
|
409 int UpdateAnimeEntry(int id) { |
0c4138de2ea7
anime list: we are finally read-write
Paper <mrpapersonic@gmail.com>
parents:
48
diff
changeset
|
410 Anime::Anime& anime = Anime::db.items[id]; |
184
09492158bcc5
anime: etc. comments and changes
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
411 if (!anime.IsInUserList()) |
09492158bcc5
anime: etc. comments and changes
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
412 return 0; |
09492158bcc5
anime: etc. comments and changes
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
413 |
291 | 414 std::optional<std::string> service_id = anime.GetServiceId(Anime::Service::AniList); |
415 if (!service_id) | |
416 return 0; | |
417 | |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
418 static constexpr std::string_view query = |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
419 "mutation ($media_id: Int, $progress: Int, $status: MediaListStatus, $score: Int, $notes: String," |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
420 " $start: FuzzyDateInput, $comp: FuzzyDateInput, $repeat: Int) {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
421 " SaveMediaListEntry (mediaId: $media_id, progress: $progress, status: $status, scoreRaw: $score," |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
422 " notes: $notes, startedAt: $start, completedAt: $comp, repeat: $repeat) {\n" |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
423 " id\n" |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
424 " }\n" |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
425 "}\n"; |
9 | 426 // clang-format off |
427 nlohmann::json json = { | |
428 {"query", query}, | |
429 {"variables", { | |
291 | 430 {"media_id", Strings::ToInt<int64_t>(service_id.value())}, |
10 | 431 {"progress", anime.GetUserProgress()}, |
15 | 432 {"status", ListStatusToString(anime)}, |
10 | 433 {"score", anime.GetUserScore()}, |
77 | 434 {"notes", anime.GetUserNotes()}, |
435 {"start", anime.GetUserDateStarted().GetAsAniListJson()}, | |
184
09492158bcc5
anime: etc. comments and changes
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
436 {"comp", anime.GetUserDateCompleted().GetAsAniListJson()}, |
09492158bcc5
anime: etc. comments and changes
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
437 {"repeat", anime.GetUserRewatchedTimes()} |
9 | 438 }} |
439 }; | |
440 // clang-format on | |
175 | 441 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
442 const std::optional<nlohmann::json> res = SendJSONRequest(json); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
443 if (!res) |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
444 return 0; |
175 | 445 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
446 const nlohmann::json& result = res.value(); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
447 |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
448 session.SetStatusBar(Strings::Translate("AniList: Anime entry updated successfully!")); |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
449 |
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
450 return JSON::GetNumber(result, "/data/SaveMediaListEntry/id"_json_pointer, 0); |
9 | 451 } |
452 | |
291 | 453 static int ParseUser(const nlohmann::json& json) { |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
454 auto& auth = session.config.auth.anilist; |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
455 |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
456 return auth.user_id = JSON::GetNumber(json, "/id"_json_pointer, 0); |
9 | 457 } |
458 | |
44
619cbd6e69f9
filesystem: fix CreateDirectories function
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
459 bool AuthorizeUser() { |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
460 auto& auth = session.config.auth.anilist; |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
461 |
9 | 462 /* Prompt for PIN */ |
258 | 463 QDesktopServices::openUrl(QUrl(Strings::ToQString("https://anilist.co/api/v2/oauth/authorize?client_id=" + |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
464 std::string(CLIENT_ID) + "&response_type=token"))); |
175 | 465 |
9 | 466 bool ok; |
467 QString token = QInputDialog::getText( | |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
468 0, "Credentials needed!", "Please enter the code given to you after logging in to AniList:", QLineEdit::Normal, |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
469 "", &ok); |
175 | 470 |
471 if (!ok || token.isEmpty()) | |
44
619cbd6e69f9
filesystem: fix CreateDirectories function
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
472 return false; |
175 | 473 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
474 auth.auth_token = Strings::ToUtf8String(token); |
175 | 475 |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
476 session.SetStatusBar(Strings::Translate("AniList: Requesting user ID...")); |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
477 |
325
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
478 static constexpr std::string_view query = |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
479 "query {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
480 " Viewer {\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
481 " id\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
482 " }\n" |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
483 "}\n"; |
78929794e7d8
pages/seasons: run seasons search in a separate thread
Paper <paper@paper.us.eu.org>
parents:
324
diff
changeset
|
484 |
9 | 485 nlohmann::json json = { |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
486 {"query", query} |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
487 }; |
175 | 488 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
489 /* SendJSONRequest handles status errors */ |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
490 const std::optional<nlohmann::json> ret = SendJSONRequest(json); |
315
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
491 if (!ret) |
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
492 return 0; |
34347fd2a2de
session: allow printing status messages
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
493 |
323
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
494 const nlohmann::json& result = ret.value(); |
1686fac290c5
services/anilist: refactor HTTP requests...
Paper <paper@paper.us.eu.org>
parents:
321
diff
changeset
|
495 |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
496 if (ParseUser(result["data"]["Viewer"])) |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
497 session.SetStatusBar(Strings::Translate("AniList: Successfully retrieved user data!")); |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
498 else |
334
948955c3ba81
services: use fmt for setting the status bar
Paper <paper@paper.us.eu.org>
parents:
327
diff
changeset
|
499 session.SetStatusBar(Strings::Translate("AniList: Failed to retrieve user ID!")); |
319
d928ec7b6a0d
services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents:
317
diff
changeset
|
500 |
44
619cbd6e69f9
filesystem: fix CreateDirectories function
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
501 return true; |
9 | 502 } |
503 | |
63 | 504 } // namespace AniList |
505 } // namespace Services |