kunfei 3 лет назад
Родитель
Сommit
36238083f6

+ 11 - 4
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://")

+ 49 - 0
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<String, Any>()
+
+    init {
+        val urlMatcher = AnalyzeUrl.paramPattern.matcher(url)
+        mUrl = if (urlMatcher.find()) {
+            val attr = url.substring(urlMatcher.end())
+            GSON.fromJsonObject<Map<String, Any>>(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<String, Any> {
+        return attribute
+    }
+
+    override fun toString(): String {
+        if (attribute.isEmpty()) {
+            return mUrl
+        }
+        return mUrl + "," + GSON.toJson(attribute)
+    }
+
+}

+ 1 - 1
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")

+ 10 - 6
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()
 
     }
-}
+}