From 9d02a63b228ecc12ed650a9defe00621a94adf39 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 31 Jul 2022 20:53:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/BookHelp.kt | 25 +++++++++++++++++++ .../io/legado/app/model/localBook/EpubFile.kt | 24 ++++++------------ 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 8e403ebff..c926cdc5f 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -1,5 +1,7 @@ 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.AppPattern import io.legado.app.constant.EventBus @@ -15,8 +17,11 @@ import kotlinx.coroutines.Dispatchers.IO import org.apache.commons.text.similarity.JaccardSimilarity import splitties.init.appCtx import java.io.File +import java.io.FileOutputStream +import java.io.IOException import java.util.concurrent.CopyOnWriteArraySet import java.util.regex.Pattern +import java.util.zip.ZipFile import kotlin.math.abs import kotlin.math.max import kotlin.math.min @@ -158,6 +163,26 @@ object BookHelp { 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 { val fileNameList = arrayListOf() if (book.isLocalTxt()) { diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt index 2a72a121d..368305998 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt +++ b/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.BitmapFactory -import android.net.Uri import android.text.TextUtils import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter +import io.legado.app.help.BookHelp import io.legado.app.utils.* import me.ag2s.epublib.domain.EpubBook import me.ag2s.epublib.domain.Resource @@ -15,13 +15,11 @@ import org.jsoup.Jsoup import org.jsoup.nodes.Element import org.jsoup.select.Elements import splitties.init.appCtx - import java.io.File import java.io.FileOutputStream import java.io.IOException import java.io.InputStream import java.nio.charset.Charset -import java.util.zip.ZipFile class EpubFile(var book: Book) { @@ -104,19 +102,13 @@ class EpubFile(var book: Book) { * 重写epub文件解析代码,直接读出压缩包文件生成Resources给epublib,这样的好处是可以逐一修改某些文件的格式错误 */ 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? {