aboutsummaryrefslogtreecommitdiff
path: root/src/lib/AniList/schedule.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/AniList/schedule.ts')
-rw-r--r--src/lib/AniList/schedule.ts75
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[]>;
+};