From 88b3e5cf3441f6b9c228ae50c141820cba5bbb13 Mon Sep 17 00:00:00 2001 From: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> Date: Thu, 23 May 2024 13:17:39 +0500 Subject: [PATCH] implement basic methods for descrambling images --- app/build.gradle | 6 ++- .../kotatsu/core/parser/BitmapImpl.kt | 48 +++++++++++++++++++ .../core/parser/MangaLoaderContextImpl.kt | 29 +++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/core/parser/BitmapImpl.kt diff --git a/app/build.gradle b/app/build.gradle index 63625098b..f99250810 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,7 +82,11 @@ afterEvaluate { } dependencies { //noinspection GradleDependency - implementation('com.github.KotatsuApp:kotatsu-parsers:078b59b1e2') { + // TODO: change bac +// implementation('com.github.KotatsuApp:kotatsu-parsers:078b59b1e2') { +// exclude group: 'org.json', module: 'json' +// } + implementation('com.github.AwkwardPeak7:kotatsu-parsers:d7d42465de') { exclude group: 'org.json', module: 'json' } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/BitmapImpl.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/BitmapImpl.kt new file mode 100644 index 000000000..b55e8333d --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/BitmapImpl.kt @@ -0,0 +1,48 @@ +package org.koitharu.kotatsu.core.parser + +import android.graphics.Canvas +import android.graphics.Bitmap as AndroidBitmap +import android.graphics.Rect as AndroidRect +import org.koitharu.kotatsu.parsers.bitmap.Bitmap +import org.koitharu.kotatsu.parsers.bitmap.Rect + +class BitmapImpl private constructor() : Bitmap { + + lateinit var androidBitmap: AndroidBitmap + + private lateinit var canvas: Canvas + + override val height: Int + get() = androidBitmap.height + + override val width: Int + get() = androidBitmap.width + + override fun drawBitmap(sourceBitmap: Bitmap, src: Rect, dst: Rect) { + val androidSourceBitmap = (sourceBitmap as BitmapImpl).androidBitmap + + canvas.drawBitmap(androidSourceBitmap, src.toAndroidRect(), dst.toAndroidRect(), null) + } + + companion object { + fun create(width: Int, height: Int): Bitmap { + val instance = BitmapImpl() + instance.androidBitmap = AndroidBitmap.createBitmap(width, height, AndroidBitmap.Config.ARGB_8888) + instance.canvas = Canvas(instance.androidBitmap) + + return instance + } + + fun create(bitmap: AndroidBitmap): Bitmap { + val instance = BitmapImpl() + instance.androidBitmap = bitmap.copy(AndroidBitmap.Config.ARGB_8888, true) + instance.canvas = Canvas(instance.androidBitmap) + + return instance + } + } +} + +private fun Rect.toAndroidRect(): AndroidRect { + return AndroidRect(left, top, right, bottom) +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaLoaderContextImpl.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaLoaderContextImpl.kt index 852bdace1..bfb8b8eae 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaLoaderContextImpl.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaLoaderContextImpl.kt @@ -1,7 +1,9 @@ package org.koitharu.kotatsu.core.parser +import android.graphics.Bitmap as AndroidBitmap import android.annotation.SuppressLint import android.content.Context +import android.graphics.BitmapFactory import android.util.Base64 import android.webkit.WebView import androidx.annotation.MainThread @@ -10,7 +12,11 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext +import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient +import okhttp3.Response +import okhttp3.ResponseBody.Companion.asResponseBody +import okio.Buffer import org.koitharu.kotatsu.core.network.MangaHttpClient import org.koitharu.kotatsu.core.network.cookies.MutableCookieJar import org.koitharu.kotatsu.core.prefs.SourceSettings @@ -19,6 +25,7 @@ import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug import org.koitharu.kotatsu.core.util.ext.sanitizeHeaderValue import org.koitharu.kotatsu.core.util.ext.toList import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.bitmap.Bitmap import org.koitharu.kotatsu.parsers.config.MangaSourceConfig import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.network.UserAgents @@ -68,6 +75,28 @@ class MangaLoaderContextImpl @Inject constructor( return LocaleListCompat.getAdjustedDefault().toList() } + override fun redrawImageResponse(response: Response, redraw: (image: Bitmap) -> Bitmap): Response { + val image = requireNotNull(response.body) { + "Response is null" + }.byteStream() + + val bitmap = BitmapFactory.decodeStream(image) + val result = redraw(BitmapImpl.create(bitmap)) as BitmapImpl + + val body = Buffer().run { + result.androidBitmap.compress(AndroidBitmap.CompressFormat.JPEG, 90, outputStream()) + asResponseBody("image/jpeg".toMediaType()) + } + + return response.newBuilder() + .body(body) + .build() + } + + override fun createBitmap(width: Int, height: Int): Bitmap { + return BitmapImpl.create(width, height) + } + @MainThread private fun obtainWebView(): WebView { return webViewCached?.get() ?: WebView(androidContext).also {