diff options
| author | Fuwn <[email protected]> | 2023-11-06 10:01:57 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-11-06 10:09:34 -0800 |
| commit | 4e2742b3850b9f8567732316971d1b71975b5994 (patch) | |
| tree | d1679e2dcd2e7ef435f10a594dd73c7fcfd2b946 /src/lib/AniList | |
| parent | feat(wrapped): fix total episode and chapter count (diff) | |
| download | due.moe-4e2742b3850b9f8567732316971d1b71975b5994.tar.xz due.moe-4e2742b3850b9f8567732316971d1b71975b5994.zip | |
feat(manga): estimate settings
Diffstat (limited to 'src/lib/AniList')
| -rw-r--r-- | src/lib/AniList/media.ts | 90 |
1 files changed, 60 insertions, 30 deletions
diff --git a/src/lib/AniList/media.ts b/src/lib/AniList/media.ts index 55e3e453..a1f17fb6 100644 --- a/src/lib/AniList/media.ts +++ b/src/lib/AniList/media.ts @@ -190,7 +190,8 @@ export const publicMediaListCollection = async (userId: number, type: Type): Pro export const recentMediaActivities = async ( userIdentity: UserIdentity, - media: Media + media: Media, + method: 'median' | 'trimmed_mean' | 'weighted_average' = 'trimmed_mean' ): Promise<number | null> => { const activities = await ( await fetch('https://graphql.anilist.co', { @@ -212,8 +213,7 @@ export const recentMediaActivities = async ( }) }) ).json(); - // Essentially, just Automail estimation. All credit to hoh and the Automail contributors. - let guesses: number[] = []; + const guesses: number[] = []; activities['data']['Page']['activities'].forEach((activity: { progress: string }) => { if (activity.progress !== null) { @@ -229,38 +229,68 @@ export const recentMediaActivities = async ( if (guesses.length) { let bestGuess = guesses[0]; - if (guesses.length > 2) { - if (guesses.filter((val) => val < 7000).length) { - guesses = guesses.filter((val) => val < 7000); - } + switch (method) { + case 'median': + { + const sortedGuesses = guesses.slice().sort((a, b) => a - b); - const difference = guesses[0] - guesses[1]; - const inverseDifference = 1 + Math.ceil(25 / (difference + 1)); - - if (guesses.length >= inverseDifference) { - if ( - guesses[1] === guesses[inverseDifference] || - guesses[0] - guesses[1] > 500 || - (guesses[0] - guesses[1] > 100 && guesses[1] >= guesses[inverseDifference] - 1) - ) { - bestGuess = guesses[1]; - - if ( - guesses.length > 15 && - guesses[1] - guesses[2] > 50 && - guesses[2] === guesses[guesses.length - 1] - ) { - bestGuess = guesses[2]; - } + bestGuess = sortedGuesses[Math.floor(sortedGuesses.length / 2)]; } - } + break; + case 'trimmed_mean': + { + const sortedGuesses = guesses.slice().sort((a, b) => a - b); + const trimmedGuesses = sortedGuesses.slice(1, -1); + bestGuess = trimmedGuesses.reduce((a, b) => a + b) / trimmedGuesses.length; + } + break; + case 'weighted_average': + { + const countMap: { [key: number]: number } = {}; + guesses.forEach((g) => { + countMap[g] = (countMap[g] || 0) + 1; + }); + + bestGuess = + Object.entries(countMap).reduce((acc: number, [val, count]: [string, number]) => { + return acc + Number(val) * Math.log(count); + }, 0) / Object.values(countMap).reduce((a: number, b: number) => a + Math.log(b), 0); + } + break; } - if (activities['data']['MediaList']['progress'] !== null) { - if (activities['data']['MediaList']['progress'] > bestGuess) { - bestGuess = activities['data']['MediaList']['progress']; - } + // if (guesses.length > 2) { + // if (guesses.filter((val) => val < 7000).length) { + // guesses = guesses.filter((val) => val < 7000); + // } + + // const difference = guesses[0] - guesses[1]; + // const inverseDifference = 1 + Math.ceil(25 / (difference + 1)); + + // if (guesses.length >= inverseDifference) { + // if ( + // guesses[1] === guesses[inverseDifference] || + // guesses[0] - guesses[1] > 500 || + // (guesses[0] - guesses[1] > 100 && guesses[1] >= guesses[inverseDifference] - 1) + // ) { + // bestGuess = guesses[1]; + + // if ( + // guesses.length > 15 && + // guesses[1] - guesses[2] > 50 && + // guesses[2] === guesses[guesses.length - 1] + // ) { + // bestGuess = guesses[2]; + // } + // } + // } + // } + + // if (activities['data']['MediaList']['progress'] !== null) { + if (activities['data']['MediaList']['progress'] > bestGuess) { + bestGuess = activities['data']['MediaList']['progress']; } + // } return bestGuess; } |