From 5e3915eae81fa21ab77d1d64e390d5112d85432c Mon Sep 17 00:00:00 2001 From: az4521 <18432684+az4521@users.noreply.github.com> Date: Fri, 16 Jan 2026 03:54:36 +0000 Subject: [PATCH] EH keep CF cookies (cherry picked from commit 68dc8b51765537bdb7bd4edcca5c95e0f3cf025a) --- .../tachiyomi/source/online/all/EHentai.kt | 45 +++++++++++-------- .../main/java/exh/uconfig/EHConfigurator.kt | 5 ++- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt index 69e821e35..0a1f49d5e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt @@ -67,7 +67,6 @@ import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.put import okhttp3.CacheControl -import okhttp3.CookieJar import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl @@ -906,7 +905,7 @@ class EHentai( page = parsed.first.lastOrNull()?.manga?.url?.let { EHentaiSearchMetadata.galleryId(it) }?.toInt() ?: 0 } while (parsed.second != null) - return Pair(result.toList(), favNames.orEmpty()) + return Pair(result.toList(), favNames) } fun spPref() = if (exh) { @@ -948,7 +947,7 @@ class EHentai( return cookies } - fun cookiesHeader(sp: Int = spPref().get()) = buildCookies(rawCookies(sp)) + fun cookiesHeader(cfCookies: Map = emptyMap(), sp: Int = spPref().get()) = buildCookies(rawCookies(sp) + cfCookies) // Headers override fun headersBuilder() = super.headersBuilder().add("Cookie", cookiesHeader()) @@ -958,20 +957,28 @@ class EHentai( .appendQueryParameter(param, value) .toString() - override val client = network.client.newBuilder() - .cookieJar(CookieJar.NO_COOKIES) - .addInterceptor { chain -> - val newReq = chain - .request() - .newBuilder() - .removeHeader("Cookie") - .addHeader("Cookie", cookiesHeader()) - .build() + override val client = + network.client.newBuilder() + // .cookieJar(CookieJar.NO_COOKIES) + .addInterceptor { chain -> + val cfCookies = chain.request().header("Cookie")?.split("; ") + ?.filter { + val name = it.split("=")[0].trim().lowercase() + name in arrayOf("cf_clearance", "__cf_bm", "cf_chl_prog", "_cfuvid", "__cfruid", "__cflb", "cf_ob_info", "cf_use_ob", "__cfwaitingroom", "__cfseq", "cf_chl_rc_i", "cf_chl_rc_ni", "cf_chl_rc_m") || name.startsWith("cf_chl_seq_") + }?.associate { it.split("=")[0].trim() to it.split("=")[1].trim() } - chain.proceed(newReq) - } - .addInterceptor(ThumbnailPreviewInterceptor()) - .build() + val newReq = + chain + .request() + .newBuilder() + .removeHeader("Cookie") + .addHeader("Cookie", cookiesHeader(cfCookies ?: emptyMap())) + .build() + + chain.proceed(newReq) + } + .addInterceptor(ThumbnailPreviewInterceptor()) + .build() // Filters override fun getFilterList(): FilterList { @@ -1392,9 +1399,9 @@ class EHentai( private const val BLANK_THUMB = "blank.gif" private const val BLANK_PREVIEW_THUMB = "https://$THUMB_DOMAIN/g/$BLANK_THUMB" - private val MATCH_YEAR_REGEX = "^\\d{4}\$".toRegex() - private val MATCH_SEEK_REGEX = "^\\d{2,4}-\\d{1,2}(-\\d{1,2})?\$".toRegex() - private val MATCH_JUMP_REGEX = "^\\d+(\$|d\$|w\$|m\$|y\$|-\$)".toRegex() + private val MATCH_YEAR_REGEX = "^\\d{4}$".toRegex() + private val MATCH_SEEK_REGEX = "^\\d{2,4}-\\d{1,2}(-\\d{1,2})?$".toRegex() + private val MATCH_JUMP_REGEX = "^\\d+($|d$|w$|m$|y$|-$)".toRegex() private const val EH_API_BASE = "https://api.e-hentai.org/api.php" private val JSON = "application/json; charset=utf-8".toMediaTypeOrNull()!! diff --git a/app/src/main/java/exh/uconfig/EHConfigurator.kt b/app/src/main/java/exh/uconfig/EHConfigurator.kt index 4d0dde552..4da3a130f 100644 --- a/app/src/main/java/exh/uconfig/EHConfigurator.kt +++ b/app/src/main/java/exh/uconfig/EHConfigurator.kt @@ -26,8 +26,9 @@ class EHConfigurator(val context: Context) { .maybeInjectEHLogger() .build() - private fun EHentai.requestWithCreds(sp: Int = 1) = Request.Builder() - .addHeader("Cookie", cookiesHeader(sp)) + private fun EHentai.requestWithCreds(sp: Int = 1) = + Request.Builder() + .addHeader("Cookie", cookiesHeader(sp = sp)) private suspend fun EHentai.execProfileActions( action: String,