DiskusScan: Fix loading content (#4738)
* Fix loading content * Bump version
This commit is contained in:
parent
4c947f56b9
commit
589ebcd677
|
@ -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"
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue