This commit is contained in:
kunfei
2022-05-15 19:25:47 +08:00
parent e26c2dcbbf
commit 83461f68ba
3 changed files with 48 additions and 45 deletions
+1
View File
@@ -19,6 +19,7 @@
* 书源支持文件类型 by Xwite
* 启用firebase收集崩溃日志
* web端阅读实现无限滚动 by Xwite
* 进入阅读界面时如果本地书籍有更新自动刷新目录
**2022/05/11**
@@ -7,21 +7,17 @@ import com.script.SimpleBindings
import io.legado.app.R
import io.legado.app.constant.AppConst
import io.legado.app.data.appDb
import io.legado.app.data.entities.BaseSource
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BaseSource
import io.legado.app.exception.TocEmptyException
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.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.*
import splitties.init.appCtx
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.FileNotFoundException
import java.io.InputStream
import java.io.*
import java.util.regex.Pattern
/**
@@ -50,6 +46,20 @@ object LocalBook {
throw FileNotFoundException("${uri.path} 文件不存在")
}
fun getLastModified(book: Book): Result<Long> {
return kotlin.runCatching {
val uri = Uri.parse(book.bookUrl)
if (uri.isContentScheme()) {
return@runCatching DocumentFile.fromSingleUri(appCtx, uri)!!.lastModified()
}
val file = File(uri.path!!)
if (file.exists()) {
return@runCatching File(uri.path!!).lastModified()
}
throw FileNotFoundException("${uri.path} 文件不存在")
}
}
@Throws(Exception::class)
fun getChapterList(book: Book): ArrayList<BookChapter> {
val chapters = when {
@@ -228,7 +238,7 @@ object LocalBook {
val lastPath = urlNoOption.substringAfterLast("/")
val fileType = lastPath.substringAfterLast(".")
val type = analyzeUrl.type
return type ?: fileType ?: "unknown"
return type ?: fileType
}
private fun saveBookFile(
@@ -262,13 +272,13 @@ object LocalBook {
//文件类书源 合并在线书籍信息 在线 > 本地
fun mergeBook(localBook: Book, onLineBook: Book?): Book {
onLineBook ?: return localBook
val mergeBook = localBook
mergeBook.name = if (onLineBook.name.isBlank()) localBook.name else onLineBook.name
mergeBook.author = if (onLineBook.author.isBlank()) localBook.author else onLineBook.author
mergeBook.coverUrl = onLineBook.coverUrl
mergeBook.intro = if (onLineBook.intro.isNullOrBlank()) localBook.intro else onLineBook.intro
mergeBook.save()
return mergeBook
localBook.name = onLineBook.name.ifBlank { localBook.name }
localBook.author = onLineBook.author.ifBlank { localBook.author }
localBook.coverUrl = onLineBook.coverUrl
localBook.intro =
if (onLineBook.intro.isNullOrBlank()) localBook.intro else onLineBook.intro
localBook.save()
return localBook
}
}
@@ -61,41 +61,33 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
}
private fun initBook(book: Book) {
if (ReadBook.book?.bookUrl != book.bookUrl) {
ReadBook.resetData(book)
isInitFinish = true
if (ReadBook.chapterSize == 0) {
if (book.tocUrl.isEmpty()) {
loadBookInfo(book)
} else {
loadChapterList(book)
}
val isSameBook = ReadBook.book?.bookUrl == book.bookUrl
if (isSameBook) ReadBook.upData(book) else ReadBook.resetData(book)
isInitFinish = true
if (ReadBook.chapterSize == 0) {
if (book.tocUrl.isEmpty()) {
loadBookInfo(book)
} else {
loadChapterList(book)
}
} else if (book.isLocalBook()
&& LocalBook.getLastModified(book).getOrDefault(0L) > book.latestChapterTime
) {
loadChapterList(book)
} else if (isSameBook) {
if (ReadBook.curTextChapter != null) {
ReadBook.callBack?.upContent(resetPageOffset = false)
} else {
if (ReadBook.durChapterIndex > ReadBook.chapterSize - 1) {
ReadBook.durChapterIndex = ReadBook.chapterSize - 1
}
ReadBook.loadContent(resetPageOffset = true)
}
syncBookProgress(book)
} else {
ReadBook.upData(book)
isInitFinish = true
if (ReadBook.chapterSize == 0) {
if (book.tocUrl.isEmpty()) {
loadBookInfo(book)
} else {
loadChapterList(book)
}
} else {
if (ReadBook.curTextChapter != null) {
ReadBook.callBack?.upContent(resetPageOffset = false)
} else {
ReadBook.loadContent(resetPageOffset = true)
}
}
if (!BaseReadAloudService.isRun) {
syncBookProgress(book)
if (ReadBook.durChapterIndex > ReadBook.chapterSize - 1) {
ReadBook.durChapterIndex = ReadBook.chapterSize - 1
}
ReadBook.loadContent(resetPageOffset = isSameBook)
}
if (!isSameBook || !BaseReadAloudService.isRun) {
syncBookProgress(book)
}
if (!book.isLocalBook() && ReadBook.bookSource == null) {
autoChangeSource(book.name, book.author)