diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt index 945dc6a2a..5d330351b 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt @@ -86,19 +86,9 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { ?: throw NoStackTraceException("创建文档失败") val stringBuilder = StringBuilder() context.contentResolver.openOutputStream(bookDoc.uri, "wa")?.use { bookOs -> - getAllContents(scope, book) { text, srcList -> + getAllContents(scope, book) { text -> bookOs.write(text.toByteArray(Charset.forName(AppConfig.exportCharset))) stringBuilder.append(text) - srcList?.forEach { - val vFile = BookHelp.getImage(book, it.third) - if (vFile.exists()) { - DocumentUtils.createFileIfNotExist( - doc, - "${it.second}-${MD5Utils.md5Encode16(it.third)}.jpg", - subDirs = arrayOf("${book.name}_${book.author}", "images", it.first) - )?.writeBytes(context, vFile.readBytes()) - } - } } } if (AppConfig.exportToWebDav) { @@ -114,21 +104,9 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { val bookPath = FileUtils.getPath(file, filename) val bookFile = FileUtils.createFileWithReplace(bookPath) val stringBuilder = StringBuilder() - getAllContents(scope, book) { text, srcList -> + getAllContents(scope, book) { text -> bookFile.appendText(text, Charset.forName(AppConfig.exportCharset)) stringBuilder.append(text) - srcList?.forEach { - val vFile = BookHelp.getImage(book, it.third) - if (vFile.exists()) { - FileUtils.createFileIfNotExist( - file, - "${book.name}_${book.author}", - "images", - it.first, - "${it.second}-${MD5Utils.md5Encode16(it.third)}.jpg" - ).writeBytes(vFile.readBytes()) - } - } } if (AppConfig.exportToWebDav) { val byteArray = @@ -140,7 +118,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { private suspend fun getAllContents( scope: CoroutineScope, book: Book, - append: (text: String, srcList: ArrayList>?) -> Unit + append: (text: String) -> Unit ) { val useReplace = AppConfig.exportUseReplace && book.getUseReplaceRule() val contentProcessor = ContentProcessor.get(book.name, book.origin) @@ -152,7 +130,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { "\n" + HtmlFormatter.format(book.getDisplayIntro()) ) }" - append(qy, null) + append(qy) appDb.bookChapterDao.getChapterList(book.bookUrl).forEachIndexed { index, chapter -> scope.ensureActive() upAdapterLiveData.postValue(book.bookUrl) @@ -168,17 +146,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { chineseConvert = false, reSegment = false ).joinToString("\n") - val srcList = arrayListOf>() - content?.split("\n")?.forEachIndexed { index, text -> - val matcher = AppPattern.imgPattern.matcher(text) - while (matcher.find()) { - matcher.group(1)?.let { - val src = NetworkUtils.getAbsoluteURL(chapter.url, it) - srcList.add(Triple(chapter.title, index, src)) - } - } - } - append.invoke("\n\n$content1", srcList) + append.invoke("\n\n$content1") } } } @@ -461,7 +429,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { while (matcher.find()) { matcher.group(1)?.let { val src = NetworkUtils.getAbsoluteURL(chapter.url, it) - val originalHref = "${MD5Utils.md5Encode16(src)}${BookHelp.getImageSuffix(src)}" + val originalHref = "${MD5Utils.md5Encode16(src)}.${BookHelp.getImageSuffix(src)}" val href = "Images/${MD5Utils.md5Encode16(src)}.${BookHelp.getImageSuffix(src)}" val vFile = BookHelp.getImage(book, src) val fp = FileResourceProvider(vFile.parent) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt index f5d8d9173..09dfeacfc 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt @@ -1,6 +1,10 @@ package io.legado.app.ui.book.read.page.provider import android.graphics.Bitmap +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookSource import io.legado.app.help.BookHelp @@ -8,9 +12,11 @@ import io.legado.app.help.glide.ImageLoader import io.legado.app.model.localBook.EpubFile import io.legado.app.utils.BitmapUtils import io.legado.app.utils.FileUtils +import io.legado.app.R import kotlinx.coroutines.runBlocking import splitties.init.appCtx import java.io.FileOutputStream +import java.io.File import java.util.concurrent.ConcurrentHashMap object ImageProvider { @@ -37,10 +43,36 @@ object ImageProvider { } } } - return try { - ImageLoader.loadBitmap(appCtx, vFile.absolutePath).submit().get() - } catch (e: Exception) { - null + return ImageLoader.loadBitmap(appCtx, vFile.absolutePath) + .error(R.drawable.image_loading_error) + .listener(glideListener) + .submit() + .get() + } + + private val glideListener by lazy { + object : RequestListener { + + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + File(model as String).delete() + return false + } + + override fun onResourceReady( + resource: Bitmap?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + return false + } + } } diff --git a/app/src/main/res/drawable/image_loading_error.jpg b/app/src/main/res/drawable/image_loading_error.jpg new file mode 100644 index 000000000..b4987a78a Binary files /dev/null and b/app/src/main/res/drawable/image_loading_error.jpg differ