localBook uri 添加缓存

pull/2446/head
kunfei 2 years ago
parent 7f6862f8d2
commit ca6fc902a6
  1. 37
      app/src/main/java/io/legado/app/help/book/BookExtensions.kt
  2. 7
      app/src/main/java/io/legado/app/model/localBook/LocalBook.kt

@ -8,9 +8,10 @@ import io.legado.app.constant.BookType
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.config.AppConfig.defaultBookTreeUri
import io.legado.app.help.config.AppConfig
import io.legado.app.utils.*
import java.io.File
import java.util.concurrent.ConcurrentHashMap
val Book.isAudio: Boolean
@ -51,22 +52,48 @@ val Book.isOnLineTxt: Boolean
return !isLocal && type and BookType.text > 0
}
private val localUriCache by lazy {
ConcurrentHashMap<String, Uri>()
}
fun Book.getLocalUri(): Uri {
if (isLocal) {
val originBookUri = if (bookUrl.isContentScheme()) {
var uri = localUriCache[bookUrl]
if (uri != null) {
return uri
}
uri = if (bookUrl.isUri()) {
Uri.parse(bookUrl)
} else {
Uri.fromFile(File(bookUrl))
}
//不同的设备书籍保存路径可能不一样 优先尝试寻找当前保存路径下的文件
defaultBookTreeUri ?: return originBookUri
val treeUri = Uri.parse(defaultBookTreeUri)
val defaultBookDir = AppConfig.defaultBookTreeUri
if (defaultBookDir.isNullOrBlank()) {
localUriCache[bookUrl] = uri
return uri
}
val treeUri = Uri.parse(defaultBookDir)
val treeFileDoc = FileDoc.fromUri(treeUri, true)
return treeFileDoc.find(originName, 5)?.uri ?: originBookUri
val fileDoc = treeFileDoc.find(originName, 3)
if (fileDoc != null) {
localUriCache[bookUrl] = fileDoc.uri
return fileDoc.uri
}
localUriCache[bookUrl] = uri
return uri
}
throw NoStackTraceException("不是本地书籍")
}
fun Book.cacheLocalUri(uri: Uri) {
localUriCache[bookUrl] = uri
}
fun Book.removeLocalUriCache() {
localUriCache.remove(bookUrl)
}
fun Book.getRemoteUrl(): String? {
if (origin.startsWith(BookType.webDavTag)) {
return origin.substring(8)

@ -43,8 +43,12 @@ object LocalBook {
fun getBookInputStream(book: Book): InputStream {
val uri = book.getLocalUri()
//文件不存在 尝试下载webDav文件
val inputStream = uri.inputStream(appCtx) ?: downloadRemoteBook(book)
val inputStream = uri.inputStream(appCtx) ?: let {
book.removeLocalUriCache()
downloadRemoteBook(book)
}
if (inputStream != null) return inputStream
book.removeLocalUriCache()
throw FileNotFoundException("${uri.path} 文件不存在")
}
@ -319,6 +323,7 @@ object LocalBook {
return uri?.let {
localBook.bookUrl = if (it.isContentScheme()) it.toString() else it.path!!
localBook.save()
localBook.cacheLocalUri(it)
it.inputStream(appCtx)
}
} catch (e: Exception) {

Loading…
Cancel
Save