From 8b3d7150f4c78a1874c4ca421cef3fc85003cec5 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:48:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/help/glide/LegadoDataUrlLoader.kt | 82 +++++++++++++++++++ .../app/help/glide/LegadoGlideModule.kt | 5 ++ .../app/help/glide/OkHttpStreamFetcher.kt | 4 +- 3 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/io/legado/app/help/glide/LegadoDataUrlLoader.kt diff --git a/app/src/main/java/io/legado/app/help/glide/LegadoDataUrlLoader.kt b/app/src/main/java/io/legado/app/help/glide/LegadoDataUrlLoader.kt new file mode 100644 index 000000000..2601c0d3a --- /dev/null +++ b/app/src/main/java/io/legado/app/help/glide/LegadoDataUrlLoader.kt @@ -0,0 +1,82 @@ +package io.legado.app.help.glide + +import com.bumptech.glide.Priority +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.data.DataFetcher +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import com.bumptech.glide.signature.ObjectKey +import io.legado.app.exception.NoStackTraceException +import io.legado.app.model.ReadManga +import io.legado.app.model.analyzeRule.AnalyzeUrl +import io.legado.app.utils.ImageUtils +import java.io.InputStream + +class LegadoDataUrlLoader : ModelLoader { + + override fun buildLoadData( + model: String, + width: Int, + height: Int, + options: Options + ): ModelLoader.LoadData? { + if (options.get(OkHttpModelLoader.mangaOption) == false) { + return null + } + return ModelLoader.LoadData(ObjectKey(model), LegadoDataUrlFetcher(model)) + } + + override fun handles(model: String): Boolean { + return model.startsWith("data:") + } + + class LegadoDataUrlFetcher(private val model: String) : DataFetcher { + override fun loadData( + priority: Priority, + callback: DataFetcher.DataCallback + ) { + try { + val bytes = AnalyzeUrl(model, source = ReadManga.bookSource).getByteArray() + val decoded = ImageUtils.decode( + model, bytes, isCover = false, ReadManga.bookSource, ReadManga.book + )?.inputStream() + if (decoded == null) { + throw NoStackTraceException("漫画图片解密失败") + } + callback.onDataReady(decoded) + } catch (e: Exception) { + callback.onLoadFailed(e) + } + } + + override fun cleanup() { + // do nothing + } + + override fun cancel() { + // do nothing + } + + override fun getDataClass(): Class { + return InputStream::class.java + } + + override fun getDataSource(): DataSource { + return DataSource.LOCAL + } + + } + + class Factory : ModelLoaderFactory { + override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader { + return LegadoDataUrlLoader() + } + + override fun teardown() { + // do nothing + } + } + +} diff --git a/app/src/main/java/io/legado/app/help/glide/LegadoGlideModule.kt b/app/src/main/java/io/legado/app/help/glide/LegadoGlideModule.kt index 1785da235..d35a121df 100644 --- a/app/src/main/java/io/legado/app/help/glide/LegadoGlideModule.kt +++ b/app/src/main/java/io/legado/app/help/glide/LegadoGlideModule.kt @@ -21,6 +21,11 @@ class LegadoGlideModule : AppGlideModule() { InputStream::class.java, OkHttpModeLoaderFactory ) + registry.prepend( + String::class.java, + InputStream::class.java, + LegadoDataUrlLoader.Factory() + ) } override fun applyOptions(context: Context, builder: GlideBuilder) { diff --git a/app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt b/app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt index a3391a978..7e635521d 100644 --- a/app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt +++ b/app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt @@ -113,9 +113,7 @@ class OkHttpStreamFetcher( isCover = false, source, ReadManga.book - )?.let { - ByteArrayInputStream(it) - } + )?.inputStream() } else { ImageUtils.decode( url.toStringUrl(), responseBody!!.byteStream(),