aboutsummaryrefslogtreecommitdiff
path: root/src/lib/List/Anime/UpcomingAnimeList.svelte
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/List/Anime/UpcomingAnimeList.svelte')
-rw-r--r--src/lib/List/Anime/UpcomingAnimeList.svelte202
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