Initial commit
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 5.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 149 KiB |
@@ -0,0 +1,78 @@
|
||||
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()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package eu.kanade.tachiyomi.extension.en.xcalibrscans
|
||||
|
||||
import android.util.Log
|
||||
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||
import okhttp3.OkHttpClient
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.nodes.Element
|
||||
|
||||
class xCaliBRScans : MangaThemesia("xCaliBR Scans", "https://xcalibrscans.com", "en") {
|
||||
|
||||
override val client: OkHttpClient = super.client.newBuilder()
|
||||
.addInterceptor(AntiScrapInterceptor())
|
||||
.rateLimit(2)
|
||||
.build()
|
||||
|
||||
override val hasProjectPage = true
|
||||
|
||||
override fun pageListParse(document: Document): List<Page> {
|
||||
document.selectFirst("div#readerarea .sword_box") ?: return super.pageListParse(document)
|
||||
|
||||
val imgUrls = mutableListOf<String>()
|
||||
|
||||
// Selects all direct descendant of "div#readerarea"
|
||||
document.select("div#readerarea > *")
|
||||
.forEach { element ->
|
||||
when {
|
||||
element.tagName() == "p" -> {
|
||||
val imgUrl = element.selectFirst("img")!!.imgAttr()
|
||||
imgUrls.add(imgUrl)
|
||||
}
|
||||
element.tagName() == "div" && element.hasClass("kage") -> {
|
||||
parseAntiScrapScramble(element, imgUrls)
|
||||
}
|
||||
else -> {
|
||||
Log.d("xCaliBR Scans", "Unknown element for page parsing $element")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return imgUrls.mapIndexed { index, imageUrl -> Page(index, document.location(), imageUrl) }
|
||||
}
|
||||
|
||||
private fun parseAntiScrapScramble(element: Element, destination: MutableList<String>) {
|
||||
element.select("div.sword")
|
||||
.forEach { swordDiv ->
|
||||
val imgUrls = swordDiv.select("img").map { it.imgAttr() }
|
||||
val urls = imgUrls.joinToString(AntiScrapInterceptor.IMAGE_URLS_SEPARATOR)
|
||||
val url = baseUrl.toHttpUrl()
|
||||
.newBuilder()
|
||||
.addQueryParameter("urls", urls)
|
||||
.fragment(AntiScrapInterceptor.ANTI_SCRAP_FRAGMENT)
|
||||
.build()
|
||||
.toString()
|
||||
|
||||
destination.add(url)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user