From 07a36900be4dc3329bf50ea09da37173b6859770 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Thu, 16 Mar 2023 17:54:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E4=B9=A6=E7=B1=8D=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E6=94=AF=E6=8C=81=E5=AF=BC=E5=85=A5=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/constant/AppPattern.kt | 2 +- .../legado/app/model/localBook/LocalBook.kt | 26 +++++++++++++++++-- .../book/import/local/ImportBookViewModel.kt | 10 ++++--- .../java/io/legado/app/utils/ArchiveUtils.kt | 9 +++---- 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/AppPattern.kt b/app/src/main/java/io/legado/app/constant/AppPattern.kt index c979e12ce..5bc621f1f 100644 --- a/app/src/main/java/io/legado/app/constant/AppPattern.kt +++ b/app/src/main/java/io/legado/app/constant/AppPattern.kt @@ -25,7 +25,7 @@ object AppPattern { //本地书籍支持类型 val bookFileRegex = Regex(".*\\.(txt|epub|umd|pdf)", RegexOption.IGNORE_CASE) //压缩文件支持类型 - val archiveFileRegex = Regex(".*\\.(zip|rar|7z)", RegexOption.IGNORE_CASE) + val archiveFileRegex = Regex(".*\\.(zip|rar|7z)$", RegexOption.IGNORE_CASE) /** * 所有标点 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 bbcc528c4..625ca30a3 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 @@ -188,9 +188,10 @@ object LocalBook { return book } + /* 导入压缩包内的书籍 */ fun importArchiveFile( uri: Uri, - saveFileName: String, + saveFileName: String? = null filter: ((String) -> Boolean)? = null ): List { val files = ArchiveUtils.deCompress(uri, filter = filter) @@ -198,13 +199,34 @@ object LocalBook { return files.map { saveBookFile( FileInputStream(it), - saveFileName + saveFileName ?: it.name ).let { importFile(it) } } } + /* 批量导入 支持自动导入压缩包的支持书籍 */ + fun importFiles(uris: List) { + var errorCount = 0 + uris.forEach { uri -> + val fileDoc = FileDoc.fromUri(uri, false) + kotlin.runCatching { + if (ArchiveUtils.isArchive(fileDoc.name)) { + importArchiveFile(uri) { + it.matches(AppPattern.bookFileRegex) + } + } else { + importFile(uri) + } + }.onFailure { + AppLog.put("ImportFile Error:\nFile ${fileDoc.toString()}\n${it.localizedMessage}", it) + errorCount = errorCount + 1 + } + } + if (errorCount == uris.size) throw NoStackTraceException("ImportFiles Error:\nAll input files occur error") + } + /** * 从文件分析书籍必要信息(书名 作者等) */ diff --git a/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookViewModel.kt index f4c1d9dbe..9e17df2d5 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookViewModel.kt @@ -5,6 +5,7 @@ import android.net.Uri import androidx.documentfile.provider.DocumentFile import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppLog +import io.legado.app.constant.AppPattern.archiveFileRegex import io.legado.app.constant.AppPattern.bookFileRegex import io.legado.app.constant.PreferKey import io.legado.app.model.localBook.LocalBook @@ -84,9 +85,11 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application) fun addToBookshelf(uriList: HashSet, finally: () -> Unit) { execute { + val fileUris = mutableListOf() uriList.forEach { - LocalBook.importFile(Uri.parse(it)) + fileUris.add(Uri.parse(it)) } + LocalBook.importFiles(fileUris) }.onError { context.toastOnUi("添加书架失败,请尝试重新选择文件夹") AppLog.put("添加书架失败\n${it.localizedMessage}", it) @@ -118,7 +121,7 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application) when { item.name.startsWith(".") -> false item.isDir -> true - else -> item.name.matches(bookFileRegex) + else -> item.name.matches(bookFileRegex) || item.name.matches(archiveFileRegex) } } dataCallback?.setItems(docList!!) @@ -149,7 +152,8 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application) } if (docItem.isDir) { scanDoc(docItem, false, scope) - } else if (docItem.name.matches(bookFileRegex)) { + } else if (docItem.name.matches(bookFileRegex) || docItem.name.matches(archiveFileRegex) + ) { list.add(docItem) } } diff --git a/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt b/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt index f7da695e1..0389f5723 100644 --- a/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt +++ b/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt @@ -2,6 +2,7 @@ package io.legado.app.utils import android.net.Uri import androidx.documentfile.provider.DocumentFile +import io.legado.app.constant.AppPattern.archiveFileRegex import io.legado.app.utils.compress.RarUtils import io.legado.app.utils.compress.SevenZipUtils import io.legado.app.utils.compress.ZipUtils @@ -95,12 +96,8 @@ object ArchiveUtils { } } - fun checkAchieve(name: String) { - if ( - name.endsWith(".zip", ignoreCase = true) || - name.endsWith(".rar", ignoreCase = true) || - name.endsWith(".7z", ignoreCase = true) - ) return + fun checkAchieve(name: String): Boolean { + if (archiveFileRegex.matches(name)) return true throw IllegalArgumentException("Unexpected file suffix: Only 7z rar zip Accepted") }