pull/2380/head
kunfei 2 years ago
parent 0867c1fc32
commit c214fb65ca
  1. 4
      app/src/main/java/io/legado/app/App.kt
  2. 6
      app/src/main/java/io/legado/app/api/controller/BookController.kt
  3. 4
      app/src/main/java/io/legado/app/data/entities/Book.kt
  4. 2
      app/src/main/java/io/legado/app/help/AppWebDav.kt
  5. 0
      app/src/main/java/io/legado/app/help/book/BookExtensions.kt
  6. 5
      app/src/main/java/io/legado/app/help/book/BookHelp.kt
  7. 4
      app/src/main/java/io/legado/app/help/book/ContentHelp.kt
  8. 2
      app/src/main/java/io/legado/app/help/book/ContentProcessor.kt
  9. 2
      app/src/main/java/io/legado/app/help/storage/Backup.kt
  10. 6
      app/src/main/java/io/legado/app/lib/webdav/WebDav.kt
  11. 2
      app/src/main/java/io/legado/app/model/AudioPlay.kt
  12. 2
      app/src/main/java/io/legado/app/model/CacheBook.kt
  13. 6
      app/src/main/java/io/legado/app/model/ReadBook.kt
  14. 2
      app/src/main/java/io/legado/app/model/localBook/EpubFile.kt
  15. 4
      app/src/main/java/io/legado/app/model/localBook/LocalBook.kt
  16. 35
      app/src/main/java/io/legado/app/model/remote/RemoteBookManager.kt
  17. 31
      app/src/main/java/io/legado/app/model/remote/RemoteBookWebDav.kt
  18. 2
      app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt
  19. 2
      app/src/main/java/io/legado/app/model/webBook/BookContent.kt
  20. 2
      app/src/main/java/io/legado/app/model/webBook/BookInfo.kt
  21. 2
      app/src/main/java/io/legado/app/model/webBook/BookList.kt
  22. 2
      app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt
  23. 2
      app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt
  24. 6
      app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt
  25. 2
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt
  26. 8
      app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt
  27. 2
      app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt
  28. 4
      app/src/main/java/io/legado/app/ui/book/read/ContentEditDialog.kt
  29. 2
      app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
  30. 6
      app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt
  31. 2
      app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt
  32. 18
      app/src/main/java/io/legado/app/ui/book/remote/RemoteBookManager.kt
  33. 4
      app/src/main/java/io/legado/app/ui/book/remote/RemoteBookViewModel.kt
  34. 2
      app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt
  35. 4
      app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt
  36. 2
      app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt
  37. 2
      app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt
  38. 2
      app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt
  39. 4
      app/src/main/java/io/legado/app/ui/config/ConfigViewModel.kt
  40. 4
      app/src/main/java/io/legado/app/ui/main/MainActivity.kt
  41. 4
      app/src/main/java/io/legado/app/ui/main/MainViewModel.kt
  42. 2
      app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt
  43. 2
      app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt

@ -16,15 +16,15 @@ import io.legado.app.constant.AppConst.channelIdReadAloud
import io.legado.app.constant.AppConst.channelIdWeb
import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb
import io.legado.app.help.BookHelp
import io.legado.app.help.AppWebDav
import io.legado.app.help.CrashHandler
import io.legado.app.help.LifecycleHelp
import io.legado.app.help.RuleBigDataHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ThemeConfig.applyDayNight
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.http.cronet.CronetLoader
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.BookCover
import io.legado.app.utils.defaultSharedPreferences
import io.legado.app.utils.getPrefBoolean

@ -7,12 +7,12 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookProgress
import io.legado.app.data.entities.BookSource
import io.legado.app.help.BookHelp
import io.legado.app.help.AppWebDav
import io.legado.app.help.CacheManager
import io.legado.app.help.ContentProcessor
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.glide.ImageLoader
import io.legado.app.help.isLocal
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.BookCover
import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook

@ -6,8 +6,8 @@ import io.legado.app.constant.AppPattern
import io.legado.app.constant.BookType
import io.legado.app.constant.PageAnim
import io.legado.app.data.appDb
import io.legado.app.help.BookHelp
import io.legado.app.help.ContentProcessor
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.isEpub

