NoxScans: Fix pages and mangaDetails (#6106)

* Fix pages and mangaDetails

* Refac
This commit is contained in:
Chopper 2024-11-18 10:33:19 -03:00 committed by Draff
parent 8253a0ae7a
commit bd97eb008b
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
2 changed files with 44 additions and 29 deletions

View File

@ -2,8 +2,8 @@ ext {
extName = 'Nox Scans'
extClass = '.NoxScans'
themePkg = 'mangathemesia'
baseUrl = 'https://noxscans.com'
overrideVersionCode = 1
baseUrl = 'https://www.noxscans.com'
overrideVersionCode = 2
isNsfw = false
}

View File

@ -1,61 +1,84 @@
package eu.kanade.tachiyomi.extension.tr.noxscans
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import okhttp3.Response
import org.json.JSONObject
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
class NoxScans : MangaThemesia(
"NoxScans",
"https://noxscans.com",
"https://www.noxscans.com",
"tr",
dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("tr")),
) {
companion object {
private val IMAGE_EXTENSIONS = listOf(".webp", ".jpg", ".jpeg", ".png", ".gif")
private const val VERIFICATION_ERROR =
"Bölümü görüntülemek için WebView'de doğrulama yapmanız gerekiyor"
private const val ROBOT_VERIFICATION_ERROR =
"Robot doğrulaması gerekiyor. WebView'de doğrulama yapın"
}
private fun checkVerification(document: Document, url: String? = null) {
when {
document.select("form[action*=kontrol]").isNotEmpty() -> throw Exception(
VERIFICATION_ERROR,
)
private var attempts = 0
private val formSelector = "form[action*=kontrol], form:has(legend)"
url?.contains("/kontrol/") == true -> throw Exception(ROBOT_VERIFICATION_ERROR)
private fun checkVerification(document: Document): Document {
attempts = 0
return document.selectFirst(formSelector)?.let {
bypassRobotVerification(document)
} ?: document
}
private fun bypassRobotVerification(document: Document): Document {
if (attempts == 3) {
throw Exception(ROBOT_VERIFICATION_ERROR)
}
attempts++
return document.selectFirst(formSelector)?.let { robotForm ->
val formUrl = robotForm.absUrl("action").takeIf(String::isNotBlank) ?: document.location()
val input = robotForm.selectFirst("input")!!.let {
it.attr("name") to it.attr("value")
}
val formBody = FormBody.Builder()
.add(input.first, input.second)
.build()
bypassRobotVerification(client.newCall(POST(formUrl, headers, formBody)).execute().asJsoup())
} ?: document
}
override fun chapterListParse(response: Response): List<SChapter> {
return response.use { resp ->
val document = Jsoup.parse(resp.peekBody(Long.MAX_VALUE).string())
checkVerification(document, resp.request.url.toString())
super.chapterListParse(resp)
}
return checkVerification(response.asJsoup())
.select(chapterListSelector())
.map(::chapterFromElement)
}
override fun pageListParse(document: Document): List<Page> {
checkVerification(document, document.location())
val doc = checkVerification(document)
val scriptContent = document.selectFirst("script:containsData(ts_reader.run)")?.data()
?: return super.pageListParse(document)
val scriptContent = doc.selectFirst("script:containsData(ts_reader.run)")?.data()
?: return super.pageListParse(doc)
return try {
parseReaderScript(scriptContent)
} catch (e: Exception) {
super.pageListParse(document)
super.pageListParse(doc)
}
}
override fun mangaDetailsParse(document: Document): SManga {
return super.mangaDetailsParse(checkVerification(document))
}
private fun parseReaderScript(scriptContent: String): List<Page> {
val jsonStr = scriptContent.substringAfter("ts_reader.run(").substringBefore(");")
val jsonData = JSONObject(jsonStr)
@ -104,14 +127,6 @@ class NoxScans : MangaThemesia(
}
}
override fun mangaDetailsParse(response: Response): SManga {
return response.use { resp ->
val document = Jsoup.parse(resp.body.string())
checkVerification(document, resp.request.url.toString())
super.mangaDetailsParse(resp)
}
}
private fun isImageUrl(url: String): Boolean = IMAGE_EXTENSIONS.any { ext ->
url.lowercase().endsWith(ext) && url.contains("/wp-content/uploads/")
}