diff options
| author | Fuwn <[email protected]> | 2023-12-23 18:37:02 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-12-23 18:37:02 -0800 |
| commit | c431ceebf04ce74abf3403e0dc0ddb549e206405 (patch) | |
| tree | 4b21123588c7336889ca301e37c8fc5418a176ac /src/lib/AniList | |
| parent | feat(media): include all option (diff) | |
| download | due.moe-c431ceebf04ce74abf3403e0dc0ddb549e206405.tar.xz due.moe-c431ceebf04ce74abf3403e0dc0ddb549e206405.zip | |
feat(wrapped): manual tag and genre calculation
Diffstat (limited to 'src/lib/AniList')
| -rw-r--r-- | src/lib/AniList/media.ts | 4 | ||||
| -rw-r--r-- | src/lib/AniList/wrapped.ts | 76 |
2 files changed, 79 insertions, 1 deletions
diff --git a/src/lib/AniList/media.ts b/src/lib/AniList/media.ts index 52d7da85..3fdd54dc 100644 --- a/src/lib/AniList/media.ts +++ b/src/lib/AniList/media.ts @@ -87,7 +87,9 @@ export const flattenLists = ( self.findIndex((itemToCompare) => itemToCompare.id === item.id) === index ); - if (!all) { + if (all) { + for (const list of lists) flattenedList.push(...list.entries.map((entry) => entry.media)); + } else { for (const list of lists) { if (list.name.toLowerCase().includes('#dueinclude')) { dueInclude = true; 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 + }; +}; |