From 88288bf1286214798a3c5f0b325d3cdbe9495092 Mon Sep 17 00:00:00 2001 From: Stysusss <158248053+stysus@users.noreply.github.com> Date: Sat, 26 Sep 2026 05:26:55 +0700 Subject: [PATCH] Fix Page --- src/zh/jcomic/build.gradle.kts | 2 +- .../tachiyomi/extension/zh/jcomic/JComic.kt | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/zh/jcomic/build.gradle.kts b/src/zh/jcomic/build.gradle.kts index dcbd90dc7eb..fa14b748b1a 100644 --- a/src/zh/jcomic/build.gradle.kts +++ b/src/zh/jcomic/build.gradle.kts @@ -6,7 +6,7 @@ plugins { keiyoushi { name = "JComic" - versionCode = 2 + versionCode = 3 contentWarning = ContentWarning.NSFW libVersion = "1.6" diff --git a/src/zh/jcomic/src/eu/kanade/tachiyomi/extension/zh/jcomic/JComic.kt b/src/zh/jcomic/src/eu/kanade/tachiyomi/extension/zh/jcomic/JComic.kt index 28727fe7395..63d6a23b88e 100644 --- a/src/zh/jcomic/src/eu/kanade/tachiyomi/extension/zh/jcomic/JComic.kt +++ b/src/zh/jcomic/src/eu/kanade/tachiyomi/extension/zh/jcomic/JComic.kt @@ -12,7 +12,7 @@ import keiyoushi.annotation.Source import keiyoushi.network.get import keiyoushi.source.KeiSource import keiyoushi.utils.asJsoup -import keiyoushi.utils.long +import keiyoushi.utils.longOrNull import keiyoushi.utils.tryParse import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.async @@ -20,6 +20,7 @@ import kotlinx.coroutines.supervisorScope import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put +import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient import okhttp3.Response @@ -31,11 +32,15 @@ import java.util.Locale @Source abstract class JComic : KeiSource() { + override fun Headers.Builder.configureHeaders() = apply { + set("Cookie", "jcomic_access=verified_user") + } + override fun OkHttpClient.Builder.configureClient() = apply { addInterceptor { chain -> val origin = chain.request() chain.proceed(origin).also { - if (it.code == 403 && origin.url.toString().contains("jcomic-content")) { + if (it.code == 403 && (origin.url.host.startsWith("images.") || origin.url.toString().contains("jcomic-content"))) { it.close() throw IOException("图片已失效,清除章节缓存后重试\n(链接有效期只有1分钟,建议以后下载完章节再看)") } @@ -129,7 +134,7 @@ abstract class JComic : KeiSource() { val asyncChapters = if (fetchChapters) { async { - val time = manga.memo["time"]!!.long + val time = manga.memo["time"]?.longOrNull ?: 0L if (manga.url.contains("/page")) { listOf( SChapter.create().apply { @@ -160,7 +165,13 @@ abstract class JComic : KeiSource() { override suspend fun getPageList(chapter: SChapter): List { val response = client.get(baseUrl + chapter.url) return response.asJsoup().select(".comic-thumb").mapIndexed { i, img -> - Page(i, imageUrl = String(Base64.decode(img.attr("data-locked").removePrefix("JCOMIC_TRAP_").reversed(), Base64.NO_WRAP))) + val locked = img.attr("data-locked") + val url = if (locked.isNotEmpty()) { + String(Base64.decode(locked.removePrefix("JCOMIC_TRAP_").reversed(), Base64.NO_WRAP)) + } else { + img.attr("data-src").ifEmpty { img.attr("src") } + } + Page(i, imageUrl = url) } } }