annotate src/core/anime_db.cc @ 392:a72d6d7b3568

anime_info: don't need to wait on the thread, just disconnect eventually, we can cancel any outgoing requests, but it's kind of unnecessary
author Paper <paper@tflc.us>
date Fri, 07 Nov 2025 07:10:32 -0500
parents 1e5d922fe82b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
1 #include "core/anime_db.h"
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
2 #include "core/anime.h"
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 254
diff changeset
3 #include "core/filesystem.h"
379
5eaafed6c10b *: clang-format
Paper <paper@tflc.us>
parents: 378
diff changeset
4 #include "core/http.h"
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
5 #include "core/json.h"
319
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
6 #include "core/session.h"
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 254
diff changeset
7 #include "core/strings.h"
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
8
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 254
diff changeset
9 #include "gui/translate/anilist.h"
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
10 #include "gui/translate/anime.h"
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
11
187
9613d72b097e *: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents: 177
diff changeset
12 #include <QDate>
9613d72b097e *: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents: 177
diff changeset
13
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
14 #include <fstream>
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
15
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
16 #include <cstdlib>
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 254
diff changeset
17 #include <exception>
176
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
18 #include <iostream>
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
19 #include <random>
176
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
20
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
21 namespace Anime {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
22
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
23 size_t Database::GetTotalAnimeAmount() const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
24 {
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
25 size_t total = 0;
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
26
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
27 for (const auto &[id, anime] : items)
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
28 if (anime.IsInUserList())
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
29 total++;
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
30
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
31 return total;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
32 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
33
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
34 size_t Database::GetListsAnimeAmount(ListStatus status) const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
35 {
279
657fda1b9cac *: clean up enums
Paper <paper@paper.us.eu.org>
parents: 264
diff changeset
36 if (status == ListStatus::NotInList)
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
37 return 0;
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
38
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
39 size_t total = 0;
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
40
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
41 for (const auto &[id, anime] : items)
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
42 if (anime.IsInUserList() && anime.GetUserStatus() == status)
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
43 total++;
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
44
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
45 return total;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
46 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
47
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
48 size_t Database::GetTotalEpisodeAmount() const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
49 {
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
50 size_t total = 0;
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
51
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
52 for (const auto &[id, anime] : items)
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
53 if (anime.IsInUserList())
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
54 total += anime.GetUserRewatchedTimes() * anime.GetEpisodes() + anime.GetUserProgress();
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
55
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
56 return total;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
57 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
58
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
59 /* Returns the total watched amount in minutes. */
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
60 size_t Database::GetTotalWatchedAmount() const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
61 {
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
62 size_t total = 0;
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
63
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
64 for (const auto &[id, anime] : items)
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
65 if (anime.IsInUserList())
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 254
diff changeset
66 total += anime.GetDuration() * anime.GetUserProgress() +
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 254
diff changeset
67 anime.GetEpisodes() * anime.GetDuration() * anime.GetUserRewatchedTimes();
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
68
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
69 return total;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
70 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
71
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
72 /* Returns the total planned amount in minutes.
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
73 Note that we should probably limit progress to the
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
74 amount of episodes, as AniList will let you
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
75 set episode counts up to 32768. But that should
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
76 rather be handled elsewhere. */
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
77 size_t Database::GetTotalPlannedAmount() const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
78 {
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
79 size_t total = 0;
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
80
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
81 for (const auto &[id, anime] : items)
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
82 if (anime.IsInUserList())
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
83 total += anime.GetDuration() * (anime.GetEpisodes() - anime.GetUserProgress());
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
84
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
85 return total;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
86 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
87
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
88 /* In Taiga this is called the mean, but "average" is
83
d02fdf1d6708 *: huuuge update
Paper <mrpapersonic@gmail.com>
parents: 81
diff changeset
89 what's primarily used in conversation, at least
d02fdf1d6708 *: huuuge update
Paper <mrpapersonic@gmail.com>
parents: 81
diff changeset
90 in the U.S. */
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
91 double Database::GetAverageScore() const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
92 {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
93 double avg = 0;
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
94 size_t amt = 0;
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
95
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
96 for (const auto &[id, anime] : items) {
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
97 if (anime.IsInUserList() && anime.GetUserScore()) {
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
98 avg += anime.GetUserScore();
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
99 amt++;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
100 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
101 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
102 return avg / amt;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
103 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
104
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
105 double Database::GetScoreDeviation() const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
106 {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
107 double squares_sum = 0, avg = GetAverageScore();
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
108 size_t amt = 0;
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
109
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
110 for (const auto &[id, anime] : items) {
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
111 if (anime.IsInUserList() && anime.GetUserScore()) {
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
112 squares_sum += std::pow(static_cast<double>(anime.GetUserScore()) - avg, 2);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
113 amt++;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
114 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
115 }
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
116
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
117 return (amt > 0) ? std::sqrt(squares_sum / amt) : 0;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
118 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
119
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
120 int Database::LookupAnimeTitle(const std::string &title) const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
121 {
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
122 if (title.empty())
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
123 return 0;
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
124
264
9a04802848c0 *: improve multiple things
Paper <paper@paper.us.eu.org>
parents: 260
diff changeset
125 std::string title_n(title);
9a04802848c0 *: improve multiple things
Paper <paper@paper.us.eu.org>
parents: 260
diff changeset
126 Strings::NormalizeAnimeTitle(title_n);
9a04802848c0 *: improve multiple things
Paper <paper@paper.us.eu.org>
parents: 260
diff changeset
127
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
128 for (const auto &[id, anime] : items) {
260
dd211ff68b36 pages/seasons: add initial functionality
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
129 std::vector<std::string> synonyms(anime.GetTitleSynonyms());
dd211ff68b36 pages/seasons: add initial functionality
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
130 synonyms.push_back(anime.GetUserPreferredTitle());
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
131
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
132 for (auto &synonym : synonyms) {
264
9a04802848c0 *: improve multiple things
Paper <paper@paper.us.eu.org>
parents: 260
diff changeset
133 Strings::NormalizeAnimeTitle(synonym);
9a04802848c0 *: improve multiple things
Paper <paper@paper.us.eu.org>
parents: 260
diff changeset
134 if (synonym == title_n)
254
d14f8e0e40c3 [UNFINISHED] *: update anime button
Paper <paper@paper.us.eu.org>
parents: 236
diff changeset
135 return id;
260
dd211ff68b36 pages/seasons: add initial functionality
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
136 }
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
137 }
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
138
254
d14f8e0e40c3 [UNFINISHED] *: update anime button
Paper <paper@paper.us.eu.org>
parents: 236
diff changeset
139 return 0;
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
140 }
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
141
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
142 static bool GetListDataAsJSON(const Anime &anime, nlohmann::json &json)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
143 {
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
144 if (!anime.IsInUserList())
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
145 return false;
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
146
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
147 // clang-format off
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
148 json = {
389
1e5d922fe82b kitsu: implement UpdateAnimeEntry
Paper <paper@tflc.us>
parents: 383
diff changeset
149 {"id", anime.GetUserId()},
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
150 {"status", Translate::ToString(anime.GetUserStatus())},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
151 {"progress", anime.GetUserProgress()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
152 {"score", anime.GetUserScore()},
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
153 {"started", anime.GetUserDateStarted().GetAsAniListJson()},
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
154 {"completed", anime.GetUserDateCompleted().GetAsAniListJson()},
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
155 {"private", anime.GetUserIsPrivate()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
156 {"rewatched_times", anime.GetUserRewatchedTimes()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
157 {"rewatching", anime.GetUserIsRewatching()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
158 {"updated", anime.GetUserTimeUpdated()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
159 {"notes", anime.GetUserNotes()}
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
160 };
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
161 // clang-format on
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
162
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
163 return true;
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
164 }
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
165
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
166 static bool GetAnimeAsJSON(const Anime &anime, nlohmann::json &json)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
167 {
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
168 // clang-format off
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
169 json = {
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
170 {"id", anime.GetId()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
171 {"synonyms", anime.GetTitleSynonyms()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
172 {"episodes", anime.GetEpisodes()},
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
173 {"airing_status", Translate::ToString(anime.GetAiringStatus())},
324
5d3c9b31aa6e anime: add completed date member
Paper <paper@paper.us.eu.org>
parents: 320
diff changeset
174 {"started_date", anime.GetStartedDate().GetAsAniListJson()},
5d3c9b31aa6e anime: add completed date member
Paper <paper@paper.us.eu.org>
parents: 320
diff changeset
175 {"completed_date", anime.GetCompletedDate().GetAsAniListJson()},
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
176 {"genres", anime.GetGenres()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
177 {"producers", anime.GetProducers()},
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
178 {"format", Translate::ToString(anime.GetFormat())},
279
657fda1b9cac *: clean up enums
Paper <paper@paper.us.eu.org>
parents: 264
diff changeset
179 // {"season", Translate::ToString(anime.GetSeason())},
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
180 {"audience_score", anime.GetAudienceScore()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
181 {"synopsis", anime.GetSynopsis()},
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
182 {"duration", anime.GetDuration()},
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
183 {"poster_url", anime.GetPosterUrl()}
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
184 };
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
185 // clang-format on
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
186
284
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
187 /* now for dynamically-filled stuff */
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
188 for (const auto &lang : TitleLanguages) {
284
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
189 std::optional<std::string> title = anime.GetTitle(lang);
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
190 if (title.has_value())
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
191 json["title"][Strings::ToLower(Translate::ToString(lang))] = title.value();
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
192 }
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
193
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
194 for (const auto &service : Services) {
286
53e3c015a973 anime: initial cross-service support
Paper <paper@paper.us.eu.org>
parents: 284
diff changeset
195 std::optional<std::string> id = anime.GetServiceId(service);
53e3c015a973 anime: initial cross-service support
Paper <paper@paper.us.eu.org>
parents: 284
diff changeset
196 if (id.has_value())
53e3c015a973 anime: initial cross-service support
Paper <paper@paper.us.eu.org>
parents: 284
diff changeset
197 json["ids"][Strings::ToLower(Translate::ToString(service))] = id.value();
53e3c015a973 anime: initial cross-service support
Paper <paper@paper.us.eu.org>
parents: 284
diff changeset
198 }
53e3c015a973 anime: initial cross-service support
Paper <paper@paper.us.eu.org>
parents: 284
diff changeset
199
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
200 nlohmann::json user;
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
201 if (GetListDataAsJSON(anime, user))
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
202 json.push_back({"list_data", user});
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
203
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
204 return true;
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
205 }
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
206
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
207 bool Database::GetDatabaseAsJSON(nlohmann::json &json) const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
208 {
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
209 for (const auto &[id, anime] : items) {
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
210 nlohmann::json anime_json = {};
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
211 GetAnimeAsJSON(anime, anime_json);
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
212 json.push_back(anime_json);
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
213 }
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
214
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
215 return true;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
216 }
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
217
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
218 bool Database::SaveDatabaseToDisk() const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
219 {
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
220 std::filesystem::path db_path = Filesystem::GetAnimeDBPath();
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
221 Filesystem::CreateDirectories(db_path);
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
222
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
223 std::ofstream db_file(db_path);
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
224 if (!db_file)
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
225 return false;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
226
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
227 nlohmann::json json = {};
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
228 if (!GetDatabaseAsJSON(json))
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
229 return false;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
230
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
231 db_file << std::setw(4) << json << std::endl;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
232 return true;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
233 }
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
234
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
235 static bool ParseAnimeUserInfoJSON(const nlohmann::json &json, Anime &anime)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
236 {
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
237 if (!anime.IsInUserList())
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
238 anime.AddToUserList();
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
239
389
1e5d922fe82b kitsu: implement UpdateAnimeEntry
Paper <paper@tflc.us>
parents: 383
diff changeset
240 anime.SetUserId(JSON::GetString<std::string>(json, "/id"_json_pointer, ""));
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
241 anime.SetUserStatus(Translate::ToListStatus(JSON::GetString<std::string>(json, "/status"_json_pointer, "")));
175
9b10175be389 dep/json: update to v3.11.3
Paper <mrpapersonic@gmail.com>
parents: 174
diff changeset
242 anime.SetUserProgress(JSON::GetNumber(json, "/progress"_json_pointer, 0));
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
243 anime.SetUserScore(JSON::GetNumber(json, "/score"_json_pointer, 0));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
244 anime.SetUserDateStarted(Date(JSON::GetValue(json, "/started"_json_pointer)));
197
c4ca035c565d *: misc. patches
Paper <mrpapersonic@gmail.com>
parents: 187
diff changeset
245 anime.SetUserDateCompleted(Date(JSON::GetValue(json, "/completed"_json_pointer)));
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
246 anime.SetUserIsPrivate(JSON::GetBoolean(json, "/private"_json_pointer, false));
175
9b10175be389 dep/json: update to v3.11.3
Paper <mrpapersonic@gmail.com>
parents: 174
diff changeset
247 anime.SetUserRewatchedTimes(JSON::GetNumber(json, "/rewatched_times"_json_pointer, 0));
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
248 anime.SetUserIsRewatching(JSON::GetBoolean(json, "/rewatching"_json_pointer, false));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
249 anime.SetUserTimeUpdated(JSON::GetNumber(json, "/updated"_json_pointer, 0));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
250 anime.SetUserNotes(JSON::GetString<std::string>(json, "/notes"_json_pointer, ""));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
251
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
252 return true;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
253 }
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
254
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
255 static bool ParseAnimeInfoJSON(const nlohmann::json &json, Database &database)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
256 {
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
257 int id = JSON::GetNumber(json, "/id"_json_pointer, 0);
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
258 if (!id)
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
259 return false;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
260
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
261 Anime &anime = database.items[id];
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
262
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
263 anime.SetId(id);
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
264 for (const auto &service : Services) {
320
1b5c04268d6a services/kitsu: ACTUALLY finish GetAnimeList
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
265 nlohmann::json::json_pointer p("/ids/" + Strings::ToLower(Translate::ToString(service)));
1b5c04268d6a services/kitsu: ACTUALLY finish GetAnimeList
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
266
1b5c04268d6a services/kitsu: ACTUALLY finish GetAnimeList
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
267 if (json.contains(p) && json[p].is_string())
1b5c04268d6a services/kitsu: ACTUALLY finish GetAnimeList
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
268 anime.SetServiceId(service, json[p].get<std::string>());
1b5c04268d6a services/kitsu: ACTUALLY finish GetAnimeList
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
269 }
1b5c04268d6a services/kitsu: ACTUALLY finish GetAnimeList
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
270
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
271 for (const auto &lang : TitleLanguages) {
284
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
272 nlohmann::json::json_pointer p("/title/" + Strings::ToLower(Translate::ToString(lang)));
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
273
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
274 if (json.contains(p) && json[p].is_string())
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
275 anime.SetTitle(lang, json[p].get<std::string>());
e66ffc338d82 anime: refactor title structure to a map
Paper <paper@paper.us.eu.org>
parents: 279
diff changeset
276 }
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
277 anime.SetTitleSynonyms(JSON::GetArray<std::vector<std::string>>(json, "/synonyms"_json_pointer, {}));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
278 anime.SetEpisodes(JSON::GetNumber(json, "/episodes"_json_pointer, 0));
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 254
diff changeset
279 anime.SetAiringStatus(
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 254
diff changeset
280 Translate::ToSeriesStatus(JSON::GetString<std::string>(json, "/airing_status"_json_pointer, "")));
324
5d3c9b31aa6e anime: add completed date member
Paper <paper@paper.us.eu.org>
parents: 320
diff changeset
281 anime.SetStartedDate(Date(JSON::GetValue(json, "/started_date"_json_pointer)));
5d3c9b31aa6e anime: add completed date member
Paper <paper@paper.us.eu.org>
parents: 320
diff changeset
282 anime.SetCompletedDate(Date(JSON::GetValue(json, "/completed_date"_json_pointer)));
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
283 anime.SetGenres(JSON::GetArray<std::vector<std::string>>(json, "/genres"_json_pointer, {}));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
284 anime.SetProducers(JSON::GetArray<std::vector<std::string>>(json, "/producers"_json_pointer, {}));
175
9b10175be389 dep/json: update to v3.11.3
Paper <mrpapersonic@gmail.com>
parents: 174
diff changeset
285 anime.SetFormat(Translate::ToSeriesFormat(JSON::GetString<std::string>(json, "/format"_json_pointer, "")));
279
657fda1b9cac *: clean up enums
Paper <paper@paper.us.eu.org>
parents: 264
diff changeset
286 // anime.SetSeason(Translate::ToSeriesSeason(JSON::GetString<std::string>(json, "/season"_json_pointer, "")));
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
287 anime.SetAudienceScore(JSON::GetNumber(json, "/audience_score"_json_pointer, 0));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
288 anime.SetSynopsis(JSON::GetString<std::string>(json, "/synopsis"_json_pointer, ""));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
289 anime.SetDuration(JSON::GetNumber(json, "/duration"_json_pointer, 0));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
290 anime.SetPosterUrl(JSON::GetString<std::string>(json, "/poster_url"_json_pointer, ""));
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
291
176
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
292 if (json.contains("/list_data"_json_pointer) && json.at("/list_data"_json_pointer).is_object())
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
293 ParseAnimeUserInfoJSON(json.at("/list_data"_json_pointer), anime);
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
294
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
295 return true;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
296 }
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
297
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
298 bool Database::ParseDatabaseJSON(const nlohmann::json &json)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
299 {
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
300 for (const auto &anime_json : json)
177
122fad646f81 anime/db: upgrade to c++17 style, make things easier to read
Paper <mrpapersonic@gmail.com>
parents: 176
diff changeset
301 ParseAnimeInfoJSON(anime_json, *this);
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
302
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
303 return true;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
304 }
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
305
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
306 bool Database::LoadDatabaseFromDisk()
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
307 {
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
308 std::filesystem::path db_path = Filesystem::GetAnimeDBPath();
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
309 Filesystem::CreateDirectories(db_path);
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
310
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
311 std::ifstream db_file(db_path);
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
312 if (!db_file)
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
313 return false;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
314
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
315 /* When parsing, do NOT throw exceptions */
176
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
316 nlohmann::json json;
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
317 try {
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
318 json = json.parse(db_file);
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
319 } catch (std::exception const &ex) {
176
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
320 std::cerr << "[anime/db] Failed to parse JSON! " << ex.what() << std::endl;
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
321 return false;
121c2d5b321f anime/db: finalize anime db cache
Paper <mrpapersonic@gmail.com>
parents: 175
diff changeset
322 }
174
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
323
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
324 if (!ParseDatabaseJSON(json)) /* How */
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
325 return false;
f88eda79c60a anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents: 173
diff changeset
326
173
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
327 return true;
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
328 }
de0a8d2f28b3 WILL NOT COMPILE: sample export ability for anime db
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
329
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
330 int Database::GetUnusedId() const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
331 {
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
332 std::uniform_int_distribution<int> distrib(1, INT_MAX);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
333 int res;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
334
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
335 do {
319
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
336 res = distrib(session.gen);
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
337 } while (items.count(res) && !res);
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
338
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
339 return res;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
340 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
341
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
342 int Database::LookupServiceId(Service service, const std::string &id_to_find) const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
343 {
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
344 for (const auto &[id, anime] : items) {
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
345 std::optional<std::string> service_id = anime.GetServiceId(service);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
346 if (!service_id)
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
347 continue;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
348
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
349 if (service_id == id_to_find)
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
350 return id;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
351 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
352
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
353 return 0;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
354 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
355
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
356 int Database::LookupServiceIdOrUnused(Service service, const std::string &id_to_find) const
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
357 {
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
358 int id = LookupServiceId(service, id_to_find);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
359 if (id)
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
360 return id;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
361
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
362 return GetUnusedId();
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
363 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 286
diff changeset
364
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
365 void Database::RemoveAllUserData()
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
366 {
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
367 for (auto &[id, anime] : items) {
319
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
368 if (anime.IsInUserList())
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
369 anime.RemoveFromUserList();
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
370 }
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
371 }
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
372
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
373 std::vector<int> Database::GetAllAnimeForSeason(Season season)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
374 {
326
10096c5489e3 anime/db: refactor anime_season_db out
Paper <paper@paper.us.eu.org>
parents: 324
diff changeset
375 std::vector<int> res;
10096c5489e3 anime/db: refactor anime_season_db out
Paper <paper@paper.us.eu.org>
parents: 324
diff changeset
376
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 327
diff changeset
377 for (const auto &[id, anime] : items) {
327
b5d6c27c308f anime: refactor Anime::SeriesSeason to Season class
Paper <paper@paper.us.eu.org>
parents: 326
diff changeset
378 if (anime.GetSeason() == season)
326
10096c5489e3 anime/db: refactor anime_season_db out
Paper <paper@paper.us.eu.org>
parents: 324
diff changeset
379 res.push_back(id);
10096c5489e3 anime/db: refactor anime_season_db out
Paper <paper@paper.us.eu.org>
parents: 324
diff changeset
380 }
10096c5489e3 anime/db: refactor anime_season_db out
Paper <paper@paper.us.eu.org>
parents: 324
diff changeset
381
10096c5489e3 anime/db: refactor anime_season_db out
Paper <paper@paper.us.eu.org>
parents: 324
diff changeset
382 return res;
10096c5489e3 anime/db: refactor anime_season_db out
Paper <paper@paper.us.eu.org>
parents: 324
diff changeset
383 }
10096c5489e3 anime/db: refactor anime_season_db out
Paper <paper@paper.us.eu.org>
parents: 324
diff changeset
384
378
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
385 QImage Database::GetAnimePoster(int id)
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
386 {
383
27c462bc7815 make the "Now Playing" page actually work
Paper <paper@tflc.us>
parents: 381
diff changeset
387 /* Creates an anime poster and then saves it to disk
392
a72d6d7b3568 anime_info: don't need to wait on the thread, just disconnect
Paper <paper@tflc.us>
parents: 389
diff changeset
388 * Sorry this is kind of spaghetti...
a72d6d7b3568 anime_info: don't need to wait on the thread, just disconnect
Paper <paper@tflc.us>
parents: 389
diff changeset
389 *
a72d6d7b3568 anime_info: don't need to wait on the thread, just disconnect
Paper <paper@tflc.us>
parents: 389
diff changeset
390 * TODO need to do spring cleaning here. For example, we can
a72d6d7b3568 anime_info: don't need to wait on the thread, just disconnect
Paper <paper@tflc.us>
parents: 389
diff changeset
391 * delete posters that haven't been accessed in over a week. */
378
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
392 QImage res;
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
393 QString posterfile;
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
394
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
395 std::filesystem::path posterpath = Filesystem::GetAnimePostersPath();
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
396
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
397 posterpath = posterpath / ((Strings::ToUtf8String(id) + ".png"));
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
398
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
399 Filesystem::CreateDirectories(posterpath);
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
400
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
401 /* Load from disk if available */
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
402 posterfile = Strings::ToQString(posterpath.string());
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
403
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
404 if (res.load(posterfile))
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
405 return res;
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
406
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
407 /* TODO check if the anime even exists.. */
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
408
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
409 Anime &anime = db.items[id];
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
410
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
411 QByteArray arr = HTTP::Request(anime.GetPosterUrl());
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
412
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
413 /* If it's not valid, return dummy QImage */
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
414 if (arr.isNull() || !res.loadFromData(arr))
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
415 return QImage();
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
416
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
417 /* Save the result to disk
381
5beae59cf042 anime_db: fix build fail under Qt 5
Paper <paper@tflc.us>
parents: 379
diff changeset
418 * TODO probably more efficient to save with original format,
5beae59cf042 anime_db: fix build fail under Qt 5
Paper <paper@tflc.us>
parents: 379
diff changeset
419 * and save filename as well in the anime class */
5beae59cf042 anime_db: fix build fail under Qt 5
Paper <paper@tflc.us>
parents: 379
diff changeset
420 res.save(posterfile, "png");
378
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
421
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
422 return res;
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
423 }
5912dafc6e28 anime: add poster cache
Paper <paper@tflc.us>
parents: 369
diff changeset
424
11
fc1bf97c528b *: use C++11 standard
Paper <mrpapersonic@gmail.com>
parents: 10
diff changeset
425 Database db;
fc1bf97c528b *: use C++11 standard
Paper <mrpapersonic@gmail.com>
parents: 10
diff changeset
426
279
657fda1b9cac *: clean up enums
Paper <paper@paper.us.eu.org>
parents: 264
diff changeset
427 } // namespace Anime