From 1cbbb8911ee943a625d7edcce18673f7a051621a Mon Sep 17 00:00:00 2001 From: peakedshout <93729380+peakedshout@users.noreply.github.com> Date: Thu, 3 Jul 2025 16:34:00 +0800 Subject: [PATCH] Jinman Tiantang: manga details resolve (#9522) * Fix: manga details resolve * Fix: manga details resolve --- src/zh/jinmantiantang/build.gradle | 2 +- .../zh/jinmantiantang/Jinmantiantang.kt | 36 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/zh/jinmantiantang/build.gradle b/src/zh/jinmantiantang/build.gradle index 92f103415..b6441b78f 100644 --- a/src/zh/jinmantiantang/build.gradle +++ b/src/zh/jinmantiantang/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Jinman Tiantang' extClass = '.Jinmantiantang' - extVersionCode = 50 + extVersionCode = 51 isNsfw = true } diff --git a/src/zh/jinmantiantang/src/eu/kanade/tachiyomi/extension/zh/jinmantiantang/Jinmantiantang.kt b/src/zh/jinmantiantang/src/eu/kanade/tachiyomi/extension/zh/jinmantiantang/Jinmantiantang.kt index 2cd065d1c..a45e2d9cb 100644 --- a/src/zh/jinmantiantang/src/eu/kanade/tachiyomi/extension/zh/jinmantiantang/Jinmantiantang.kt +++ b/src/zh/jinmantiantang/src/eu/kanade/tachiyomi/extension/zh/jinmantiantang/Jinmantiantang.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.extension.zh.jinmantiantang +import android.util.Base64 import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.lib.randomua.addRandomUAPreferenceToScreen import eu.kanade.tachiyomi.lib.randomua.getPrefCustomUA @@ -167,6 +168,39 @@ class Jinmantiantang : ParsedHttpSource(), ConfigurableSource { // 漫画详情 + private fun mangaDetailsResolve(response: Response): Document { + val document = response.asJsoup() + val scripts = + document.select("#wrapper > script:containsData(function base64DecodeUtf8):containsData(document.write(html))") + + for (script in scripts) { + val jsCode = script.html().trim() + + jsCode.lines().forEach { line -> + val trimmedLine = line.trim() + // html = base64DecodeUtf8("...") + if (trimmedLine.startsWith("const html") || trimmedLine.startsWith("let html") || trimmedLine.startsWith( + "var html", + ) + ) { + val start = + trimmedLine.indexOf("base64DecodeUtf8(\"") + "base64DecodeUtf8(\"".length + val end = trimmedLine.indexOf("\");", start) + if (start > 0 && end > start) { + val html = Base64.decode(trimmedLine.substring(start, end), Base64.DEFAULT) + document.body().append(String(html)) + } + } + } + } + return document + } + + override fun mangaDetailsParse(response: Response): SManga { + val document = mangaDetailsResolve(response) + return mangaDetailsParse(document) + } + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { title = document.selectFirst("h1")!!.text() // keep thumbnail_url same as the one in popularMangaFromElement() @@ -239,7 +273,7 @@ class Jinmantiantang : ParsedHttpSource(), ConfigurableSource { } override fun chapterListParse(response: Response): List { - val document = response.asJsoup() + val document = mangaDetailsResolve(response) if (document.select("div[id=episode-block] a li").size == 0) { val singleChapter = SChapter.create().apply { name = "单章节"