aboutsummaryrefslogtreecommitdiff
path: root/src/lib/AniList/wrapped.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-12-23 18:37:02 -0800
committerFuwn <[email protected]>2023-12-23 18:37:02 -0800
commitc431ceebf04ce74abf3403e0dc0ddb549e206405 (patch)
tree4b21123588c7336889ca301e37c8fc5418a176ac /src/lib/AniList/wrapped.ts
parentfeat(media): include all option (diff)
downloaddue.moe-c431ceebf04ce74abf3403e0dc0ddb549e206405.tar.xz
due.moe-c431ceebf04ce74abf3403e0dc0ddb549e206405.zip
feat(wrapped): manual tag and genre calculation
Diffstat (limited to 'src/lib/AniList/wrapped.ts')
-rw-r--r--src/lib/AniList/wrapped.ts76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/lib/AniList/wrapped.ts b/src/lib/AniList/wrapped.ts
index 35ce7554..40a81957 100644
--- a/src/lib/AniList/wrapped.ts
+++ b/src/lib/AniList/wrapped.ts
@@ -1,4 +1,5 @@
import type { AniListAuthorisation, UserIdentity } from './identity';
+import type { Media } from './media';
export interface WrappedMediaFormat {
startYears: {
@@ -143,3 +144,78 @@ export const wrapped = async (
avatar: wrappedResponse['data']['User']['avatar']
};
};
+
+export interface TopMedia {
+ genres: {
+ genre: string;
+ averageScore: number;
+ }[];
+ tags: {
+ tag: string;
+ averageScore: number;
+ }[];
+ topGenreMedia: Media;
+ topTagMedia: Media;
+}
+
+export const tops = (media: Media[], amount: number): TopMedia => {
+ const genresMap: { [genre: string]: { totalScore: number; count: number } } = {};
+ const tagsMap: { [tag: string]: { totalScore: number; count: number } } = {};
+
+ media.forEach((m) => {
+ if (m.mediaListEntry && m.mediaListEntry.score) {
+ m.genres.forEach((genre) => {
+ if (!genresMap[genre]) genresMap[genre] = { totalScore: 0, count: 0 };
+
+ const score = m.mediaListEntry?.score;
+
+ if (score) {
+ genresMap[genre].totalScore += score;
+ genresMap[genre].count++;
+ }
+ });
+
+ m.tags.forEach((tag) => {
+ if (!tagsMap[tag.name]) tagsMap[tag.name] = { totalScore: 0, count: 0 };
+
+ const score = m.mediaListEntry?.score;
+
+ if (score) {
+ tagsMap[tag.name].totalScore += score;
+ tagsMap[tag.name].count++;
+ }
+ });
+ }
+ });
+
+ // const limitNumber = (n: number) => {
+ // const formatted = Number(n).toFixed(2);
+
+ // return formatted.endsWith('00') ? Number(formatted).toString() : formatted;
+ // };
+
+ let genres = Object.keys(genresMap).map((genre) => ({
+ genre,
+ averageScore: Math.round(genresMap[genre].totalScore / genresMap[genre].count)
+ }));
+ let tags = Object.keys(tagsMap).map((tag) => ({
+ tag,
+ averageScore: Math.round(tagsMap[tag].totalScore / tagsMap[tag].count)
+ }));
+
+ genres = genres.slice(0, amount);
+ tags = tags.slice(0, amount);
+
+ const topGenreMedia = media.find((m) => m.genres.includes(genres[0].genre)) || media[0];
+ const topTagMedia = media.find((m) => m.tags.some((tag) => tag.name === tags[0].tag)) || media[0];
+
+ // if (topGenreMedia.id === topTagMedia.id)
+ // topTagMedia = media.find((m) => m.id !== topGenreMedia.id) || media[1];
+
+ return {
+ genres,
+ tags,
+ topGenreMedia,
+ topTagMedia
+ };
+};