aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Data
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Data')
-rw-r--r--src/lib/Data/Manga/raw.ts82
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) => {