From fe7492cc83fcdbcd404f67fe9cd4ac4a31cc95cb Mon Sep 17 00:00:00 2001
From: beerpsi <92439990+beerpiss@users.noreply.github.com>
Date: Thu, 19 Jan 2023 21:51:37 +0700
Subject: [PATCH] [mgo] fix selectors and ratelimit (#15031)

* [Mgo] Update selectors

* Add rate limit

* chore: bump version
---
 src/en/mangago/build.gradle                   |  2 +-
 .../tachiyomi/extension/en/mangago/Mangago.kt | 73 ++++++++++---------
 2 files changed, 40 insertions(+), 35 deletions(-)

diff --git a/src/en/mangago/build.gradle b/src/en/mangago/build.gradle
index e1a15bf03..6e9fd4687 100644
--- a/src/en/mangago/build.gradle
+++ b/src/en/mangago/build.gradle
@@ -5,7 +5,7 @@ ext {
     extName = 'Mangago'
     pkgNameSuffix = 'en.mangago'
     extClass = '.Mangago'
-    extVersionCode = 9
+    extVersionCode = 10
     isNsfw = true
 }
 
diff --git a/src/en/mangago/src/eu/kanade/tachiyomi/extension/en/mangago/Mangago.kt b/src/en/mangago/src/eu/kanade/tachiyomi/extension/en/mangago/Mangago.kt
index 60c5784d2..0f346dea2 100644
--- a/src/en/mangago/src/eu/kanade/tachiyomi/extension/en/mangago/Mangago.kt
+++ b/src/en/mangago/src/eu/kanade/tachiyomi/extension/en/mangago/Mangago.kt
@@ -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"