diff --git a/app/src/main/java/io/legado/app/data/entities/SearchBook.kt b/app/src/main/java/io/legado/app/data/entities/SearchBook.kt index 1b054cb73..29f59717c 100644 --- a/app/src/main/java/io/legado/app/data/entities/SearchBook.kt +++ b/app/src/main/java/io/legado/app/data/entities/SearchBook.kt @@ -2,7 +2,12 @@ package io.legado.app.data.entities import android.content.Context import android.os.Parcelable -import androidx.room.* +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.Ignore +import androidx.room.Index +import androidx.room.PrimaryKey import io.legado.app.R import io.legado.app.constant.BookType import io.legado.app.utils.GSON @@ -99,6 +104,11 @@ data class SearchBook( } } + fun releaseHtmlData() { + infoHtml = null + tocHtml = null + } + fun toBook() = Book( name = name, author = author, diff --git a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt index 18d7c3e59..3925c04d7 100644 --- a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt +++ b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt @@ -244,6 +244,11 @@ fun Book.isLocalModified(): Boolean { return isLocal && LocalBook.getLastModified(this).getOrDefault(0L) > latestChapterTime } +fun Book.releaseHtmlData() { + infoHtml = null + tocHtml = null +} + fun Book.isSameNameAuthor(other: Any?): Boolean { if (other is BaseBook) { return name == other.name && author == other.author diff --git a/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt b/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt index 50b811063..6d66e30cb 100644 --- a/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt +++ b/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt @@ -87,6 +87,9 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB WebBook.searchBookAwait(it, searchKey, searchPage) } }.onEach { items -> + for (book in items) { + book.releaseHtmlData() + } appDb.searchBookDao.insert(*items.toTypedArray()) mergeItems(items, precision) currentCoroutineContext().ensureActive() diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt index 7e7d35228..4c093a516 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt @@ -18,10 +18,12 @@ import io.legado.app.data.entities.SearchBook import io.legado.app.exception.NoStackTraceException import io.legado.app.help.book.BookHelp import io.legado.app.help.book.ContentProcessor +import io.legado.app.help.book.releaseHtmlData import io.legado.app.help.config.AppConfig import io.legado.app.help.config.SourceConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.webBook.WebBook +import io.legado.app.utils.internString import io.legado.app.utils.mapParallelSafe import io.legado.app.utils.toastOnUi import kotlinx.coroutines.CancellationException @@ -87,6 +89,7 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a searchCallback = object : SourceCallback { override fun searchSuccess(searchBook: SearchBook) { + searchBook.releaseHtmlData() appDb.searchBookDao.insert(searchBook) when { screenKey.isEmpty() -> searchBooks.add(searchBook) @@ -227,13 +230,15 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a private suspend fun search(source: BookSource) { val resultBooks = WebBook.searchBookAwait(source, name) - resultBooks.forEach { searchBook -> + resultBooks.filter { searchBook -> if (searchBook.name != name) { - return@forEach + return@filter false } if (AppConfig.changeSourceCheckAuthor && !searchBook.author.contains(author)) { - return@forEach + return@filter false } + true + }.forEach { searchBook -> when { AppConfig.changeSourceLoadInfo || AppConfig.changeSourceLoadToc || AppConfig.changeSourceLoadWordCount -> { loadBookInfo(source, searchBook.toBook()) @@ -261,8 +266,12 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a private suspend fun loadBookToc(source: BookSource, book: Book) { val chapters = WebBook.getChapterListAwait(source, book).getOrThrow() + for (chapter in chapters) { + chapter.internString() + } tocMap[book.bookUrl] = chapters bookMap[book.bookUrl] = book + book.releaseHtmlData() if (AppConfig.changeSourceLoadWordCount) { loadBookWordCount(source, book, chapters) } else { diff --git a/app/src/main/java/io/legado/app/utils/BookChapterExtensions.kt b/app/src/main/java/io/legado/app/utils/BookChapterExtensions.kt new file mode 100644 index 000000000..890062f6a --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/BookChapterExtensions.kt @@ -0,0 +1,8 @@ +package io.legado.app.utils + +import io.legado.app.data.entities.BookChapter + +fun BookChapter.internString() { + title = title.intern() + bookUrl = bookUrl.intern() +}