DiskusScan: Fix loading content (#4738)

* Fix loading content

* Bump version
This commit is contained in:
Chopper 2024-08-24 23:16:37 -03:00 committed by Draff
parent 4c947f56b9
commit 589ebcd677
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
2 changed files with 96 additions and 19 deletions

View File

@ -3,7 +3,7 @@ ext {
extClass = '.DiskusScan' extClass = '.DiskusScan'
themePkg = 'mangathemesia' themePkg = 'mangathemesia'
baseUrl = 'https://diskusscan.com' baseUrl = 'https://diskusscan.com'
overrideVersionCode = 11 overrideVersionCode = 12
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -1,13 +1,26 @@
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.GET
import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.Headers
import okhttp3.Request 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 import java.util.concurrent.TimeUnit
class DiskusScan : MangaThemesia( class DiskusScan : MangaThemesia(
@ -20,18 +33,93 @@ 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 -> .addInterceptor { chain ->
val request = chain.request() if (challengeHeaders != null) {
val headers = request.headers.newBuilder() val request = chain.request().newBuilder()
.set("Accept-Encoding", "") .headers(challengeHeaders!!)
.build() .build()
chain.proceed(request.newBuilder().headers(headers).build())
val response = chain.proceed(request)
if (response.isSuccessful) {
return@addInterceptor response
}
}
chain.proceed(resolveChallenge(chain.request()))
} }
.rateLimit(2, 1, TimeUnit.SECONDS) .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() 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("Accept-Language", "pt-BR,en-US;q=0.7,en;q=0.3")
.set("Alt-Used", baseUrl.substringAfterLast("/")) .set("Alt-Used", baseUrl.substringAfterLast("/"))
.set("Sec-Fetch-Dest", "document") .set("Sec-Fetch-Dest", "document")
@ -60,15 +148,4 @@ class DiskusScan : MangaThemesia(
// ============================== Chapters ============================== // ============================== Chapters ==============================
override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga)
// =============================== Pages ================================
override fun imageUrlRequest(page: Page): Request {
val newHeaders = super.imageUrlRequest(page).headers.newBuilder()
.set("Sec-Fetch-Dest", "image")
.set("Sec-Fetch-Mode", "no-cors")
.set("Sec-Fetch-Site", "cross-site")
.build()
return GET(page.imageUrl!!, newHeaders)
}
} }