From f1a0658677b1b1b84ed97cdb60005d759880fcc0 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 14 Mar 2023 12:42:49 +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 --- .../io/legado/app/help/book/BookExtensions.kt | 18 ++++++++++++++++ .../app/ui/book/info/BookInfoActivity.kt | 17 +++++++++------ .../app/ui/book/info/BookInfoViewModel.kt | 21 +++++++++++++------ .../io/legado/app/utils/compress/RarUtils.kt | 2 +- .../app/utils/compress/SevenZipUtils.kt | 2 +- .../io/legado/app/utils/compress/ZipUtils.kt | 10 +++++---- 6 files changed, 52 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt index 94041e500..d1f0e9c83 100644 --- a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt +++ b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt @@ -3,6 +3,9 @@ package io.legado.app.help.book import android.net.Uri +import com.script.SimpleBindings +import io.legado.app.constant.AppConst +import io.legado.app.constant.AppLog import io.legado.app.constant.BookSourceType import io.legado.app.constant.BookType import io.legado.app.data.appDb @@ -201,4 +204,19 @@ fun Book.isSameNameAuthor(other: Any?): Boolean { return name == other.name && author == other.author } return false +} + +fun Book.getExportFileName(): String { + val jsStr = AppConfig.bookExportFileName + if (jsStr.isNullOrBlank()) { + return "${name} 作者:${getRealAuthor()}" + } + val bindings = SimpleBindings() + bindings["name"] = name + bindings["author"] = getRealAuthor() + return kotlin.runCatching { + AppConst.SCRIPT_ENGINE.eval(jsStr, bindings).toString() + }.onFailure { + AppLog.put("导出书名规则错误,使用默认规则\n${it.localizedMessage}", it) + }.getOrDefault("${name} 作者:${getRealAuthor()}") } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index bc5e5a73f..4b9c281da 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -534,11 +534,13 @@ class BookInfoActivity : } else if (webFile.isSupportDecompress) { /* 解压筛选后再选择导入项 */ viewModel.importOrDownloadWebFile(webFile) { uri -> - viewModel.deCompress(uri) { - if (it.size == 1) { - viewModel.importBook(it[0]) + viewModel.deCompress(uri) { files -> + if (files.size == 1) { + viewModel.importBook(files[0]) { + onClick?.invoke(it) + } } else { - showDecompressFileImportAlert(it) + showDecompressFileImportAlert(files) } } } @@ -560,7 +562,8 @@ class BookInfoActivity : } private fun showDecompressFileImportAlert( - files: List + files: List, + success: ((Book) -> Unit)? = null ) { if (files.isEmpty()) { toastOnUi(R.string.unsupport_archivefile_entry) @@ -571,7 +574,9 @@ class BookInfoActivity : R.string.import_select_book, selectorNames ) { _, _, index -> - viewModel.importBook(files[index]) + viewModel.importBook(files[index]) { + success?.invoke(it) + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index fcd489c1e..f73591327 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -287,18 +287,27 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { AppPattern.bookFileRegex.matches(it.name) } }.onError { + AppLog.put("DeCompress Error:\n${it.localizedMessage}", it) context.toastOnUi("DeCompress Error:\n${it.localizedMessage}") }.onSuccess { onSuccess.invoke(it) } } - fun importBook(file: File) { - val uri = LocalBook.saveBookFile( - FileInputStream(file), - file.name - ) - changeToLocalBook(LocalBook.importFile(uri)) + @Suppress("BlockingMethodInNonBlockingContext") + fun importBook(file: File, success: ((Book) -> Unit)? = null) { + execute { + LocalBook.saveBookFile( + FileInputStream(file), + bookData.value!!.getExportFileName() + ) + }.onSuccess { + val book = changeToLocalBook(LocalBook.importFile(it)) + success?.invoke(book) + }.onError { + AppLog.put("ImportBook Error:\n${it.localizedMessage}", it) + context.toastOnUi("ImportBook Error:\n${it.localizedMessage}") + } } fun changeTo(source: BookSource, book: Book, toc: List) { diff --git a/app/src/main/java/io/legado/app/utils/compress/RarUtils.kt b/app/src/main/java/io/legado/app/utils/compress/RarUtils.kt index c95b10793..523cbb452 100644 --- a/app/src/main/java/io/legado/app/utils/compress/RarUtils.kt +++ b/app/src/main/java/io/legado/app/utils/compress/RarUtils.kt @@ -61,7 +61,7 @@ object RarUtils { } @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(archive: Archive, destDir: File?): List { + private fun unRarToPath(archive: Archive, destDir: File?): List { destDir ?: throw NullPointerException("解决路径不能为空") val files = arrayListOf() var entry: FileHeader? diff --git a/app/src/main/java/io/legado/app/utils/compress/SevenZipUtils.kt b/app/src/main/java/io/legado/app/utils/compress/SevenZipUtils.kt index c6ce35a68..0b09fd441 100644 --- a/app/src/main/java/io/legado/app/utils/compress/SevenZipUtils.kt +++ b/app/src/main/java/io/legado/app/utils/compress/SevenZipUtils.kt @@ -68,7 +68,7 @@ object SevenZipUtils { } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(sevenZFile: SevenZFile, destDir: File?): List { + private fun un7zToPath(sevenZFile: SevenZFile, destDir: File?): List { destDir ?: throw NullPointerException("解决路径不能为空") val files = arrayListOf() var entry: SevenZArchiveEntry? diff --git a/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt b/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt index db7bbb85b..87932a47d 100644 --- a/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt +++ b/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt @@ -4,6 +4,8 @@ import io.legado.app.utils.DebugLog import io.legado.app.utils.printOnDebug import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext +import org.apache.commons.compress.archivers.ArchiveEntry +import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream import java.io.* import java.util.zip.* @@ -192,22 +194,22 @@ object ZipUtils { @Throws(SecurityException::class) fun unZipToPath(inputStream: InputStream, path: String): List { - return ZipInputStream(inputStream).use { + return ZipArchiveInputStream(inputStream).use { unZipToPath(it, File(path)) } } @Throws(SecurityException::class) fun unZipToPath(inputStream: InputStream, dir: File): List { - return ZipInputStream(inputStream).use { + return ZipArchiveInputStream(inputStream).use { unZipToPath(it, dir) } } @Throws(SecurityException::class) - fun unZipToPath(zipInputStream: ZipInputStream, dir: File): List { + private fun unZipToPath(zipInputStream: ZipArchiveInputStream, dir: File): List { val files = arrayListOf() - var entry: ZipEntry? + var entry: ArchiveEntry? while (zipInputStream.nextEntry.also { entry = it } != null) { val entryFile = File(dir, entry!!.name) if (!entryFile.canonicalPath.startsWith(dir.canonicalPath)) {