DiskusScan: Fix popular and latestUpdate (#8016)

Fix loading popular and latestUpdate
This commit is contained in:
Chopper 2025-03-11 09:34:07 -03:00 committed by Draff
parent 6205dad385
commit 7ad4d56426
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
2 changed files with 2 additions and 119 deletions

View File

@ -3,7 +3,7 @@ ext {
extClass = '.DiskusScan' extClass = '.DiskusScan'
themePkg = 'mangathemesia' themePkg = 'mangathemesia'
baseUrl = 'https://diskusscan.online' baseUrl = 'https://diskusscan.online'
overrideVersionCode = 13 overrideVersionCode = 14
isNsfw = false isNsfw = false
} }

View File

@ -1,27 +1,10 @@
package eu.kanade.tachiyomi.extension.pt.diskusscan package eu.kanade.tachiyomi.extension.pt.diskusscan
import android.annotation.SuppressLint
import android.app.Application
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.annotation.RequiresApi
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.Headers
import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
class DiskusScan : MangaThemesia( class DiskusScan : MangaThemesia(
"Diskus Scan", "Diskus Scan",
@ -33,109 +16,10 @@ class DiskusScan : MangaThemesia(
// Changed their theme from Madara to MangaThemesia. // Changed their theme from Madara to MangaThemesia.
override val versionId = 2 override val versionId = 2
private var challengeHeaders: Headers? = null
override val client = super.client.newBuilder() override val client = super.client.newBuilder()
.addInterceptor { chain -> .rateLimit(2)
if (challengeHeaders != null) {
val request = chain.request().newBuilder()
.headers(challengeHeaders!!)
.build()
val response = chain.proceed(request)
if (response.isSuccessful) {
return@addInterceptor response
}
}
chain.proceed(resolveChallenge(chain.request()))
}
.rateLimit(1, 2, TimeUnit.SECONDS)
.build() .build()
@SuppressLint("SetJavaScriptEnabled")
private fun resolveChallenge(origin: Request): Request {
val latch = CountDownLatch(1)
val headers = Headers.Builder()
Handler(Looper.getMainLooper()).post {
val webView = WebView(Injekt.get<Application>())
with(webView.settings) {
javaScriptEnabled = true
blockNetworkImage = true
}
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String) {
view?.apply {
evaluateJavascript("document.documentElement.outerHTML") { html ->
if ("challenge" in html) {
return@evaluateJavascript
}
latch.countDown()
}
}
}
@RequiresApi(Build.VERSION_CODES.N)
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest,
): WebResourceResponse? {
val ignore = listOf(".css", ".js", ".php", ".ico", "google", "fonts")
val url = request.url.toString()
if (ignore.any { url.contains(it, ignoreCase = true) }) {
return emptyResource()
}
if (request.isOriginRequest()) {
for ((key, value) in request.requestHeaders) {
headers[key] = value
}
}
return super.shouldInterceptRequest(view, request)
}
private fun WebResourceRequest.isOriginRequest(): Boolean =
this.url.toString().equals(origin.url.toString(), true)
private fun emptyResource() = WebResourceResponse(null, null, null)
}
webView.loadUrl(origin.url.toString())
}
latch.await(client.callTimeoutMillis.toLong(), TimeUnit.MILLISECONDS)
challengeHeaders = origin.headers.newBuilder().let {
for ((key, value) in headers.build()) {
it[key] = value
}
it.build()
}
return origin.newBuilder()
.headers(challengeHeaders!!)
.build()
}
override fun headersBuilder() = super.headersBuilder()
.set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
.set("Accept-Language", "pt-BR,en-US;q=0.7,en;q=0.3")
.set("Alt-Used", baseUrl.substringAfterLast("/"))
.set("Sec-Fetch-Dest", "document")
.set("Sec-Fetch-Mode", "navigate")
.set("Sec-Fetch-Site", "same-origin")
.set("Sec-Fetch-User", "?1")
// =========================== Manga Details ============================
override fun mangaDetailsRequest(manga: SManga): Request {
val newHeaders = headersBuilder()
.set("Referer", baseUrl + mangaUrlDirectory)
.build()
return GET(baseUrl + manga.url, newHeaders)
}
override val seriesAuthorSelector = ".infotable tr:contains(Autor) td:last-child" override val seriesAuthorSelector = ".infotable tr:contains(Autor) td:last-child"
override val seriesDescriptionSelector = ".entry-content[itemprop=description] > *:not([class^=disku])" override val seriesDescriptionSelector = ".entry-content[itemprop=description] > *:not([class^=disku])"
@ -146,6 +30,5 @@ class DiskusScan : MangaThemesia(
else -> SManga.UNKNOWN else -> SManga.UNKNOWN
} }
// ============================== Chapters ==============================
override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga)
} }