1
0
Fork 0
taevas.xyz/backend/api/infos/media/anilist.ts
Taevas def421065b
DreamBall project entry + AniList dropped anime support
(as in, make it explicit an anime has been dropped)
2025-08-06 15:09:10 +02:00

83 linhas
2,3 KiB
TypeScript

import { headers, parseJson, type Handler } from "../..";
export type Info = {
title: string;
episodes: {
watched: number;
total: number;
};
score: number;
status: string;
startDate: string;
updateDate: string;
endDate: string;
cover: string;
url: string;
} | undefined;
const username = "Taevas";
export const anilist: Handler = async () => {
/** https://github.com/AniList/ApiV2-GraphQL-Docs/blob/master/docs/reference/query.md */
const anilist = await fetch("https://graphql.anilist.co", {
method: "POST",
headers,
body: JSON.stringify({
query: `
query ($userName: String) {
MediaList (userName: $userName, type: ANIME, startedAt_greater: 1, sort: UPDATED_TIME_DESC) {
media {
title {
romaji
}
episodes
coverImage {
medium
}
siteUrl
}
progress
score (format: POINT_10)
status
startedAt {
day
month
year
}
updatedAt
completedAt {
day
month
year
}
}
}
`,
variables: {
userName: username,
},
}),
});
const json = (await parseJson(anilist)).data.MediaList;
const anime: Info = {
title: json.media.title.romaji,
episodes: {
watched: json.progress,
total: json.media.episodes,
},
score: json.score,
status: json.status,
startDate: json.startedAt.year ? new Date(`${json.startedAt.year}-${json.startedAt.month}-${json.startedAt.day}Z`).toISOString() : new Date().toISOString(),
updateDate: new Date(json.updatedAt * 1000).toISOString(),
endDate: json.completedAt.year ? new Date(`${json.completedAt.year}-${json.completedAt.month}-${json.completedAt.day}Z`).toISOString() : new Date().toISOString(),
cover: json.media.coverImage.medium,
url: json.media.siteUrl,
};
anime.startDate = anime.startDate.substring(0, anime.startDate.indexOf("T"));
anime.updateDate = anime.updateDate.substring(0, anime.updateDate.indexOf("T"));
anime.endDate = anime.endDate.substring(0, anime.endDate.indexOf("T"));
return Response.json(anime, {status: 200});
};