From 9698fd07111db79f3a03a1b8873c6d2f41c7c832 Mon Sep 17 00:00:00 2001 From: DitFranXX <45893338+DitFranXX@users.noreply.github.com> Date: Sat, 9 Mar 2019 20:58:51 +0900 Subject: [PATCH] Implement Nosrob's Image Discrambler (#881) Implement Nosrob's Japscan Image Discrambler --- src/fr/japscan/build.gradle | 2 +- .../tachiyomi/extension/fr/japscan/Japscan.kt | 71 +++++++++++++++++-- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/fr/japscan/build.gradle b/src/fr/japscan/build.gradle index 8c3d37fc3..4fd7b5945 100644 --- a/src/fr/japscan/build.gradle +++ b/src/fr/japscan/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Japscan' pkgNameSuffix = 'fr.japscan' extClass = '.Japscan' - extVersionCode = 6 + extVersionCode = 7 libVersion = '1.2' } diff --git a/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt b/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt index dca3d6d91..d3fb45cd3 100644 --- a/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt +++ b/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt @@ -7,21 +7,24 @@ package eu.kanade.tachiyomi.extension.fr.japscan * @version 1.0 */ +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Canvas +import android.graphics.Rect import com.google.gson.JsonObject import com.google.gson.JsonParser import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.source.model.* import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.FormBody -import okhttp3.Request -import okhttp3.Response -import okhttp3.OkHttpClient +import okhttp3.* +import org.apache.commons.lang3.StringUtils import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.io.ByteArrayOutputStream +import java.io.InputStream import java.text.ParseException import java.text.SimpleDateFormat -import org.apache.commons.lang3.StringUtils class Japscan : ParsedHttpSource() { @@ -35,7 +38,18 @@ class Japscan : ParsedHttpSource() { override val supportsLatest = true - override val client: OkHttpClient = network.cloudflareClient + override val client: OkHttpClient = network.cloudflareClient.newBuilder().addInterceptor { chain -> + val request = chain.request() + val response = chain.proceed(request) + if (!request.url().pathSegments().contains("clel")) return@addInterceptor response + + val res = response.body()!!.byteStream().use { + decodeImage(it) + } + + val rb = ResponseBody.create(MediaType.parse("image/png"), res) + response.newBuilder().body(rb).build() + }.build() companion object { val dateFormat by lazy { @@ -167,4 +181,49 @@ class Japscan : ParsedHttpSource() { } override fun imageUrlParse(document: Document): String = "" + + private fun decodeImage(img: InputStream): ByteArray { + val input = BitmapFactory.decodeStream(img) + + val xResult = Bitmap.createBitmap(input.width, + input.height, + Bitmap.Config.ARGB_8888) + val xCanvas = Canvas(xResult) + + val result = Bitmap.createBitmap(input.width, + input.height, + Bitmap.Config.ARGB_8888) + val canvas = Canvas(result) + + for (x in 0..input.width step 200) { + val col1 = Rect(x, 0, x + 100, input.height) + if ((x + 200) <= input.width) { + val col2 = Rect(x + 100, 0, x + 200, input.height) + xCanvas.drawBitmap(input, col1, col2, null) + xCanvas.drawBitmap(input, col2, col1, null) + } else { + val col2 = Rect(x + 100, 0, input.width, input.height) + xCanvas.drawBitmap(input, col1, col1, null) + xCanvas.drawBitmap(input, col2, col2, null) + } + } + + for (y in 0..input.height step 200) { + val row1 = Rect(0, y, input.width, y + 100) + + if ((y + 200) <= input.height) { + val row2 = Rect(0, y + 100, input.width, y + 200) + canvas.drawBitmap(xResult, row1, row2, null) + canvas.drawBitmap(xResult, row2, row1, null) + } else { + val row2 = Rect(0, y + 100, input.width, input.height) + canvas.drawBitmap(xResult, row1, row1, null) + canvas.drawBitmap(xResult, row2, row2, null) + } + } + + val output = ByteArrayOutputStream() + result.compress(Bitmap.CompressFormat.PNG, 100, output) + return output.toByteArray() + } }