Jinman Tiantang: manga details resolve (#9522)

* Fix: manga details resolve

* Fix: manga details resolve
This commit is contained in:
peakedshout 2025-07-03 16:34:00 +08:00 committed by Draff
parent a5a70f4a31
commit 1cbbb8911e
Signed by: Draff
GPG Key ID: E8A89F3211677653
2 changed files with 36 additions and 2 deletions

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'Jinman Tiantang' extName = 'Jinman Tiantang'
extClass = '.Jinmantiantang' extClass = '.Jinmantiantang'
extVersionCode = 50 extVersionCode = 51
isNsfw = true isNsfw = true
} }

View File

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.extension.zh.jinmantiantang package eu.kanade.tachiyomi.extension.zh.jinmantiantang
import android.util.Base64
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.lib.randomua.addRandomUAPreferenceToScreen import eu.kanade.tachiyomi.lib.randomua.addRandomUAPreferenceToScreen
import eu.kanade.tachiyomi.lib.randomua.getPrefCustomUA 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 { override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
title = document.selectFirst("h1")!!.text() title = document.selectFirst("h1")!!.text()
// keep thumbnail_url same as the one in popularMangaFromElement() // keep thumbnail_url same as the one in popularMangaFromElement()
@ -239,7 +273,7 @@ class Jinmantiantang : ParsedHttpSource(), ConfigurableSource {
} }
override fun chapterListParse(response: Response): List<SChapter> { override fun chapterListParse(response: Response): List<SChapter> {
val document = response.asJsoup() val document = mangaDetailsResolve(response)
if (document.select("div[id=episode-block] a li").size == 0) { if (document.select("div[id=episode-block] a li").size == 0) {
val singleChapter = SChapter.create().apply { val singleChapter = SChapter.create().apply {
name = "单章节" name = "单章节"