|
@@ -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 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)
|
|
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)
|