This commit is contained in:
Horis
2025-03-06 14:41:47 +08:00
parent c3a696c9fb
commit fd77ef0705
10 changed files with 36 additions and 25 deletions
@@ -58,6 +58,8 @@ object BookType {
*/ */
const val allBookType = text or image or audio or webFile const val allBookType = text or image or audio or webFile
const val allBookTypeLocal = text or image or audio or webFile or local
/** /**
* 本地书籍书源标志 * 本地书籍书源标志
*/ */
@@ -109,6 +109,14 @@ data class SearchBook(
tocHtml = null tocHtml = null
} }
fun primaryStr(): String {
return origin + bookUrl
}
fun sameBookTypeLocal(bookType: Int): Boolean {
return type and BookType.allBookTypeLocal == bookType and BookType.allBookTypeLocal
}
fun toBook() = Book( fun toBook() = Book(
name = name, name = name,
author = author, author = author,
@@ -232,15 +232,6 @@ fun Book.upType() {
} }
} }
fun BookSource.getBookType(): Int {
return when (bookSourceType) {
BookSourceType.file -> BookType.text or BookType.webFile
BookSourceType.image -> BookType.image
BookSourceType.audio -> BookType.audio
else -> BookType.text
}
}
fun Book.sync(oldBook: Book) { fun Book.sync(oldBook: Book) {
val curBook = appDb.bookDao.getBook(oldBook.bookUrl)!! val curBook = appDb.bookDao.getBook(oldBook.bookUrl)!!
durChapterTime = curBook.durChapterTime durChapterTime = curBook.durChapterTime
@@ -259,6 +250,10 @@ fun Book.update() {
appDb.bookDao.update(this) appDb.bookDao.update(this)
} }
fun Book.primaryStr(): String {
return origin + bookUrl
}
fun Book.updateTo(newBook: Book): Book { fun Book.updateTo(newBook: Book): Book {
newBook.durChapterIndex = durChapterIndex newBook.durChapterIndex = durChapterIndex
newBook.durChapterTitle = durChapterTitle newBook.durChapterTitle = durChapterTitle
@@ -1,5 +1,7 @@
package io.legado.app.help.source package io.legado.app.help.source
import io.legado.app.constant.BookSourceType
import io.legado.app.constant.BookType
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.BookSourcePart import io.legado.app.data.entities.BookSourcePart
import io.legado.app.data.entities.rule.ExploreKind import io.legado.app.data.entities.rule.ExploreKind
@@ -90,3 +92,12 @@ suspend fun BookSourcePart.clearExploreKindsCache() {
exploreKindsMap.remove(exploreKindsKey) exploreKindsMap.remove(exploreKindsKey)
} }
} }
fun BookSource.getBookType(): Int {
return when (bookSourceType) {
BookSourceType.file -> BookType.text or BookType.webFile
BookSourceType.image -> BookType.image
BookSourceType.audio -> BookType.audio
else -> BookType.text
}
}
@@ -7,7 +7,7 @@ import io.legado.app.data.entities.SearchBook
import io.legado.app.data.entities.rule.BookListRule import io.legado.app.data.entities.rule.BookListRule
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.book.BookHelp import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.getBookType import io.legado.app.help.source.getBookType
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
@@ -8,10 +8,10 @@ import io.legado.app.data.entities.BookSourcePart
import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchBook
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.book.addType import io.legado.app.help.book.addType
import io.legado.app.help.book.getBookType
import io.legado.app.help.book.removeAllBookType import io.legado.app.help.book.removeAllBookType
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.http.StrResponse import io.legado.app.help.http.StrResponse
import io.legado.app.help.source.getBookType
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
@@ -17,8 +17,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseDialogFragment import io.legado.app.base.BaseDialogFragment
import io.legado.app.constant.AppConst
import io.legado.app.constant.BookType
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
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
@@ -307,9 +305,8 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_
} }
override fun changeTo(searchBook: SearchBook) { override fun changeTo(searchBook: SearchBook) {
val oldBookType = callBack?.oldBook?.type?.and(BookType.updateError.inv()) val oldBookType = callBack?.oldBook?.type ?: 0
?.and(BookType.notShelf.inv()) if (searchBook.sameBookTypeLocal(oldBookType)) {
if (searchBook.type == oldBookType) {
changeSource(searchBook) { changeSource(searchBook) {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
@@ -369,7 +366,7 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_
private fun changeSource(searchBook: SearchBook, onSuccess: (() -> Unit)? = null) { private fun changeSource(searchBook: SearchBook, onSuccess: (() -> Unit)? = null) {
waitDialog.setText(R.string.load_toc) waitDialog.setText(R.string.load_toc)
waitDialog.show() waitDialog.show()
val book = viewModel.bookMap[searchBook.bookUrl] ?: searchBook.toBook() val book = viewModel.bookMap[searchBook.primaryStr()] ?: searchBook.toBook()
val coroutine = viewModel.getToc(book, { val coroutine = viewModel.getToc(book, {
waitDialog.dismiss() waitDialog.dismiss()
toastOnUi(it) toastOnUi(it)
@@ -18,6 +18,7 @@ import io.legado.app.data.entities.SearchBook
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
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.primaryStr
import io.legado.app.help.book.releaseHtmlData import io.legado.app.help.book.releaseHtmlData
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.SourceConfig import io.legado.app.help.config.SourceConfig
@@ -278,9 +279,9 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
} }
if (tocMapChapterCount < 30000) { if (tocMapChapterCount < 30000) {
tocMapChapterCount += chapters.size tocMapChapterCount += chapters.size
tocMap[book.bookUrl] = chapters tocMap[book.primaryStr()] = chapters
} }
bookMap[book.bookUrl] = book bookMap[book.primaryStr()] = book
book.releaseHtmlData() book.releaseHtmlData()
if (AppConfig.changeSourceLoadWordCount) { if (AppConfig.changeSourceLoadWordCount) {
loadBookWordCount(source, book, chapters) loadBookWordCount(source, book, chapters)
@@ -429,13 +430,13 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
onSuccess: (toc: List<BookChapter>, source: BookSource) -> Unit onSuccess: (toc: List<BookChapter>, source: BookSource) -> Unit
): Coroutine<Pair<List<BookChapter>, BookSource>> { ): Coroutine<Pair<List<BookChapter>, BookSource>> {
return execute { return execute {
val toc = tocMap[book.bookUrl] val toc = tocMap[book.primaryStr()]
if (toc != null) { if (toc != null) {
val source = appDb.bookSourceDao.getBookSource(book.origin) val source = appDb.bookSourceDao.getBookSource(book.origin)
return@execute Pair(toc, source!!) return@execute Pair(toc, source!!)
} }
val result = getToc(book).getOrThrow() val result = getToc(book).getOrThrow()
tocMap[book.bookUrl] = result.first tocMap[book.primaryStr()] = result.first
return@execute result return@execute result
}.onSuccess { }.onSuccess {
onSuccess.invoke(it.first, it.second) onSuccess.invoke(it.first, it.second)
@@ -201,9 +201,7 @@ class MangaViewModel(application: Application) : BaseViewModel(application) {
appDb.bookDao.insert(book) appDb.bookDao.insert(book)
appDb.bookChapterDao.insert(*toc.toTypedArray()) appDb.bookChapterDao.insert(*toc.toTypedArray())
ReadManga.resetData(book) ReadManga.resetData(book)
toc.find { it.title.contains(ReadManga.chapterTitle) }?.run { ReadManga.loadContent()
ReadManga.loadContent(index)
} ?: ReadManga.loadContent()
}.onError { }.onError {
AppLog.put("换源失败\n$it", it, true) AppLog.put("换源失败\n$it", it, true)
}.onFinally { }.onFinally {
@@ -1,6 +1,5 @@
package io.legado.app.ui.book.manga.entities package io.legado.app.ui.book.manga.entities
data class MangaContent( data class MangaContent(
var mChapterIndex: Int = 0,//总章节位置 var mChapterIndex: Int = 0,//总章节位置
var chapterSize: Int,//总章节数量 var chapterSize: Int,//总章节数量