mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
压缩文件和远程文件自动恢复
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user