diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index b9be414db..4e5c3b875 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.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() { diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index d5ff08514..8c3c9bb0c 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -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 = "", diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index 28a5593c1..50f5b875e 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -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 + } + } diff --git a/app/src/main/java/io/legado/app/ui/book/remote/RemoteBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/remote/RemoteBookViewModel.kt index 49dc60b74..c59a8eca6 100644 --- a/app/src/main/java/io/legado/app/ui/book/remote/RemoteBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/remote/RemoteBookViewModel.kt @@ -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 } }