Преглед изворни кода

feat: 通过 webview 获取书源内容支持设置延迟时间 (#4365)

鸿蒙机器人 пре 2 година
родитељ
комит
d384254eb9

+ 19 - 10
app/src/main/java/io/legado/app/help/http/BackstageWebView.kt

@@ -5,6 +5,7 @@ import android.net.http.SslError
 import android.os.Handler
 import android.os.Looper
 import android.util.AndroidRuntimeException
+import android.util.Log
 import android.webkit.CookieManager
 import android.webkit.SslErrorHandler
 import android.webkit.WebResourceRequest
@@ -18,6 +19,7 @@ import io.legado.app.help.coroutine.Coroutine
 import io.legado.app.utils.runOnUI
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Runnable
+import kotlinx.coroutines.delay
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withTimeout
 import org.apache.commons.text.StringEscapeUtils
@@ -38,6 +40,7 @@ class BackstageWebView(
     private val sourceRegex: String? = null,
     private val overrideUrlRegex: String? = null,
     private val javaScript: String? = null,
+    private val delayTime: Long = 1000,
 ) {
 
     private val mHandler = Handler(Looper.getMainLooper())
@@ -53,8 +56,9 @@ class BackstageWebView(
             }
             callback = object : Callback() {
                 override fun onResult(response: StrResponse) {
-                    if (!block.isCompleted)
+                    if (!block.isCompleted) {
                         block.resume(response)
+                    }
                 }
 
                 override fun onError(error: Throwable) {
@@ -145,11 +149,13 @@ class BackstageWebView(
 
         override fun onPageFinished(view: WebView, url: String) {
             setCookie(url)
-            if (runnable == null) {
-                runnable = EvalJsRunnable(view, url, getJs())
-            }
-            mHandler.removeCallbacks(runnable!!)
-            mHandler.postDelayed(runnable!!, 1000)
+            mHandler.postDelayed({
+                if (runnable == null) {
+                    runnable = EvalJsRunnable(view, url, getJs())
+                }
+                mHandler.removeCallbacks(runnable!!)
+                mHandler.postDelayed(runnable!!, 1000)
+            }, delayTime)
         }
 
         @SuppressLint("WebViewClientOnReceivedSslError")
@@ -176,6 +182,7 @@ class BackstageWebView(
 
             private fun handleResult(result: String) = Coroutine.async {
                 if (result.isNotEmpty() && result != "null") {
+                    Log.d("BackstageWebView", "result: $result")
                     val content = StringEscapeUtils.unescapeJson(result)
                         .replace(quoteRegex, "")
                     try {
@@ -255,10 +262,12 @@ class BackstageWebView(
 
         override fun onPageFinished(webView: WebView, url: String) {
             setCookie(url)
-            if (!javaScript.isNullOrEmpty()) {
-                val runnable = LoadJsRunnable(webView, javaScript)
-                mHandler.postDelayed(runnable, 1000L)
-            }
+            mHandler.postDelayed({
+                if (!javaScript.isNullOrEmpty()) {
+                    val runnable = LoadJsRunnable(webView, javaScript)
+                    mHandler.postDelayed(runnable, 1000L)
+                }
+            }, delayTime)
         }
 
         @SuppressLint("WebViewClientOnReceivedSslError")

+ 19 - 3
app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt

@@ -87,6 +87,7 @@ class AnalyzeUrl(
     private var webJs: String? = null
     private val enabledCookieJar = source?.enabledCookieJar ?: false
     private val domain: String
+    private var delayTime: Long? = null
 
     // 服务器ID
     var serverID: Long? = null
@@ -215,6 +216,7 @@ class AnalyzeUrl(
                         }
                     }
                     serverID = option.getServerID()
+                    delayTime = option.getDelayTime()
                 }
         }
         urlNoQuery = url
@@ -433,7 +435,8 @@ class AnalyzeUrl(
                             tag = source?.getKey(),
                             javaScript = webJs ?: jsStr,
                             sourceRegex = sourceRegex,
-                            headerMap = headerMap
+                            headerMap = headerMap,
+                            delayTime = delayTime ?:1000
                         ).getStrResponse()
                     }
 
@@ -442,7 +445,8 @@ class AnalyzeUrl(
                         tag = source?.getKey(),
                         javaScript = webJs ?: jsStr,
                         sourceRegex = sourceRegex,
-                        headerMap = headerMap
+                        headerMap = headerMap,
+                        delayTime = delayTime ?:1000
                     ).getStrResponse()
                 }
             } else {
@@ -704,7 +708,11 @@ class AnalyzeUrl(
         /**
          * 服务器id
          */
-        private var serverID: Long? = null
+        private var serverID: Long? = null,
+        /**
+         * webview等待页面加载完毕的延迟时间(毫秒)
+         */
+        private var delayTime: Long? = null,
     ) {
         fun setMethod(value: String?) {
             method = if (value.isNullOrBlank()) null else value
@@ -811,6 +819,14 @@ class AnalyzeUrl(
         fun getServerID(): Long? {
             return serverID
         }
+
+        fun setDelayTime(value: String?) {
+            delayTime = if (value.isNullOrBlank()) null else value.toLong()
+        }
+
+        fun getDelayTime(): Long? {
+            return delayTime
+        }
     }
 
     data class ConcurrentRecord(