localBook uri 添加缓存

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

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

Loading…
Cancel
Save