96 lines
3.1 KiB
Kotlin
96 lines
3.1 KiB
Kotlin
package com.lagradost.cloudstream3.network
|
|
|
|
import android.annotation.SuppressLint
|
|
import android.net.http.SslError
|
|
import android.webkit.*
|
|
import com.lagradost.cloudstream3.AcraApplication
|
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
|
import kotlinx.coroutines.delay
|
|
import kotlinx.coroutines.runBlocking
|
|
import okhttp3.Interceptor
|
|
import okhttp3.Request
|
|
import okhttp3.Response
|
|
import java.util.concurrent.TimeUnit
|
|
|
|
class WebViewResolver(val interceptUrl: Regex) : Interceptor {
|
|
override fun intercept(chain: Interceptor.Chain): Response {
|
|
val request = chain.request()
|
|
return runBlocking {
|
|
val fixedRequest = resolveUsingWebView(request)
|
|
return@runBlocking chain.proceed(fixedRequest ?: request)
|
|
}
|
|
}
|
|
|
|
@SuppressLint("SetJavaScriptEnabled")
|
|
suspend fun resolveUsingWebView(request: Request): Request? {
|
|
val url = request.url.toString()
|
|
println("Initial web-view request: $url")
|
|
var webView: WebView? = null
|
|
|
|
fun destroyWebView() {
|
|
main {
|
|
webView?.stopLoading()
|
|
webView?.destroy()
|
|
webView = null
|
|
println("Destroyed webview")
|
|
}
|
|
}
|
|
|
|
var fixedRequest: Request? = null
|
|
|
|
main {
|
|
webView = WebView(
|
|
AcraApplication.context ?: throw RuntimeException("No base context in WebViewResolver")
|
|
).apply {
|
|
settings.cacheMode
|
|
settings.javaScriptEnabled = true
|
|
}
|
|
|
|
webView?.webViewClient = object : WebViewClient() {
|
|
override fun shouldInterceptRequest(
|
|
view: WebView,
|
|
request: WebResourceRequest
|
|
): WebResourceResponse? {
|
|
val webViewUrl = request.url.toString()
|
|
if (interceptUrl.containsMatchIn(webViewUrl)) {
|
|
fixedRequest = getRequestCreator(
|
|
webViewUrl,
|
|
request.requestHeaders,
|
|
null,
|
|
mapOf(),
|
|
mapOf(),
|
|
10,
|
|
TimeUnit.MINUTES
|
|
)
|
|
println("Web-view request finished: $webViewUrl")
|
|
destroyWebView()
|
|
}
|
|
return super.shouldInterceptRequest(view, request)
|
|
}
|
|
|
|
override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
|
|
handler?.proceed() // Ignore ssl issues
|
|
}
|
|
}
|
|
|
|
webView?.loadUrl(url)
|
|
}
|
|
|
|
var loop = 0
|
|
// Timeouts after this amount, 20s
|
|
val totalTime = 20000L
|
|
val delayTime = 100L
|
|
|
|
// A bit sloppy, but couldn't find a better way
|
|
while (loop < totalTime / delayTime) {
|
|
if (fixedRequest != null) return fixedRequest
|
|
delay(delayTime)
|
|
loop += 1
|
|
}
|
|
|
|
println("Web-view timeout after ${totalTime / 1000}s")
|
|
destroyWebView()
|
|
return null
|
|
}
|
|
|
|
} |