This commit is contained in:
Horis
2025-02-28 16:01:45 +08:00
parent 2799320279
commit e78a13e5cd
12 changed files with 37 additions and 56 deletions
@@ -14,6 +14,7 @@ import io.legado.app.constant.PageAnim
import io.legado.app.data.appDb
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.book.getFolderNameNoCache
import io.legado.app.help.book.isEpub
import io.legado.app.help.book.isImage
import io.legado.app.help.book.simulatedTotalChapterNum
@@ -21,14 +22,12 @@ import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.model.ReadBook
import io.legado.app.utils.GSON
import io.legado.app.utils.MD5Utils
import io.legado.app.utils.fromJsonObject
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import java.nio.charset.Charset
import java.time.LocalDate
import kotlin.math.max
import kotlin.math.min
@Parcelize
@TypeConverters(Book.Converters::class)
@@ -316,12 +315,6 @@ data class Book(
return folderName!!
}
fun getFolderNameNoCache(): String {
return name.replace(AppPattern.fileNameRegex, "").let {
it.substring(0, min(9, it.length)) + MD5Utils.md5Encode16(bookUrl)
}
}
fun toSearchBook() = SearchBook(
name = name,
author = author,
@@ -6,6 +6,7 @@ import android.net.Uri
import com.script.buildScriptBindings
import com.script.rhino.RhinoScriptEngine
import io.legado.app.constant.AppLog
import io.legado.app.constant.AppPattern
import io.legado.app.constant.BookSourceType
import io.legado.app.constant.BookType
import io.legado.app.data.appDb
@@ -17,6 +18,7 @@ import io.legado.app.help.config.AppConfig
import io.legado.app.model.localBook.LocalBook
import io.legado.app.utils.FileDoc
import io.legado.app.utils.GSON
import io.legado.app.utils.MD5Utils
import io.legado.app.utils.exists
import io.legado.app.utils.find
import io.legado.app.utils.inputStream
@@ -277,6 +279,12 @@ fun Book.updateTo(newBook: Book): Book {
return newBook
}
fun Book.getFolderNameNoCache(): String {
return name.replace(AppPattern.fileNameRegex, "").let {
it.substring(0, min(9, it.length)) + MD5Utils.md5Encode16(bookUrl)
}
}
fun Book.getBookSource(): BookSource? {
return appDb.bookSourceDao.getBookSource(origin)
}
@@ -15,6 +15,7 @@ import io.legado.app.help.book.ContentProcessor
import io.legado.app.help.book.isImage
import io.legado.app.help.book.isLocal
import io.legado.app.help.book.isPdf
import io.legado.app.help.book.isSameNameAuthor
import io.legado.app.help.book.readSimulating
import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.book.update
@@ -921,6 +922,18 @@ object ReadBook : CoroutineScope by MainScope() {
}
}
fun onChapterListUpdated(newBook: Book) {
if (newBook.isSameNameAuthor(book)) {
book = newBook
chapterSize = newBook.totalChapterNum
simulatedChapterSize = newBook.simulatedTotalChapterNum()
if (simulatedChapterSize > 0 && durChapterIndex > simulatedChapterSize - 1) {
durChapterIndex = simulatedChapterSize - 1
}
clearTextChapter()
}
}
/**
* 注册回调
*/
@@ -32,7 +32,6 @@ import io.legado.app.help.book.isPdf
import io.legado.app.help.book.isUmd
import io.legado.app.help.book.removeLocalUriCache
import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.book.update
import io.legado.app.help.config.AppConfig
import io.legado.app.lib.webdav.WebDav
import io.legado.app.lib.webdav.WebDavException
@@ -152,7 +151,7 @@ object LocalBook {
list.getOrElse(book.simulatedTotalChapterNum() - 1) { list.last() }
.getDisplayTitle(replaceRules, book.getUseReplaceRule())
book.totalChapterNum = list.size
book.update()
book.latestChapterTime = System.currentTimeMillis()
return list
}
@@ -21,9 +21,9 @@ 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.book.getExportFileName
import io.legado.app.help.book.isLocal
import io.legado.app.help.book.isLocalModified
import io.legado.app.help.config.AppConfig
import io.legado.app.model.ReadBook
import io.legado.app.model.localBook.LocalBook
import io.legado.app.ui.book.cache.CacheActivity
import io.legado.app.utils.FileDoc
@@ -212,15 +212,16 @@ class ExportBookService : BaseService() {
}
private fun refreshChapterList(book: Book) {
if (!book.isLocal || !book.isLocalModified()) {
if (!book.isLocalModified()) {
return
}
kotlin.runCatching {
LocalBook.getChapterList(book)
}.onSuccess {
book.latestChapterTime = System.currentTimeMillis()
appDb.bookChapterDao.delByBook(book.bookUrl)
appDb.bookChapterDao.insert(*it.toTypedArray())
appDb.bookDao.update(book)
ReadBook.onChapterListUpdated(book)
}
}
@@ -26,7 +26,6 @@ import io.legado.app.help.book.isNotShelf
import io.legado.app.help.book.isSameNameAuthor
import io.legado.app.help.book.isWebFile
import io.legado.app.help.book.removeType
import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.book.updateTo
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.webdav.ObjectNotFoundException
@@ -226,12 +225,8 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
appDb.bookDao.update(book)
appDb.bookChapterDao.delByBook(book.bookUrl)
appDb.bookChapterDao.insert(*it.toTypedArray())
if (book.isSameNameAuthor(ReadBook.book)) {
ReadBook.book = book
ReadBook.chapterSize = book.totalChapterNum
ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
ReadBook.clearTextChapter()
}
ReadBook.onChapterListUpdated(book)
bookData.postValue(book)
chapterListData.postValue(it)
}
}.onError {
@@ -258,12 +253,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
}
appDb.bookChapterDao.delByBook(oldBook.bookUrl)
appDb.bookChapterDao.insert(*it.toTypedArray())
if (book.isSameNameAuthor(ReadBook.book)) {
ReadBook.book = book
ReadBook.chapterSize = book.totalChapterNum
ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
ReadBook.clearTextChapter()
}
ReadBook.onChapterListUpdated(book)
}
bookData.postValue(book)
chapterListData.postValue(it)
@@ -136,7 +136,7 @@ class BookInfoEditActivity :
book.customIntro = if (customIntro == book.intro) null else customIntro
BookHelp.updateCacheFolder(oldBook, book)
viewModel.saveBook(book) {
setResult(Activity.RESULT_OK)
setResult(RESULT_OK)
finish()
}
}
@@ -1,7 +1,6 @@
package io.legado.app.ui.book.read
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.content.res.Configuration
import android.net.Uri
@@ -1578,7 +1577,7 @@ class ReadBookActivity : BaseReadBookActivity(),
ReadBook.book?.removeType(BookType.notShelf)
ReadBook.book?.save()
ReadBook.inBookshelf = true
setResult(Activity.RESULT_OK)
setResult(RESULT_OK)
}
noButton { viewModel.removeFromBookshelf { super.finish() } }
}
@@ -122,7 +122,6 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
return
}
ReadBook.upMsg(null)
ensureChapterExist()
if (!isSameBook) {
ReadBook.loadContent(resetPageOffset = true)
} else {
@@ -157,12 +156,6 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
}
}
private fun ensureChapterExist() {
if (ReadBook.simulatedChapterSize > 0 && ReadBook.durChapterIndex > ReadBook.simulatedChapterSize - 1) {
ReadBook.durChapterIndex = ReadBook.simulatedChapterSize - 1
}
}
/**
* 加载详情页
*/
@@ -183,7 +176,6 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
fun loadChapterList(book: Book) {
execute {
if (loadChapterListAwait(book)) {
ensureChapterExist()
ReadBook.upMsg(null)
ReadBook.loadContent(resetPageOffset = true)
}
@@ -194,13 +186,10 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
if (book.isLocal) {
kotlin.runCatching {
LocalBook.getChapterList(book).let {
book.latestChapterTime = System.currentTimeMillis()
appDb.bookChapterDao.delByBook(book.bookUrl)
appDb.bookChapterDao.insert(*it.toTypedArray())
appDb.bookDao.update(book)
ReadBook.chapterSize = it.size
ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
ReadBook.clearTextChapter()
ReadBook.onChapterListUpdated(book)
}
return true
}.onFailure {
@@ -229,8 +218,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
}
appDb.bookChapterDao.delByBook(oldBook.bookUrl)
appDb.bookChapterDao.insert(*cList.toTypedArray())
ReadBook.chapterSize = cList.size
ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
ReadBook.onChapterListUpdated(book)
return true
}.onFailure {
ReadBook.upMsg(context.getString(R.string.error_load_toc))
@@ -17,7 +17,6 @@ import io.legado.app.base.VMBaseActivity
import io.legado.app.data.entities.Book
import io.legado.app.databinding.ActivityChapterListBinding
import io.legado.app.help.book.isLocalTxt
import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.config.AppConfig
import io.legado.app.lib.theme.accentColor
import io.legado.app.lib.theme.primaryTextColor
@@ -198,9 +197,6 @@ class TocActivity : VMBaseActivity<ActivityChapterListBinding, TocViewModel>(),
waitDialog.dismiss()
ReadBook.book?.let { readBook ->
if (readBook == book) {
ReadBook.book = book
ReadBook.chapterSize = book.totalChapterNum
ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
ReadBook.upMsg(null)
ReadBook.loadContent(resetPageOffset = true)
}
@@ -10,6 +10,7 @@ import io.legado.app.constant.AppLog
import io.legado.app.data.appDb
import io.legado.app.data.entities.Book
import io.legado.app.exception.NoStackTraceException
import io.legado.app.model.ReadBook
import io.legado.app.model.localBook.LocalBook
import io.legado.app.utils.FileDoc
import io.legado.app.utils.GSON
@@ -38,10 +39,10 @@ class TocViewModel(application: Application) : BaseViewModel(application) {
execute {
appDb.bookDao.update(book)
LocalBook.getChapterList(book).let {
book.latestChapterTime = System.currentTimeMillis()
appDb.bookChapterDao.delByBook(book.bookUrl)
appDb.bookChapterDao.insert(*it.toTypedArray())
appDb.bookDao.update(book)
ReadBook.onChapterListUpdated(book)
bookData.postValue(book)
}
}.onFinally {
@@ -17,10 +17,8 @@ import io.legado.app.help.DefaultData
import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.addType
import io.legado.app.help.book.isLocal
import io.legado.app.help.book.isSameNameAuthor
import io.legado.app.help.book.isUpError
import io.legado.app.help.book.removeType
import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.book.sync
import io.legado.app.help.config.AppConfig
import io.legado.app.model.CacheBook
@@ -169,12 +167,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
}
appDb.bookChapterDao.delByBook(bookUrl)
appDb.bookChapterDao.insert(*toc.toTypedArray())
if (book.isSameNameAuthor(ReadBook.book)) {
ReadBook.book = book
ReadBook.chapterSize = book.totalChapterNum
ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
ReadBook.clearTextChapter()
}
ReadBook.onChapterListUpdated(book)
addDownload(source, book)
}.onFailure {
AppLog.put("${book.name} 更新目录失败\n${it.localizedMessage}", it)