From a87fee111ccb501121b5aa3c1e48601f4869198a Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 20 Dec 2023 02:20:37 -0800 Subject: feat(schedule): match media to anilist --- src/routes/schedule/+page.svelte | 153 ++++++++++++++++++++++++--------------- 1 file changed, 95 insertions(+), 58 deletions(-) (limited to 'src/routes') diff --git a/src/routes/schedule/+page.svelte b/src/routes/schedule/+page.svelte index c629f820..2a975c46 100644 --- a/src/routes/schedule/+page.svelte +++ b/src/routes/schedule/+page.svelte @@ -5,8 +5,14 @@ import settings from '../../stores/settings'; import { parseOrDefault } from '$lib/Tools/tool'; import { browser } from '$app/environment'; + import type { Media } from '$lib/AniList/media'; + import { scheduleMediaListCollection } from '$lib/AniList/schedule'; + import { season } from '$lib/Media/Anime/season'; + import { findClosestMedia } from '$lib/Media/Anime/airing'; + import MediaTitleDisplay from '$lib/List/MediaTitleDisplay.svelte'; let subsPleasePromise: Promise; + let scheduledMediaPromise: Promise>; const urlParameters = browser ? new URLSearchParams(window.location.search) : null; let timeZone = parseOrDefault( urlParameters, @@ -14,11 +20,13 @@ Intl.DateTimeFormat().resolvedOptions().timeZone ); - onMount( - async () => (subsPleasePromise = fetch(`/api/subsplease?tz=${timeZone}`).then((r) => r.json())) - ); + onMount(async () => { + subsPleasePromise = fetch(`/api/subsplease?tz=${timeZone}`).then((r) => r.json()); + scheduledMediaPromise = scheduleMediaListCollection(new Date().getFullYear(), season()); + }); let hoveredItem: SubsPleaseEpisode | null = null; + let hoveredMedia: Media | null = null; let imageStyle = ''; let imageHeight = 0; @@ -58,67 +66,94 @@ return shiftedSchedule; }; + + const associateMedia = (media: (Media | undefined)[], title: string) => + findClosestMedia(media as Media[], title); {#await subsPleasePromise} Loading ... {:then subsPlease} {#if subsPlease} -
- {timeZone.split('/').reverse().join(', ').replace(/_/g, ' ')} -
- -

- -

- -
- {#each Object.entries(shiftSubsPleaseSchedule(subsPlease.schedule)) as [day, scheduleEntry]} -
- {day} - -
    - {#each Object.values(scheduleEntry) as entry} -
  • (hoveredItem = entry)} - on:mouseleave={() => (hoveredItem = null)} - on:mousemove={onMouseMove} - > - - {entry.title} - - {#if !$settings.displayCountdownRightAligned} - | - {/if} - - {entry.time} - -
  • + {#await scheduledMediaPromise} + Loading ... + {:then scheduledMedia} + {#if scheduledMedia} +
    + {timeZone.split('/').reverse().join(', ').replace(/_/g, ' ')} +
    + +

    + +

    + +
    + {#each Object.entries(shiftSubsPleaseSchedule(subsPlease.schedule)) as [day, scheduleEntry]} +
    + {day} + +
      + {#each Object.values(scheduleEntry) as entry} + {@const media = associateMedia(scheduledMedia, entry.title)} + +
    • { + hoveredItem = entry; + hoveredMedia = media; + }} + on:mouseleave={() => { + hoveredItem = null; + hoveredMedia = null; + }} + on:mousemove={onMouseMove} + > + + {#if media} + + {:else} + {entry.title} + {/if} + + {#if !$settings.displayCountdownRightAligned} + | + {/if} + + {entry.time} + +
    • + {/each} +
    + +

    +

    + {/each} +
    + {:else} + Loading ... + {/if} + {:catch} + + {/await} {:else} Loading ... {/if} @@ -129,7 +164,9 @@ {#if hoveredItem} Media Cover -- cgit v1.2.3