优化
This commit is contained in:
@@ -8,6 +8,7 @@ import io.legado.app.help.http.newCallResponse
|
|||||||
import io.legado.app.help.http.okHttpClient
|
import io.legado.app.help.http.okHttpClient
|
||||||
import io.legado.app.help.http.text
|
import io.legado.app.help.http.text
|
||||||
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
||||||
|
import io.legado.app.model.analyzeRule.CustomUrl
|
||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.*
|
||||||
import kotlinx.coroutines.Dispatchers.IO
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@@ -33,11 +34,17 @@ import java.time.format.DateTimeFormatter
|
|||||||
@Suppress("unused", "MemberVisibilityCanBePrivate")
|
@Suppress("unused", "MemberVisibilityCanBePrivate")
|
||||||
open class WebDav(
|
open class WebDav(
|
||||||
val path: String,
|
val path: String,
|
||||||
val authorization: Authorization = Authorization(AnalyzeUrl(path).serverID),
|
val authorization: Authorization,
|
||||||
private val serverID: Long? = AnalyzeUrl(path).serverID
|
private val serverID: Long? = null
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
fun fromPath(path: String): WebDav {
|
||||||
|
val id = AnalyzeUrl(path).serverID
|
||||||
|
val authorization = Authorization(id)
|
||||||
|
return WebDav(path, authorization, id)
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("DateTimeFormatter")
|
@SuppressLint("DateTimeFormatter")
|
||||||
private val dateTimeFormatter = DateTimeFormatter.RFC_1123_DATE_TIME
|
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 {
|
private val httpUrl: String? by lazy {
|
||||||
val raw = url.toString()
|
val raw = url.toString()
|
||||||
.replace("davs://", "https://")
|
.replace("davs://", "https://")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -340,7 +340,7 @@ object LocalBook {
|
|||||||
?: throw NoStackTraceException("没有设置书籍保存位置!")
|
?: throw NoStackTraceException("没有设置书籍保存位置!")
|
||||||
// 兼容旧版链接
|
// 兼容旧版链接
|
||||||
val webdav: WebDav = kotlin.runCatching {
|
val webdav: WebDav = kotlin.runCatching {
|
||||||
WebDav(webDavUrl)
|
WebDav.fromPath(webDavUrl)
|
||||||
}.onFailure {
|
}.onFailure {
|
||||||
AppWebDav.defaultBookWebDav
|
AppWebDav.defaultBookWebDav
|
||||||
?: throw WebDavException("Unexpected defaultBookWebDav")
|
?: throw WebDavException("Unexpected defaultBookWebDav")
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import io.legado.app.data.appDb
|
|||||||
import io.legado.app.exception.NoStackTraceException
|
import io.legado.app.exception.NoStackTraceException
|
||||||
import io.legado.app.help.AppWebDav
|
import io.legado.app.help.AppWebDav
|
||||||
import io.legado.app.lib.webdav.Authorization
|
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.localBook.LocalBook
|
||||||
import io.legado.app.model.remote.RemoteBook
|
import io.legado.app.model.remote.RemoteBook
|
||||||
import io.legado.app.model.remote.RemoteBookWebDav
|
import io.legado.app.model.remote.RemoteBookWebDav
|
||||||
@@ -122,10 +122,14 @@ class RemoteBookViewModel(application: Application) : BaseViewModel(application)
|
|||||||
remoteBooks.forEach { remoteBook ->
|
remoteBooks.forEach { remoteBook ->
|
||||||
val bookWebDav = remoteBookWebDav
|
val bookWebDav = remoteBookWebDav
|
||||||
?: throw NoStackTraceException("没有配置webDav")
|
?: throw NoStackTraceException("没有配置webDav")
|
||||||
bookWebDav.run {
|
val downloadBookPath = bookWebDav.downloadRemoteBook(remoteBook)
|
||||||
val downloadBookPath = downloadRemoteBook(remoteBook)
|
downloadBookPath.let {
|
||||||
val localBook = LocalBook.importFile(downloadBookPath)
|
val localBook = LocalBook.importFile(it)
|
||||||
localBook.origin = BookType.webDavTag + WebDav(remoteBook.path, authorization, serverID).toString()
|
localBook.origin = BookType.webDavTag + CustomUrl(remoteBook.path)
|
||||||
|
.putAttribute(
|
||||||
|
"serverID",
|
||||||
|
bookWebDav.serverID
|
||||||
|
).toString()
|
||||||
localBook.save()
|
localBook.save()
|
||||||
remoteBook.isOnBookShelf = true
|
remoteBook.isOnBookShelf = true
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user