localBook uri 添加缓存
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user