From b89d0e7dada186e31be37e62a7a75efc2dbe9c99 Mon Sep 17 00:00:00 2001
From: Fuwn <contact@fuwn.me>
Date: Sat, 26 Aug 2023 22:29:03 -0700
Subject: feat: initial build

---
 src/lib/List/Due/MangaList.svelte | 114 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)
 create mode 100644 src/lib/List/Due/MangaList.svelte

(limited to 'src/lib/List/Due/MangaList.svelte')

diff --git a/src/lib/List/Due/MangaList.svelte b/src/lib/List/Due/MangaList.svelte
new file mode 100644
index 00000000..3016ed57
--- /dev/null
+++ b/src/lib/List/Due/MangaList.svelte
@@ -0,0 +1,114 @@
+<script lang="ts">
+	import { mediaListCollection, Type, flattenLists, type Media } from '$lib/AniList/media';
+	import type { UserIdentity, AniListAuthorisation } from '$lib/AniList/identity';
+	import { onMount } from 'svelte';
+	import { chapterCount } from '$lib/mangadex';
+	import lastPruneAt from '../../../stores/lastPruneAt';
+	import cacheMangaMinutes from '../../../stores/cacheMangaMinutes';
+
+	export let user: AniListAuthorisation;
+	export let identity: UserIdentity;
+	export let displayUnresolved: boolean;
+
+	let mangaLists: any;
+	let startTime: number;
+	let endTime: number;
+
+	onMount(async () => {
+		mangaLists = mediaListCollection(user, identity, Type.Manga);
+	});
+
+	const cleanMedia = async (media: object[][], displayUnresolved: boolean) => {
+		startTime = performance.now();
+
+		if ($lastPruneAt == '') {
+			lastPruneAt.set(new Date().getTime().toString());
+		} else {
+			if ((new Date().getTime() - Number($lastPruneAt)) / 1000 / 60 > Number($cacheMangaMinutes)) {
+				lastPruneAt.set(new Date().getTime().toString());
+			}
+		}
+
+		const flattenedLists = flattenLists(media);
+		const releasingMedia = flattenedLists.filter(
+			(media: Media) =>
+				media['status'] == 'RELEASING' &&
+				media['format'] != 'NOVEL' &&
+				(media['mediaListEntry'] || { progress: 0 })['progress'] >= 1
+		);
+		let finalMedia = releasingMedia;
+
+		const chapterPromises = finalMedia.map((m: Media) => chapterCount(m));
+		const chapterCounts = await Promise.all(chapterPromises);
+
+		finalMedia.forEach((m: Media, i) => {
+			m.episodes = chapterCounts[i];
+		});
+
+		if (!displayUnresolved) {
+			finalMedia = finalMedia.filter((m: Media) => m.episodes !== null);
+		}
+
+		finalMedia.sort((a: Media, b: Media) => {
+			return (
+				(a.episodes || 9999) -
+				a.mediaListEntry!.progress -
+				((b.episodes || 9999) - b.mediaListEntry!.progress)
+			);
+		});
+
+		finalMedia = finalMedia.filter((item, index, array) => {
+			return (
+				array.findIndex((i) => {
+					return i.id === item.id;
+				}) === index &&
+				(item.episodes === null && displayUnresolved
+					? true
+					: (item.mediaListEntry?.progress || 0) < item.episodes)
+			);
+		});
+		endTime = performance.now() - startTime;
+
+		return finalMedia;
+	};
+
+	const updateMedia = async (id: number, progress: number | undefined) => {
+		mangaLists = mediaListCollection(user, identity, Type.Manga);
+
+		await fetch(`/anilist/increment?id=${id}&progress=${progress! + 1}`);
+	};
+</script>
+
+{#await mangaLists}
+	<summary>Manga</summary>
+
+	<ul><li>Loading ...</li></ul>
+{:then media}
+	<summary>
+		Manga {#await cleanMedia(media, displayUnresolved) then count}[{count.length}]{/await}
+		<small style="opacity: 50%">{endTime / 1000}s</small>
+	</summary>
+
+	<ul>
+		{#await cleanMedia(media, displayUnresolved)}
+			<li>Loading ...</li>
+		{:then cleanedMedia}
+			{#each cleanedMedia as manga}
+				<li>
+					<a href={`https://anilist.co/manga/${manga['id']}`} target="_blank">
+						{manga['title']['english'] || manga['title']['romaji'] || manga['title']['native']}
+					</a>
+					{(manga['mediaListEntry'] || { progress: 0 })['progress']}
+					<a href="#" on:click={() => updateMedia(manga.id, manga.mediaListEntry?.progress)}>+</a>
+					[{manga['episodes'] || '?'}]
+				</li>
+			{/each}
+		{:catch}
+			<li>
+				Media could not be loaded. You might have been <a
+					href="https://en.wikipedia.org/wiki/Rate_limiting">rate limited</a
+				>.
+			</li>
+		{/await}
+	</ul>
+{/await}
-- 
cgit v1.2.3

