Dynamic UserAgent support
This commit is contained in:
@@ -29,4 +29,6 @@ abstract class MangaLoaderContext {
|
|||||||
abstract suspend fun evaluateJs(script: String): String?
|
abstract suspend fun evaluateJs(script: String): String?
|
||||||
|
|
||||||
abstract fun getConfig(source: MangaSource): MangaSourceConfig
|
abstract fun getConfig(source: MangaSource): MangaSourceConfig
|
||||||
|
|
||||||
|
abstract fun getDefaultUserAgent(): String
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ abstract class MangaParser @InternalParsersApi constructor(
|
|||||||
abstract val configKeyDomain: ConfigKey.Domain
|
abstract val configKeyDomain: ConfigKey.Domain
|
||||||
|
|
||||||
open val headers: Headers = Headers.Builder()
|
open val headers: Headers = Headers.Builder()
|
||||||
.add("User-Agent", UserAgents.DEFAULT_BROWSER)
|
.add("User-Agent", context.getDefaultUserAgent())
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package org.koitharu.kotatsu.parsers.network
|
|||||||
|
|
||||||
object UserAgents {
|
object UserAgents {
|
||||||
|
|
||||||
@Deprecated("Issues with CloudFlare", replaceWith = ReplaceWith("UserAgents.DEFAULT_BROWSER"))
|
|
||||||
const val CHROME_MOBILE =
|
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"
|
"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 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 KOTATSU = "Kotatsu/6.8 (Android 13;;; en)"
|
||||||
|
|
||||||
|
|
||||||
const val DEFAULT_BROWSER = FIREFOX_MOBILE
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,10 +24,6 @@ internal class LegacyScansParser(context: MangaLoaderContext) :
|
|||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain("legacy-scans.com")
|
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<Manga> {
|
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||||
val end = page * pageSize
|
val end = page * pageSize
|
||||||
val start = end - (pageSize - 1)
|
val start = end - (pageSize - 1)
|
||||||
|
|||||||
@@ -20,10 +20,6 @@ internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context,
|
|||||||
|
|
||||||
override val isMultipleTagsSupported = false
|
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<Manga> {
|
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||||
|
|
||||||
val doc =
|
val doc =
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
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.site.galleryadults.GalleryAdultsParser
|
||||||
import org.koitharu.kotatsu.parsers.util.*
|
import org.koitharu.kotatsu.parsers.util.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -31,7 +30,7 @@ internal class NHentaiParser(context: MangaLoaderContext) :
|
|||||||
|
|
||||||
override val isMultipleTagsSupported = true
|
override val isMultipleTagsSupported = true
|
||||||
|
|
||||||
private val userAgentKey = ConfigKey.UserAgent(UserAgents.DEFAULT_BROWSER)
|
private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent())
|
||||||
|
|
||||||
override val headers: Headers
|
override val headers: Headers
|
||||||
get() = super.headers.newBuilder()
|
get() = super.headers.newBuilder()
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import java.util.*
|
|||||||
internal class Shinigami(context: MangaLoaderContext) :
|
internal class Shinigami(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaSource.SHINIGAMI, "shinigamitoon.com", 10) {
|
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 tagPrefix = "genre/"
|
||||||
override val listUrl = "series/"
|
override val listUrl = "series/"
|
||||||
override val sourceLocale: Locale = Locale.ENGLISH
|
override val sourceLocale: Locale = Locale.ENGLISH
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ internal class RemangaParser(
|
|||||||
context: MangaLoaderContext,
|
context: MangaLoaderContext,
|
||||||
) : PagedMangaParser(context, MangaSource.REMANGA, PAGE_SIZE), MangaParserAuthProvider, Interceptor {
|
) : 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
|
private val baseHeaders: Headers
|
||||||
get() = Headers.Builder()
|
get() = Headers.Builder()
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
|
|||||||
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("hentaivn.red", "hentaivn.autos", "hentaivn.tv")
|
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.
|
// 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<SortOrder> = EnumSet.of(
|
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
|
||||||
SortOrder.UPDATED,
|
SortOrder.UPDATED,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import okhttp3.Request
|
|||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.koitharu.kotatsu.parsers.config.MangaSourceConfig
|
import org.koitharu.kotatsu.parsers.config.MangaSourceConfig
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
|
import org.koitharu.kotatsu.parsers.network.UserAgents
|
||||||
import org.koitharu.kotatsu.parsers.util.await
|
import org.koitharu.kotatsu.parsers.util.await
|
||||||
import java.security.SecureRandom
|
import java.security.SecureRandom
|
||||||
import java.security.cert.X509Certificate
|
import java.security.cert.X509Certificate
|
||||||
@@ -42,6 +43,8 @@ internal object MangaLoaderContextMock : MangaLoaderContext() {
|
|||||||
return SourceConfigMock()
|
return SourceConfigMock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getDefaultUserAgent(): String = UserAgents.FIREFOX_MOBILE
|
||||||
|
|
||||||
suspend fun doRequest(url: String, source: MangaSource?): Response {
|
suspend fun doRequest(url: String, source: MangaSource?): Response {
|
||||||
val request = Request.Builder()
|
val request = Request.Builder()
|
||||||
.get()
|
.get()
|
||||||
|
|||||||
Reference in New Issue
Block a user