diff options
Diffstat (limited to 'src/lib/List/Anime/UpcomingAnimeList.svelte')
| -rw-r--r-- | src/lib/List/Anime/UpcomingAnimeList.svelte | 202 |
1 files changed, 118 insertions, 84 deletions
diff --git a/src/lib/List/Anime/UpcomingAnimeList.svelte b/src/lib/List/Anime/UpcomingAnimeList.svelte index 4f285b47..ed47f22f 100644 --- a/src/lib/List/Anime/UpcomingAnimeList.svelte +++ b/src/lib/List/Anime/UpcomingAnimeList.svelte @@ -1,88 +1,122 @@ <script lang="ts"> - import Spacer from '$lib/Layout/Spacer.svelte'; - import { mediaListCollection, Type, type Media } from '$lib/Data/AniList/media'; - import type { AniListAuthorisation } from '$lib/Data/AniList/identity'; - import { onMount } from 'svelte'; - import anime from '$stores/anime'; - import lastPruneTimes from '$stores/lastPruneTimes'; - import AnimeList from './AnimeListTemplate.svelte'; - import settings from '$stores/settings'; - import type { SubsPlease } from '$lib/Media/Anime/Airing/Subtitled/subsPlease'; - import { addNotification } from '$lib/Notification/store'; - import locale from '$stores/locale'; - import identity from '$stores/identity'; - import { injectAiringTime } from '$lib/Media/Anime/Airing/Subtitled/match'; - import revalidateAnime from '$stores/revalidateAnime'; - - export let user: AniListAuthorisation; - let animeLists: Promise<Media[]>; - let startTime: number; - let endTime: number; - - onMount(async () => { - startTime = performance.now(); - animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, { - addNotification, - notificationType: 'Upcoming Episodes' - }); - }); - - const cleanMedia = ( - anime: Media[], - displayUnresolved: boolean, - subsPlease: SubsPlease | null, - plannedOnly = true - ) => { - if (anime === undefined) return []; - - const filterAnime = (status: 'RELEASING' | 'NOT_YET_RELEASED') => - anime - .filter((media: Media) => media.status === status && media.nextAiringEpisode !== null) - .map((media) => injectAiringTime(media, subsPlease)) - .filter( - (media: Media) => - // Outdated media - ($settings.displayPlannedAnime ? media.mediaListEntry?.status === 'PLANNING' : false) || - (media.nextAiringEpisode || { episode: 0 }).episode - 1 <= - (media.mediaListEntry || { progress: 0 }).progress - ) - .map((media: Media) => { - // Adjust for planned anime - if ( - ($settings.displayPlannedAnime ? media.episodes !== 1 : true) && - (media.nextAiringEpisode || { episode: 0 }).episode - 1 <= 0 - ) - media.nextAiringEpisode = { episode: -1 }; - - return media; - }); - let upcomingAnime = filterAnime(plannedOnly ? 'NOT_YET_RELEASED' : 'RELEASING'); - - if (!displayUnresolved) - upcomingAnime = upcomingAnime.filter( - (media: Media) => media.nextAiringEpisode?.episode !== -1 - ); - - upcomingAnime.sort( - (a: Media, b: Media) => - (a.nextAiringEpisode?.airingAt || 9999) - (b.nextAiringEpisode?.airingAt || 9999) - ); - - if (!endTime) endTime = performance.now() - startTime; - - return upcomingAnime; - }; - - $: { - if ($revalidateAnime) { - $revalidateAnime = false; - $lastPruneTimes.anime = -1; - animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, { - addNotification, - notificationType: 'Upcoming Episodes' - }); - } - } +import Spacer from "$lib/Layout/Spacer.svelte"; +import { mediaListCollection, Type, type Media } from "$lib/Data/AniList/media"; +import { hydrateMediaListCache } from "$lib/Data/AniList/cacheHydration"; +import type { AniListAuthorisation } from "$lib/Data/AniList/identity"; +import { onMount } from "svelte"; +import anime from "$stores/anime"; +import lastPruneTimes from "$stores/lastPruneTimes"; +import AnimeList from "./AnimeListTemplate.svelte"; +import settings from "$stores/settings"; +import type { SubsPlease } from "$lib/Media/Anime/Airing/Subtitled/subsPlease"; +import { addNotification } from "$lib/Notification/store"; +import locale from "$stores/locale"; +import identity from "$stores/identity"; +import { injectAiringTime } from "$lib/Media/Anime/Airing/Subtitled/match"; +import { + hasDueEpisodes, + hasNoAiredEpisodes, +} from "$lib/Media/Anime/Airing/classify"; +import revalidateAnime from "$stores/revalidateAnime"; + +export let user: AniListAuthorisation; +let animeLists: Promise<Media[]>; +let startTime: number; +let endTime: number; + +onMount(async () => { + await hydrateMediaListCache("anime"); + + startTime = performance.now(); + animeLists = mediaListCollection( + user, + $identity, + Type.Anime, + $anime, + $lastPruneTimes.anime, + { + addNotification, + notificationType: "Upcoming Episodes", + }, + ); +}); + +const cleanMedia = ( + anime: Media[], + displayUnresolved: boolean, + subsPlease: SubsPlease | null, + plannedOnly = true, +) => { + if (anime === undefined) return []; + + const filterAnime = (status: "RELEASING" | "NOT_YET_RELEASED") => + anime + .filter( + (media: Media) => + media.status === status && media.nextAiringEpisode !== null, + ) + .map((media) => injectAiringTime(media, subsPlease)) + .filter( + (media: Media) => + // Outdated media + ($settings.displayPlannedAnime + ? media.mediaListEntry?.status === "PLANNING" + : false) || !hasDueEpisodes(media), + ) + .map((media: Media) => + // Adjust for planned anime + ($settings.displayPlannedAnime ? media.episodes !== 1 : true) && + hasNoAiredEpisodes(media) + ? { + ...media, + nextAiringEpisode: { + ...(media.nextAiringEpisode || { episode: 0 }), + episode: -1, + }, + } + : media, + ); + let upcomingAnime = filterAnime( + plannedOnly ? "NOT_YET_RELEASED" : "RELEASING", + ); + + if (!displayUnresolved) + upcomingAnime = upcomingAnime.filter( + (media: Media) => media.nextAiringEpisode?.episode !== -1, + ); + + upcomingAnime.sort( + (a: Media, b: Media) => + (a.nextAiringEpisode?.airingAt || 9999) - + (b.nextAiringEpisode?.airingAt || 9999), + ); + + if (!endTime) endTime = performance.now() - startTime; + + return upcomingAnime; +}; + +let lastAnimeRevalidation = 0; + +$: if ($revalidateAnime > lastAnimeRevalidation) { + lastAnimeRevalidation = $revalidateAnime; + + startTime = performance.now(); + endTime = -1; + + animeLists = mediaListCollection( + user, + $identity, + Type.Anime, + $anime, + $lastPruneTimes.anime, + { + forcePrune: true, + addNotification, + notificationType: "Upcoming Episodes", + }, + ); +} </script> <AnimeList |