79 lines
2.3 KiB
Kotlin
79 lines
2.3 KiB
Kotlin
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()
|
|
}
|
|
}
|