From ffb3ecea2e74c869e05abcbe2c0f8f0c173d8bf5 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 6 Mar 2023 17:53:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/lib/webdav/WebDav.kt | 15 ++++-- .../legado/app/model/analyzeRule/CustomUrl.kt | 49 +++++++++++++++++++ .../legado/app/model/localBook/LocalBook.kt | 2 +- .../book/import/remote/RemoteBookViewModel.kt | 16 +++--- 4 files changed, 71 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/io/legado/app/model/analyzeRule/CustomUrl.kt diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 895a5198b..f4e8e925c 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -8,6 +8,7 @@ import io.legado.app.help.http.newCallResponse import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.text import io.legado.app.model.analyzeRule.AnalyzeUrl +import io.legado.app.model.analyzeRule.CustomUrl import io.legado.app.utils.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext @@ -33,11 +34,17 @@ import java.time.format.DateTimeFormatter @Suppress("unused", "MemberVisibilityCanBePrivate") open class WebDav( val path: String, - val authorization: Authorization = Authorization(AnalyzeUrl(path).serverID), - private val serverID: Long? = AnalyzeUrl(path).serverID - ) { + val authorization: Authorization, + private val serverID: Long? = null +) { companion object { + fun fromPath(path: String): WebDav { + val id = AnalyzeUrl(path).serverID + val authorization = Authorization(id) + return WebDav(path, authorization, id) + } + @SuppressLint("DateTimeFormatter") private val dateTimeFormatter = DateTimeFormatter.RFC_1123_DATE_TIME @@ -67,7 +74,7 @@ open class WebDav( } - private val url: URL = URL(AnalyzeUrl(path).url) + private val url: URL = URL(CustomUrl(path).getUrl()) private val httpUrl: String? by lazy { val raw = url.toString() .replace("davs://", "https://") diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/CustomUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/CustomUrl.kt new file mode 100644 index 000000000..99fe118ea --- /dev/null +++ b/app/src/main/java/io/legado/app/model/analyzeRule/CustomUrl.kt @@ -0,0 +1,49 @@ +package io.legado.app.model.analyzeRule + +import io.legado.app.utils.GSON +import io.legado.app.utils.fromJsonObject + +@Suppress("unused") +class CustomUrl(url: String) { + + private val mUrl: String + private val attribute = hashMapOf() + + init { + val urlMatcher = AnalyzeUrl.paramPattern.matcher(url) + mUrl = if (urlMatcher.find()) { + val attr = url.substring(urlMatcher.end()) + GSON.fromJsonObject>(attr).getOrNull()?.let { + attribute.putAll(it) + } + url.substring(0, urlMatcher.start()) + } else { + url + } + } + + fun putAttribute(key: String, value: Any?): CustomUrl { + if (value == null) { + attribute.remove(key) + } else { + attribute[key] = value + } + return this + } + + fun getUrl(): String { + return mUrl + } + + fun getAttr(): Map { + return attribute + } + + override fun toString(): String { + if (attribute.isEmpty()) { + return mUrl + } + return mUrl + "," + GSON.toJson(attribute) + } + +} \ No newline at end of file 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 ed8df5054..4bd3abb48 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 @@ -340,7 +340,7 @@ object LocalBook { ?: throw NoStackTraceException("没有设置书籍保存位置!") // 兼容旧版链接 val webdav: WebDav = kotlin.runCatching { - WebDav(webDavUrl) + WebDav.fromPath(webDavUrl) }.onFailure { AppWebDav.defaultBookWebDav ?: throw WebDavException("Unexpected defaultBookWebDav") diff --git a/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookViewModel.kt index 439e7a31b..b0ab19f18 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookViewModel.kt @@ -8,7 +8,7 @@ import io.legado.app.data.appDb import io.legado.app.exception.NoStackTraceException import io.legado.app.help.AppWebDav import io.legado.app.lib.webdav.Authorization -import io.legado.app.lib.webdav.WebDav +import io.legado.app.model.analyzeRule.CustomUrl import io.legado.app.model.localBook.LocalBook import io.legado.app.model.remote.RemoteBook import io.legado.app.model.remote.RemoteBookWebDav @@ -122,10 +122,14 @@ class RemoteBookViewModel(application: Application) : BaseViewModel(application) remoteBooks.forEach { remoteBook -> val bookWebDav = remoteBookWebDav ?: throw NoStackTraceException("没有配置webDav") - bookWebDav.run { - val downloadBookPath = downloadRemoteBook(remoteBook) - val localBook = LocalBook.importFile(downloadBookPath) - localBook.origin = BookType.webDavTag + WebDav(remoteBook.path, authorization, serverID).toString() + val downloadBookPath = bookWebDav.downloadRemoteBook(remoteBook) + downloadBookPath.let { + val localBook = LocalBook.importFile(it) + localBook.origin = BookType.webDavTag + CustomUrl(remoteBook.path) + .putAttribute( + "serverID", + bookWebDav.serverID + ).toString() localBook.save() remoteBook.isOnBookShelf = true } @@ -147,4 +151,4 @@ class RemoteBookViewModel(application: Application) : BaseViewModel(application) fun clear() } -} +} \ No newline at end of file