diff options
| author | Fuwn <[email protected]> | 2023-12-29 21:17:57 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-12-29 21:17:57 -0800 |
| commit | 2581ef653a0ab8f9583d3135c1a8f82775cb1e1b (patch) | |
| tree | cb230eb4bbd6d0da782f2241ccdaa2da8c3ea79f /src/lib/AniList | |
| parent | fix(wrapped): slice after sort (diff) | |
| download | due.moe-2581ef653a0ab8f9583d3135c1a8f82775cb1e1b.tar.xz due.moe-2581ef653a0ab8f9583d3135c1a8f82775cb1e1b.zip | |
feat(wrapped): genre tags sort options
Diffstat (limited to 'src/lib/AniList')
| -rw-r--r-- | src/lib/AniList/wrapped.ts | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/src/lib/AniList/wrapped.ts b/src/lib/AniList/wrapped.ts index f9f3c409..1eeeeac2 100644 --- a/src/lib/AniList/wrapped.ts +++ b/src/lib/AniList/wrapped.ts @@ -1,6 +1,12 @@ import type { AniListAuthorisation, UserIdentity } from './identity'; import type { Media } from './media'; +export enum SortOptions { + SCORE, + MINUTES_WATCHED, + COUNT +} + export interface WrappedMediaFormat { startYears: { startYear: number; @@ -158,30 +164,40 @@ export interface TopMedia { topTagMedia: Media; } -export const tops = (media: Media[], amount: number, excludedKeywords: string[] = []): TopMedia => { - const genresMap: { [genre: string]: { totalScore: number; count: number } } = {}; - const tagsMap: { [tag: string]: { totalScore: number; count: number } } = {}; +export const tops = ( + media: Media[], + amount: number, + sortMode: SortOptions, + excludedKeywords: string[] = [] +): TopMedia => { + const genresMap: { + [genre: string]: { totalScore: number; count: number; minutesWatched: number }; + } = {}; + const tagsMap: { [tag: string]: { totalScore: number; count: number; minutesWatched: number } } = + {}; media.forEach((m) => { if (m.mediaListEntry && m.mediaListEntry.score) { m.genres.forEach((genre) => { - if (!genresMap[genre]) genresMap[genre] = { totalScore: 0, count: 0 }; + if (!genresMap[genre]) genresMap[genre] = { totalScore: 0, count: 0, minutesWatched: 0 }; const score = m.mediaListEntry?.score; if (score) { genresMap[genre].totalScore += score; + genresMap[genre].minutesWatched += m.duration; genresMap[genre].count++; } }); m.tags.forEach((tag) => { - if (!tagsMap[tag.name]) tagsMap[tag.name] = { totalScore: 0, count: 0 }; + if (!tagsMap[tag.name]) tagsMap[tag.name] = { totalScore: 0, count: 0, minutesWatched: 0 }; const score = m.mediaListEntry?.score; if (score) { tagsMap[tag.name].totalScore += score; + tagsMap[tag.name].minutesWatched += m.duration; tagsMap[tag.name].count++; } }); @@ -201,8 +217,25 @@ export const tops = (media: Media[], amount: number, excludedKeywords: string[] averageScore: Math.round(tagsMap[tag].totalScore / tagsMap[tag].count) })); - genres.sort((a, b) => b.averageScore - a.averageScore); - tags.sort((a, b) => b.averageScore - a.averageScore); + switch (sortMode) { + case SortOptions.SCORE: + genres = genres.sort((a, b) => b.averageScore - a.averageScore); + tags = tags.sort((a, b) => b.averageScore - a.averageScore); + + break; + case SortOptions.MINUTES_WATCHED: + genres = genres.sort( + (a, b) => genresMap[b.genre].minutesWatched - genresMap[a.genre].minutesWatched + ); + tags = tags.sort((a, b) => tagsMap[b.tag].minutesWatched - tagsMap[a.tag].minutesWatched); + + break; + case SortOptions.COUNT: + genres = genres.sort((a, b) => genresMap[b.genre].count - genresMap[a.genre].count); + tags = tags.sort((a, b) => tagsMap[b.tag].count - tagsMap[a.tag].count); + + break; + } genres = genres.slice(0, amount); tags = tags.slice(0, amount); |