aboutsummaryrefslogtreecommitdiff
path: root/src/lib/List/Anime
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-10-09 00:41:20 -0700
committerFuwn <[email protected]>2024-10-09 00:41:43 -0700
commit998b63a35256ac985a5a2714dd1ca451af4dfd8a (patch)
tree50796121a9d5ab0330fdc5d7e098bda2860d9726 /src/lib/List/Anime
parentfeat(graphql): add badgeCount field (diff)
downloaddue.moe-998b63a35256ac985a5a2714dd1ca451af4dfd8a.tar.xz
due.moe-998b63a35256ac985a5a2714dd1ca451af4dfd8a.zip
chore(prettier): use spaces instead of tabs
Diffstat (limited to 'src/lib/List/Anime')
-rw-r--r--src/lib/List/Anime/AnimeListTemplate.svelte170
-rw-r--r--src/lib/List/Anime/CleanAnimeList.svelte312
-rw-r--r--src/lib/List/Anime/CompletedAnimeList.svelte180
-rw-r--r--src/lib/List/Anime/DueAnimeList.svelte154
-rw-r--r--src/lib/List/Anime/DueIndexColumn.svelte28
-rw-r--r--src/lib/List/Anime/PlaceholderList.svelte26
-rw-r--r--src/lib/List/Anime/UpcomingAnimeList.svelte180
7 files changed, 525 insertions, 525 deletions
diff --git a/src/lib/List/Anime/AnimeListTemplate.svelte b/src/lib/List/Anime/AnimeListTemplate.svelte
index 0bb2dfe8..08583d7c 100644
--- a/src/lib/List/Anime/AnimeListTemplate.svelte
+++ b/src/lib/List/Anime/AnimeListTemplate.svelte
@@ -1,96 +1,96 @@
<script lang="ts">
- /* eslint svelte/no-at-html-tags: "off" */
+ /* eslint svelte/no-at-html-tags: "off" */
- import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
- import type { Media } from '$lib/Data/AniList/media';
- import Error from '$lib/Error/RateLimited.svelte';
- import settings from '$stores/settings';
- import CleanAnimeList from './CleanAnimeList.svelte';
- import ListTitle from '../ListTitle.svelte';
- import type { SubsPlease } from '$lib/Media/Anime/Airing/Subtitled/subsPlease';
- import PlaceholderList from './PlaceholderList.svelte';
- import { browser } from '$app/environment';
- import { onMount } from 'svelte';
- import subsPlease from '$stores/subsPlease';
- import identity from '$stores/identity';
+ import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
+ import type { Media } from '$lib/Data/AniList/media';
+ import Error from '$lib/Error/RateLimited.svelte';
+ import settings from '$stores/settings';
+ import CleanAnimeList from './CleanAnimeList.svelte';
+ import ListTitle from '../ListTitle.svelte';
+ import type { SubsPlease } from '$lib/Media/Anime/Airing/Subtitled/subsPlease';
+ import PlaceholderList from './PlaceholderList.svelte';
+ import { browser } from '$app/environment';
+ import { onMount } from 'svelte';
+ import subsPlease from '$stores/subsPlease';
+ import identity from '$stores/identity';
- export let endTime: number;
- export let cleanMedia: (
- media: Media[],
- displayUnresolved: boolean,
- subsPlease: SubsPlease | null,
- plannedOnly?: boolean
- ) => Media[];
- export let animeLists: Promise<Media[]>;
- export let user: AniListAuthorisation;
- export let title: any;
- export let completed = false;
- export let plannedOnly = false;
- export let upcoming = false;
- export let notYetReleased = false;
- export let dummy = false;
+ export let endTime: number;
+ export let cleanMedia: (
+ media: Media[],
+ displayUnresolved: boolean,
+ subsPlease: SubsPlease | null,
+ plannedOnly?: boolean
+ ) => Media[];
+ export let animeLists: Promise<Media[]>;
+ export let user: AniListAuthorisation;
+ export let title: any;
+ export let completed = false;
+ export let plannedOnly = false;
+ export let upcoming = false;
+ export let notYetReleased = false;
+ export let dummy = false;
- let lastUpdatedMedia = -1;
- let previousAnimeList: Media[];
- let pendingUpdate: number | null = null;
- let lastListSize = 8;
+ let lastUpdatedMedia = -1;
+ let previousAnimeList: Media[];
+ let pendingUpdate: number | null = null;
+ let lastListSize = 8;
- onMount(() => {
- if (browser) {
- const lastStoredList = localStorage.getItem(
- `last${
- notYetReleased ? 'NotYetReleased' : upcoming ? 'Upcoming' : completed ? 'Completed' : ''
- }AnimeListLength`
- );
- if (lastStoredList) lastListSize = parseInt(lastStoredList);
- }
- });
+ onMount(() => {
+ if (browser) {
+ const lastStoredList = localStorage.getItem(
+ `last${
+ notYetReleased ? 'NotYetReleased' : upcoming ? 'Upcoming' : completed ? 'Completed' : ''
+ }AnimeListLength`
+ );
+ if (lastStoredList) lastListSize = parseInt(lastStoredList);
+ }
+ });
</script>
{#if !$subsPlease && !dummy}
- <PlaceholderList count={lastListSize} {title} />
+ <PlaceholderList count={lastListSize} {title} />
{:else}
- {#await animeLists}
- {#if previousAnimeList}
- <CleanAnimeList
- media={previousAnimeList}
- {title}
- bind:animeLists
- {user}
- {endTime}
- bind:lastUpdatedMedia
- {completed}
- {notYetReleased}
- {upcoming}
- bind:previousAnimeList
- bind:pendingUpdate
- {dummy}
- />
- {:else}
- <PlaceholderList count={lastListSize} {title} />
- {/if}
- {:then media}
- {#if $identity.id === -2 && !dummy}
- <PlaceholderList count={lastListSize} {title} />
- {:else}
- <CleanAnimeList
- media={cleanMedia(media, $settings.displayUnresolved, $subsPlease, plannedOnly)}
- {title}
- bind:animeLists
- {user}
- {endTime}
- bind:lastUpdatedMedia
- {completed}
- {notYetReleased}
- {upcoming}
- bind:previousAnimeList
- bind:pendingUpdate
- {dummy}
- />
- {/if}
- {:catch}
- <ListTitle time={0} count={-1337} {title} />
+ {#await animeLists}
+ {#if previousAnimeList}
+ <CleanAnimeList
+ media={previousAnimeList}
+ {title}
+ bind:animeLists
+ {user}
+ {endTime}
+ bind:lastUpdatedMedia
+ {completed}
+ {notYetReleased}
+ {upcoming}
+ bind:previousAnimeList
+ bind:pendingUpdate
+ {dummy}
+ />
+ {:else}
+ <PlaceholderList count={lastListSize} {title} />
+ {/if}
+ {:then media}
+ {#if $identity.id === -2 && !dummy}
+ <PlaceholderList count={lastListSize} {title} />
+ {:else}
+ <CleanAnimeList
+ media={cleanMedia(media, $settings.displayUnresolved, $subsPlease, plannedOnly)}
+ {title}
+ bind:animeLists
+ {user}
+ {endTime}
+ bind:lastUpdatedMedia
+ {completed}
+ {notYetReleased}
+ {upcoming}
+ bind:previousAnimeList
+ bind:pendingUpdate
+ {dummy}
+ />
+ {/if}
+ {:catch}
+ <ListTitle time={0} count={-1337} {title} />
- <Error />
- {/await}
+ <Error />
+ {/await}
{/if}
diff --git a/src/lib/List/Anime/CleanAnimeList.svelte b/src/lib/List/Anime/CleanAnimeList.svelte
index f9584659..0220a366 100644
--- a/src/lib/List/Anime/CleanAnimeList.svelte
+++ b/src/lib/List/Anime/CleanAnimeList.svelte
@@ -1,168 +1,168 @@
<script lang="ts">
- /* eslint svelte/no-at-html-tags: "off" */
-
- import settings from '$stores/settings';
- import type { Media } from '$lib/Data/AniList/media';
- import { cleanCache, incrementMediaProgress } from '$lib/Media/Anime/cache';
- import { totalEpisodes } from '$lib/Media/Anime/episodes';
- import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
- import ListTitle from '../ListTitle.svelte';
- import { onDestroy, onMount } from 'svelte';
- import AiringTime from '$lib/Media/Anime/Airing/AiringTime.svelte';
- import { browser } from '$app/environment';
- import identity from '$stores/identity';
- import '../covers.css';
- import revalidateAnime from '$stores/revalidateAnime';
- import CleanGrid from '$lib/List/CleanGrid.svelte';
- import CleanList from '../CleanList.svelte';
-
- export let media: Media[];
- export let title: any;
- export let animeLists: Promise<Media[]>;
- export let user: AniListAuthorisation;
- export let endTime: number;
- export let lastUpdatedMedia: number;
- export let completed = false;
- export let previousAnimeList: Media[];
- export let pendingUpdate: number | null;
- export let upcoming = false;
- export let notYetReleased = false;
- export let dummy = false;
-
- let keyCacher: NodeJS.Timeout;
- let totalEpisodeDueCount = media
- .map((anime) => {
- if (anime.mediaListEntry?.status === 'COMPLETED') return 0;
-
- return (anime.nextAiringEpisode?.episode || 1) - (anime.mediaListEntry?.progress || 0) - 1;
- })
- .reduce((a, b) => a + b, 0);
-
- onMount(() => {
- if (dummy) return;
-
- keyCacher = setInterval(
- () => {
- media = media;
-
- if (
- media.some(
- (m) => m.nextAiringEpisode?.airingAt && m.nextAiringEpisode.airingAt < Date.now() / 1000
- )
- )
- animeLists = cleanCache(user, $identity);
- },
- (() => {
- const airingAt = media
- .filter(
- (m) =>
- (m.status === 'RELEASING' || m.status === 'NOT_YET_RELEASED') &&
- m.nextAiringEpisode?.airingAt
- )
- .find((m) => m.nextAiringEpisode?.airingAt)?.nextAiringEpisode?.airingAt;
- const untilAiring = airingAt
- ? Math.round((airingAt - Date.now() / 1000) * 100) / 100
- : undefined;
-
- return untilAiring ? (untilAiring < 0 ? 1000 : untilAiring) : 1000;
- })()
- );
-
- if (browser)
- localStorage.setItem(
- `last${
- notYetReleased ? 'NotYetReleased' : upcoming ? 'Upcoming' : completed ? 'Completed' : ''
- }AnimeListLength`,
- media.length.toString()
- );
- });
-
- onDestroy(() => clearInterval(keyCacher));
-
- const increment = (anime: Media, progress: number) => {
- if (!dummy && pendingUpdate !== anime.id) {
- $revalidateAnime = true;
- lastUpdatedMedia = anime.id;
- pendingUpdate = anime.id;
-
- incrementMediaProgress(anime.id, anime.mediaListEntry?.progress, user, () => {
- const mediaListEntry = media.find((m) => m.id === anime.id)?.mediaListEntry;
-
- if (mediaListEntry) mediaListEntry.progress = progress + 1;
-
- previousAnimeList = media;
- animeLists = cleanCache(user, $identity);
- pendingUpdate = null;
- });
- }
- };
+ /* eslint svelte/no-at-html-tags: "off" */
+
+ import settings from '$stores/settings';
+ import type { Media } from '$lib/Data/AniList/media';
+ import { cleanCache, incrementMediaProgress } from '$lib/Media/Anime/cache';
+ import { totalEpisodes } from '$lib/Media/Anime/episodes';
+ import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
+ import ListTitle from '../ListTitle.svelte';
+ import { onDestroy, onMount } from 'svelte';
+ import AiringTime from '$lib/Media/Anime/Airing/AiringTime.svelte';
+ import { browser } from '$app/environment';
+ import identity from '$stores/identity';
+ import '../covers.css';
+ import revalidateAnime from '$stores/revalidateAnime';
+ import CleanGrid from '$lib/List/CleanGrid.svelte';
+ import CleanList from '../CleanList.svelte';
+
+ export let media: Media[];
+ export let title: any;
+ export let animeLists: Promise<Media[]>;
+ export let user: AniListAuthorisation;
+ export let endTime: number;
+ export let lastUpdatedMedia: number;
+ export let completed = false;
+ export let previousAnimeList: Media[];
+ export let pendingUpdate: number | null;
+ export let upcoming = false;
+ export let notYetReleased = false;
+ export let dummy = false;
+
+ let keyCacher: NodeJS.Timeout;
+ let totalEpisodeDueCount = media
+ .map((anime) => {
+ if (anime.mediaListEntry?.status === 'COMPLETED') return 0;
+
+ return (anime.nextAiringEpisode?.episode || 1) - (anime.mediaListEntry?.progress || 0) - 1;
+ })
+ .reduce((a, b) => a + b, 0);
+
+ onMount(() => {
+ if (dummy) return;
+
+ keyCacher = setInterval(
+ () => {
+ media = media;
+
+ if (
+ media.some(
+ (m) => m.nextAiringEpisode?.airingAt && m.nextAiringEpisode.airingAt < Date.now() / 1000
+ )
+ )
+ animeLists = cleanCache(user, $identity);
+ },
+ (() => {
+ const airingAt = media
+ .filter(
+ (m) =>
+ (m.status === 'RELEASING' || m.status === 'NOT_YET_RELEASED') &&
+ m.nextAiringEpisode?.airingAt
+ )
+ .find((m) => m.nextAiringEpisode?.airingAt)?.nextAiringEpisode?.airingAt;
+ const untilAiring = airingAt
+ ? Math.round((airingAt - Date.now() / 1000) * 100) / 100
+ : undefined;
+
+ return untilAiring ? (untilAiring < 0 ? 1000 : untilAiring) : 1000;
+ })()
+ );
+
+ if (browser)
+ localStorage.setItem(
+ `last${
+ notYetReleased ? 'NotYetReleased' : upcoming ? 'Upcoming' : completed ? 'Completed' : ''
+ }AnimeListLength`,
+ media.length.toString()
+ );
+ });
+
+ onDestroy(() => clearInterval(keyCacher));
+
+ const increment = (anime: Media, progress: number) => {
+ if (!dummy && pendingUpdate !== anime.id) {
+ $revalidateAnime = true;
+ lastUpdatedMedia = anime.id;
+ pendingUpdate = anime.id;
+
+ incrementMediaProgress(anime.id, anime.mediaListEntry?.progress, user, () => {
+ const mediaListEntry = media.find((m) => m.id === anime.id)?.mediaListEntry;
+
+ if (mediaListEntry) mediaListEntry.progress = progress + 1;
+
+ previousAnimeList = media;
+ animeLists = cleanCache(user, $identity);
+ pendingUpdate = null;
+ });
+ }
+ };
</script>
<ListTitle
- time={endTime / 1000}
- count={$settings.displayTotalDueEpisodes && !notYetReleased && !completed && !upcoming
- ? totalEpisodeDueCount
- : media.length}
- {title}
- hideTime={dummy}
- hideCount={dummy}
+ time={endTime / 1000}
+ count={$settings.displayTotalDueEpisodes && !notYetReleased && !completed && !upcoming
+ ? totalEpisodeDueCount
+ : media.length}
+ {title}
+ hideTime={dummy}
+ hideCount={dummy}
/>
{#if media.length === 0}
- No anime to display. <button on:click={() => (animeLists = cleanCache(user, $identity))}>
- Force refresh
- </button>
+ No anime to display. <button on:click={() => (animeLists = cleanCache(user, $identity))}>
+ Force refresh
+ </button>
{/if}
{#if $settings.displayCoverModeAnime}
- <CleanGrid {media} {dummy} type="anime" {upcoming} {notYetReleased}>
- <div slot="title" let:title={anime} let:progress>
- {#if !upcoming && !notYetReleased}
- {pendingUpdate === anime.id ? progress + 1 : progress}{@html totalEpisodes(anime)}
- <button
- class={`button-square button-action ${pendingUpdate === anime.id ? 'opaque' : ''}`}
- style={pendingUpdate === anime.id ? 'pointer-events: none;' : ''}
- on:click={() => increment(anime, progress)}>+</button
- >
- {#if !completed || dummy}
- [{anime.nextAiringEpisode?.episode === -1
- ? '?'
- : (anime.nextAiringEpisode?.episode || 1) - 1}]
- <br />
- <AiringTime originalAnime={anime} />
- {/if}
- {:else}
- <AiringTime originalAnime={anime} upcoming={true} />
- {/if}
- </div>
- </CleanGrid>
+ <CleanGrid {media} {dummy} type="anime" {upcoming} {notYetReleased}>
+ <div slot="title" let:title={anime} let:progress>
+ {#if !upcoming && !notYetReleased}
+ {pendingUpdate === anime.id ? progress + 1 : progress}{@html totalEpisodes(anime)}
+ <button
+ class={`button-square button-action ${pendingUpdate === anime.id ? 'opaque' : ''}`}
+ style={pendingUpdate === anime.id ? 'pointer-events: none;' : ''}
+ on:click={() => increment(anime, progress)}>+</button
+ >
+ {#if !completed || dummy}
+ [{anime.nextAiringEpisode?.episode === -1
+ ? '?'
+ : (anime.nextAiringEpisode?.episode || 1) - 1}]
+ <br />
+ <AiringTime originalAnime={anime} />
+ {/if}
+ {:else}
+ <AiringTime originalAnime={anime} upcoming={true} />
+ {/if}
+ </div>
+ </CleanGrid>
{:else}
- <CleanList {media} type="anime" {upcoming} {notYetReleased} {lastUpdatedMedia}>
- <span slot="information" let:title={anime} let:progress>
- {#if !upcoming || notYetReleased || !$settings.displayCountdownRightAligned}
- <span class="opaque">|</span>
- {/if}
- {#if !upcoming || notYetReleased}
- <!-- {anime.mediaListEntry?.progress || 0}{@html totalEpisodes(anime)} -->
- {pendingUpdate === anime.id ? progress + 1 : progress}{@html totalEpisodes(anime)}
- <button
- class={`button-square button-action ${pendingUpdate === anime.id ? 'opaque' : ''}`}
- style={pendingUpdate === anime.id ? 'pointer-events: none;' : ''}
- on:click={() => increment(anime, progress)}>+</button
- >
- {#if !completed}
- [{anime.nextAiringEpisode?.episode === -1
- ? '?'
- : (anime.nextAiringEpisode?.episode || 1) - 1}]
- <span class:countdown={$settings.displayCountdownRightAligned}>
- <AiringTime originalAnime={anime} />
- </span>
- {/if}
- {:else}
- <span class:countdown={$settings.displayCountdownRightAligned}>
- <AiringTime originalAnime={anime} upcoming={true} />
- </span>
- {/if}
- </span>
- </CleanList>
+ <CleanList {media} type="anime" {upcoming} {notYetReleased} {lastUpdatedMedia}>
+ <span slot="information" let:title={anime} let:progress>
+ {#if !upcoming || notYetReleased || !$settings.displayCountdownRightAligned}
+ <span class="opaque">|</span>
+ {/if}
+ {#if !upcoming || notYetReleased}
+ <!-- {anime.mediaListEntry?.progress || 0}{@html totalEpisodes(anime)} -->
+ {pendingUpdate === anime.id ? progress + 1 : progress}{@html totalEpisodes(anime)}
+ <button
+ class={`button-square button-action ${pendingUpdate === anime.id ? 'opaque' : ''}`}
+ style={pendingUpdate === anime.id ? 'pointer-events: none;' : ''}
+ on:click={() => increment(anime, progress)}>+</button
+ >
+ {#if !completed}
+ [{anime.nextAiringEpisode?.episode === -1
+ ? '?'
+ : (anime.nextAiringEpisode?.episode || 1) - 1}]
+ <span class:countdown={$settings.displayCountdownRightAligned}>
+ <AiringTime originalAnime={anime} />
+ </span>
+ {/if}
+ {:else}
+ <span class:countdown={$settings.displayCountdownRightAligned}>
+ <AiringTime originalAnime={anime} upcoming={true} />
+ </span>
+ {/if}
+ </span>
+ </CleanList>
{/if}
diff --git a/src/lib/List/Anime/CompletedAnimeList.svelte b/src/lib/List/Anime/CompletedAnimeList.svelte
index 29d62724..76ec7207 100644
--- a/src/lib/List/Anime/CompletedAnimeList.svelte
+++ b/src/lib/List/Anime/CompletedAnimeList.svelte
@@ -1,108 +1,108 @@
<script lang="ts">
- 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 settings from '$stores/settings';
- import AnimeList from './AnimeListTemplate.svelte';
- import { getNotificationsContext } from 'svelte-notifications';
- import locale from '$stores/locale';
- import identity from '$stores/identity';
- import sampleAnime from '$lib/Data/Static/SampleMedia/anime.json';
+ 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 settings from '$stores/settings';
+ import AnimeList from './AnimeListTemplate.svelte';
+ import { getNotificationsContext } from 'svelte-notifications';
+ import locale from '$stores/locale';
+ import identity from '$stores/identity';
+ import sampleAnime from '$lib/Data/Static/SampleMedia/anime.json';
- export let user: AniListAuthorisation = {
- accessToken: '',
- refreshToken: '',
- expiresIn: 0,
- tokenType: ''
- };
- export let dummy = false;
+ export let user: AniListAuthorisation = {
+ accessToken: '',
+ refreshToken: '',
+ expiresIn: 0,
+ tokenType: ''
+ };
+ export let dummy = false;
- const { addNotification } = getNotificationsContext();
- let animeLists: Promise<Media[]>;
- let startTime: number;
- let endTime: number;
+ const { addNotification } = getNotificationsContext();
+ let animeLists: Promise<Media[]>;
+ let startTime: number;
+ let endTime: number;
- onMount(async () => {
- startTime = performance.now();
+ onMount(async () => {
+ startTime = performance.now();
- if (dummy) {
- animeLists = Promise.resolve(
- sampleAnime
- .filter(
- (anime) =>
- anime.episodes &&
- !anime.tags.some((tag) => tag.name === 'Nudity') &&
- !anime.tags.some((tag) => tag.name === 'Rape') &&
- !anime.tags.some((tag) => tag.name === 'Tragedy') &&
- !anime.tags.some((tag) => tag.name === 'Bondage') &&
- !anime.genres.some((genre) => genre === 'Hentai') &&
- anime.genres.some((genre) => genre === 'Comedy') &&
- anime.status !== 'NOT_YET_RELEASED' &&
- anime.episodes > 1
- )
- .sort(() => 0.5 - Math.random())
- .map((anime) => {
- const nextEpisode = Math.floor(Math.random() * (anime.episodes || 0)) + 1 || 1;
+ if (dummy) {
+ animeLists = Promise.resolve(
+ sampleAnime
+ .filter(
+ (anime) =>
+ anime.episodes &&
+ !anime.tags.some((tag) => tag.name === 'Nudity') &&
+ !anime.tags.some((tag) => tag.name === 'Rape') &&
+ !anime.tags.some((tag) => tag.name === 'Tragedy') &&
+ !anime.tags.some((tag) => tag.name === 'Bondage') &&
+ !anime.genres.some((genre) => genre === 'Hentai') &&
+ anime.genres.some((genre) => genre === 'Comedy') &&
+ anime.status !== 'NOT_YET_RELEASED' &&
+ anime.episodes > 1
+ )
+ .sort(() => 0.5 - Math.random())
+ .map((anime) => {
+ const nextEpisode = Math.floor(Math.random() * (anime.episodes || 0)) + 1 || 1;
- anime.status = 'FINISHED';
- anime.nextAiringEpisode = {
- airingAt:
- Math.floor(Date.now() / 1000) +
- Math.floor(Math.random() * 7 * 24 * 60 * 60) +
- 60 * 60,
- episode: Math.floor(Math.random() * (anime.episodes || 0)) + 1 || 1
- };
- anime.mediaListEntry.progress = Math.floor(Math.random() * nextEpisode) || 1;
+ anime.status = 'FINISHED';
+ anime.nextAiringEpisode = {
+ airingAt:
+ Math.floor(Date.now() / 1000) +
+ Math.floor(Math.random() * 7 * 24 * 60 * 60) +
+ 60 * 60,
+ episode: Math.floor(Math.random() * (anime.episodes || 0)) + 1 || 1
+ };
+ anime.mediaListEntry.progress = Math.floor(Math.random() * nextEpisode) || 1;
- return anime;
- })
- .sort(
- (a, b) => (a.nextAiringEpisode?.airingAt || 0) - (b.nextAiringEpisode?.airingAt || 0)
- )
- .slice(0, 7) as unknown as Media[]
- );
- } else {
- animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, {
- addNotification
- });
- }
- });
+ return anime;
+ })
+ .sort(
+ (a, b) => (a.nextAiringEpisode?.airingAt || 0) - (b.nextAiringEpisode?.airingAt || 0)
+ )
+ .slice(0, 7) as unknown as Media[]
+ );
+ } else {
+ animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, {
+ addNotification
+ });
+ }
+ });
- const cleanMedia = (anime: Media[]) => {
- if (anime && dummy) return anime;
+ const cleanMedia = (anime: Media[]) => {
+ if (anime && dummy) return anime;
- if (anime === undefined) return [];
+ if (anime === undefined) return [];
- const outdatedCompletedAnime = anime.filter(
- (media: Media) =>
- media.status === 'FINISHED' &&
- (media.mediaListEntry || { status: 'DROPPED' }).status != 'DROPPED' &&
- (media.mediaListEntry || { status: 'DROPPED' }).status !=
- ($settings.displayPausedMedia ? '' : 'PAUSED') &&
- (media.mediaListEntry || { progress: 0 }).progress >= ($settings.displayNotStarted ? 0 : 1)
- );
+ const outdatedCompletedAnime = anime.filter(
+ (media: Media) =>
+ media.status === 'FINISHED' &&
+ (media.mediaListEntry || { status: 'DROPPED' }).status != 'DROPPED' &&
+ (media.mediaListEntry || { status: 'DROPPED' }).status !=
+ ($settings.displayPausedMedia ? '' : 'PAUSED') &&
+ (media.mediaListEntry || { progress: 0 }).progress >= ($settings.displayNotStarted ? 0 : 1)
+ );
- outdatedCompletedAnime.sort((a: Media, b: Media) => {
- const difference = (anime: Media) =>
- anime.episodes - (anime.mediaListEntry || { progress: 0 }).progress;
+ outdatedCompletedAnime.sort((a: Media, b: Media) => {
+ const difference = (anime: Media) =>
+ anime.episodes - (anime.mediaListEntry || { progress: 0 }).progress;
- return difference(a) - difference(b);
- });
+ return difference(a) - difference(b);
+ });
- if (!endTime) endTime = performance.now() - startTime;
+ if (!endTime) endTime = performance.now() - startTime;
- return outdatedCompletedAnime;
- };
+ return outdatedCompletedAnime;
+ };
</script>
<AnimeList
- {endTime}
- {cleanMedia}
- bind:animeLists
- {user}
- title={$locale().lists.completed.anime}
- completed
- {dummy}
+ {endTime}
+ {cleanMedia}
+ bind:animeLists
+ {user}
+ title={$locale().lists.completed.anime}
+ completed
+ {dummy}
/>
diff --git a/src/lib/List/Anime/DueAnimeList.svelte b/src/lib/List/Anime/DueAnimeList.svelte
index 28744b01..0109d5fa 100644
--- a/src/lib/List/Anime/DueAnimeList.svelte
+++ b/src/lib/List/Anime/DueAnimeList.svelte
@@ -1,94 +1,94 @@
<script lang="ts">
- import { mediaListCollection, Type, type Media } from '$lib/Data/AniList/media';
- import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
- import { onDestroy, onMount } from 'svelte';
- import anime from '$stores/anime';
- import settings from '$stores/settings';
- import lastPruneTimes from '$stores/lastPruneTimes';
- import AnimeList from './AnimeListTemplate.svelte';
- import type { SubsPlease } from '$lib/Media/Anime/Airing/Subtitled/subsPlease';
- import { injectAiringTime } from '$lib/Media/Anime/Airing/Subtitled/match';
- import { getNotificationsContext } from 'svelte-notifications';
- import locale from '$stores/locale';
- import identity from '$stores/identity';
+ import { mediaListCollection, Type, type Media } from '$lib/Data/AniList/media';
+ import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
+ import { onDestroy, onMount } from 'svelte';
+ import anime from '$stores/anime';
+ import settings from '$stores/settings';
+ import lastPruneTimes from '$stores/lastPruneTimes';
+ import AnimeList from './AnimeListTemplate.svelte';
+ import type { SubsPlease } from '$lib/Media/Anime/Airing/Subtitled/subsPlease';
+ import { injectAiringTime } from '$lib/Media/Anime/Airing/Subtitled/match';
+ import { getNotificationsContext } from 'svelte-notifications';
+ import locale from '$stores/locale';
+ import identity from '$stores/identity';
- export let user: AniListAuthorisation;
+ export let user: AniListAuthorisation;
- const { addNotification } = getNotificationsContext();
- let animeLists: Promise<Media[]>;
- let startTime: number;
- let endTime: number;
+ const { addNotification } = getNotificationsContext();
+ let animeLists: Promise<Media[]>;
+ let startTime: number;
+ let endTime: number;
- const keyCacher = setInterval(() => {
- startTime = performance.now();
- endTime = -1;
- animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, {
- forcePrune: true,
- addNotification
- });
- }, $settings.cacheMinutes * 1000 * 60);
+ const keyCacher = setInterval(() => {
+ startTime = performance.now();
+ endTime = -1;
+ animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, {
+ forcePrune: true,
+ addNotification
+ });
+ }, $settings.cacheMinutes * 1000 * 60);
- onMount(async () => {
- startTime = performance.now();
- animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, {
- addNotification
- });
- });
+ onMount(async () => {
+ startTime = performance.now();
+ animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, {
+ addNotification
+ });
+ });
- onDestroy(() => clearInterval(keyCacher));
+ onDestroy(() => clearInterval(keyCacher));
- const cleanMedia = (
- anime: Media[],
- displayUnresolved: boolean,
- subsPlease: SubsPlease | null
- ) => {
- if (anime === undefined) return [];
+ const cleanMedia = (
+ anime: Media[],
+ displayUnresolved: boolean,
+ subsPlease: SubsPlease | null
+ ) => {
+ if (anime === undefined) return [];
- let dueAnime = anime
- .map((media) => injectAiringTime(media, subsPlease))
- .filter(
- // Releasing media
- (media: Media) =>
- media.status === 'RELEASING' &&
- (media.mediaListEntry || { status: 'DROPPED' }).status !=
- ($settings.displayPausedMedia ? '' : 'PAUSED') &&
- (media.mediaListEntry || { progress: 0 }).progress >=
- ($settings.displayNotStarted === true ? 0 : 1)
- )
- .filter(
- (media: Media) =>
- // Outdated media
- (media.nextAiringEpisode || { episode: 0 }).episode - 1 >
- (media.mediaListEntry || { progress: 0 }).progress
- )
- .map((media: Media) => {
- if ((media.nextAiringEpisode || { episode: 0 }).episode - 1 <= 0)
- media.nextAiringEpisode = { episode: -1 };
+ let dueAnime = anime
+ .map((media) => injectAiringTime(media, subsPlease))
+ .filter(
+ // Releasing media
+ (media: Media) =>
+ media.status === 'RELEASING' &&
+ (media.mediaListEntry || { status: 'DROPPED' }).status !=
+ ($settings.displayPausedMedia ? '' : 'PAUSED') &&
+ (media.mediaListEntry || { progress: 0 }).progress >=
+ ($settings.displayNotStarted === true ? 0 : 1)
+ )
+ .filter(
+ (media: Media) =>
+ // Outdated media
+ (media.nextAiringEpisode || { episode: 0 }).episode - 1 >
+ (media.mediaListEntry || { progress: 0 }).progress
+ )
+ .map((media: Media) => {
+ if ((media.nextAiringEpisode || { episode: 0 }).episode - 1 <= 0)
+ media.nextAiringEpisode = { episode: -1 };
- return media;
- });
+ return media;
+ });
- if (!displayUnresolved)
- dueAnime = dueAnime.filter((media: Media) => media.nextAiringEpisode?.episode !== -1);
+ if (!displayUnresolved)
+ dueAnime = dueAnime.filter((media: Media) => media.nextAiringEpisode?.episode !== -1);
- dueAnime.sort((a: Media, b: Media) => {
- if ($settings.displaySortedByDifference === true) {
- const difference = (anime: Media) =>
- (anime.nextAiringEpisode?.episode === -1
- ? 99999
- : anime.nextAiringEpisode?.episode || -1) -
- (anime.mediaListEntry || { progress: 0 }).progress;
+ dueAnime.sort((a: Media, b: Media) => {
+ if ($settings.displaySortedByDifference === true) {
+ const difference = (anime: Media) =>
+ (anime.nextAiringEpisode?.episode === -1
+ ? 99999
+ : anime.nextAiringEpisode?.episode || -1) -
+ (anime.mediaListEntry || { progress: 0 }).progress;
- return difference(a) - difference(b);
- } else {
- return (a.nextAiringEpisode?.airingAt || 9999) - (b.nextAiringEpisode?.airingAt || 9999);
- }
- });
+ return difference(a) - difference(b);
+ } else {
+ return (a.nextAiringEpisode?.airingAt || 9999) - (b.nextAiringEpisode?.airingAt || 9999);
+ }
+ });
- if (!endTime || endTime === -1) endTime = performance.now() - startTime;
+ if (!endTime || endTime === -1) endTime = performance.now() - startTime;
- return dueAnime;
- };
+ return dueAnime;
+ };
</script>
<AnimeList {endTime} {cleanMedia} bind:animeLists {user} title={$locale().lists.due.episodes} />
diff --git a/src/lib/List/Anime/DueIndexColumn.svelte b/src/lib/List/Anime/DueIndexColumn.svelte
index 6d81a661..61f2a178 100644
--- a/src/lib/List/Anime/DueIndexColumn.svelte
+++ b/src/lib/List/Anime/DueIndexColumn.svelte
@@ -1,21 +1,21 @@
<script lang="ts">
- import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
- import Skeleton from '$lib/Loading/Skeleton.svelte';
- import locale from '$stores/locale';
- import settings from '$stores/settings';
- import ListTitle from '../ListTitle.svelte';
- import AnimeList from '$lib/List/Anime/DueAnimeList.svelte';
+ import type { AniListAuthorisation } from '$lib/Data/AniList/identity';
+ import Skeleton from '$lib/Loading/Skeleton.svelte';
+ import locale from '$stores/locale';
+ import settings from '$stores/settings';
+ import ListTitle from '../ListTitle.svelte';
+ import AnimeList from '$lib/List/Anime/DueAnimeList.svelte';
- export let userIdentity: { id: number };
- export let user: AniListAuthorisation;
+ export let userIdentity: { id: number };
+ export let user: AniListAuthorisation;
</script>
<details open={!$settings.displayAnimeCollapsed} class="list list-due">
- {#if userIdentity.id !== -2}
- <AnimeList {user} />
- {:else}
- <ListTitle title={$locale().lists.due.episodes} />
+ {#if userIdentity.id !== -2}
+ <AnimeList {user} />
+ {:else}
+ <ListTitle title={$locale().lists.due.episodes} />
- <Skeleton card={false} count={5} height="0.9rem" list />
- {/if}
+ <Skeleton card={false} count={5} height="0.9rem" list />
+ {/if}
</details>
diff --git a/src/lib/List/Anime/PlaceholderList.svelte b/src/lib/List/Anime/PlaceholderList.svelte
index 5d7eb908..1f701d79 100644
--- a/src/lib/List/Anime/PlaceholderList.svelte
+++ b/src/lib/List/Anime/PlaceholderList.svelte
@@ -1,21 +1,21 @@
<script lang="ts">
- import Skeleton from '$lib/Loading/Skeleton.svelte';
- import settings from '$stores/settings';
- import ListTitle from '../ListTitle.svelte';
- import type { Title } from '../mediaTitle';
+ import Skeleton from '$lib/Loading/Skeleton.svelte';
+ import settings from '$stores/settings';
+ import ListTitle from '../ListTitle.svelte';
+ import type { Title } from '../mediaTitle';
- export let title: Title;
- export let count = 8;
+ export let title: Title;
+ export let count = 8;
</script>
<ListTitle {title} />
<Skeleton
- card={false}
- {count}
- pad={$settings.displayCoverModeAnime}
- height={$settings.displayCoverModeAnime ? '8rem' : '0.9rem'}
- width={$settings.displayCoverModeAnime ? `${$settings.displayCoverWidth / 1.05}px` : '100%'}
- list={!$settings.displayCoverModeAnime}
- grid={$settings.displayCoverModeAnime}
+ card={false}
+ {count}
+ pad={$settings.displayCoverModeAnime}
+ height={$settings.displayCoverModeAnime ? '8rem' : '0.9rem'}
+ width={$settings.displayCoverModeAnime ? `${$settings.displayCoverWidth / 1.05}px` : '100%'}
+ list={!$settings.displayCoverModeAnime}
+ grid={$settings.displayCoverModeAnime}
/>
diff --git a/src/lib/List/Anime/UpcomingAnimeList.svelte b/src/lib/List/Anime/UpcomingAnimeList.svelte
index 7e1e2462..7b01af86 100644
--- a/src/lib/List/Anime/UpcomingAnimeList.svelte
+++ b/src/lib/List/Anime/UpcomingAnimeList.svelte
@@ -1,110 +1,110 @@
<script lang="ts">
- 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 { getNotificationsContext } from 'svelte-notifications';
- import locale from '$stores/locale';
- import identity from '$stores/identity';
- import { injectAiringTime } from '$lib/Media/Anime/Airing/Subtitled/match';
- import revalidateAnime from '$stores/revalidateAnime';
+ 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 { getNotificationsContext } from 'svelte-notifications';
+ 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;
+ export let user: AniListAuthorisation;
- const { addNotification } = getNotificationsContext();
- let animeLists: Promise<Media[]>;
- let startTime: number;
- let endTime: number;
+ const { addNotification } = getNotificationsContext();
+ 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'
- });
- });
+ 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 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 };
+ 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');
+ return media;
+ });
+ let upcomingAnime = filterAnime(plannedOnly ? 'NOT_YET_RELEASED' : 'RELEASING');
- if (!displayUnresolved)
- upcomingAnime = upcomingAnime.filter(
- (media: Media) => media.nextAiringEpisode?.episode !== -1
- );
+ 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)
- );
+ upcomingAnime.sort(
+ (a: Media, b: Media) =>
+ (a.nextAiringEpisode?.airingAt || 9999) - (b.nextAiringEpisode?.airingAt || 9999)
+ );
- if (!endTime) endTime = performance.now() - startTime;
+ if (!endTime) endTime = performance.now() - startTime;
- return upcomingAnime;
- };
+ return upcomingAnime;
+ };
- $: {
- if ($revalidateAnime) {
- $revalidateAnime = false;
- $lastPruneTimes.anime = -1;
- animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, {
- addNotification,
- notificationType: 'Upcoming Episodes'
- });
- }
- }
+ $: {
+ if ($revalidateAnime) {
+ $revalidateAnime = false;
+ $lastPruneTimes.anime = -1;
+ animeLists = mediaListCollection(user, $identity, Type.Anime, $anime, $lastPruneTimes.anime, {
+ addNotification,
+ notificationType: 'Upcoming Episodes'
+ });
+ }
+ }
</script>
<AnimeList
- {endTime}
- {cleanMedia}
- bind:animeLists
- {user}
- title={$locale().lists.upcoming.episodes}
- upcoming
+ {endTime}
+ {cleanMedia}
+ bind:animeLists
+ {user}
+ title={$locale().lists.upcoming.episodes}
+ upcoming
/>
{#if $settings.displayPlannedAnime}
- <p />
+ <p />
- <AnimeList
- {endTime}
- {cleanMedia}
- bind:animeLists
- {user}
- title={$locale().lists.upcoming.notYetReleased}
- notYetReleased
- plannedOnly
- />
+ <AnimeList
+ {endTime}
+ {cleanMedia}
+ bind:animeLists
+ {user}
+ title={$locale().lists.upcoming.notYetReleased}
+ notYetReleased
+ plannedOnly
+ />
{/if}