Просмотр исходного кода

压缩文件和远程文件自动恢复

Xwite 3 лет назад
Родитель
Сommit
25094f8d5e

+ 12 - 11
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
 }

+ 23 - 11
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()