[mgo] fix selectors and ratelimit (#15031)
* [Mgo] Update selectors * Add rate limit * chore: bump version
This commit is contained in:
parent
2cd0dcd55f
commit
fe7492cc83
@ -5,7 +5,7 @@ ext {
|
||||
extName = 'Mangago'
|
||||
pkgNameSuffix = 'en.mangago'
|
||||
extClass = '.Mangago'
|
||||
extVersionCode = 9
|
||||
extVersionCode = 10
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,7 @@ import android.graphics.Rect
|
||||
import android.util.Base64
|
||||
import app.cash.quickjs.QuickJs
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
import eu.kanade.tachiyomi.source.model.Filter
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
@ -40,18 +41,22 @@ class Mangago : ParsedHttpSource() {
|
||||
|
||||
override val supportsLatest = true
|
||||
|
||||
override val client = network.cloudflareClient.newBuilder().addInterceptor { chain ->
|
||||
val response = chain.proceed(chain.request())
|
||||
override val client = network.cloudflareClient.newBuilder()
|
||||
.rateLimit(1, 2)
|
||||
.addInterceptor { chain ->
|
||||
val response = chain.proceed(chain.request())
|
||||
|
||||
val key = response.request.url.queryParameter("desckey") ?: return@addInterceptor response
|
||||
val cols = response.request.url.queryParameter("cols")?.toIntOrNull() ?: return@addInterceptor response
|
||||
val key =
|
||||
response.request.url.queryParameter("desckey") ?: return@addInterceptor response
|
||||
val cols = response.request.url.queryParameter("cols")?.toIntOrNull()
|
||||
?: return@addInterceptor response
|
||||
|
||||
val image = unscrambleImage(response.body!!.byteStream(), key, cols)
|
||||
val body = image.toResponseBody("image/jpeg".toMediaTypeOrNull())
|
||||
return@addInterceptor response.newBuilder()
|
||||
.body(body)
|
||||
.build()
|
||||
}.build()
|
||||
val image = unscrambleImage(response.body!!.byteStream(), key, cols)
|
||||
val body = image.toResponseBody("image/jpeg".toMediaTypeOrNull())
|
||||
return@addInterceptor response.newBuilder()
|
||||
.body(body)
|
||||
.build()
|
||||
}.build()
|
||||
|
||||
override fun headersBuilder(): Headers.Builder = super.headersBuilder()
|
||||
.add("Referer", "$baseUrl/")
|
||||
@ -91,7 +96,8 @@ class Mangago : ParsedHttpSource() {
|
||||
|
||||
override fun popularMangaNextPageSelector() = genreListingNextPageSelector
|
||||
|
||||
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/genre/all/$page/?f=1&o=1&sortby=update_date&e=", headers)
|
||||
override fun latestUpdatesRequest(page: Int) =
|
||||
GET("$baseUrl/genre/all/$page/?f=1&o=1&sortby=update_date&e=", headers)
|
||||
|
||||
override fun latestUpdatesSelector() = genreListingSelector
|
||||
|
||||
@ -144,31 +150,26 @@ class Mangago : ParsedHttpSource() {
|
||||
override fun searchMangaNextPageSelector() = genreListingNextPageSelector
|
||||
|
||||
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
|
||||
val coverElement = document.select(".left.cover > img")
|
||||
|
||||
title = coverElement.attr("alt")
|
||||
thumbnail_url = coverElement.attr("src")
|
||||
document.select(".manga_right td").forEach {
|
||||
when (it.getElementsByTag("label").text().trim().lowercase()) {
|
||||
"status:" -> {
|
||||
status = when (it.selectFirst("span").text().trim().lowercase()) {
|
||||
document.getElementById("information").let {
|
||||
title = it.selectFirst(".w-title h1").text()
|
||||
thumbnail_url = it.selectFirst("img").attr("abs:src")
|
||||
description = it.selectFirst(".manga_summary").text()
|
||||
it.select(".manga_info li").forEach { el ->
|
||||
when (el.selectFirst("b").text().trim().lowercase()) {
|
||||
"alternative:" -> description += "\n\n${el.text()}"
|
||||
"status:" -> when (el.selectFirst("span").text().trim().lowercase()) {
|
||||
"ongoing" -> SManga.ONGOING
|
||||
"completed" -> SManga.COMPLETED
|
||||
else -> SManga.UNKNOWN
|
||||
}
|
||||
}
|
||||
"author:" -> {
|
||||
author = it.selectFirst("a").text()
|
||||
}
|
||||
"genre(s):" -> {
|
||||
genre = it.getElementsByTag("a").joinToString { it.text() }
|
||||
"author(s):" -> author = el.select("a").joinToString { it.text() }
|
||||
"genre(s):" -> genre = el.select("a").joinToString { it.text() }
|
||||
}
|
||||
}
|
||||
}
|
||||
description = document.selectFirst(".manga_summary").ownText().trim()
|
||||
}
|
||||
|
||||
override fun chapterListSelector() = "#chapter_table > tbody > tr"
|
||||
override fun chapterListSelector() = "table > tbody > tr"
|
||||
|
||||
override fun chapterFromElement(element: Element) = SChapter.create().apply {
|
||||
val link = element.getElementsByTag("a")
|
||||
@ -176,7 +177,7 @@ class Mangago : ParsedHttpSource() {
|
||||
setUrlWithoutDomain(link.attr("href"))
|
||||
name = link.text().trim()
|
||||
date_upload = kotlin.runCatching {
|
||||
dateFormat.parse(element.getElementsByClass("no").text().trim())?.time
|
||||
dateFormat.parse(element.select("td:last-child").text().trim())?.time
|
||||
}.getOrNull() ?: 0L
|
||||
}
|
||||
|
||||
@ -191,7 +192,8 @@ class Mangago : ParsedHttpSource() {
|
||||
it.attr("src").contains("chapter.js", ignoreCase = true)
|
||||
}.attr("abs:src")
|
||||
|
||||
val obfuscatedChapterJs = client.newCall(GET(chapterJsUrl, headers)).execute().body!!.string()
|
||||
val obfuscatedChapterJs =
|
||||
client.newCall(GET(chapterJsUrl, headers)).execute().body!!.string()
|
||||
val deobfChapterJs = SoJsonV4Deobfuscator.decode(obfuscatedChapterJs)
|
||||
|
||||
val key = findHexEncodedVariable(deobfChapterJs, "key").decodeHex()
|
||||
@ -238,7 +240,8 @@ class Mangago : ParsedHttpSource() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")
|
||||
override fun imageUrlParse(document: Document): String =
|
||||
throw UnsupportedOperationException("Not used")
|
||||
|
||||
override fun getFilterList(): FilterList = FilterList(
|
||||
Filter.Header("Ignored if using text search"),
|
||||
@ -396,9 +399,10 @@ class Mangago : ParsedHttpSource() {
|
||||
return output.toByteArray()
|
||||
}
|
||||
|
||||
private fun buildCookies(cookies: Map<String, String>) = cookies.entries.joinToString(separator = "; ", postfix = ";") {
|
||||
"${URLEncoder.encode(it.key, "UTF-8")}=${URLEncoder.encode(it.value, "UTF-8")}"
|
||||
}
|
||||
private fun buildCookies(cookies: Map<String, String>) =
|
||||
cookies.entries.joinToString(separator = "; ", postfix = ";") {
|
||||
"${URLEncoder.encode(it.key, "UTF-8")}=${URLEncoder.encode(it.value, "UTF-8")}"
|
||||
}
|
||||
|
||||
private fun String.decodeHex(): ByteArray {
|
||||
check(length % 2 == 0) { "Must have an even length" }
|
||||
@ -429,7 +433,8 @@ class Mangago : ParsedHttpSource() {
|
||||
}
|
||||
}
|
||||
|
||||
private val jsFilters = listOf("jQuery", "document", "getContext", "toDataURL", "getImageData", "width", "height")
|
||||
private val jsFilters =
|
||||
listOf("jQuery", "document", "getContext", "toDataURL", "getImageData", "width", "height")
|
||||
|
||||
private val hashCipher = "AES/CBC/ZEROBYTEPADDING"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user