更新时检测webDav书籍是否比本地新,自动重新下载
This commit is contained in:
@@ -2,19 +2,10 @@ package io.legado.app.model.remote
|
||||
|
||||
import android.net.Uri
|
||||
import io.legado.app.data.entities.Book
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
abstract class RemoteBookManager {
|
||||
protected val remoteBookFolder: String = "books"
|
||||
|
||||
init {
|
||||
runBlocking {
|
||||
initRemoteContext()
|
||||
}
|
||||
}
|
||||
|
||||
abstract suspend fun initRemoteContext()
|
||||
|
||||
/**
|
||||
* 获取书籍列表
|
||||
*/
|
||||
@@ -25,7 +16,7 @@ abstract class RemoteBookManager {
|
||||
* 根据书籍地址获取书籍信息
|
||||
*/
|
||||
@Throws(Exception::class)
|
||||
abstract suspend fun getRemoteBook(path: String): RemoteBook
|
||||
abstract suspend fun getRemoteBook(path: String): RemoteBook?
|
||||
|
||||
/**
|
||||
* @return Uri:下载到本地的路径
|
||||
|
||||
@@ -12,13 +12,21 @@ import io.legado.app.model.localBook.LocalBook
|
||||
import io.legado.app.utils.NetworkUtils
|
||||
import io.legado.app.utils.isContentScheme
|
||||
import io.legado.app.utils.readBytes
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import splitties.init.appCtx
|
||||
import java.io.File
|
||||
|
||||
object RemoteBookWebDav : RemoteBookManager() {
|
||||
|
||||
val rootBookUrl get() = "${AppWebDav.rootWebDavUrl}${remoteBookFolder}"
|
||||
|
||||
override suspend fun initRemoteContext() {
|
||||
init {
|
||||
runBlocking {
|
||||
initRemoteContext()
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun initRemoteContext() {
|
||||
AppWebDav.authorization?.let {
|
||||
WebDav(rootBookUrl, it).makeAsDir()
|
||||
}
|
||||
@@ -41,10 +49,10 @@ object RemoteBookWebDav : RemoteBookManager() {
|
||||
return remoteBooks
|
||||
}
|
||||
|
||||
override suspend fun getRemoteBook(path: String): RemoteBook {
|
||||
override suspend fun getRemoteBook(path: String): RemoteBook? {
|
||||
AppWebDav.authorization?.let {
|
||||
val webDavFile = WebDav(path, it).getWebDavFile()
|
||||
?: throw NoStackTraceException("远程书籍不存在")
|
||||
?: return null
|
||||
return RemoteBook(webDavFile)
|
||||
} ?: throw NoStackTraceException("webDav没有配置")
|
||||
}
|
||||
|
||||
@@ -332,9 +332,10 @@ class BookInfoActivity :
|
||||
}
|
||||
}
|
||||
tvOrigin.setOnClickListener {
|
||||
viewModel.bookData.value?.let {
|
||||
viewModel.bookData.value?.let { book ->
|
||||
if (book.isLocal) return@let
|
||||
startActivity<BookSourceEditActivity> {
|
||||
putExtra("sourceUrl", it.origin)
|
||||
putExtra("sourceUrl", book.origin)
|
||||
}
|
||||
} ?: toastOnUi("Book is null")
|
||||
}
|
||||
|
||||
@@ -15,12 +15,14 @@ import io.legado.app.data.entities.BookChapter
|
||||
import io.legado.app.data.entities.BookSource
|
||||
import io.legado.app.exception.NoStackTraceException
|
||||
import io.legado.app.help.book.BookHelp
|
||||
import io.legado.app.help.book.getRemoteUrl
|
||||
import io.legado.app.help.book.isLocal
|
||||
import io.legado.app.help.coroutine.Coroutine
|
||||
import io.legado.app.model.BookCover
|
||||
import io.legado.app.model.ReadBook
|
||||
import io.legado.app.model.analyzeRule.AnalyzeRule
|
||||
import io.legado.app.model.localBook.LocalBook
|
||||
import io.legado.app.model.remote.RemoteBookWebDav
|
||||
import io.legado.app.model.webBook.WebBook
|
||||
import io.legado.app.utils.postEvent
|
||||
import io.legado.app.utils.toastOnUi
|
||||
@@ -108,10 +110,23 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
||||
}
|
||||
|
||||
fun refreshBook(book: Book) {
|
||||
if (book.isLocal) {
|
||||
book.tocUrl = ""
|
||||
execute {
|
||||
if (book.isLocal) {
|
||||
book.tocUrl = ""
|
||||
book.getRemoteUrl()?.let {
|
||||
val remoteBook = RemoteBookWebDav.getRemoteBook(it)
|
||||
if (remoteBook == null) {
|
||||
|
||||
} else if (remoteBook.lastModify > book.latestChapterTime) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}.onError {
|
||||
AppLog.put("下载远程书籍<${book.name}>失败", it)
|
||||
}.onFinally {
|
||||
loadBookInfo(book, false)
|
||||
}
|
||||
loadBookInfo(book, false)
|
||||
}
|
||||
|
||||
fun loadBookInfo(
|
||||
|
||||
Reference in New Issue
Block a user