aboutsummaryrefslogtreecommitdiff
path: root/src/lib/AniList
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-11-06 10:01:57 -0800
committerFuwn <[email protected]>2023-11-06 10:09:34 -0800
commit4e2742b3850b9f8567732316971d1b71975b5994 (patch)
treed1679e2dcd2e7ef435f10a594dd73c7fcfd2b946 /src/lib/AniList
parentfeat(wrapped): fix total episode and chapter count (diff)
downloaddue.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.ts90
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;
}