This commit is contained in:
kunfei
2023-03-06 17:53:55 +08:00
parent 34cd1c28f9
commit ffb3ecea2e
4 changed files with 71 additions and 11 deletions

View File

@@ -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://")

View File

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

View File

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

View File

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