aboutsummaryrefslogtreecommitdiff
path: root/src/lib/AniList
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-12-29 21:17:57 -0800
committerFuwn <[email protected]>2023-12-29 21:17:57 -0800
commit2581ef653a0ab8f9583d3135c1a8f82775cb1e1b (patch)
treecb230eb4bbd6d0da782f2241ccdaa2da8c3ea79f /src/lib/AniList
parentfix(wrapped): slice after sort (diff)
downloaddue.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.ts47
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);