-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMangaLoaderContextImpl.kt
More file actions
64 lines (52 loc) · 2.59 KB
/
MangaLoaderContextImpl.kt
File metadata and controls
64 lines (52 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package org.koitharu.kotatsu.dl.parsers
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible
import okhttp3.CookieJar
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.bitmap.Bitmap
import org.koitharu.kotatsu.parsers.config.MangaSourceConfig
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.util.requireBody
import java.awt.image.BufferedImage
import java.util.concurrent.TimeUnit
import javax.imageio.ImageIO
import javax.script.ScriptEngineManager
class MangaLoaderContextImpl : MangaLoaderContext() {
override val cookieJar: CookieJar = InMemoryCookieJar()
private val scriptEngineManager = ScriptEngineManager()
override val httpClient: OkHttpClient = OkHttpClient.Builder()
.cookieJar(cookieJar)
.addInterceptor(CloudFlareInterceptor())
.addInterceptor(GZipInterceptor())
.addInterceptor(RateLimitInterceptor())
.addInterceptor(CommonHeadersInterceptor(this))
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.build()
@Suppress("OVERRIDE_DEPRECATION")
override suspend fun evaluateJs(script: String): String? = evaluateJs("", script)
override suspend fun evaluateJs(baseUrl: String, script: String): String? = runInterruptible(Dispatchers.Default) {
val nashorn = scriptEngineManager.getEngineByName("nashorn")
?: error("JavaScript engine is not available")
nashorn.eval(script)?.toString()?.takeUnless { it.isEmpty() || it == "null" }
}
override fun getConfig(source: MangaSource): MangaSourceConfig = DefaultMangaSourceConfig()
override fun getDefaultUserAgent(): String = UserAgents.FIREFOX_DESKTOP
override fun redrawImageResponse(response: Response, redraw: (Bitmap) -> Bitmap): Response {
val srcImage = response.requireBody().byteStream().use { ImageIO.read(it) }
checkNotNull(srcImage) { "Cannot decode image" }
val resImage = (redraw(BitmapImpl(srcImage)) as BitmapImpl)
return response.newBuilder()
.body(resImage.compress("png").toResponseBody("image/png".toMediaTypeOrNull()))
.build()
}
override fun createBitmap(width: Int, height: Int): Bitmap {
return BitmapImpl(BufferedImage(width, height, BufferedImage.TYPE_INT_RGB))
}
}