diff --git a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt index 3600881c7..b349fe697 100644 --- a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt +++ b/app/src/main/java/io/legado/app/help/book/BookExtensions.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() +} + 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) diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index 3c8e0eaf8..1a9dd0feb 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -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) {