Horis 1 год назад
Родитель
Сommit
3cf4937be8
1 измененных файлов с 34 добавлено и 18 удалено
  1. 34 18
      app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt

+ 34 - 18
app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt

@@ -10,6 +10,7 @@ import com.bumptech.glide.util.ContentLengthInputStream
 import com.script.rhino.runScriptWithContext
 import io.legado.app.data.entities.BaseSource
 import io.legado.app.exception.NoStackTraceException
+import io.legado.app.help.coroutine.Coroutine
 import io.legado.app.help.http.addHeaders
 import io.legado.app.help.http.okHttpClient
 import io.legado.app.help.http.okHttpClientManga
@@ -18,7 +19,9 @@ import io.legado.app.model.ReadManga
 import io.legado.app.model.analyzeRule.AnalyzeUrl
 import io.legado.app.utils.ImageUtils
 import io.legado.app.utils.isWifiConnect
-import kotlinx.coroutines.Job
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers.IO
+import kotlinx.coroutines.SupervisorJob
 import okhttp3.Call
 import okhttp3.Request
 import okhttp3.Response
@@ -39,7 +42,8 @@ class OkHttpStreamFetcher(
     private var callback: DataFetcher.DataCallback<in InputStream>? = null
     private var source: BaseSource? = null
     private val manga = options.get(OkHttpModelLoader.mangaOption) == true
-    private val coroutineContext = Job()
+    private val coroutineContext = SupervisorJob()
+    private val coroutineScope = CoroutineScope(coroutineContext)
     private lateinit var analyzedUrl: GlideUrl
 
     @Volatile
@@ -110,11 +114,20 @@ class OkHttpStreamFetcher(
 
     override fun onResponse(call: Call, response: Response) {
         responseBody = response.body
-        if (response.isSuccessful) {
+        if (!response.isSuccessful) {
+            if (!manga) {
+                failUrl.add(url.toStringUrl())
+            }
+            callback?.onLoadFailed(HttpException(response.message, response.code))
+            return
+        }
+        if (ImageUtils.skipDecode(source, !manga)) {
+            onStreamReady(responseBody!!.byteStream())
+            return
+        }
+        Coroutine.async(coroutineScope, executeContext = IO) {
             val decodeResult = runScriptWithContext(coroutineContext) {
-                if (ImageUtils.skipDecode(source, !manga)) {
-                    responseBody!!.byteStream()
-                } else if (manga) {
+                if (manga) {
                     ImageUtils.decode(
                         url.toString(),
                         responseBody!!.bytes(),
@@ -129,20 +142,23 @@ class OkHttpStreamFetcher(
                     )
                 }
             }
-            if (decodeResult == null) {
-                callback?.onLoadFailed(NoStackTraceException("封面二次解密失败"))
-            } else {
-                val contentLength: Long =
-                    if (decodeResult is ByteArrayInputStream) decodeResult.available().toLong()
-                    else responseBody!!.contentLength()
-                stream = ContentLengthInputStream.obtain(decodeResult, contentLength)
-                callback?.onDataReady(stream)
-            }
-        } else {
+            onStreamReady(decodeResult)
+        }
+    }
+
+    private fun onStreamReady(inputStream: InputStream?) {
+        if (inputStream == null) {
             if (!manga) {
-                failUrl.add(analyzedUrl.toStringUrl())
+                failUrl.add(url.toStringUrl())
             }
-            callback?.onLoadFailed(HttpException(response.message, response.code))
+            callback?.onLoadFailed(NoStackTraceException("封面二次解密失败"))
+        } else {
+            val contentLength: Long =
+                if (inputStream is ByteArrayInputStream) inputStream.available().toLong()
+                else responseBody!!.contentLength()
+            stream = ContentLengthInputStream.obtain(inputStream, contentLength)
+            callback?.onDataReady(stream)
         }
     }
+
 }