From d2f9936ad4b7f381e13fcd7793da76df42c1ad17 Mon Sep 17 00:00:00 2001 From: AgentKush Date: Wed, 5 Aug 2026 21:07:11 +0100 Subject: [PATCH] fix(luascans): rebuild on heancms - luacomic.org migrated to Next.js + JSON API luacomic.org moved off keyoapp to a heancms-style stack (api.luacomic.org JSON API + a Next.js client-rendered reader). Re-based LuaScans on HeanCms (list via /query, chapters via /chapter/query - both verified live) and added a getPages override that extracts the ordered page-image URLs from the reader's Next.js flight data (/uploads/series/...). Verified against the live site: /query fields match, chapters parse, and a free chapter's 16 ordered page images extract and load (200 image/jpg). --- .../parsers/site/heancms/en/LuaScans.kt | 34 +++++++++++++++++++ .../parsers/site/keyoapp/en/LuaScans.kt | 12 ------- 2 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/LuaScans.kt delete mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/LuaScans.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/LuaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/LuaScans.kt new file mode 100644 index 000000000..39ee71cdd --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/LuaScans.kt @@ -0,0 +1,34 @@ +package org.koitharu.kotatsu.parsers.site.heancms.en + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.site.heancms.HeanCms +import org.koitharu.kotatsu.parsers.util.* + +@MangaSourceParser("LUASCANS", "luaComic.net", "en") +internal class LuaScans(context: MangaLoaderContext) : + HeanCms(context, MangaParserSource.LUASCANS, "luacomic.org") { + + // The reader is a Next.js client-rendered page: page image URLs are embedded (with escaped + // slashes) in the server-sent flight data under /uploads/series/..., already in page order. + private val pageUrlRegex = + Regex("""https://[^"'\\ ]*?/uploads/series/[^"'\\ ]+?\.(?:webp|jpg|jpeg|png|avif)(?:\.(?:webp|jpg|jpeg|png|avif))?""") + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val html = webClient.httpGet(fullUrl).parseRaw().replace("\\/", "/") + return pageUrlRegex.findAll(html) + .map { it.value } + .distinct() + .map { url -> + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + .toList() + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/LuaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/LuaScans.kt deleted file mode 100644 index a29546626..000000000 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/LuaScans.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.koitharu.kotatsu.parsers.site.keyoapp.en - -import org.koitharu.kotatsu.parsers.Broken -import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.site.keyoapp.KeyoappParser - -@Broken("Site is online but parser is broken — layout/API changed, needs rewrite") -@MangaSourceParser("LUASCANS", "luaComic.net", "en") -internal class LuaScans(context: MangaLoaderContext) : - KeyoappParser(context, MangaParserSource.LUASCANS, "luacomic.org")