From fcbc26f544a5ad7ec841561dec695aaceb63d709 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Tue, 10 Sep 2024 00:06:05 -0700 Subject: feat(reader): add rawkuma chapter support --- src/lib/Data/Manga/raw.ts | 26 +++++++++++++++++++++ src/lib/Reader/Chapters.svelte | 22 ------------------ src/lib/Reader/Chapters/MangaDex.svelte | 22 ++++++++++++++++++ src/lib/Reader/Chapters/Rawkuma.svelte | 22 ++++++++++++++++++ src/lib/Reader/resource.ts | 40 +++++++++++++++++++++++++++++++++ 5 files changed, 110 insertions(+), 22 deletions(-) delete mode 100644 src/lib/Reader/Chapters.svelte create mode 100644 src/lib/Reader/Chapters/MangaDex.svelte create mode 100644 src/lib/Reader/Chapters/Rawkuma.svelte create mode 100644 src/lib/Reader/resource.ts (limited to 'src/lib') diff --git a/src/lib/Data/Manga/raw.ts b/src/lib/Data/Manga/raw.ts index c570474d..0d7e928c 100644 --- a/src/lib/Data/Manga/raw.ts +++ b/src/lib/Data/Manga/raw.ts @@ -1,5 +1,11 @@ import proxy from '$lib/Utility/proxy'; +interface Chapter { + href: string; + chapterNum: string; + chapterDate: string; +} + export const getChapterCount = async (nativeTitle: string): Promise => { const html = new DOMParser().parseFromString( await (await fetch(proxy(`https://rawkuma.com/?s=${encodeURIComponent(nativeTitle)}`))).text(), @@ -19,3 +25,23 @@ export const getChapterCount = async (nativeTitle: string): Promise { + const dom = new DOMParser().parseFromString(text, 'text/html').querySelectorAll('.eph-num'); + const chapters: Chapter[] = []; + + dom.forEach((chapter) => { + const href = chapter.querySelector('a')?.getAttribute('href'); + const chapterNum = chapter.querySelector('.chapternum')?.textContent; + const chapterDate = chapter.querySelector('.chapterdate')?.textContent; + + if (href && chapterNum && chapterDate) + chapters.push({ + href, + chapterNum, + chapterDate + }); + }); + + return chapters; +}; diff --git a/src/lib/Reader/Chapters.svelte b/src/lib/Reader/Chapters.svelte deleted file mode 100644 index 9953036e..00000000 --- a/src/lib/Reader/Chapters.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/src/lib/Reader/Chapters/MangaDex.svelte b/src/lib/Reader/Chapters/MangaDex.svelte new file mode 100644 index 00000000..12eca713 --- /dev/null +++ b/src/lib/Reader/Chapters/MangaDex.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/Reader/Chapters/Rawkuma.svelte b/src/lib/Reader/Chapters/Rawkuma.svelte new file mode 100644 index 00000000..5a7e57ad --- /dev/null +++ b/src/lib/Reader/Chapters/Rawkuma.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/Reader/resource.ts b/src/lib/Reader/resource.ts new file mode 100644 index 00000000..b96a890f --- /dev/null +++ b/src/lib/Reader/resource.ts @@ -0,0 +1,40 @@ +export enum Resource { + MangaDex = 'MangaDex', + Rawkuma = 'Rawkuma' +} + +export const identify = (url: string): Resource | undefined => { + if (url.match(/mangadex\.org\/title\/([a-f0-9-]+)\/?/)?.[1]) { + return Resource.MangaDex; + } else if (url.match(/rawkuma\.com\/manga\/([a-z0-9-]+)\/?/)?.[1]) { + return Resource.Rawkuma; + } + + return undefined; +}; + +export const fetchResource = async (url: string) => { + const resource = identify(url); + + if (resource === Resource.MangaDex) { + return await fetch( + `https://api.mangadex.org/manga/${ + url.match(/mangadex\.org\/title\/([a-f0-9-]+)\/?/)?.[1] + }/feed?order[chapter]=desc&translatedLanguage[]=en` + ); + } else if (resource === Resource.Rawkuma) { + return await fetch(url); + } + + return fetch(url); +}; + +export const decodeResource = async (response: Response, url: string) => { + const resource = identify(url); + + if (resource === Resource.MangaDex) { + return await response.json(); + } else { + return await response.text(); + } +}; -- cgit v1.2.3