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