|
|
@@ -15,12 +15,11 @@ import io.legado.app.data.appDb
|
|
|
import io.legado.app.data.entities.Book
|
|
|
import io.legado.app.data.entities.BookChapter
|
|
|
import io.legado.app.data.entities.BookSource
|
|
|
+import io.legado.app.data.repository.RemoteBookRepository
|
|
|
import io.legado.app.exception.NoBooksDirException
|
|
|
import io.legado.app.exception.NoStackTraceException
|
|
|
-import io.legado.app.help.AppWebDav
|
|
|
import io.legado.app.help.book.BookHelp
|
|
|
import io.legado.app.help.book.getExportFileName
|
|
|
-import io.legado.app.help.book.getRemoteUrl
|
|
|
import io.legado.app.help.book.isLocal
|
|
|
import io.legado.app.help.book.isNotShelf
|
|
|
import io.legado.app.help.book.isSameNameAuthor
|
|
|
@@ -38,13 +37,15 @@ import io.legado.app.model.localBook.LocalBook
|
|
|
import io.legado.app.model.webBook.WebBook
|
|
|
import io.legado.app.utils.ArchiveUtils
|
|
|
import io.legado.app.utils.UrlUtil
|
|
|
-import io.legado.app.utils.isContentScheme
|
|
|
import io.legado.app.utils.postEvent
|
|
|
import io.legado.app.utils.toastOnUi
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
|
|
|
|
-class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|
|
+class BookInfoViewModel(
|
|
|
+ application: Application,
|
|
|
+ private val remoteBookRepository: RemoteBookRepository
|
|
|
+) : BaseViewModel(application) {
|
|
|
val bookData = MutableLiveData<Book>()
|
|
|
val chapterListData = MutableLiveData<List<BookChapter>>()
|
|
|
val webFiles = mutableListOf<WebFile>()
|
|
|
@@ -122,18 +123,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|
|
executeLazy(executeContext = IO) {
|
|
|
if (book.isLocal) {
|
|
|
book.tocUrl = ""
|
|
|
- book.getRemoteUrl()?.let {
|
|
|
- val bookWebDav = AppWebDav.defaultBookWebDav
|
|
|
- ?: throw NoStackTraceException("webDav没有配置")
|
|
|
- val remoteBook = bookWebDav.getRemoteBook(it)
|
|
|
- if (remoteBook == null) {
|
|
|
- book.origin = BookType.localTag
|
|
|
- } else if (remoteBook.lastModify > book.lastCheckTime) {
|
|
|
- val uri = bookWebDav.downloadRemoteBook(remoteBook)
|
|
|
- book.bookUrl = if (uri.isContentScheme()) uri.toString() else uri.path!!
|
|
|
- book.lastCheckTime = remoteBook.lastModify
|
|
|
- }
|
|
|
- }
|
|
|
+ remoteBookRepository.refreshLocalBook(book)
|
|
|
} else {
|
|
|
val bs = bookSource ?: return@executeLazy
|
|
|
if (book.originName != bs.bookSourceName) {
|
|
|
@@ -159,25 +149,9 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|
|
val book = bookData.value ?: return
|
|
|
if (!book.isLocal) return
|
|
|
|
|
|
- val remoteUrl = book.getRemoteUrl() ?: return
|
|
|
-
|
|
|
execute {
|
|
|
waitDialogData.postValue(true)
|
|
|
- val bookWebDav = AppWebDav.defaultBookWebDav
|
|
|
- ?: throw NoStackTraceException("webDav没有配置")
|
|
|
-
|
|
|
- val remoteBook = bookWebDav.getRemoteBook(remoteUrl)
|
|
|
- ?: throw NoStackTraceException("远程文件不存在")
|
|
|
-
|
|
|
- val downloadBookUri = bookWebDav.downloadRemoteBook(remoteBook)
|
|
|
-
|
|
|
- val importedBooks = LocalBook.importFiles(downloadBookUri)
|
|
|
- val newBook = importedBooks.firstOrNull() ?: throw NoStackTraceException("导入失败")
|
|
|
-
|
|
|
- newBook.durChapterIndex = book.durChapterIndex
|
|
|
- newBook.durChapterPos = book.durChapterPos
|
|
|
- newBook.order = book.order
|
|
|
- newBook.group = book.group
|
|
|
+ val newBook = remoteBookRepository.syncBookFromRemote(book)
|
|
|
|
|
|
appDb.bookDao.delete(book)
|
|
|
appDb.bookDao.insert(newBook)
|
|
|
@@ -188,6 +162,21 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|
|
context.toastOnUi("同步完成")
|
|
|
}.onFinally {
|
|
|
waitDialogData.postValue(false)
|
|
|
+ }.onError {
|
|
|
+ context.toastOnUi(it.localizedMessage)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fun uploadBook(book: Book, success: () -> Unit) {
|
|
|
+ execute {
|
|
|
+ waitDialogData.postValue(true)
|
|
|
+ remoteBookRepository.uploadBook(book)
|
|
|
+ saveBook(book)
|
|
|
+ success.invoke()
|
|
|
+ }.onFinally {
|
|
|
+ waitDialogData.postValue(false)
|
|
|
+ }.onError {
|
|
|
+ context.toastOnUi(it.localizedMessage)
|
|
|
}
|
|
|
}
|
|
|
|