From eb51efbc55b6f82e99b42bc6f7c247907d7e0bbd Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Fri, 17 Mar 2023 17:46:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=8B=E7=BC=A9=E6=96=87=E4=BB=B6=E5=92=8C?= =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E6=96=87=E4=BB=B6=E8=87=AA=E5=8A=A8=E6=81=A2?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/book/BookExtensions.kt | 23 +++++++------ .../legado/app/model/localBook/LocalBook.kt | 34 +++++++++++++------ 2 files changed, 35 insertions(+), 22 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 23f754651..7b58246b8 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 @@ -58,17 +58,6 @@ val Book.isUpError: Boolean val Book.isArchive: Boolean get() = isType(BookType.archive) -val Book.archiveName: String? - get() { - return if (isArchive) { - // local_book::archive.rar - // webDav::https://...../archive.rar - origin.substringAfter("::").substringAfterLast("/") - } else { - null - } - } - fun Book.contains(word: String?): Boolean { if (word.isNullOrEmpty()) { return true @@ -143,6 +132,18 @@ fun Book.getLocalUri(): Uri { return uri } +fun Book.getArchiveUri(): Uri? { + val defaultBookDir = AppConfig.defaultBookTreeUri + return if (isArchive && !defaultBookDir.isNullOrBlank()) { + // local_book::archive.rar + // webDav::https://...../archive.rar + val archiveFileName = origin.substringAfter("::").substringAfterLast("/") + FileDoc.fromUri(Uri.parse(defaultBookDir), true).find(archiveFileName)?.uri + } else { + null + } +} + fun Book.cacheLocalUri(uri: Uri) { localUriCache[bookUrl] = uri } 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 85be9625f..fd454edcf 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 @@ -46,11 +46,22 @@ object LocalBook { @Throws(FileNotFoundException::class, SecurityException::class) fun getBookInputStream(book: Book): InputStream { val uri = book.getLocalUri() - //文件不存在 尝试下载webDav文件 val inputStream = uri.inputStream(appCtx).getOrNull() ?: let { book.removeLocalUriCache() - downloadRemoteBook(book) + val localArchiveUri = book.getArchiveUri() + if (localArchiveUri != null) { + // 重新导入对应的压缩包 + importArchiveFile(localArchiveUri, book.originName) { + it.contains(book.originName) + }.firstOrNull()?.let { + getBookInputStream(it) + } + } else { + // 下载远程链接 + downloadRemoteBook(book) + getBookInputStream(book) + } } if (inputStream != null) return inputStream book.removeLocalUriCache() @@ -203,7 +214,7 @@ object LocalBook { saveFileName ?: it.name ).let { importFile(it).apply { - //附加压缩包文件名 以便判断书籍导入界面压缩包是否导入 + //附加压缩包名称 以便解压文件被删后再解压 origin = "${BookType.localTag}::${archiveFileDoc.name}" addType(BookType.archive) save() @@ -374,8 +385,8 @@ object LocalBook { return localBook } - //下载book对应的远程文件并更新bookUrl 返回inputStream - private fun downloadRemoteBook(localBook: Book): InputStream? { + //下载book对应的远程文件 并更新Book + private fun downloadRemoteBook(localBook: Book): { val webDavUrl = localBook.getRemoteUrl() if (webDavUrl.isNullOrBlank()) return null try { @@ -388,14 +399,15 @@ object LocalBook { AppWebDav.authorization?.let { WebDav(webDavUrl, it) } ?: throw WebDavException("Unexpected defaultBookWebDav") } - val uri = runBlocking { + val fileUri = runBlocking { saveBookFile(webdav.downloadInputStream(), localBook.originName) - } - return uri.let { - localBook.bookUrl = if (it.isContentScheme()) it.toString() else it.path!! + if (localBook.isArchive) { + importArchiveFile(fileUri, book.originName) { + it.contains(book.originName) + } + } else { + localBook.bookUrl = FileDoc.fromUri(fileUr, false).toString() localBook.save() - localBook.cacheLocalUri(it) - it.inputStream(appCtx).getOrThrow() } } catch (e: Exception) { e.printOnDebug()