From 43d8714d2b5bdbd2894c3a5e6ba3c6b7b5cb2d40 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 1 Jan 2022 11:04:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E4=B9=A6=E7=B1=8D=E6=97=A0?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=88=99=E4=BF=9D=E5=AD=98=E5=88=B0=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E9=80=89=E5=AE=9A=E7=9A=84=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 5 +++ .../io/legado/app/model/localBook/EpubFile.kt | 33 ++++--------------- .../legado/app/model/localBook/LocalBook.kt | 22 +++++++++---- .../io/legado/app/model/localBook/TextFile.kt | 21 ++---------- .../io/legado/app/model/localBook/UmdFile.kt | 9 +---- 5 files changed, 31 insertions(+), 59 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index d8f361f4b..3896502be 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,6 +11,11 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! +**2021/01/01** + +* 修复本地txt问题,不在拷贝到私有目录,可以正常打开 +* 优化txt目录识别,取目录数量最多的规则 + **2021/12/28** * 用阅读打开本地朗读引擎文件和主体配置文件也可以导入 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 1c15e6fd9..873bb4470 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,12 +2,13 @@ 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 io.legado.app.utils.FileUtils +import io.legado.app.utils.HtmlFormatter +import io.legado.app.utils.MD5Utils +import io.legado.app.utils.externalFiles import me.ag2s.epublib.domain.EpubBook import me.ag2s.epublib.domain.Resource import me.ag2s.epublib.domain.TOCReference @@ -23,36 +24,14 @@ import java.io.IOException import java.io.InputStream import java.nio.charset.Charset import java.util.* -import java.util.zip.ZipFile class EpubFile(var book: Book) { companion object { private var eFile: EpubFile? = null - fun getFile(book: Book): File { - val file = BookHelp.downloadDir.getFile( - BookHelp.cacheFolderName, - book.getFolderName(), - "index.epubx" - ) - if (!file.exists()) { - val input = if (book.bookUrl.isContentScheme()) { - val uri = Uri.parse(book.bookUrl) - appCtx.contentResolver.openInputStream(uri) - } else { - File(book.bookUrl).inputStream() - } - if (input != null) { - FileUtils.writeInputStream(file, input) - } - } - return file - } - @Synchronized private fun getEFile(book: Book): EpubFile { - getFile(book) if (eFile == null || eFile?.book?.bookUrl != book.bookUrl) { eFile = EpubFile(book) //对于Epub文件默认不启用替换 @@ -126,9 +105,9 @@ class EpubFile(var book: Book) { /*重写epub文件解析代码,直接读出压缩包文件生成Resources给epublib,这样的好处是可以逐一修改某些文件的格式错误*/ private fun readEpub(): EpubBook? { try { - val file = getFile(book) + val bis = LocalBook.getBookInputStream(book) //通过懒加载读取epub - return EpubReader().readEpubLazy(ZipFile(file), "utf-8") + return EpubReader().readEpub(bis, "utf-8") } catch (e: Exception) { Timber.e(e) } diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index 8294ace2e..59cfe9729 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -15,6 +15,9 @@ import io.legado.app.utils.* import splitties.init.appCtx import timber.log.Timber import java.io.File +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.io.InputStream import java.util.regex.Matcher import java.util.regex.Pattern import javax.script.SimpleBindings @@ -26,6 +29,15 @@ object LocalBook { FileUtils.createFolderIfNotExist(appCtx.externalFiles, folderName) } + @Throws(FileNotFoundException::class) + fun getBookInputStream(book: Book): InputStream { + if (book.bookUrl.isContentScheme()) { + val uri = Uri.parse(book.bookUrl) + return appCtx.contentResolver.openInputStream(uri)!! + } + return FileInputStream(File(book.bookUrl)) + } + @Throws(Exception::class) fun getChapterList(book: Book): ArrayList { val chapters = when { @@ -150,14 +162,12 @@ object LocalBook { fun deleteBook(book: Book, deleteOriginal: Boolean) { kotlin.runCatching { if (book.isLocalTxt() || book.isUmd()) { - val bookFile = cacheFolder.getFile(book.originName) - bookFile.delete() + cacheFolder.getFile(book.originName).delete() } if (book.isEpub()) { - val bookFile = EpubFile.getFile(book).parentFile - if (bookFile != null && bookFile.exists()) { - FileUtils.delete(bookFile, true) - } + FileUtils.delete( + cacheFolder.getFile(book.getFolderName()) + ) } if (deleteOriginal) { diff --git a/app/src/main/java/io/legado/app/model/localBook/TextFile.kt b/app/src/main/java/io/legado/app/model/localBook/TextFile.kt index 952f68803..8d1d3feaa 100644 --- a/app/src/main/java/io/legado/app/model/localBook/TextFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/TextFile.kt @@ -1,6 +1,5 @@ package io.legado.app.model.localBook -import android.net.Uri import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter @@ -9,12 +8,7 @@ import io.legado.app.help.DefaultData import io.legado.app.utils.EncodingDetect import io.legado.app.utils.MD5Utils import io.legado.app.utils.StringUtils -import io.legado.app.utils.isContentScheme -import splitties.init.appCtx -import java.io.File -import java.io.FileInputStream import java.io.FileNotFoundException -import java.io.InputStream import java.nio.charset.Charset import java.util.regex.Matcher import java.util.regex.Pattern @@ -28,7 +22,7 @@ class TextFile(private val book: Book) { fun getChapterList(): ArrayList { var rulePattern: Pattern? = null if (book.charset == null || book.tocUrl.isNotEmpty()) { - getBookInputStream(book).use { bis -> + LocalBook.getBookInputStream(book).use { bis -> val buffer = ByteArray(BUFFER_SIZE) var blockContent: String bis.read(buffer) @@ -55,7 +49,7 @@ class TextFile(private val book: Book) { private fun analyze(pattern: Pattern?): ArrayList { val toc = arrayListOf() - getBookInputStream(book).use { bis -> + LocalBook.getBookInputStream(book).use { bis -> var tocRule: TxtTocRule? = null val buffer = ByteArray(BUFFER_SIZE) var blockContent: String @@ -279,7 +273,7 @@ class TextFile(private val book: Book) { fun getContent(book: Book, bookChapter: BookChapter): String { val count = (bookChapter.end!! - bookChapter.start!!).toInt() val buffer = ByteArray(count) - getBookInputStream(book).use { bis -> + LocalBook.getBookInputStream(book).use { bis -> bis.skip(bookChapter.start!!) bis.read(buffer) } @@ -288,15 +282,6 @@ class TextFile(private val book: Book) { .replace("^[\\n\\s]+".toRegex(), "  ") } - @Throws(FileNotFoundException::class) - private fun getBookInputStream(book: Book): InputStream { - if (book.bookUrl.isContentScheme()) { - val uri = Uri.parse(book.bookUrl) - return appCtx.contentResolver.openInputStream(uri)!! - } - return FileInputStream(File(book.bookUrl)) - } - private fun getTocRules(): List { var rules = appDb.txtTocRuleDao.enabled if (rules.isEmpty()) { diff --git a/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt b/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt index 03ce0a113..c2e46c5a2 100644 --- a/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt @@ -1,12 +1,10 @@ package io.legado.app.model.localBook -import android.net.Uri import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.utils.FileUtils import io.legado.app.utils.MD5Utils import io.legado.app.utils.externalFiles -import io.legado.app.utils.isContentScheme import me.ag2s.umdlib.domain.UmdBook import me.ag2s.umdlib.umd.UmdReader import splitties.init.appCtx @@ -87,12 +85,7 @@ class UmdFile(var book: Book) { } private fun readUmd(): UmdBook? { - val input = if (book.bookUrl.isContentScheme()) { - val uri = Uri.parse(book.bookUrl) - appCtx.contentResolver.openInputStream(uri) - } else { - File(book.bookUrl).inputStream() - } + val input = LocalBook.getBookInputStream(book) return UmdReader().read(input) }