 f80dab6f73
			
		
	
	
		f80dab6f73
		
			
		
	
	
	
	
		
			
			* xCaliBR Scans: Update anti scrap logic Also handles HTTP 103 through WebView Fixes #10528 * Remove unused import * Remove Http103Interceptor
		
			
				
	
	
		
			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()
 | |
|     }
 | |
| }
 |