diff options
Diffstat (limited to 'src/lib/Data')
| -rw-r--r-- | src/lib/Data/Manga/raw.ts | 82 |
1 files changed, 51 insertions, 31 deletions
diff --git a/src/lib/Data/Manga/raw.ts b/src/lib/Data/Manga/raw.ts index 3663c737..64ed3de4 100644 --- a/src/lib/Data/Manga/raw.ts +++ b/src/lib/Data/Manga/raw.ts @@ -6,41 +6,61 @@ interface Chapter { chapterDate: string; } +const RAWKUMA_ORIGIN = "https://rawkuma.net"; + +const fetchDocument = async (url: string, init?: RequestInit) => + new DOMParser().parseFromString( + await (await fetch(proxy(url, true), init)).text(), + "text/html", + ); + +const parseChapterNumber = (text: string | null | undefined) => { + if (!text) return undefined; + + const match = text.match(/Chapter\s+(\d+(?:\.\d+)?)/i); + + return match ? Number.parseFloat(match[1]) : undefined; +}; + export const getChapterCount = async ( nativeTitle: string, ): Promise<number | undefined> => { - const html = new DOMParser().parseFromString( - await ( - await fetch( - proxy(`https://rawkuma.com/?s=${encodeURIComponent(nativeTitle)}`), - ) - ).text(), - "text/html", + const nonceDocument = await fetchDocument( + `${RAWKUMA_ORIGIN}/wp-admin/admin-ajax.php?type=search_form&action=get_nonce`, + ); + const nonce = nonceDocument + .querySelector("input[name='search_nonce']") + ?.getAttribute("value"); + + if (!nonce) return undefined; + + const searchDocument = await fetchDocument( + `${RAWKUMA_ORIGIN}/wp-admin/admin-ajax.php?nonce=${encodeURIComponent( + nonce, + )}&action=search`, + { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + }, + body: new URLSearchParams({ + query: nativeTitle, + }), + }, ); - const listContent = html.querySelector(".listupd"); - - if ( - listContent && - listContent.textContent && - listContent.textContent.includes("Not Found") - ) { - return undefined; - } - - const chapterCount = html.querySelector(".epxs"); - - if ( - chapterCount && - chapterCount.textContent && - chapterCount.textContent.includes("Chapter") - ) { - return Number.parseInt( - chapterCount.textContent.replace("Chapter", "").trim(), - 10, - ); - } - - return undefined; + const mangaUrl = searchDocument + .querySelector("#searchResults a[href*='/manga/']") + ?.getAttribute("href"); + + if (!mangaUrl) return undefined; + + const mangaDocument = await fetchDocument(mangaUrl); + const chapters = [...mangaDocument.querySelectorAll("a[href*='/chapter-']")] + .map((anchor) => parseChapterNumber(anchor.textContent)) + .filter((value): value is number => value !== undefined) + .sort((left, right) => right - left); + + return chapters[0]; }; export const getChaptersFromText = (text: string) => { |