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

This commit is contained in:
Xwite
2023-03-17 17:46:45 +08:00
parent 9744ebfae5
commit eb51efbc55
2 changed files with 35 additions and 22 deletions

View File

@@ -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
}

View File

@@ -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()