自动下载webDav书籍

* `Book`添加字段`remoteUrl`
 * 导入webdav书籍时添加Book.remoteUrl
 * LocalBook.getBookInputStream自动尝试下载远程书籍
pull/2364/head
Xwite 3 years ago
parent b5c6a17055
commit 0f389eda8a
  1. 3
      app/src/main/java/io/legado/app/data/AppDatabase.kt
  2. 3
      app/src/main/java/io/legado/app/data/entities/Book.kt
  3. 38
      app/src/main/java/io/legado/app/model/localBook/LocalBook.kt
  4. 4
      app/src/main/java/io/legado/app/ui/book/remote/RemoteBookViewModel.kt

@ -20,7 +20,7 @@ val appDb by lazy {
}
@Database(
version = 54,
version = 55,
exportSchema = true,
entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class,
ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
@ -39,6 +39,7 @@ val appDb by lazy {
AutoMigration(from = 51, to = 52),
AutoMigration(from = 52, to = 53),
AutoMigration(from = 53, to = 54),
AutoMigration(from = 54, to = 55),
]
)
abstract class AppDatabase : RoomDatabase() {

@ -32,6 +32,9 @@ data class Book(
@PrimaryKey
@ColumnInfo(defaultValue = "")
override var bookUrl: String = "",
//webdav远程文件链接
@ColumnInfo(defaultValue = "")
var remoteUrl: String = "",
// 目录页Url (toc=table of Contents)
@ColumnInfo(defaultValue = "")
var tocUrl: String = "",

@ -15,12 +15,15 @@ import io.legado.app.exception.NoStackTraceException
import io.legado.app.exception.TocEmptyException
import io.legado.app.help.BookHelp
import io.legado.app.help.config.AppConfig
import io.legado.app.help.AppWebDav
import io.legado.app.lib.webdav.WebDav
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.*
import org.jsoup.nodes.Entities
import splitties.init.appCtx
import java.io.*
import java.util.regex.Pattern
import kotlinx.coroutines.runBlocking
/**
* 书籍文件导入 目录正文解析
@ -38,13 +41,9 @@ object LocalBook {
@Throws(FileNotFoundException::class, SecurityException::class)
fun getBookInputStream(book: Book): InputStream {
val uri = Uri.parse(book.bookUrl)
if (uri.isContentScheme()) {
return appCtx.contentResolver.openInputStream(uri)!!
}
val file = File(uri.path!!)
if (file.exists()) {
return FileInputStream(File(uri.path!!))
}
//文件不存在 尝试下载webDav文件 book.remoteUrl
val inputStream = uri.inputStream(appCtx) ?: downloadRemoteBook(book)
if (inputStream != null) return inputStream
throw FileNotFoundException("${uri.path} 文件不存在")
}
@ -302,4 +301,29 @@ object LocalBook {
return localBook
}
//下载book.remoteUrl对应的远程文件并更新bookUrl 返回inputStream
private fun downloadRemoteBook(localBook: Book): InputStream? {
if (localBook.remoteUrl.isNullOrBlank()) return null
try {
val uri = AppWebDav.authorization?.let {
val webdav = WebDav(localBook.remoteUrl, it)
runBlocking {
webdav.downloadInputStream().let { inputStream ->
saveBookFile(inputStream, localBook.originName)
}
}
}
return uri?.let {
localBook.bookUrl = if (it.isContentScheme()) it.toString()
else it.path!!
localBook.save()
it.inputStream(appCtx)
}
} catch (e: Exception) {
e.printOnDebug()
AppLog.put("自动下载webDav书籍失败", e)
}
return null
}
}

@ -95,7 +95,9 @@ class RemoteBookViewModel(application: Application) : BaseViewModel(application)
remoteBooks.forEach { remoteBook ->
val downloadBookPath = RemoteBookWebDav.getRemoteBook(remoteBook)
downloadBookPath?.let {
LocalBook.importFile(it)
val localBook = LocalBook.importFile(it)
localBook.remoteUrl = remoteBook.path
localBook.save()
remoteBook.isOnBookShelf = true
}
}

Loading…
Cancel
Save