@ -1,4 +1,4 @@
package io.legado.app.help.webdav
package io.legado.app.help
import android.content.Context
import io.legado.app.R

@ -1,4 +1,4 @@
package io.legado.app.help
package io.legado.app.help.book
import android.net.Uri
import androidx.documentfile.provider.DocumentFile
@ -9,6 +9,9 @@ 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.help.isEpub
import io.legado.app.help.isLocal
import io.legado.app.help.isLocalTxt
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.localBook.LocalBook
import io.legado.app.utils.*

@ -1,4 +1,4 @@
package io.legado.app.help
package io.legado.app.help.book
import java.util.regex.Pattern
import kotlin.math.max
@ -478,7 +478,7 @@ object ContentHelp {
val patten = Pattern.compile(
"""
(?<=["'”“])([^
\p{P}]{1,${WORD_MAX_LENGTH}})(?=["'”“])
\p{P}]{1,$WORD_MAX_LENGTH})(?=["'”“])
""".trimIndent()
)
//Pattern patten = Pattern.compile("(?<=[\"'”“])([^\n\"'”“]{1,16})(?=[\"'”“])");

@ -1,4 +1,4 @@
package io.legado.app.help
package io.legado.app.help.book
import com.github.liuyueyi.quick.transfer.ChineseUtils
import io.legado.app.constant.AppLog

@ -6,12 +6,12 @@ import androidx.documentfile.provider.DocumentFile
import io.legado.app.constant.AppLog
import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb
import io.legado.app.help.AppWebDav
import io.legado.app.help.DirectLinkUpload
import io.legado.app.help.config.LocalConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.config.ThemeConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.utils.*
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.ensureActive

@ -8,6 +8,8 @@ import io.legado.app.help.http.okHttpClient
import io.legado.app.help.http.text
import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.printOnDebug
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.withContext
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.asRequestBody
@ -274,6 +276,7 @@ open class WebDav(val path: String, val authorization: Authorization) {
contentType: String = "application/octet-stream"
) {
kotlin.runCatching {
withContext(IO) {
val file = File(localPath)
if (!file.exists()) throw WebDavException("文件不存在")
// 务必注意RequestBody不要嵌套,不然上传时内容可能会被追加多余的文件信息
@ -285,6 +288,7 @@ open class WebDav(val path: String, val authorization: Authorization) {
}.let {
checkResult(it)
}
}
}.onFailure {
AppLog.put("WebDav上传失败\n${it.localizedMessage}", it)
throw WebDavException("WebDav上传失败\n${it.localizedMessage}")
@ -295,6 +299,7 @@ open class WebDav(val path: String, val authorization: Authorization) {
suspend fun upload(byteArray: ByteArray, contentType: String) {
// 务必注意RequestBody不要嵌套,不然上传时内容可能会被追加多余的文件信息
kotlin.runCatching {
withContext(IO) {
val fileBody = byteArray.toRequestBody(contentType.toMediaType())
val url = httpUrl ?: throw NoStackTraceException("url不能为空")
webDavClient.newCallResponse {
@ -303,6 +308,7 @@ open class WebDav(val path: String, val authorization: Authorization) {
}.let {
checkResult(it)
}
}
}.onFailure {
AppLog.put("WebDav上传失败\n${it.localizedMessage}", it)
throw WebDavException("WebDav上传失败\n${it.localizedMessage}")

@ -10,7 +10,7 @@ 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.help.ContentProcessor
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.service.AudioPlayService
import io.legado.app.utils.postEvent

@ -9,7 +9,7 @@ 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.exception.ConcurrentException
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.isLocal
import io.legado.app.model.webBook.WebBook
import io.legado.app.service.CacheBookService

@ -3,13 +3,13 @@ package io.legado.app.model
import io.legado.app.constant.AppLog
import io.legado.app.data.appDb
import io.legado.app.data.entities.*
import io.legado.app.help.BookHelp
import io.legado.app.help.ContentProcessor
import io.legado.app.help.AppWebDav
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.isLocal
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.webBook.WebBook
import io.legado.app.service.BaseReadAloudService
import io.legado.app.ui.book.read.page.entities.TextChapter

@ -6,7 +6,7 @@ import android.text.TextUtils
import io.legado.app.constant.AppLog
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.utils.*
import me.ag2s.epublib.domain.EpubBook
import me.ag2s.epublib.domain.Resource

@ -14,11 +14,11 @@ import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.exception.NoStackTraceException
import io.legado.app.exception.TocEmptyException
import io.legado.app.help.BookHelp
import io.legado.app.help.AppWebDav
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.help.isEpub
import io.legado.app.help.isUmd
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.lib.webdav.WebDav
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.*

@ -0,0 +1,35 @@
package io.legado.app.model.remote
import android.net.Uri
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.RemoteBook
abstract class RemoteBookManager {
protected val remoteBookFolder: String = "books"
abstract suspend fun initRemoteContext()
/**
* 获取书籍列表
*/
@Throws(Exception::class)
abstract suspend fun getRemoteBookList(path: String): MutableList<RemoteBook>
/**
* 上传书籍
*/
@Throws(Exception::class)
abstract suspend fun upload(book: Book)
/**
* 删除书籍
*/
@Throws(Exception::class)
abstract suspend fun delete(remoteBookUrl: String)
/**
* @return Uri下载到本地的路径
*/
@Throws(Exception::class)
abstract suspend fun getRemoteBook(remoteBook: RemoteBook): Uri
}

@ -1,4 +1,4 @@
package io.legado.app.help.webdav
package io.legado.app.model.remote
import android.net.Uri
import io.legado.app.constant.AppPattern.bookFileRegex
@ -6,10 +6,10 @@ import io.legado.app.constant.BookType
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.RemoteBook
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.AppWebDav
import io.legado.app.lib.webdav.WebDav
import io.legado.app.lib.webdav.WebDavFile
import io.legado.app.model.localBook.LocalBook
import io.legado.app.ui.book.remote.RemoteBookManager
import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.isContentScheme
import io.legado.app.utils.readBytes
@ -32,9 +32,6 @@ object RemoteBookWebDav : RemoteBookManager() {
}
}
/**
* 获取远程书籍列表
*/
@Throws(Exception::class)
override suspend fun getRemoteBookList(path: String): MutableList<RemoteBook> {
val remoteBooks = mutableListOf<RemoteBook>()
@ -70,23 +67,17 @@ object RemoteBookWebDav : RemoteBookManager() {
return remoteBooks
}
/**
* 下载指定的远程书籍到本地
*/
override suspend fun getRemoteBook(remoteBook: RemoteBook): Uri? {
override suspend fun getRemoteBook(remoteBook: RemoteBook): Uri {
return AppWebDav.authorization?.let {
val webdav = WebDav(remoteBook.path, it)
webdav.downloadInputStream().let { inputStream ->
LocalBook.saveBookFile(inputStream, remoteBook.filename)
}
}
} ?: throw NoStackTraceException("webDav没有配置")
}
/**
* 上传本地导入的书籍到远程
*/
override suspend fun upload(book: Book): Boolean {
if (!NetworkUtils.isAvailable()) return false
override suspend fun upload(book: Book) {
if (!NetworkUtils.isAvailable()) throw NoStackTraceException("网络不可用")
val localBookUri = Uri.parse(book.bookUrl)
val putUrl = "$rootBookUrl${File.separator}${book.originName}"
AppWebDav.authorization?.let {
@ -98,17 +89,15 @@ object RemoteBookWebDav : RemoteBookManager() {
} else {
WebDav(putUrl, it).upload(localBookUri.path!!)
}
}
} ?: throw NoStackTraceException("webDav没有配置")
book.origin = BookType.webDavTag + putUrl
book.save()
return true
}
override suspend fun delete(remoteBookUrl: String): Boolean {
override suspend fun delete(remoteBookUrl: String) {
AppWebDav.authorization?.let {
return WebDav(remoteBookUrl, it).delete()
}
return false
WebDav(remoteBookUrl, it).delete()
} ?: throw NoStackTraceException("webDav没有配置")
}
}

@ -8,7 +8,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.rule.TocRule
import io.legado.app.exception.NoStackTraceException
import io.legado.app.exception.TocEmptyException
import io.legado.app.help.ContentProcessor
import io.legado.app.help.book.ContentProcessor
import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeUrl

@ -8,7 +8,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.rule.ContentRule
import io.legado.app.exception.ContentEmptyException
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeUrl

@ -6,7 +6,7 @@ import io.legado.app.constant.BookType
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.utils.DebugLog

@ -6,7 +6,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.SearchBook
import io.legado.app.data.entities.rule.BookListRule
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.getBookType
import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule

@ -10,7 +10,7 @@ import io.legado.app.constant.AppPattern
import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.ContentProcessor
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.config.AppConfig
import io.legado.app.help.http.newCallResponseBody
import io.legado.app.help.http.okHttpClient

@ -18,7 +18,7 @@ import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BookGroup
import io.legado.app.databinding.ActivityCacheBookBinding
import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.help.isAudio
import io.legado.app.lib.dialogs.SelectItem

@ -18,11 +18,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.exception.NoStackTraceException
import io.legado.app.help.BookHelp
import io.legado.app.help.ContentProcessor
import io.legado.app.help.AppWebDav
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.config.AppConfig
import io.legado.app.help.coroutine.OrderCoroutine
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.utils.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive

@ -21,7 +21,7 @@ import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.SearchBook
import io.legado.app.databinding.DialogChapterChangeSourceBinding
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.elevation

@ -23,12 +23,12 @@ import io.legado.app.help.config.AppConfig
import io.legado.app.help.isAudio
import io.legado.app.help.isLocal
import io.legado.app.help.isLocalTxt
import io.legado.app.help.webdav.RemoteBookWebDav
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.lib.theme.bottomBackground
import io.legado.app.lib.theme.getPrimaryTextColor
import io.legado.app.model.BookCover
import io.legado.app.model.remote.RemoteBookWebDav
import io.legado.app.ui.about.AppLogDialog
import io.legado.app.ui.association.ImportOnLineBookFileDialog
import io.legado.app.ui.book.audio.AudioPlayActivity
@ -213,11 +213,7 @@ class BookInfoActivity :
waitDialog.setText("上传中.....")
waitDialog.show()
try {
val isUpload = RemoteBookWebDav.upload(it)
if (isUpload)
toastOnUi(getString(R.string.upload_book_success))
else
toastOnUi(getString(R.string.upload_book_fail))
RemoteBookWebDav.upload(it)
} catch (e: Exception) {
toastOnUi(e.localizedMessage)
} finally {

@ -14,7 +14,7 @@ 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.exception.NoStackTraceException
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.isLocal
import io.legado.app.model.BookCover

@ -12,8 +12,8 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.BookChapter
import io.legado.app.databinding.DialogContentEditBinding
import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.help.BookHelp
import io.legado.app.help.ContentProcessor
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.isLocal
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor

@ -23,12 +23,12 @@ import io.legado.app.data.entities.BookProgress
import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.*
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.config.ReadTipConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.storage.Backup
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector

@ -15,12 +15,12 @@ import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BookProgress
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.BookHelp
import io.legado.app.help.ContentProcessor
import io.legado.app.help.AppWebDav
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.config.AppConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.isLocal
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook
import io.legado.app.model.analyzeRule.AnalyzeRule

@ -10,7 +10,7 @@ import io.legado.app.constant.PageAnim
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.isEpub

@ -1,18 +0,0 @@
package io.legado.app.ui.book.remote
import android.net.Uri
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.RemoteBook
abstract class RemoteBookManager {
protected val remoteBookFolder : String = "books"
abstract suspend fun initRemoteContext()
abstract suspend fun getRemoteBookList(path: String): MutableList<RemoteBook>
abstract suspend fun upload(book: Book): Boolean
abstract suspend fun delete(remoteBookUrl: String): Boolean
/**
* @return String下载到本地的路径
*/
abstract suspend fun getRemoteBook(remoteBook: RemoteBook): Uri?
}

@ -5,8 +5,8 @@ import io.legado.app.base.BaseViewModel
import io.legado.app.constant.AppLog
import io.legado.app.constant.BookType
import io.legado.app.data.entities.RemoteBook
import io.legado.app.help.webdav.RemoteBookWebDav
import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.remote.RemoteBookWebDav
import io.legado.app.utils.toastOnUi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.awaitClose
@ -96,7 +96,7 @@ class RemoteBookViewModel(application: Application) : BaseViewModel(application)
execute {
remoteBooks.forEach { remoteBook ->
val downloadBookPath = RemoteBookWebDav.getRemoteBook(remoteBook)
downloadBookPath?.let {
downloadBookPath.let {
val localBook = LocalBook.importFile(it)
localBook.origin = BookType.webDavTag + remoteBook.path
localBook.save()

@ -13,8 +13,8 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.databinding.ActivitySearchContentBinding
import io.legado.app.help.BookHelp
import io.legado.app.help.IntentData
import io.legado.app.help.book.BookHelp
import io.legado.app.help.isLocal
import io.legado.app.lib.theme.bottomBackground
import io.legado.app.lib.theme.getPrimaryTextColor

@ -7,8 +7,8 @@ import io.legado.app.base.BaseViewModel
import io.legado.app.data.appDb
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.help.BookHelp
import io.legado.app.help.ContentProcessor
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.config.AppConfig
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ensureActive

@ -9,7 +9,7 @@ import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.databinding.ItemChapterListBinding
import io.legado.app.help.ContentProcessor
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.config.AppConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.theme.ThemeUtils

@ -14,7 +14,7 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.databinding.FragmentChapterListBinding
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.isLocal
import io.legado.app.lib.theme.bottomBackground
import io.legado.app.lib.theme.getPrimaryTextColor

@ -18,6 +18,7 @@ import androidx.preference.Preference
import io.legado.app.R
import io.legado.app.constant.AppLog
import io.legado.app.constant.PreferKey
import io.legado.app.help.AppWebDav
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.LocalConfig
import io.legado.app.help.coroutine.Coroutine
@ -25,7 +26,6 @@ import io.legado.app.help.storage.Backup
import io.legado.app.help.storage.BackupConfig
import io.legado.app.help.storage.ImportOldData
import io.legado.app.help.storage.Restore
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.permission.Permissions
import io.legado.app.lib.permission.PermissionsCompat

@ -3,8 +3,8 @@ package io.legado.app.ui.config
import android.app.Application
import io.legado.app.R
import io.legado.app.base.BaseViewModel
import io.legado.app.help.BookHelp
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.help.AppWebDav
import io.legado.app.help.book.BookHelp
import io.legado.app.utils.FileUtils
import io.legado.app.utils.toastOnUi

@ -21,12 +21,12 @@ import io.legado.app.constant.AppConst.appInfo
import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey
import io.legado.app.databinding.ActivityMainBinding
import io.legado.app.help.BookHelp
import io.legado.app.help.AppWebDav
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.LocalConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.storage.Backup
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.elevation
import io.legado.app.lib.theme.primaryColor

@ -9,12 +9,12 @@ import io.legado.app.constant.EventBus
import io.legado.app.data.appDb
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookSource
import io.legado.app.help.BookHelp
import io.legado.app.help.AppWebDav
import io.legado.app.help.DefaultData
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.LocalConfig
import io.legado.app.help.isLocal
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.CacheBook
import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.webBook.WebBook

@ -19,8 +19,8 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.ReplaceRule
import io.legado.app.databinding.ActivityReplaceRuleBinding
import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.help.ContentProcessor
import io.legado.app.help.DirectLinkUpload
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor

@ -7,7 +7,7 @@ import com.bumptech.glide.request.RequestOptions
import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogPhotoViewBinding
import io.legado.app.help.BookHelp
import io.legado.app.help.book.BookHelp
import io.legado.app.help.glide.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader
import io.legado.app.model.BookCover

Loading…
Cancel
Save