diff options
Diffstat (limited to 'src/lib/AniList/schedule.ts')
| -rw-r--r-- | src/lib/AniList/schedule.ts | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/lib/AniList/schedule.ts b/src/lib/AniList/schedule.ts new file mode 100644 index 00000000..33351a09 --- /dev/null +++ b/src/lib/AniList/schedule.ts @@ -0,0 +1,75 @@ +import type { Media, MediaTitle } from './media'; + +interface SchedulePage { + data: { + Page: { + media: { + title: MediaTitle; + synonyms: string[]; + id: number; + idMal: number; + episodes: number; + nextAiringEpisode?: { + episode: number; + airingAt?: number; + }; + coverImage: { + extraLarge: string; + }; + }[]; + pageInfo: { + hasNextPage: boolean; + }; + }; + }; +} + +const schedulePage = async ( + page: number, + year: number, + season: 'WINTER' | 'SPRING' | 'SUMMER' | 'FALL' +): Promise<SchedulePage> => + await ( + await fetch('https://graphql.anilist.co', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json' + }, + body: JSON.stringify({ + query: `{ + Page(page: ${page}) { + pageInfo { + hasNextPage + } + media(season: ${season}, seasonYear: ${year}) { + id idMal episodes synonyms + title { english romaji native } + nextAiringEpisode { episode airingAt } + coverImage { extraLarge } + } + } +}` + }) + }) + ).json(); + +export const scheduleMediaListCollection = async ( + year: number, + season: 'WINTER' | 'SPRING' | 'SUMMER' | 'FALL' +) => { + const scheduledMedia = []; + let page = 1; + let currentPage = await schedulePage(page, year, season); + + for (const candidate of currentPage.data.Page.media) scheduledMedia.push(candidate); + + while (currentPage['data']['Page']['pageInfo']['hasNextPage']) { + for (const candidate of currentPage.data.Page.media) scheduledMedia.push(candidate); + + page += 1; + currentPage = await schedulePage(page, year, season); + } + + return scheduledMedia as Partial<Media[]>; +}; |