diff options
Diffstat (limited to 'src/lib/Schedule')
| -rw-r--r-- | src/lib/Schedule/CoverBypass.svelte | 30 | ||||
| -rw-r--r-- | src/lib/Schedule/Crunchyroll.svelte | 90 | ||||
| -rw-r--r-- | src/lib/Schedule/Days.svelte | 220 | ||||
| -rw-r--r-- | src/lib/Schedule/container.css | 2 |
4 files changed, 183 insertions, 159 deletions
diff --git a/src/lib/Schedule/CoverBypass.svelte b/src/lib/Schedule/CoverBypass.svelte index 1f166e06..2656a696 100644 --- a/src/lib/Schedule/CoverBypass.svelte +++ b/src/lib/Schedule/CoverBypass.svelte @@ -1,22 +1,24 @@ <script lang="ts"> - import type { Media } from '$lib/Data/AniList/media'; - import MediaTitleDisplay from '$lib/List/MediaTitleDisplay.svelte'; - import type { SubsPleaseEpisode } from '$lib/Media/Anime/Airing/Subtitled/subsPlease'; +import type { Media } from "$lib/Data/AniList/media"; +import MediaTitleDisplay from "$lib/List/MediaTitleDisplay.svelte"; +import type { SubsPleaseEpisode } from "$lib/Media/Anime/Airing/Subtitled/subsPlease"; - import { outboundLink } from '$lib/Media/links'; - import tooltip from '$lib/Tooltip/tooltip'; - import { abbreviate } from '$lib/Utility/string'; - import settings from '$stores/settings'; +import { outboundLink } from "$lib/Media/links"; +import tooltip from "$lib/Tooltip/tooltip"; +import { abbreviate } from "$lib/Utility/string"; +import settings from "$stores/settings"; - export let media: Media | null; - export let entry: SubsPleaseEpisode; - export let cover = true; - export let showTooltip = true; +export let media: Media | null; +export let entry: SubsPleaseEpisode; +export let cover = true; +export let showTooltip = true; - const abbreviateTo = 40; +const abbreviateTo = 40; - const titleSelect = (media: Media | null) => - media ? media.title.english || media.title.romaji || media.title.native : null; +const titleSelect = (media: Media | null) => + media + ? media.title.english || media.title.romaji || media.title.native + : null; </script> <a diff --git a/src/lib/Schedule/Crunchyroll.svelte b/src/lib/Schedule/Crunchyroll.svelte index 9d7c8e70..1f5f121c 100644 --- a/src/lib/Schedule/Crunchyroll.svelte +++ b/src/lib/Schedule/Crunchyroll.svelte @@ -1,47 +1,51 @@ <script lang="ts"> - import Spacer from '$lib/Layout/Spacer.svelte'; - import crunchyroll from '$lib/Data/Static/crunchyroll.json'; - import './container.css'; - - interface CrunchyrollMedia<T = number | 'soon' | 'continuing'> { - year: number; - month: number; - day: T; - title: string; - } - - type KnownMedia = { [key: string]: CrunchyrollMedia<number>[] }; - - const days: KnownMedia = crunchyroll - .filter((media) => media.day !== 'soon' && media.day !== 'continuing') - .reduce((acc: KnownMedia, media) => { - const date = new Date(media.year, media.month - 1, media.day as number).toLocaleDateString(); - - if (!acc[date]) acc[date] = []; - - acc[date].push(media as CrunchyrollMedia<number>); - - return acc; - }, {}); - const continuing: CrunchyrollMedia<number | string>[] = crunchyroll.filter( - (media) => media.day === 'continuing' - ); - const soon: CrunchyrollMedia<number | string>[] = crunchyroll.filter( - (media) => media.day === 'soon' - ); - - $: columnCount = Math.ceil(Object.keys(days).length / 2); - - const ordinalSuffix = (i: number) => { - const j = i % 10; - const k = i % 100; - - if (j === 1 && k !== 11) return i + 'st'; - if (j === 2 && k !== 12) return i + 'nd'; - if (j === 3 && k !== 13) return i + 'rd'; - - return i + 'th'; - }; +import Spacer from "$lib/Layout/Spacer.svelte"; +import crunchyroll from "$lib/Data/Static/crunchyroll.json"; +import "./container.css"; + +interface CrunchyrollMedia<T = number | "soon" | "continuing"> { + year: number; + month: number; + day: T; + title: string; +} + +type KnownMedia = { [key: string]: CrunchyrollMedia<number>[] }; + +const days: KnownMedia = crunchyroll + .filter((media) => media.day !== "soon" && media.day !== "continuing") + .reduce((acc: KnownMedia, media) => { + const date = new Date( + media.year, + media.month - 1, + media.day as number, + ).toLocaleDateString(); + + if (!acc[date]) acc[date] = []; + + acc[date].push(media as CrunchyrollMedia<number>); + + return acc; + }, {}); +const continuing: CrunchyrollMedia<number | string>[] = crunchyroll.filter( + (media) => media.day === "continuing", +); +const soon: CrunchyrollMedia<number | string>[] = crunchyroll.filter( + (media) => media.day === "soon", +); + +$: columnCount = Math.ceil(Object.keys(days).length / 2); + +const ordinalSuffix = (i: number) => { + const j = i % 10; + const k = i % 100; + + if (j === 1 && k !== 11) return i + "st"; + if (j === 2 && k !== 12) return i + "nd"; + if (j === 3 && k !== 13) return i + "rd"; + + return i + "th"; +}; </script> <div class="list-container" id="crunchyroll" style={`column-count: ${columnCount};`}> diff --git a/src/lib/Schedule/Days.svelte b/src/lib/Schedule/Days.svelte index 99955897..ec36be5c 100644 --- a/src/lib/Schedule/Days.svelte +++ b/src/lib/Schedule/Days.svelte @@ -1,104 +1,122 @@ <script lang="ts"> - import { browser } from '$app/environment'; - import { mediaListCollection, Type, type Media } from '$lib/Data/AniList/media'; - import { findClosestMedia } from '$lib/Media/Anime/Airing/Subtitled/match'; - import type { SubsPlease, SubsPleaseEpisode } from '$lib/Media/Anime/Airing/Subtitled/subsPlease'; - import { outboundLink } from '$lib/Media/links'; - import { parseOrDefault } from '$lib/Utility/parameters'; - import settings from '$stores/settings'; - import CoverBypass from './CoverBypass.svelte'; - import '$lib/List/covers.css'; - import ParallaxImage from '$lib/Image/ParallaxImage.svelte'; - import LinkedTooltip from '$lib/Tooltip/LinkedTooltip.svelte'; - import { onMount } from 'svelte'; - import identity from '$stores/identity'; - import anime from '$stores/anime'; - import lastPruneTimes from '$stores/lastPruneTimes'; - import Message from '$lib/Loading/Message.svelte'; - import Skeleton from '$lib/Loading/Skeleton.svelte'; - import Error from '$lib/Error/RateLimited.svelte'; - - export let subsPlease: SubsPlease; - export let scheduledMedia: Partial<Media[]>; - export let forceListMode = false; - export let user; - - const urlParameters = browser ? new URLSearchParams(window.location.search) : null; - let day: string | null = parseOrDefault(urlParameters, 'day', null); - - let mediaListPromise: Promise<Media[]>; - - onMount(async () => { - if (user === undefined || $identity.id === -2) mediaListPromise = Promise.resolve([]); - else - mediaListPromise = mediaListCollection( - user, - $identity, - Type.Anime, - $anime, - $lastPruneTimes.anime, - { - all: true - } - ); - }); - - const shiftSubsPleaseSchedule = (schedule: SubsPlease['schedule']) => { - const shiftedSchedule: { [key: string]: SubsPleaseEpisode[] } = {}; - - if (day && Object.keys(schedule).includes(day)) { - shiftedSchedule[day] = schedule[ - day as keyof typeof schedule - ] as unknown as SubsPleaseEpisode[]; - - return shiftedSchedule; - } - - const days = Object.keys(schedule); - const currentDayIndex = days.indexOf(new Date().toLocaleString('en-us', { weekday: 'long' })); - - days - .slice(currentDayIndex) - .concat(days.slice(0, currentDayIndex)) - .forEach((day) => { - const scheduleEntry = schedule[day as keyof typeof schedule]; - - shiftedSchedule[day] = Array.isArray(scheduleEntry) - ? scheduleEntry - : ([scheduleEntry] as unknown as SubsPleaseEpisode[]); - }); - - Object.entries(shiftedSchedule).forEach(([day, scheduleEntry]) => { - if (scheduleEntry.length === 0) { - delete shiftedSchedule[day]; - } - }); - - return shiftedSchedule; - }; - - const associateMedia = (media: (Media | undefined)[], title: string, mediaList: Media[]) => { - const closestMedia = findClosestMedia(media as Media[], title); - - if ($settings.displayScheduleFilterList && closestMedia && mediaList) - return mediaList.find((m) => m.id === closestMedia?.id) || null; - - return closestMedia; - }; - - const episode = (media: Media, weekday: string) => { - if (media.nextAiringEpisode?.episode === 1) return 1; - - if ( - media.nextAiringEpisode?.airingAt && - weekday === new Date().toLocaleString('en-us', { weekday: 'long' }) && - new Date(media.nextAiringEpisode.airingAt * 1000).getTime() - new Date().getTime() > - 24 * 60 * 60 * 1000 - ) - return media.nextAiringEpisode?.episode - 1; - - return media.nextAiringEpisode?.episode || 1; - }; +import { browser } from "$app/environment"; +import type { AniListAuthorisation } from "$lib/Data/AniList/identity"; +import { mediaListCollection, Type, type Media } from "$lib/Data/AniList/media"; +import { hydrateMediaListCache } from "$lib/Data/AniList/cacheHydration"; +import { findClosestMedia } from "$lib/Media/Anime/Airing/Subtitled/match"; +import type { + SubsPlease, + SubsPleaseEpisode, +} from "$lib/Media/Anime/Airing/Subtitled/subsPlease"; +import { outboundLink } from "$lib/Media/links"; +import { parseOrDefault } from "$lib/Utility/parameters"; +import settings from "$stores/settings"; +import CoverBypass from "./CoverBypass.svelte"; +import "$lib/List/covers.css"; +import ParallaxImage from "$lib/Image/ParallaxImage.svelte"; +import LinkedTooltip from "$lib/Tooltip/LinkedTooltip.svelte"; +import { onMount } from "svelte"; +import identity from "$stores/identity"; +import anime from "$stores/anime"; +import lastPruneTimes from "$stores/lastPruneTimes"; +import Message from "$lib/Loading/Message.svelte"; +import Skeleton from "$lib/Loading/Skeleton.svelte"; +import RateLimitedError from "$lib/Error/RateLimited.svelte"; + +export let subsPlease: SubsPlease; +export let scheduledMedia: Partial<Media[]>; +export let forceListMode = false; +export let user: AniListAuthorisation | undefined; + +const urlParameters = browser + ? new URLSearchParams(window.location.search) + : null; +let day: string | null = parseOrDefault(urlParameters, "day", null); + +let mediaListPromise: Promise<Media[]>; + +onMount(async () => { + if (user === undefined || $identity.id === -2) + mediaListPromise = Promise.resolve([]); + else { + await hydrateMediaListCache("anime"); + + mediaListPromise = mediaListCollection( + user, + $identity, + Type.Anime, + $anime, + $lastPruneTimes.anime, + { + all: true, + }, + ); + } +}); + +const shiftSubsPleaseSchedule = (schedule: SubsPlease["schedule"]) => { + const shiftedSchedule: { [key: string]: SubsPleaseEpisode[] } = {}; + + if (day && Object.keys(schedule).includes(day)) { + shiftedSchedule[day] = schedule[ + day as keyof typeof schedule + ] as unknown as SubsPleaseEpisode[]; + + return shiftedSchedule; + } + + const days = Object.keys(schedule); + const currentDayIndex = days.indexOf( + new Date().toLocaleString("en-us", { weekday: "long" }), + ); + + days + .slice(currentDayIndex) + .concat(days.slice(0, currentDayIndex)) + .forEach((day) => { + const scheduleEntry = schedule[day as keyof typeof schedule]; + + shiftedSchedule[day] = Array.isArray(scheduleEntry) + ? scheduleEntry + : ([scheduleEntry] as unknown as SubsPleaseEpisode[]); + }); + + Object.entries(shiftedSchedule).forEach(([day, scheduleEntry]) => { + if (scheduleEntry.length === 0) { + delete shiftedSchedule[day]; + } + }); + + return shiftedSchedule; +}; + +const associateMedia = ( + media: (Media | undefined)[], + title: string, + mediaList: Media[], +) => { + const closestMedia = findClosestMedia(media as Media[], title); + + if ($settings.displayScheduleFilterList && closestMedia && mediaList) + return mediaList.find((m) => m.id === closestMedia?.id) || null; + + return closestMedia; +}; + +const episode = (media: Media, weekday: string) => { + if (media.nextAiringEpisode?.episode === 1) return 1; + + if ( + media.nextAiringEpisode?.airingAt && + weekday === new Date().toLocaleString("en-us", { weekday: "long" }) && + new Date(media.nextAiringEpisode.airingAt * 1000).getTime() - + new Date().getTime() > + 24 * 60 * 60 * 1000 + ) + return media.nextAiringEpisode?.episode - 1; + + return media.nextAiringEpisode?.episode || 1; +}; </script> {#await mediaListPromise} @@ -197,7 +215,7 @@ </details> {/each} {:catch} - <Error type="Media lists" loginSessionError={false} card list={false} /> + <RateLimitedError type="Media lists" loginSessionError={false} card list={false} /> {/await} <style> diff --git a/src/lib/Schedule/container.css b/src/lib/Schedule/container.css index 8690629d..3a3beb1f 100644 --- a/src/lib/Schedule/container.css +++ b/src/lib/Schedule/container.css @@ -1,3 +1,3 @@ .list-container { - column-width: 250px; + column-width: 250px; } |