extensions-source/multisrc/overrides/mangathemesia/xcalibrscans/src/AntiScrapInterceptor.kt

79 lines
2.3 KiB
Kotlin
Raw Normal View History

2024-01-09 06:12:39 +08:00
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)
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()
}
}