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. 40
      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.AppConst.channelIdWeb
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb 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.CrashHandler
import io.legado.app.help.LifecycleHelp import io.legado.app.help.LifecycleHelp
import io.legado.app.help.RuleBigDataHelp 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.AppConfig
import io.legado.app.help.config.ThemeConfig.applyDayNight import io.legado.app.help.config.ThemeConfig.applyDayNight
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.http.cronet.CronetLoader 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.model.BookCover
import io.legado.app.utils.defaultSharedPreferences import io.legado.app.utils.defaultSharedPreferences
import io.legado.app.utils.getPrefBoolean 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.Book
import io.legado.app.data.entities.BookProgress import io.legado.app.data.entities.BookProgress
import io.legado.app.data.entities.BookSource 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.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.glide.ImageLoader
import io.legado.app.help.isLocal import io.legado.app.help.isLocal
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.BookCover import io.legado.app.model.BookCover
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook 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.BookType
import io.legado.app.constant.PageAnim import io.legado.app.constant.PageAnim
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.help.BookHelp import io.legado.app.help.book.BookHelp
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.config.AppConfig
import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.isEpub 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 android.content.Context
import io.legado.app.R 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 android.net.Uri
import androidx.documentfile.provider.DocumentFile 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.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BookSource 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.analyzeRule.AnalyzeUrl
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.utils.* 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 java.util.regex.Pattern
import kotlin.math.max import kotlin.math.max
@ -478,7 +478,7 @@ object ContentHelp {
val patten = Pattern.compile( val patten = Pattern.compile(
""" """
(?<=["'”“])([^ (?<=["'”“])([^
\p{P}]{1,${WORD_MAX_LENGTH}})(?=["'”“]) \p{P}]{1,$WORD_MAX_LENGTH})(?=["'”“])
""".trimIndent() """.trimIndent()
) )
//Pattern patten = Pattern.compile("(?<=[\"'”“])([^\n\"'”“]{1,16})(?=[\"'”“])"); //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 com.github.liuyueyi.quick.transfer.ChineseUtils
import io.legado.app.constant.AppLog 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.AppLog
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.help.AppWebDav
import io.legado.app.help.DirectLinkUpload import io.legado.app.help.DirectLinkUpload
import io.legado.app.help.config.LocalConfig import io.legado.app.help.config.LocalConfig
import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.config.ThemeConfig import io.legado.app.help.config.ThemeConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.utils.* import io.legado.app.utils.*
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.ensureActive 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.help.http.text
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.printOnDebug import io.legado.app.utils.printOnDebug
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.withContext
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.asRequestBody
@ -274,16 +276,18 @@ open class WebDav(val path: String, val authorization: Authorization) {
contentType: String = "application/octet-stream" contentType: String = "application/octet-stream"
) { ) {
kotlin.runCatching { kotlin.runCatching {
val file = File(localPath) withContext(IO) {
if (!file.exists()) throw WebDavException("文件不存在") val file = File(localPath)
// 务必注意RequestBody不要嵌套,不然上传时内容可能会被追加多余的文件信息 if (!file.exists()) throw WebDavException("文件不存在")
val fileBody = file.asRequestBody(contentType.toMediaType()) // 务必注意RequestBody不要嵌套,不然上传时内容可能会被追加多余的文件信息
val url = httpUrl ?: throw WebDavException("url不能为空") val fileBody = file.asRequestBody(contentType.toMediaType())
webDavClient.newCallResponse { val url = httpUrl ?: throw WebDavException("url不能为空")
url(url) webDavClient.newCallResponse {
put(fileBody) url(url)
}.let { put(fileBody)
checkResult(it) }.let {
checkResult(it)
}
} }
}.onFailure { }.onFailure {
AppLog.put("WebDav上传失败\n${it.localizedMessage}", it) AppLog.put("WebDav上传失败\n${it.localizedMessage}", it)
@ -295,13 +299,15 @@ open class WebDav(val path: String, val authorization: Authorization) {
suspend fun upload(byteArray: ByteArray, contentType: String) { suspend fun upload(byteArray: ByteArray, contentType: String) {
// 务必注意RequestBody不要嵌套,不然上传时内容可能会被追加多余的文件信息 // 务必注意RequestBody不要嵌套,不然上传时内容可能会被追加多余的文件信息
kotlin.runCatching { kotlin.runCatching {
val fileBody = byteArray.toRequestBody(contentType.toMediaType()) withContext(IO) {
val url = httpUrl ?: throw NoStackTraceException("url不能为空") val fileBody = byteArray.toRequestBody(contentType.toMediaType())
webDavClient.newCallResponse { val url = httpUrl ?: throw NoStackTraceException("url不能为空")
url(url) webDavClient.newCallResponse {
put(fileBody) url(url)
}.let { put(fileBody)
checkResult(it) }.let {
checkResult(it)
}
} }
}.onFailure { }.onFailure {
AppLog.put("WebDav上传失败\n${it.localizedMessage}", it) AppLog.put("WebDav上传失败\n${it.localizedMessage}", it)

@ -10,7 +10,7 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BookSource 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.help.coroutine.Coroutine
import io.legado.app.service.AudioPlayService import io.legado.app.service.AudioPlayService
import io.legado.app.utils.postEvent 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.BookChapter
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.exception.ConcurrentException 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.help.isLocal
import io.legado.app.model.webBook.WebBook import io.legado.app.model.webBook.WebBook
import io.legado.app.service.CacheBookService 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.constant.AppLog
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.data.entities.* import io.legado.app.data.entities.*
import io.legado.app.help.BookHelp import io.legado.app.help.AppWebDav
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.AppConfig
import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.isLocal import io.legado.app.help.isLocal
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.webBook.WebBook import io.legado.app.model.webBook.WebBook
import io.legado.app.service.BaseReadAloudService import io.legado.app.service.BaseReadAloudService
import io.legado.app.ui.book.read.page.entities.TextChapter 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.constant.AppLog
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter 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 io.legado.app.utils.*
import me.ag2s.epublib.domain.EpubBook import me.ag2s.epublib.domain.EpubBook
import me.ag2s.epublib.domain.Resource 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.data.entities.BookChapter
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.exception.TocEmptyException 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.config.AppConfig
import io.legado.app.help.isEpub import io.legado.app.help.isEpub
import io.legado.app.help.isUmd import io.legado.app.help.isUmd
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.lib.webdav.WebDav import io.legado.app.lib.webdav.WebDav
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.* 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 android.net.Uri
import io.legado.app.constant.AppPattern.bookFileRegex 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.Book
import io.legado.app.data.entities.RemoteBook import io.legado.app.data.entities.RemoteBook
import io.legado.app.exception.NoStackTraceException 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.WebDav
import io.legado.app.lib.webdav.WebDavFile import io.legado.app.lib.webdav.WebDavFile
import io.legado.app.model.localBook.LocalBook 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.NetworkUtils
import io.legado.app.utils.isContentScheme import io.legado.app.utils.isContentScheme
import io.legado.app.utils.readBytes import io.legado.app.utils.readBytes
@ -32,9 +32,6 @@ object RemoteBookWebDav : RemoteBookManager() {
} }
} }
/**
* 获取远程书籍列表
*/
@Throws(Exception::class) @Throws(Exception::class)
override suspend fun getRemoteBookList(path: String): MutableList<RemoteBook> { override suspend fun getRemoteBookList(path: String): MutableList<RemoteBook> {
val remoteBooks = mutableListOf<RemoteBook>() val remoteBooks = mutableListOf<RemoteBook>()
@ -70,23 +67,17 @@ object RemoteBookWebDav : RemoteBookManager() {
return remoteBooks return remoteBooks
} }
/** override suspend fun getRemoteBook(remoteBook: RemoteBook): Uri {
* 下载指定的远程书籍到本地
*/
override suspend fun getRemoteBook(remoteBook: RemoteBook): Uri? {
return AppWebDav.authorization?.let { return AppWebDav.authorization?.let {
val webdav = WebDav(remoteBook.path, it) val webdav = WebDav(remoteBook.path, it)
webdav.downloadInputStream().let { inputStream -> webdav.downloadInputStream().let { inputStream ->
LocalBook.saveBookFile(inputStream, remoteBook.filename) LocalBook.saveBookFile(inputStream, remoteBook.filename)
} }
} } ?: throw NoStackTraceException("webDav没有配置")
} }
/** override suspend fun upload(book: Book) {
* 上传本地导入的书籍到远程 if (!NetworkUtils.isAvailable()) throw NoStackTraceException("网络不可用")
*/
override suspend fun upload(book: Book): Boolean {
if (!NetworkUtils.isAvailable()) return false
val localBookUri = Uri.parse(book.bookUrl) val localBookUri = Uri.parse(book.bookUrl)
val putUrl = "$rootBookUrl${File.separator}${book.originName}" val putUrl = "$rootBookUrl${File.separator}${book.originName}"
AppWebDav.authorization?.let { AppWebDav.authorization?.let {
@ -98,17 +89,15 @@ object RemoteBookWebDav : RemoteBookManager() {
} else { } else {
WebDav(putUrl, it).upload(localBookUri.path!!) WebDav(putUrl, it).upload(localBookUri.path!!)
} }
} } ?: throw NoStackTraceException("webDav没有配置")
book.origin = BookType.webDavTag + putUrl book.origin = BookType.webDavTag + putUrl
book.save() book.save()
return true
} }
override suspend fun delete(remoteBookUrl: String): Boolean { override suspend fun delete(remoteBookUrl: String) {
AppWebDav.authorization?.let { AppWebDav.authorization?.let {
return WebDav(remoteBookUrl, it).delete() WebDav(remoteBookUrl, it).delete()
} } ?: throw NoStackTraceException("webDav没有配置")
return false
} }
} }

@ -8,7 +8,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.rule.TocRule import io.legado.app.data.entities.rule.TocRule
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.exception.TocEmptyException 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.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeUrl 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.data.entities.rule.ContentRule
import io.legado.app.exception.ContentEmptyException import io.legado.app.exception.ContentEmptyException
import io.legado.app.exception.NoStackTraceException 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.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeUrl 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.Book
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException 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.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.utils.DebugLog 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.SearchBook
import io.legado.app.data.entities.rule.BookListRule import io.legado.app.data.entities.rule.BookListRule
import io.legado.app.exception.NoStackTraceException 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.help.getBookType
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule 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.appDb
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException 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.config.AppConfig
import io.legado.app.help.http.newCallResponseBody import io.legado.app.help.http.newCallResponseBody
import io.legado.app.help.http.okHttpClient 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.data.entities.BookGroup
import io.legado.app.databinding.ActivityCacheBookBinding import io.legado.app.databinding.ActivityCacheBookBinding
import io.legado.app.databinding.DialogEditTextBinding 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.config.AppConfig
import io.legado.app.help.isAudio import io.legado.app.help.isAudio
import io.legado.app.lib.dialogs.SelectItem 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.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.BookHelp import io.legado.app.help.AppWebDav
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.AppConfig
import io.legado.app.help.coroutine.OrderCoroutine import io.legado.app.help.coroutine.OrderCoroutine
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.utils.* import io.legado.app.utils.*
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive 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.BookSource
import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchBook
import io.legado.app.databinding.DialogChapterChangeSourceBinding 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.help.config.AppConfig
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.elevation 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.isAudio
import io.legado.app.help.isLocal import io.legado.app.help.isLocal
import io.legado.app.help.isLocalTxt 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.dialogs.alert
import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.backgroundColor
import io.legado.app.lib.theme.bottomBackground import io.legado.app.lib.theme.bottomBackground
import io.legado.app.lib.theme.getPrimaryTextColor import io.legado.app.lib.theme.getPrimaryTextColor
import io.legado.app.model.BookCover 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.about.AppLogDialog
import io.legado.app.ui.association.ImportOnLineBookFileDialog import io.legado.app.ui.association.ImportOnLineBookFileDialog
import io.legado.app.ui.book.audio.AudioPlayActivity import io.legado.app.ui.book.audio.AudioPlayActivity
@ -213,11 +213,7 @@ class BookInfoActivity :
waitDialog.setText("上传中.....") waitDialog.setText("上传中.....")
waitDialog.show() waitDialog.show()
try { try {
val isUpload = RemoteBookWebDav.upload(it) RemoteBookWebDav.upload(it)
if (isUpload)
toastOnUi(getString(R.string.upload_book_success))
else
toastOnUi(getString(R.string.upload_book_fail))
} catch (e: Exception) { } catch (e: Exception) {
toastOnUi(e.localizedMessage) toastOnUi(e.localizedMessage)
} finally { } 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.BookChapter
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException 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.coroutine.Coroutine
import io.legado.app.help.isLocal import io.legado.app.help.isLocal
import io.legado.app.model.BookCover 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.data.entities.BookChapter
import io.legado.app.databinding.DialogContentEditBinding import io.legado.app.databinding.DialogContentEditBinding
import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.help.BookHelp import io.legado.app.help.book.BookHelp
import io.legado.app.help.ContentProcessor import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.isLocal import io.legado.app.help.isLocal
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor 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.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.* 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.AppConfig
import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.config.ReadTipConfig import io.legado.app.help.config.ReadTipConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.storage.Backup 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.SelectItem
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector 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.BookChapter
import io.legado.app.data.entities.BookProgress import io.legado.app.data.entities.BookProgress
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.BookHelp import io.legado.app.help.AppWebDav
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.AppConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.isLocal import io.legado.app.help.isLocal
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.ReadAloud import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.model.analyzeRule.AnalyzeRule 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.Book
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException 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.config.AppConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.isEpub 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.AppLog
import io.legado.app.constant.BookType import io.legado.app.constant.BookType
import io.legado.app.data.entities.RemoteBook 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.localBook.LocalBook
import io.legado.app.model.remote.RemoteBookWebDav
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
@ -96,7 +96,7 @@ class RemoteBookViewModel(application: Application) : BaseViewModel(application)
execute { execute {
remoteBooks.forEach { remoteBook -> remoteBooks.forEach { remoteBook ->
val downloadBookPath = RemoteBookWebDav.getRemoteBook(remoteBook) val downloadBookPath = RemoteBookWebDav.getRemoteBook(remoteBook)
downloadBookPath?.let { downloadBookPath.let {
val localBook = LocalBook.importFile(it) val localBook = LocalBook.importFile(it)
localBook.origin = BookType.webDavTag + remoteBook.path localBook.origin = BookType.webDavTag + remoteBook.path
localBook.save() 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.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
import io.legado.app.databinding.ActivitySearchContentBinding import io.legado.app.databinding.ActivitySearchContentBinding
import io.legado.app.help.BookHelp
import io.legado.app.help.IntentData import io.legado.app.help.IntentData
import io.legado.app.help.book.BookHelp
import io.legado.app.help.isLocal import io.legado.app.help.isLocal
import io.legado.app.lib.theme.bottomBackground import io.legado.app.lib.theme.bottomBackground
import io.legado.app.lib.theme.getPrimaryTextColor 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.appDb
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
import io.legado.app.help.BookHelp import io.legado.app.help.book.BookHelp
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.config.AppConfig
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ensureActive 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.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
import io.legado.app.databinding.ItemChapterListBinding 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.config.AppConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.theme.ThemeUtils 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.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
import io.legado.app.databinding.FragmentChapterListBinding 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.help.isLocal
import io.legado.app.lib.theme.bottomBackground import io.legado.app.lib.theme.bottomBackground
import io.legado.app.lib.theme.getPrimaryTextColor import io.legado.app.lib.theme.getPrimaryTextColor

@ -18,6 +18,7 @@ import androidx.preference.Preference
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.AppLog import io.legado.app.constant.AppLog
import io.legado.app.constant.PreferKey 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.AppConfig
import io.legado.app.help.config.LocalConfig import io.legado.app.help.config.LocalConfig
import io.legado.app.help.coroutine.Coroutine 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.BackupConfig
import io.legado.app.help.storage.ImportOldData import io.legado.app.help.storage.ImportOldData
import io.legado.app.help.storage.Restore 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.dialogs.alert
import io.legado.app.lib.permission.Permissions import io.legado.app.lib.permission.Permissions
import io.legado.app.lib.permission.PermissionsCompat import io.legado.app.lib.permission.PermissionsCompat

@ -3,8 +3,8 @@ package io.legado.app.ui.config
import android.app.Application import android.app.Application
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.help.BookHelp import io.legado.app.help.AppWebDav
import io.legado.app.help.webdav.AppWebDav import io.legado.app.help.book.BookHelp
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileUtils
import io.legado.app.utils.toastOnUi 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.EventBus
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.databinding.ActivityMainBinding 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.AppConfig
import io.legado.app.help.config.LocalConfig import io.legado.app.help.config.LocalConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.storage.Backup 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.dialogs.alert
import io.legado.app.lib.theme.elevation import io.legado.app.lib.theme.elevation
import io.legado.app.lib.theme.primaryColor 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.appDb
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookSource 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.DefaultData
import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.LocalConfig import io.legado.app.help.config.LocalConfig
import io.legado.app.help.isLocal import io.legado.app.help.isLocal
import io.legado.app.help.webdav.AppWebDav
import io.legado.app.model.CacheBook import io.legado.app.model.CacheBook
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.webBook.WebBook 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.data.entities.ReplaceRule
import io.legado.app.databinding.ActivityReplaceRuleBinding import io.legado.app.databinding.ActivityReplaceRuleBinding
import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.help.ContentProcessor
import io.legado.app.help.DirectLinkUpload import io.legado.app.help.DirectLinkUpload
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor 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.R
import io.legado.app.base.BaseDialogFragment import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogPhotoViewBinding 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.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader import io.legado.app.help.glide.OkHttpModelLoader
import io.legado.app.model.BookCover import io.legado.app.model.BookCover

Loading…
Cancel
Save