Tachiyomi-Extensions/multisrc/overrides/mangathemesia/xcalibrscans/src/AntiScrapInterceptor.kt

79 lines
2.3 KiB
Kotlin
Raw Normal View History

package eu.kanade.tachiyomi.extension.en.xcalibrscans
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Rect
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.Protocol
import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody
import java.io.ByteArrayOutputStream
class AntiScrapInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
if (request.url.fragment != ANTI_SCRAP_FRAGMENT) {
return chain.proceed(request)
}
val imageUrls = request.url
.queryParameter("urls").orEmpty()
.split(IMAGE_URLS_SEPARATOR)
var width = 0
var height = 0
val imageBitmaps = imageUrls.map { imageUrl ->
val newRequest = request.newBuilder().url(imageUrl).build()
val response = chain.proceed(newRequest)
2023-02-11 22:30:31 +00:00
val bitmap = BitmapFactory.decodeStream(response.body.byteStream())
response.close()
width += bitmap.width
height = bitmap.height
bitmap
}
val mergedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
Canvas(mergedBitmap).apply {
// Will mirror everything that are applied afterwards
scale(-1F, 1F, width / 2F, height / 2F)
// Merge the bitmaps vertically
var left = 0
imageBitmaps.forEach { bitmap ->
val srcRect = Rect(0, 0, bitmap.width, bitmap.height)
val dstRect = Rect(left, 0, left + bitmap.width, bitmap.height)
drawBitmap(bitmap, srcRect, dstRect, null)
left += bitmap.width
}
}
val baos = ByteArrayOutputStream()
mergedBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos)
return Response.Builder()
.code(200)
.protocol(Protocol.HTTP_1_1)
.request(request)
.message("OK")
.body(baos.toByteArray().toResponseBody(pngMediaType))
.build()
}
companion object {
const val ANTI_SCRAP_FRAGMENT = "ANTI_SCRAP"
const val IMAGE_URLS_SEPARATOR = "|"
val pngMediaType = "image/png".toMediaType()
}
}