mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
优化
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.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://")
|
||||
|
||||
@@ -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("没有设置书籍保存位置!")
|
||||
// 兼容旧版链接
|
||||
val webdav: WebDav = kotlin.runCatching {
|
||||
WebDav(webDavUrl)
|
||||
WebDav.fromPath(webDavUrl)
|
||||
}.onFailure {
|
||||
AppWebDav.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.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()
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user