From 103ef11f3dbc8ad5a30af33edd7c5657a14fb4eb Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 18 Mar 2024 12:22:50 +0200 Subject: [PATCH] Dynamic UserAgent support --- .../kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt | 2 ++ src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt | 2 +- .../kotlin/org/koitharu/kotatsu/parsers/network/UserAgents.kt | 4 ---- .../org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt | 4 ---- .../kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt | 4 ---- .../kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt | 3 +-- .../org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt | 2 +- .../org/koitharu/kotatsu/parsers/MangaLoaderContextMock.kt | 3 +++ 10 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt index 9af4edd8..fe282967 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt @@ -29,4 +29,6 @@ abstract class MangaLoaderContext { abstract suspend fun evaluateJs(script: String): String? abstract fun getConfig(source: MangaSource): MangaSourceConfig + + abstract fun getDefaultUserAgent(): String } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt index 7d8d5ce8..8936ab74 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt @@ -76,7 +76,7 @@ abstract class MangaParser @InternalParsersApi constructor( abstract val configKeyDomain: ConfigKey.Domain open val headers: Headers = Headers.Builder() - .add("User-Agent", UserAgents.DEFAULT_BROWSER) + .add("User-Agent", context.getDefaultUserAgent()) .build() /** diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/network/UserAgents.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/network/UserAgents.kt index 0ac3e52e..5a4b500e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/network/UserAgents.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/network/UserAgents.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.parsers.network object UserAgents { - @Deprecated("Issues with CloudFlare", replaceWith = ReplaceWith("UserAgents.DEFAULT_BROWSER")) const val CHROME_MOBILE = "Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 Mobile Safari/537.36" @@ -14,7 +13,4 @@ object UserAgents { const val FIREFOX_DESKTOP = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/116.0" const val KOTATSU = "Kotatsu/6.8 (Android 13;;; en)" - - - const val DEFAULT_BROWSER = FIREFOX_MOBILE } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt index 92c0b395..c8349bce 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt @@ -24,10 +24,6 @@ internal class LegacyScansParser(context: MangaLoaderContext) : override val configKeyDomain = ConfigKey.Domain("legacy-scans.com") - override val headers: Headers = Headers.Builder() - .add("User-Agent", UserAgents.DEFAULT_BROWSER) - .build() - override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { val end = page * pageSize val start = end - (pageSize - 1) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt index efd93e62..5821aa85 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt @@ -20,10 +20,6 @@ internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context, override val isMultipleTagsSupported = false - override val headers: Headers = Headers.Builder() - .add("User-Agent", UserAgents.DEFAULT_BROWSER) - .build() - override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { val doc = diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt index c0ba3f1b..b9860795 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt @@ -8,7 +8,6 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.site.galleryadults.GalleryAdultsParser import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -31,7 +30,7 @@ internal class NHentaiParser(context: MangaLoaderContext) : override val isMultipleTagsSupported = true - private val userAgentKey = ConfigKey.UserAgent(UserAgents.DEFAULT_BROWSER) + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) override val headers: Headers get() = super.headers.newBuilder() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt index 28325a42..3326d6e8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt @@ -12,7 +12,7 @@ import java.util.* internal class Shinigami(context: MangaLoaderContext) : MadaraParser(context, MangaSource.SHINIGAMI, "shinigamitoon.com", 10) { - private val userAgentKey = ConfigKey.UserAgent(UserAgents.DEFAULT_BROWSER) + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) override val tagPrefix = "genre/" override val listUrl = "series/" override val sourceLocale: Locale = Locale.ENGLISH diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt index 450b9eb9..0c8ed0bc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt @@ -32,7 +32,7 @@ internal class RemangaParser( context: MangaLoaderContext, ) : PagedMangaParser(context, MangaSource.REMANGA, PAGE_SIZE), MangaParserAuthProvider, Interceptor { - private val userAgentKey = ConfigKey.UserAgent(UserAgents.DEFAULT_BROWSER) + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) private val baseHeaders: Headers get() = Headers.Builder() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index a982478a..d5ea7409 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -26,7 +26,7 @@ class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSo override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("hentaivn.red", "hentaivn.autos", "hentaivn.tv") // hentaivn has created 2 different interfaces for mobile and desktop, and Cloudflare detects whether it's mobile or not even with a desktop user agent. - override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.DEFAULT_BROWSER).build() + override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.CHROME_MOBILE).build() override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContextMock.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContextMock.kt index 111687d7..08d5b646 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContextMock.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContextMock.kt @@ -6,6 +6,7 @@ import okhttp3.Request import okhttp3.Response import org.koitharu.kotatsu.parsers.config.MangaSourceConfig import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.await import java.security.SecureRandom import java.security.cert.X509Certificate @@ -42,6 +43,8 @@ internal object MangaLoaderContextMock : MangaLoaderContext() { return SourceConfigMock() } + override fun getDefaultUserAgent(): String = UserAgents.FIREFOX_MOBILE + suspend fun doRequest(url: String, source: MangaSource?): Response { val request = Request.Builder() .get()