add language selection

This commit is contained in:
Daniel Bulant 2024-10-26 18:45:25 +02:00
parent fa09b9c1f0
commit 1dea559aee
No known key found for this signature in database
3 changed files with 63 additions and 15 deletions

View file

@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import request, { imageproxy } from "$lib/util/request"; import request, { imageproxy } from "$lib/util/request";
export var mangaId: string; // export var mangaId: string;
export var additionalList: { export var additionalList: {
alt: string; alt: string;
src: string; src: string;
@ -9,11 +9,11 @@
height?: number; height?: number;
color?: string; color?: string;
}[] = []; }[] = [];
export var list;
export var mangaId;
let list: any; $: console.log(list)
$: list = request( $: list.then(t => console.log(t))
"cover?manga[]=" + mangaId + "&locales[]=en&locales[]=uk&locales[]=ja"
);
export var selectedImage = null; export var selectedImage = null;
</script> </script>

View file

@ -3,10 +3,6 @@ import request from '$lib/util/request';
/** @type {import('./$types').PageLoad} */ /** @type {import('./$types').PageLoad} */
export async function load({ params }) { export async function load({ params }) {
const blocked = ["227e3f72-863f-46f9-bafe-c43104ca29ee", "b0b721ff-c388-4486-aa0f-c2b0bb321512"];
if (blocked.includes(params.manga)) {
throw error(404, 'blocked because of copyright');
}
const manga = await request("manga/" + params.manga + "?includes[]=author&includes[]=cover_art&includes[]=artist&includes[]=manga"); const manga = await request("manga/" + params.manga + "?includes[]=author&includes[]=cover_art&includes[]=artist&includes[]=manga");
console.log(manga); console.log(manga);
return { return {

View file

@ -30,16 +30,19 @@
var title = manga.title.en || manga.title.jp || Object.values(manga.title)[0]; var title = manga.title.en || manga.title.jp || Object.values(manga.title)[0];
$: title = manga.title.en || manga.title.jp || Object.values(manga.title)[0]; $: title = manga.title.en || manga.title.jp || Object.values(manga.title)[0];
const defaultLanguages = ["en", "uk"];
let languages = defaultLanguages;
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, total } | null = null;
async function getMangaChapters(id) { async function getMangaChapters(id, languages) {
if(cache?.id === id && cache.data.length >= cache.total) return cache; if(cache?.id === id && cache.data.length >= cache.total) return cache;
const params = new URLSearchParams(); const params = new URLSearchParams();
params.append("limit", "500"); params.append("limit", "500");
params.append("translatedLanguage[]", "en"); for(let lang of languages)
params.append("translatedLanguage[]", "uk"); params.append("translatedLanguage[]", lang);
params.append("includes[]", "scanlation_group"); params.append("includes[]", "scanlation_group");
params.append("contentRating[]", "safe"); params.append("contentRating[]", "safe");
params.append("contentRating[]", "suggestive"); params.append("contentRating[]", "suggestive");
@ -58,7 +61,7 @@
var loadingChapters = false; var loadingChapters = false;
$: if(chapters?.id !== mangaId && !loadingChapters) { $: if(chapters?.id !== mangaId && !loadingChapters) {
loadingChapters = true; loadingChapters = true;
getMangaChapters(mangaId).then(async data => { getMangaChapters(mangaId, languages).then(async data => {
chapters = data; chapters = data;
await tick(); await tick();
swiper.slideToClosest(); swiper.slideToClosest();
@ -326,6 +329,22 @@
let uniqueChapterCount; let uniqueChapterCount;
$: uniqueChapterCount = chapters?.data.filter((t, i, a) => a.findIndex(t2 => Math.floor(t2.attributes.chapter) === Math.floor(t.attributes.chapter)) === i).length; $: uniqueChapterCount = chapters?.data.filter((t, i, a) => a.findIndex(t2 => Math.floor(t2.attributes.chapter) === Math.floor(t.attributes.chapter)) === i).length;
let list: any;
$: list = request(
"cover?limit=50&manga[]=" + mangaId + languages.map(t => "&locales[]=" + t).join("")
);
function toggleLang(lang) {
return () => {
if(languages.includes(lang)) {
languages = languages.filter(t => t !== lang);
} else {
languages.push(lang);
languages = languages;
}
}
}
</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 />
@ -423,6 +442,16 @@
{/each} {/each}
</div> </div>
{/if} {/if}
<div class="langs">
{#each manga.availableTranslatedLanguages as lang}
<button class:enabled={languages.includes(lang)} on:click={toggleLang(lang)}>
{lang}
</button>
{:else}
No languages available
{/each}
</div>
<div class="flex"> <div class="flex">
<div class="linklist"> <div class="linklist">
@ -491,7 +520,10 @@
<button disabled={!selected.length} on:click={downloadMulti}>Download</button> <button disabled={!selected.length} on:click={downloadMulti}>Download</button>
<button disabled={!selected.length} on:click={downloadSeparate}>Download Separate</button> <button disabled={!selected.length} on:click={downloadSeparate}>Download Separate</button>
</div> </div>
<div class="download-options">
</div>
<div class="flex"> <div class="flex">
<p> <p>
<b> <b>
@ -525,7 +557,7 @@
</SwiperSlide> </SwiperSlide>
<SwiperSlide> <SwiperSlide>
<div class="art-list" style="min-height: 30rem; overflow: hidden;"> <div class="art-list" style="min-height: 30rem; overflow: hidden;">
<ArtList {mangaId} bind:selectedImage additionalList={additionalImages} /> <ArtList {mangaId} {list} bind:selectedImage additionalList={additionalImages} />
</div> </div>
</SwiperSlide> </SwiperSlide>
<SwiperSlide> <SwiperSlide>
@ -616,6 +648,26 @@
</main> </main>
<style> <style>
.linklist {
margin: 0 1rem;
}
.langs {
display: flex;
gap: 0.5rem;
margin: 0 1rem;
overflow-x: auto;
}
.langs button {
padding: 0.5rem;
border-radius: 5px;
background: rgb(64,64,64);
color: white;
border: none;
cursor: pointer;
}
.langs button.enabled {
background: rgb(107, 107, 107);
}
.header { .header {
position: relative; position: relative;
padding-top: 5rem; padding-top: 5rem;