Просмотр исходного кода

fix(cache): 缓存文字书正文插图

HapeLee 3 месяцев назад
Родитель
Сommit
f7e42e0f88

+ 15 - 5
app/src/main/java/io/legado/app/help/book/BookHelp.kt

@@ -522,10 +522,17 @@ object BookHelp {
     /**
      * 检测该章节是否下载
      */
-    fun countImageCachedChapters(book: Book): Int {
-        if (!book.isImage) return 0
+    fun countCachedChapters(book: Book): Int {
         return appDb.bookChapterDao.getChapterList(book.bookUrl).count { chapter ->
-            chapter.isVolume || hasImageFilesCached(book, chapter)
+            chapter.isVolume || isChapterCacheComplete(book, chapter)
+        }
+    }
+
+    fun isChapterCacheComplete(book: Book, bookChapter: BookChapter): Boolean {
+        return if (book.isLocal) {
+            hasContent(book, bookChapter)
+        } else {
+            hasImageFilesCached(book, bookChapter)
         }
     }
 
@@ -599,13 +606,16 @@ object BookHelp {
             bookChapter.getFileName()
         )
         if (file.exists()) {
-            forEachImageSrc(file, action)
+            forEachImageSrc(file) { src ->
+                action(NetworkUtils.getAbsoluteURL(bookChapter.url, src))
+            }
             return
         }
         getContent(book, bookChapter)?.let { content ->
             val matcher = AppPattern.imgPattern.matcher(content)
             while (matcher.find()) {
-                action(matcher.group(1) ?: continue)
+                val src = matcher.group(1) ?: continue
+                action(NetworkUtils.getAbsoluteURL(bookChapter.url, src))
             }
         }
     }

+ 2 - 2
app/src/main/java/io/legado/app/model/CacheBookModel.kt

@@ -619,7 +619,7 @@ class CacheBookModel(
         content: String? = null,
     ) {
         task.onSuccess(IO) {
-            if (chainImagesAfterContent && book.isImage && !repository.hasImageContent(book, chapter)) {
+            if (chainImagesAfterContent && !repository.hasImageContent(book, chapter)) {
                 startImageCacheTask(scope, context, chapter, chapterIndex, it as String)
                 return@onSuccess
             }
@@ -721,7 +721,7 @@ class CacheBookModel(
     }
 
     private suspend fun ensureChapterImagesCached(chapter: BookChapter) {
-        if (!book.isImage || repository.hasImageContent(book, chapter)) return
+        if (repository.hasImageContent(book, chapter)) return
         reportImageDownloadProgress(chapter, completed = 0)
         repository.saveCachedImagesAwait(
             bookSource = bookSource,

+ 3 - 3
app/src/main/java/io/legado/app/service/ExportBookService.kt

@@ -729,8 +729,8 @@ class ExportBookService : BaseService(), KoinComponent {
             var text1 = text
             val matcher = AppPattern.imgPattern.matcher(text)
             while (matcher.find()) {
-                matcher.group(1)?.let {
-                    val src = NetworkUtils.getAbsoluteURL(chapter.url, it)
+                matcher.group(1)?.let { rawSrc ->
+                    val src = NetworkUtils.getAbsoluteURL(chapter.url, rawSrc)
                     val originalHref =
                         "${MD5Utils.md5Encode16(src)}.${BookHelp.getImageSuffix(src)}"
                     val href =
@@ -741,7 +741,7 @@ class ExportBookService : BaseService(), KoinComponent {
                         val img = LazyResource(fp, href, originalHref)
                         resources.add(img)
                     }
-                    text1 = text1.replace(src, "../${href}")
+                    text1 = text1.replace(rawSrc, "../${href}")
                 }
             }
             data.append(text1).append("\n")

+ 8 - 24
app/src/main/java/io/legado/app/ui/book/cache/manage/BookCacheManageViewModel.kt

@@ -14,7 +14,6 @@ import io.legado.app.domain.usecase.CacheBookChaptersUseCase
 import io.legado.app.domain.usecase.ClearBookCacheUseCase
 import io.legado.app.help.book.BookHelp
 import io.legado.app.help.book.isAudio
-import io.legado.app.help.book.isImage
 import io.legado.app.help.book.isLocal
 import io.legado.app.help.book.isNotShelf
 import io.legado.app.model.CacheBook
@@ -180,7 +179,7 @@ class BookCacheManageViewModel(
         }
         viewModelScope.launch {
             CacheBook.cacheSuccessFlow.collect { chapter ->
-                // 增量标记已缓存,避免每成功一章就 countImageCachedChapters / 展开列表扫盘
+                // 增量标记已缓存,避免每成功一章就重新扫描全部章节缓存
                 markChapterCachedInUi(chapter.bookUrl, chapter.index)
             }
         }
@@ -454,11 +453,7 @@ class BookCacheManageViewModel(
         val errorIndices = errorIndices(book.bookUrl)
         val totalCount = bookChapterDao.getChapterCount(book.bookUrl)
         val cachedFileCount = cacheFiles.count { it.endsWith(".nb") }
-        val cachedCount = if (book.isImage) {
-            min(BookHelp.countImageCachedChapters(book), totalCount)
-        } else {
-            min(cachedFileCount + bookChapterDao.getVolumeCount(book.bookUrl), totalCount)
-        }
+        val cachedCount = min(BookHelp.countCachedChapters(book), totalCount)
         if (totalCount == 0 && cacheFiles.isEmpty() && waitingCount == 0 && downloadingCount == 0 && pausedCount == 0 && !book.isNotShelf) {
             return null
         }
@@ -485,7 +480,6 @@ class BookCacheManageViewModel(
     private fun buildChapterItems(bookUrl: String): List<BookCacheChapterItem> {
         val book = bookDao.getBook(bookUrl) ?: return emptyList()
         val chapters = bookChapterDao.getChapterCacheInfoList(bookUrl)
-        val cacheFiles = BookHelp.getChapterFiles(book)
         val model = CacheBook.cacheBookMap[bookUrl]
         val bookState = CacheBook.downloadStateFlow.value.books[bookUrl]
         val errorIndices = errorIndices(bookUrl)
@@ -500,14 +494,10 @@ class BookCacheManageViewModel(
                 isVolume = chapter.isVolume,
                 index = chapter.index,
             )
-            val isCached = if (book.isImage) {
-                when {
-                    chapter.isVolume -> true
-                    isDownloading -> false
-                    else -> BookHelp.hasImageFilesCached(book, bookChapter)
-                }
-            } else {
-                cacheFiles.contains(chapter.getFileName()) || chapter.isVolume
+            val isCached = when {
+                chapter.isVolume -> true
+                isDownloading -> false
+                else -> BookHelp.isChapterCacheComplete(book, bookChapter)
             }
             val chapterProgress = bookState?.chapterProgress?.get(chapter.index)
             val (downloadProgress, progressLabel) = chapterProgressUi(
@@ -679,13 +669,12 @@ class BookCacheManageViewModel(
         batchSize: Int = DOWNLOAD_BATCH_SIZE,
     ): Sequence<List<Int>> = sequence {
         val book = bookDao.getBook(bookUrl) ?: return@sequence
-        val cacheFiles = BookHelp.getChapterFiles(book)
         val model = CacheBook.cacheBookMap[bookUrl]
         var batch = ArrayList<Int>(batchSize)
         for (chapter in bookChapterDao.getChapterCacheInfoList(bookUrl)) {
             if (
                 chapter.isVolume ||
-                    isChapterFullyCached(book, chapter, cacheFiles) ||
+                    isChapterFullyCached(book, chapter) ||
                     model?.isPaused(chapter.index) == true ||
                     model?.isWaiting(chapter.index) == true ||
                     model?.isDownloading(chapter.index) == true
@@ -706,7 +695,6 @@ class BookCacheManageViewModel(
     private fun isChapterFullyCached(
         book: Book,
         chapter: BookChapterCacheInfo,
-        cacheFiles: Set<String>,
     ): Boolean {
         if (chapter.isVolume) return true
         val bookChapter = BookChapter(
@@ -716,11 +704,7 @@ class BookCacheManageViewModel(
             isVolume = chapter.isVolume,
             index = chapter.index,
         )
-        return if (book.isImage) {
-            BookHelp.hasImageFilesCached(book, bookChapter)
-        } else {
-            cacheFiles.contains(chapter.getFileName())
-        }
+        return BookHelp.isChapterCacheComplete(book, bookChapter)
     }
 
     private fun updateRuntimeDownloadStatuses(