kunfei 4 anni fa
parent
commit
9d02a63b22

+ 25 - 0
app/src/main/java/io/legado/app/help/BookHelp.kt

@@ -1,5 +1,7 @@
 package io.legado.app.help
 package io.legado.app.help
 
 
+import android.net.Uri
+import androidx.documentfile.provider.DocumentFile
 import io.legado.app.constant.AppLog
 import io.legado.app.constant.AppLog
 import io.legado.app.constant.AppPattern
 import io.legado.app.constant.AppPattern
 import io.legado.app.constant.EventBus
 import io.legado.app.constant.EventBus
@@ -15,8 +17,11 @@ import kotlinx.coroutines.Dispatchers.IO
 import org.apache.commons.text.similarity.JaccardSimilarity
 import org.apache.commons.text.similarity.JaccardSimilarity
 import splitties.init.appCtx
 import splitties.init.appCtx
 import java.io.File
 import java.io.File
+import java.io.FileOutputStream
+import java.io.IOException
 import java.util.concurrent.CopyOnWriteArraySet
 import java.util.concurrent.CopyOnWriteArraySet
 import java.util.regex.Pattern
 import java.util.regex.Pattern
+import java.util.zip.ZipFile
 import kotlin.math.abs
 import kotlin.math.abs
 import kotlin.math.max
 import kotlin.math.max
 import kotlin.math.min
 import kotlin.math.min
@@ -158,6 +163,26 @@ object BookHelp {
         return suffix
         return suffix
     }
     }
 
 
+    @Throws(IOException::class)
+    fun getEpubFile(book: Book): ZipFile {
+        val uri = Uri.parse(book.bookUrl)
+        if (uri.isContentScheme()) {
+            val path = FileUtils.getPath(downloadDir, cacheFolderName, book.originName)
+            val file = File(path)
+            val doc = DocumentFile.fromSingleUri(appCtx, uri)
+                ?: throw IOException("文件不存在")
+            if (!file.exists() || doc.lastModified() > book.latestChapterTime) {
+                LocalBook.getBookInputStream(book).use { inputStream ->
+                    FileOutputStream(file).use { outputStream ->
+                        inputStream.copyTo(outputStream)
+                    }
+                }
+            }
+            return ZipFile(file)
+        }
+        return ZipFile(uri.path)
+    }
+
     fun getChapterFiles(book: Book): List<String> {
     fun getChapterFiles(book: Book): List<String> {
         val fileNameList = arrayListOf<String>()
         val fileNameList = arrayListOf<String>()
         if (book.isLocalTxt()) {
         if (book.isLocalTxt()) {

+ 8 - 16
app/src/main/java/io/legado/app/model/localBook/EpubFile.kt

@@ -2,10 +2,10 @@ package io.legado.app.model.localBook
 
 
 import android.graphics.Bitmap
 import android.graphics.Bitmap
 import android.graphics.BitmapFactory
 import android.graphics.BitmapFactory
-import android.net.Uri
 import android.text.TextUtils
 import android.text.TextUtils
 import io.legado.app.data.entities.Book
 import io.legado.app.data.entities.Book
 import io.legado.app.data.entities.BookChapter
 import io.legado.app.data.entities.BookChapter
+import io.legado.app.help.BookHelp
 import io.legado.app.utils.*
 import io.legado.app.utils.*
 import me.ag2s.epublib.domain.EpubBook
 import me.ag2s.epublib.domain.EpubBook
 import me.ag2s.epublib.domain.Resource
 import me.ag2s.epublib.domain.Resource
@@ -15,13 +15,11 @@ import org.jsoup.Jsoup
 import org.jsoup.nodes.Element
 import org.jsoup.nodes.Element
 import org.jsoup.select.Elements
 import org.jsoup.select.Elements
 import splitties.init.appCtx
 import splitties.init.appCtx
-
 import java.io.File
 import java.io.File
 import java.io.FileOutputStream
 import java.io.FileOutputStream
 import java.io.IOException
 import java.io.IOException
 import java.io.InputStream
 import java.io.InputStream
 import java.nio.charset.Charset
 import java.nio.charset.Charset
-import java.util.zip.ZipFile
 
 
 class EpubFile(var book: Book) {
 class EpubFile(var book: Book) {
 
 
@@ -104,19 +102,13 @@ class EpubFile(var book: Book) {
      * 重写epub文件解析代码,直接读出压缩包文件生成Resources给epublib,这样的好处是可以逐一修改某些文件的格式错误
      * 重写epub文件解析代码,直接读出压缩包文件生成Resources给epublib,这样的好处是可以逐一修改某些文件的格式错误
      */
      */
     private fun readEpub(): EpubBook? {
     private fun readEpub(): EpubBook? {
-        try {
-            val uri = Uri.parse(book.bookUrl)
-            return if (uri.isContentScheme()) {
-                //高版本的手机内存一般足够大,直接加载到内存中最快
-                EpubReader().readEpub(LocalBook.getBookInputStream(book), "utf-8")
-            } else {
-                //低版本的使用懒加载
-                EpubReader().readEpubLazy(ZipFile(uri.path), "utf-8")
-            }
-        } catch (e: Exception) {
-            e.printOnDebug()
-        }
-        return null
+        return kotlin.runCatching {
+            //ContentScheme拷贝到私有文件夹采用懒加载防止OOM
+            val zipFile = BookHelp.getEpubFile(book)
+            EpubReader().readEpubLazy(zipFile, "utf-8")
+        }.onFailure {
+            it.printOnDebug()
+        }.getOrNull()
     }
     }
 
 
     private fun getContent(chapter: BookChapter): String? {
     private fun getContent(chapter: BookChapter): String? {