Mercurial > minori
annotate src/core/anime.cc @ 187:9613d72b097e
*: multiple performance improvements
like marking `static const` when it makes sense...
date: change old stupid heap-based method to a structure which should
make copying the thing actually make a copy.
also many performance-based changes, like removing the std::tie
dependency and forward-declaring nlohmann json
*: replace every instance of QString::fromUtf8 to Strings::ToQString.
the main difference is that our function will always convert exactly
what is in the string, while some other times it would only convert
up to the nearest NUL byte
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Wed, 06 Dec 2023 13:43:54 -0500 |
parents | 6ef31dbb90ca |
children | 975a3f0965e2 |
rev | line source |
---|---|
9 | 1 /* |
2 * anime.cpp: defining of custom anime-related | |
3 * datatypes & variables | |
4 */ | |
5 #include "core/anime.h" | |
6 #include "core/date.h" | |
7 #include "core/session.h" | |
178
bc8d2ccff09c
win32/dark: use existing STL classes for dwmapi
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
8 |
9 | 9 #include <algorithm> |
10 #include <string> | |
11 #include <vector> | |
12 | |
13 namespace Anime { | |
14 | |
15 /* User list data */ | |
16 bool Anime::IsInUserList() const { | |
17 if (list_info_.get()) | |
18 return true; | |
19 return false; | |
20 } | |
21 | |
22 void Anime::AddToUserList() { | |
23 list_info_.reset(new ListInformation); | |
24 } | |
25 | |
26 void Anime::RemoveFromUserList() { | |
27 list_info_.reset(); | |
28 } | |
29 | |
30 ListStatus Anime::GetUserStatus() const { | |
31 assert(list_info_.get()); | |
32 return list_info_->status; | |
33 } | |
34 | |
35 int Anime::GetUserProgress() const { | |
36 assert(list_info_.get()); | |
37 return list_info_->progress; | |
38 } | |
39 | |
40 int Anime::GetUserScore() const { | |
41 assert(list_info_.get()); | |
42 return list_info_->score; | |
43 } | |
44 | |
185
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
45 std::string Anime::GetUserPresentableScore() const { |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
46 assert(list_info_.get()); |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
47 const int score = list_info_->score; |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
48 if (score == 0) |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
49 return ""; |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
50 |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
51 switch (session.config.anime_list.score_format) { |
186
6ef31dbb90ca
anime: no unnecessary conversion to floating point
Paper <mrpapersonic@gmail.com>
parents:
185
diff
changeset
|
52 case ScoreFormat::POINT_10_DECIMAL: |
6ef31dbb90ca
anime: no unnecessary conversion to floating point
Paper <mrpapersonic@gmail.com>
parents:
185
diff
changeset
|
53 return std::to_string(score / 10) + "." + std::to_string(score % 10); |
185
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
54 case ScoreFormat::POINT_10: |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
55 return std::to_string(score / 10); |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
56 case ScoreFormat::POINT_5: { |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
57 std::string stars = ""; |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
58 |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
59 for (int i = 0; i < 100; i += 20) |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
60 stars.append((i <= score) ? "★" : "☆"); |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
61 |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
62 return stars; |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
63 } |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
64 case ScoreFormat::POINT_3: { |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
65 if (score >= 100) |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
66 return ":)"; |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
67 else if (score >= 66) |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
68 return ":|"; |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
69 else if (score >= 33) |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
70 return ":("; |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
71 else |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
72 return ""; |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
73 } |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
74 default: |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
75 case ScoreFormat::POINT_100: |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
76 return std::to_string(score); |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
77 } |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
78 } |
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
183
diff
changeset
|
79 |
9 | 80 Date Anime::GetUserDateStarted() const { |
81 assert(list_info_.get()); | |
82 return list_info_->started; | |
83 } | |
84 | |
85 Date Anime::GetUserDateCompleted() const { | |
86 assert(list_info_.get()); | |
87 return list_info_->completed; | |
88 } | |
89 | |
90 bool Anime::GetUserIsPrivate() const { | |
91 assert(list_info_.get()); | |
92 return list_info_->is_private; | |
93 } | |
94 | |
95 unsigned int Anime::GetUserRewatchedTimes() const { | |
96 assert(list_info_.get()); | |
97 return list_info_->rewatched_times; | |
98 } | |
99 | |
100 bool Anime::GetUserIsRewatching() const { | |
101 assert(list_info_.get()); | |
102 return list_info_->rewatching; | |
103 } | |
104 | |
105 uint64_t Anime::GetUserTimeUpdated() const { | |
106 assert(list_info_.get()); | |
107 return list_info_->updated; | |
108 } | |
109 | |
110 std::string Anime::GetUserNotes() const { | |
111 assert(list_info_.get()); | |
112 return list_info_->notes; | |
113 } | |
114 | |
115 void Anime::SetUserStatus(ListStatus status) { | |
116 assert(list_info_.get()); | |
117 list_info_->status = status; | |
118 } | |
119 | |
10 | 120 void Anime::SetUserScore(int score) { |
121 assert(list_info_.get()); | |
122 list_info_->score = score; | |
123 } | |
124 | |
9 | 125 void Anime::SetUserProgress(int progress) { |
126 assert(list_info_.get()); | |
127 list_info_->progress = progress; | |
128 } | |
129 | |
130 void Anime::SetUserDateStarted(Date const& started) { | |
131 assert(list_info_.get()); | |
132 list_info_->started = started; | |
133 } | |
134 | |
135 void Anime::SetUserDateCompleted(Date const& completed) { | |
136 assert(list_info_.get()); | |
137 list_info_->completed = completed; | |
138 } | |
139 | |
140 void Anime::SetUserIsPrivate(bool is_private) { | |
141 assert(list_info_.get()); | |
142 list_info_->is_private = is_private; | |
143 } | |
144 | |
145 void Anime::SetUserRewatchedTimes(int rewatched) { | |
146 assert(list_info_.get()); | |
147 list_info_->rewatched_times = rewatched; | |
148 } | |
149 | |
150 void Anime::SetUserIsRewatching(bool rewatching) { | |
151 assert(list_info_.get()); | |
152 list_info_->rewatching = rewatching; | |
153 } | |
154 | |
155 void Anime::SetUserTimeUpdated(uint64_t updated) { | |
156 assert(list_info_.get()); | |
157 list_info_->updated = updated; | |
158 } | |
159 | |
160 void Anime::SetUserNotes(std::string const& notes) { | |
161 assert(list_info_.get()); | |
162 list_info_->notes = notes; | |
163 } | |
164 | |
165 /* Series data */ | |
166 int Anime::GetId() const { | |
167 return info_.id; | |
168 } | |
169 | |
170 std::string Anime::GetRomajiTitle() const { | |
171 return info_.title.romaji; | |
172 } | |
173 | |
174 std::string Anime::GetEnglishTitle() const { | |
175 return info_.title.english; | |
176 } | |
177 | |
178 std::string Anime::GetNativeTitle() const { | |
179 return info_.title.native; | |
180 } | |
181 | |
182 std::vector<std::string> Anime::GetTitleSynonyms() const { | |
183 std::vector<std::string> result; | |
184 #define IN_VECTOR(v, k) (std::count(v.begin(), v.end(), k)) | |
36 | 185 #define ADD_TO_SYNONYMS(v, k) \ |
186 if (!k.empty() && !IN_VECTOR(v, k) && k != GetUserPreferredTitle()) \ | |
9 | 187 v.push_back(k) |
188 ADD_TO_SYNONYMS(result, info_.title.english); | |
189 ADD_TO_SYNONYMS(result, info_.title.romaji); | |
190 ADD_TO_SYNONYMS(result, info_.title.native); | |
191 for (auto& synonym : info_.synonyms) { | |
192 ADD_TO_SYNONYMS(result, synonym); | |
193 } | |
194 #undef ADD_TO_SYNONYMS | |
195 #undef IN_VECTOR | |
196 return result; | |
197 } | |
198 | |
199 int Anime::GetEpisodes() const { | |
200 return info_.episodes; | |
201 } | |
202 | |
203 SeriesStatus Anime::GetAiringStatus() const { | |
204 return info_.status; | |
205 } | |
206 | |
207 Date Anime::GetAirDate() const { | |
208 return info_.air_date; | |
209 } | |
210 | |
211 std::vector<std::string> Anime::GetGenres() const { | |
212 return info_.genres; | |
213 } | |
214 | |
215 std::vector<std::string> Anime::GetProducers() const { | |
216 return info_.producers; | |
217 } | |
218 | |
219 SeriesFormat Anime::GetFormat() const { | |
220 return info_.format; | |
221 } | |
222 | |
223 SeriesSeason Anime::GetSeason() const { | |
224 return info_.season; | |
225 } | |
226 | |
227 int Anime::GetAudienceScore() const { | |
228 return info_.audience_score; | |
229 } | |
230 | |
231 std::string Anime::GetSynopsis() const { | |
232 return info_.synopsis; | |
233 } | |
234 | |
235 int Anime::GetDuration() const { | |
236 return info_.duration; | |
237 } | |
238 | |
66
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
239 std::string Anime::GetPosterUrl() const { |
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
240 return info_.poster_url; |
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
241 } |
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
242 |
67
442065432549
poster: make posters link to AniList
Paper <mrpapersonic@gmail.com>
parents:
66
diff
changeset
|
243 std::string Anime::GetServiceUrl() const { |
183
01d259b9c89f
pages/torrents.cc: parse feed descriptions separately
Paper <mrpapersonic@gmail.com>
parents:
178
diff
changeset
|
244 /* todo: add support for other services... */ |
67
442065432549
poster: make posters link to AniList
Paper <mrpapersonic@gmail.com>
parents:
66
diff
changeset
|
245 return "https://anilist.co/anime/" + std::to_string(GetId()); |
442065432549
poster: make posters link to AniList
Paper <mrpapersonic@gmail.com>
parents:
66
diff
changeset
|
246 } |
442065432549
poster: make posters link to AniList
Paper <mrpapersonic@gmail.com>
parents:
66
diff
changeset
|
247 |
9 | 248 void Anime::SetId(int id) { |
249 info_.id = id; | |
250 } | |
251 | |
252 void Anime::SetRomajiTitle(std::string const& title) { | |
253 info_.title.romaji = title; | |
254 } | |
255 | |
256 void Anime::SetEnglishTitle(std::string const& title) { | |
257 info_.title.english = title; | |
258 } | |
259 | |
260 void Anime::SetNativeTitle(std::string const& title) { | |
261 info_.title.native = title; | |
262 } | |
263 | |
264 void Anime::SetTitleSynonyms(std::vector<std::string> const& synonyms) { | |
265 info_.synonyms = synonyms; | |
266 } | |
267 | |
268 void Anime::AddTitleSynonym(std::string const& synonym) { | |
269 info_.synonyms.push_back(synonym); | |
270 } | |
271 | |
272 void Anime::SetEpisodes(int episodes) { | |
273 info_.episodes = episodes; | |
274 } | |
275 | |
276 void Anime::SetAiringStatus(SeriesStatus status) { | |
277 info_.status = status; | |
278 } | |
279 | |
280 void Anime::SetAirDate(Date const& date) { | |
281 info_.air_date = date; | |
282 } | |
283 | |
284 void Anime::SetGenres(std::vector<std::string> const& genres) { | |
285 info_.genres = genres; | |
286 } | |
287 | |
288 void Anime::SetProducers(std::vector<std::string> const& producers) { | |
289 info_.producers = producers; | |
290 } | |
291 | |
292 void Anime::SetFormat(SeriesFormat format) { | |
293 info_.format = format; | |
294 } | |
295 | |
296 void Anime::SetSeason(SeriesSeason season) { | |
297 info_.season = season; | |
298 } | |
299 | |
300 void Anime::SetAudienceScore(int audience_score) { | |
301 info_.audience_score = audience_score; | |
302 } | |
303 | |
304 void Anime::SetSynopsis(std::string synopsis) { | |
305 info_.synopsis = synopsis; | |
306 } | |
307 | |
308 void Anime::SetDuration(int duration) { | |
309 info_.duration = duration; | |
310 } | |
311 | |
66
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
312 void Anime::SetPosterUrl(std::string url) { |
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
313 info_.poster_url = url; |
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
314 } |
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
315 |
9 | 316 std::string Anime::GetUserPreferredTitle() const { |
317 switch (session.config.anime_list.language) { | |
318 case TitleLanguage::NATIVE: return (GetNativeTitle().empty()) ? GetRomajiTitle() : GetNativeTitle(); | |
319 case TitleLanguage::ENGLISH: return (GetEnglishTitle().empty()) ? GetRomajiTitle() : GetEnglishTitle(); | |
320 default: break; | |
321 } | |
322 return GetRomajiTitle(); | |
323 } | |
324 | |
325 } // namespace Anime |