压缩文件和远程文件自动恢复
This commit is contained in:
@@ -58,17 +58,6 @@ val Book.isUpError: Boolean
|
|||||||
val Book.isArchive: Boolean
|
val Book.isArchive: Boolean
|
||||||
get() = isType(BookType.archive)
|
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 {
|
fun Book.contains(word: String?): Boolean {
|
||||||
if (word.isNullOrEmpty()) {
|
if (word.isNullOrEmpty()) {
|
||||||
return true
|
return true
|
||||||
@@ -143,6 +132,18 @@ fun Book.getLocalUri(): Uri {
|
|||||||
return 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) {
|
fun Book.cacheLocalUri(uri: Uri) {
|
||||||
localUriCache[bookUrl] = uri
|
localUriCache[bookUrl] = uri
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,11 +46,22 @@ object LocalBook {
|
|||||||
@Throws(FileNotFoundException::class, SecurityException::class)
|
@Throws(FileNotFoundException::class, SecurityException::class)
|
||||||
fun getBookInputStream(book: Book): InputStream {
|
fun getBookInputStream(book: Book): InputStream {
|
||||||
val uri = book.getLocalUri()
|
val uri = book.getLocalUri()
|
||||||
//文件不存在 尝试下载webDav文件
|
|
||||||
val inputStream = uri.inputStream(appCtx).getOrNull()
|
val inputStream = uri.inputStream(appCtx).getOrNull()
|
||||||
?: let {
|
?: let {
|
||||||
book.removeLocalUriCache()
|
book.removeLocalUriCache()
|
||||||
|
val localArchiveUri = book.getArchiveUri()
|
||||||
|
if (localArchiveUri != null) {
|
||||||
|
// 重新导入对应的压缩包
|
||||||
|
importArchiveFile(localArchiveUri, book.originName) {
|
||||||
|
it.contains(book.originName)
|
||||||
|
}.firstOrNull()?.let {
|
||||||
|
getBookInputStream(it)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 下载远程链接
|
||||||
downloadRemoteBook(book)
|
downloadRemoteBook(book)
|
||||||
|
getBookInputStream(book)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (inputStream != null) return inputStream
|
if (inputStream != null) return inputStream
|
||||||
book.removeLocalUriCache()
|
book.removeLocalUriCache()
|
||||||
@@ -203,7 +214,7 @@ object LocalBook {
|
|||||||
saveFileName ?: it.name
|
saveFileName ?: it.name
|
||||||
).let {
|
).let {
|
||||||
importFile(it).apply {
|
importFile(it).apply {
|
||||||
//附加压缩包文件名 以便判断书籍导入界面压缩包是否导入
|
//附加压缩包名称 以便解压文件被删后再解压
|
||||||
origin = "${BookType.localTag}::${archiveFileDoc.name}"
|
origin = "${BookType.localTag}::${archiveFileDoc.name}"
|
||||||
addType(BookType.archive)
|
addType(BookType.archive)
|
||||||
save()
|
save()
|
||||||
@@ -374,8 +385,8 @@ object LocalBook {
|
|||||||
return localBook
|
return localBook
|
||||||
}
|
}
|
||||||
|
|
||||||
//下载book对应的远程文件并更新bookUrl 返回inputStream
|
//下载book对应的远程文件 并更新Book
|
||||||
private fun downloadRemoteBook(localBook: Book): InputStream? {
|
private fun downloadRemoteBook(localBook: Book): {
|
||||||
val webDavUrl = localBook.getRemoteUrl()
|
val webDavUrl = localBook.getRemoteUrl()
|
||||||
if (webDavUrl.isNullOrBlank()) return null
|
if (webDavUrl.isNullOrBlank()) return null
|
||||||
try {
|
try {
|
||||||
@@ -388,14 +399,15 @@ object LocalBook {
|
|||||||
AppWebDav.authorization?.let { WebDav(webDavUrl, it) }
|
AppWebDav.authorization?.let { WebDav(webDavUrl, it) }
|
||||||
?: throw WebDavException("Unexpected defaultBookWebDav")
|
?: throw WebDavException("Unexpected defaultBookWebDav")
|
||||||
}
|
}
|
||||||
val uri = runBlocking {
|
val fileUri = runBlocking {
|
||||||
saveBookFile(webdav.downloadInputStream(), localBook.originName)
|
saveBookFile(webdav.downloadInputStream(), localBook.originName)
|
||||||
|
if (localBook.isArchive) {
|
||||||
|
importArchiveFile(fileUri, book.originName) {
|
||||||
|
it.contains(book.originName)
|
||||||
}
|
}
|
||||||
return uri.let {
|
} else {
|
||||||
localBook.bookUrl = if (it.isContentScheme()) it.toString() else it.path!!
|
localBook.bookUrl = FileDoc.fromUri(fileUr, false).toString()
|
||||||
localBook.save()
|
localBook.save()
|
||||||
localBook.cacheLocalUri(it)
|
|
||||||
it.inputStream(appCtx).getOrThrow()
|
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printOnDebug()
|
e.printOnDebug()
|
||||||
|
|||||||
Reference in New Issue
Block a user