This commit is contained in:
Daniel Bulant 2024-10-27 00:19:33 +02:00
parent 020bd06203
commit f6dccfcafb
No known key found for this signature in database

View file

@ -35,6 +35,12 @@
Epub = "epub", Epub = "epub",
Cbz = "cbz" Cbz = "cbz"
} }
enum ChapterOrder {
Asc = "asc",
Desc = "desc"
}
let order = ChapterOrder.Desc;
export var data; export var data;
@ -53,9 +59,11 @@
let anilistData; let anilistData;
$: anilistData = manga.links && manga.links.al && anilistInfo(manga.links.al); $: anilistData = manga.links && manga.links.al && anilistInfo(manga.links.al);
let cache: { id: string, data: any, total } | null = null; let cache: { id: string, data: any, languages, total, order: ChapterOrder } | null = null;
async function getMangaChapters(id, languages) { async function getMangaChapters(id, languages: string[], order: ChapterOrder) {
if(cache?.id === id && cache.data.length >= cache.total) return cache; console.log("Getting chapters", id, languages, order);
if(cache?.id === id && cache.data.length >= cache.total && cache.order == order && arraysEqual(cache.languages, languages)) return cache;
loadingChapters = true
const params = new URLSearchParams(); const params = new URLSearchParams();
params.append("limit", "500"); params.append("limit", "500");
for(let lang of languages) for(let lang of languages)
@ -65,27 +73,28 @@
params.append("contentRating[]", "suggestive"); params.append("contentRating[]", "suggestive");
params.append("contentRating[]", "erotica"); params.append("contentRating[]", "erotica");
params.append("contentRating[]", "pornographic"); params.append("contentRating[]", "pornographic");
params.append("order[chapter]", "asc"); params.append("order[chapter]", order);
params.append("offset", cache?.id === id && cache?.data.length.toString() || 0); params.append("offset", (cache?.id === id && cache.order === order && arraysEqual(cache.languages, languages)) && cache?.data.length.toString() || 0);
const data = await request("manga/" + id + "/feed?" + params.toString()); const data = await request("manga/" + id + "/feed?" + params.toString());
if(!cache || cache.id !== id) cache = { id, data: [], total: 0 }; if(!cache || cache.id !== id || cache.order !== order || arraysEqual(cache.languages, languages)) cache = { id, data: [], total: 0, languages: languages.slice(), order };
cache.total = data.total; cache.total = data.total;
cache.data = cache.data.concat(data.data); cache.data = cache.data.concat(data.data);
return cache; cache.languages = languages.slice();
cache.order = order;
loadingChapters = false;
return chapters = cache;
} }
var chapters; var chapters;
var loadingChapters = false; var loadingChapters = false;
$: if(chapters?.id !== mangaId && !loadingChapters) { $: if(!loadingChapters) {
loadingChapters = true; getMangaChapters(mangaId, languages, order).then(async () => {
getMangaChapters(mangaId, languages).then(async data => {
chapters = data;
await tick(); await tick();
swiper.slideToClosest(); swiper.slideToClosest();
loadingChapters = false;
}); });
} }
$: console.log(loadingChapters, chapters)
console.log("manga", manga); console.log("manga", manga);
console.log("chapters", chapters); console.log("chapters", chapters);
@ -254,13 +263,17 @@
break; break;
case CoverArt.AutoVolume: case CoverArt.AutoVolume:
let art = await list; let art = await list;
items = files.map(file => { items = await Promise.all(files.map(async file => {
let cover = coverForVolumeFromArt(file[0].attributes.volume, art);
if(!cover) {
cover = imageproxy + (await getURLs(file[0])).urls[0];
}
return { return {
title: `${title} - ${getNameOf(file)}.${format}`, title: `${title} - ${getNameOf(file)}.${format}`,
chapters: file.map(chapter => `${chapter.attributes.chapter}`), chapters: file.map(chapter => `${chapter.attributes.chapter}`),
cover: coverForVolumeFromArt(file[0].attributes.volume, art), cover,
}; };
}); }));
} }
return items return items
} }
@ -392,7 +405,7 @@
if(loadingNextPage) return; if(loadingNextPage) return;
console.log("Loading next page"); console.log("Loading next page");
loadingNextPage = true; loadingNextPage = true;
chapters = await getMangaChapters(mangaId, languages); chapters = await getMangaChapters(mangaId, languages, order);
await tick(); await tick();
loadingNextPage = false; loadingNextPage = false;
swiper.slideToClosest(); swiper.slideToClosest();
@ -434,6 +447,10 @@
let coverArt: CoverArt = CoverArt.FirstPage; let coverArt: CoverArt = CoverArt.FirstPage;
let group: Group = Group.Single; let group: Group = Group.Single;
let downloadPreview = false;
$: console.log("order", order)
</script> </script>
<svelte:window on:beforeunload={beforeUnload} bind:innerWidth={width} bind:scrollY bind:innerHeight /> <svelte:window on:beforeunload={beforeUnload} bind:innerWidth={width} bind:scrollY bind:innerHeight />
@ -602,7 +619,10 @@
{text} {text}
</p> </p>
</div> </div>
<button class="download-btn" disabled={!selected.length} on:click={downloadMulti}>Download</button> <div>
<button class="download-btn" disabled={!selected.length} on:click={downloadMulti}>Download</button>
<button disabled={!selected.length && !downloadPreview} on:click={() => downloadPreview = !downloadPreview}>{downloadPreview ? "Hide" : "Show"} preview</button>
</div>
</div> </div>
<div class="options"> <div class="options">
<fieldset> <fieldset>
@ -653,15 +673,17 @@
</div> </div>
<p class="note">Splitting into multiple files may require browser permission.</p> <p class="note">Splitting into multiple files may require browser permission.</p>
<h3>Preview</h3> {#if downloadPreview}
<h3>Preview</h3>
<ShowTypeChooser /> <ShowTypeChooser />
{#await previewItems(selected, group, coverArt, format)} {#await previewItems(selected, group, coverArt, format)}
<div>Loading preview...</div> <div>Loading preview...</div>
{:then items} {:then items}
<FileItems chapters={items} /> <FileItems chapters={items} />
{/await} {/await}
{/if}
</div> </div>
<div class="flex"> <div class="flex">
@ -670,13 +692,18 @@
Do not close the tab when a download is in progress. Do not close the tab when a download is in progress.
</b> </b>
</p> </p>
<button on:click={selectAll}> <div>
{#if chapters && chapters.data.length && arraysEqual(selected, chapters.data)} <button on:click={() => order = order == ChapterOrder.Asc ? ChapterOrder.Desc : ChapterOrder.Asc}>
Deselect all {order === ChapterOrder.Desc ? "Newest first" : "Oldest first"}
{:else} </button>
Select all <button on:click={selectAll}>
{/if} {#if chapters && chapters.data.length && arraysEqual(selected, chapters.data)}
</button> Deselect all
{:else}
Select all
{/if}
</button>
</div>
</div> </div>
{#if !chapters} {#if !chapters}