Use source().asResponseBody() to fix MIME to avoid extra memory load (#10254)

This commit is contained in:
stevenyomi 2025-08-24 09:53:51 +00:00 committed by Draff
parent f50bec002b
commit 0e9e55b945
Signed by: Draff
GPG Key ID: E8A89F3211677653
17 changed files with 39 additions and 44 deletions

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'Luscious' extName = 'Luscious'
extClass = '.LusciousFactory' extClass = '.LusciousFactory'
extVersionCode = 20 extVersionCode = 21
isNsfw = true isNsfw = true
} }

View File

@ -31,11 +31,11 @@ import kotlinx.serialization.json.putJsonArray
import kotlinx.serialization.json.putJsonObject import kotlinx.serialization.json.putJsonObject
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import rx.Observable import rx.Observable
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.util.Calendar import java.util.Calendar
@ -63,8 +63,8 @@ abstract class Luscious(
private val rewriteOctetStream: Interceptor = Interceptor { chain -> private val rewriteOctetStream: Interceptor = Interceptor { chain ->
val originalResponse: Response = chain.proceed(chain.request()) val originalResponse: Response = chain.proceed(chain.request())
if (originalResponse.headers("Content-Type").contains("application/octet-stream") && originalResponse.request.url.toString().contains(".webp")) { if (originalResponse.headers("Content-Type").contains("application/octet-stream") && originalResponse.request.url.toString().contains(".webp")) {
val orgBody = originalResponse.body.bytes() val orgBody = originalResponse.body.source()
val newBody = orgBody.toResponseBody("image/webp".toMediaTypeOrNull()) val newBody = orgBody.asResponseBody("image/webp".toMediaType())
originalResponse.newBuilder() originalResponse.newBuilder()
.body(newBody) .body(newBody)
.build() .build()

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'Tappytoon' extName = 'Tappytoon'
extClass = '.TappytoonFactory' extClass = '.TappytoonFactory'
extVersionCode = 8 extVersionCode = 9
isNsfw = true isNsfw = true
} }

View File

@ -17,7 +17,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.IOException import java.io.IOException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -40,9 +40,8 @@ class Tappytoon(override val lang: String) : HttpSource() {
} }
// Fix image content type // Fix image content type
val type = IMG_CONTENT_TYPE.toMediaType() val type = IMG_CONTENT_TYPE.toMediaType()
val body = res.body.bytes().toResponseBody(type) val body = res.body.source().asResponseBody(type)
return@addInterceptor res.newBuilder().body(body) return@addInterceptor res.newBuilder().body(body).build()
.header("Content-Type", IMG_CONTENT_TYPE).build()
} }
// Throw JSON error if available // Throw JSON error if available
if (mime == "application/json") { if (mime == "application/json") {

View File

@ -15,11 +15,11 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import keiyoushi.utils.getPreferencesLazy import keiyoushi.utils.getPreferencesLazy
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -40,9 +40,9 @@ class MangaKatana : ConfigurableSource, ParsedHttpSource() {
override val client: OkHttpClient = network.cloudflareClient.newBuilder().addNetworkInterceptor { chain -> override val client: OkHttpClient = network.cloudflareClient.newBuilder().addNetworkInterceptor { chain ->
val originalResponse = chain.proceed(chain.request()) val originalResponse = chain.proceed(chain.request())
if (originalResponse.headers("Content-Type").contains("application/octet-stream")) { if (originalResponse.headers("Content-Type").contains("application/octet-stream")) {
val orgBody = originalResponse.body.bytes() val orgBody = originalResponse.body.source()
val extension = chain.request().url.toString().substringAfterLast(".") val extension = chain.request().url.toString().substringAfterLast(".")
val newBody = orgBody.toResponseBody("image/$extension".toMediaTypeOrNull()) val newBody = orgBody.asResponseBody("image/$extension".toMediaType())
originalResponse.newBuilder() originalResponse.newBuilder()
.body(newBody) .body(newBody)
.build() .build()

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'Tsumino' extName = 'Tsumino'
extClass = '.Tsumino' extClass = '.Tsumino'
extVersionCode = 7 extVersionCode = 8
isNsfw = true isNsfw = true
} }

View File

@ -25,11 +25,11 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import rx.Observable import rx.Observable
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -49,8 +49,8 @@ class Tsumino : HttpSource() {
if (originalResponse.headers("Content-Type").contains("application/octet-stream") && if (originalResponse.headers("Content-Type").contains("application/octet-stream") &&
originalResponse.request.url.pathSegments.any { it == "parts" } originalResponse.request.url.pathSegments.any { it == "parts" }
) { ) {
val orgBody = originalResponse.body.bytes() val orgBody = originalResponse.body.source()
val newBody = orgBody.toResponseBody("image/jpeg".toMediaTypeOrNull()) val newBody = orgBody.asResponseBody("image/jpeg".toMediaType())
originalResponse.newBuilder() originalResponse.newBuilder()
.body(newBody) .body(newBody)
.build() .build()

View File

@ -3,7 +3,7 @@ ext {
extClass = '.ManhwaLatino' extClass = '.ManhwaLatino'
themePkg = 'madara' themePkg = 'madara'
baseUrl = 'https://manhwa-latino.com' baseUrl = 'https://manhwa-latino.com'
overrideVersionCode = 8 overrideVersionCode = 9
isNsfw = true isNsfw = true
} }

View File

@ -6,10 +6,10 @@ import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
@ -30,8 +30,8 @@ class ManhwaLatino : Madara(
.build() .build()
val response = chain.proceed(request.newBuilder().headers(headers).build()) val response = chain.proceed(request.newBuilder().headers(headers).build())
if (response.headers("Content-Type").contains("application/octet-stream") && response.request.url.toString().endsWith(".jpg")) { if (response.headers("Content-Type").contains("application/octet-stream") && response.request.url.toString().endsWith(".jpg")) {
val orgBody = response.body.bytes() val orgBody = response.body.source()
val newBody = orgBody.toResponseBody("image/jpeg".toMediaTypeOrNull()) val newBody = orgBody.asResponseBody("image/jpeg".toMediaType())
response.newBuilder() response.newBuilder()
.body(newBody) .body(newBody)
.build() .build()

View File

@ -3,7 +3,7 @@ ext {
extClass = '.Kiryuu' extClass = '.Kiryuu'
themePkg = 'mangathemesia' themePkg = 'mangathemesia'
baseUrl = 'https://kiryuu02.com' baseUrl = 'https://kiryuu02.com'
overrideVersionCode = 11 overrideVersionCode = 12
isNsfw = false isNsfw = false
} }

View File

@ -4,7 +4,7 @@ import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
@ -23,9 +23,8 @@ class Kiryuu : MangaThemesia("Kiryuu", "https://kiryuu02.com", "id", dateFormat
} }
// Fix image content type // Fix image content type
val type = IMG_CONTENT_TYPE.toMediaType() val type = IMG_CONTENT_TYPE.toMediaType()
val body = response.body.bytes().toResponseBody(type) val body = response.body.source().asResponseBody(type)
return@addInterceptor response.newBuilder().body(body) return@addInterceptor response.newBuilder().body(body).build()
.header("Content-Type", IMG_CONTENT_TYPE).build()
} }
response response
} }

View File

@ -3,7 +3,7 @@ ext {
extClass = '.Komiktap' extClass = '.Komiktap'
themePkg = 'mangathemesia' themePkg = 'mangathemesia'
baseUrl = 'https://komiktap.info' baseUrl = 'https://komiktap.info'
overrideVersionCode = 3 overrideVersionCode = 4
isNsfw = true isNsfw = true
} }

View File

@ -7,7 +7,7 @@ import okhttp3.Cookie
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import java.io.IOException import java.io.IOException
class Komiktap : MangaThemesia("Komiktap", "https://komiktap.info", "id") { class Komiktap : MangaThemesia("Komiktap", "https://komiktap.info", "id") {
@ -23,9 +23,8 @@ class Komiktap : MangaThemesia("Komiktap", "https://komiktap.info", "id") {
} }
// Fix image content type // Fix image content type
val type = IMG_CONTENT_TYPE.toMediaType() val type = IMG_CONTENT_TYPE.toMediaType()
val body = response.body.bytes().toResponseBody(type) val body = response.body.source().asResponseBody(type)
return@addInterceptor response.newBuilder().body(body) return@addInterceptor response.newBuilder().body(body).build()
.header("Content-Type", IMG_CONTENT_TYPE).build()
} }
response response
} }

View File

@ -3,7 +3,7 @@ ext {
extClass = '.ArgosComics' extClass = '.ArgosComics'
themePkg = 'madara' themePkg = 'madara'
baseUrl = 'https://argoscomic.com' baseUrl = 'https://argoscomic.com'
overrideVersionCode = 5 overrideVersionCode = 6
isNsfw = false isNsfw = false
} }

View File

@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import java.security.SecureRandom import java.security.SecureRandom
import java.security.cert.X509Certificate import java.security.cert.X509Certificate
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -49,9 +49,8 @@ class ArgosComics : Madara(
if (mime == "application/octet-stream" || mime == null) { if (mime == "application/octet-stream" || mime == null) {
// Fix image content type // Fix image content type
val type = "image/jpeg".toMediaType() val type = "image/jpeg".toMediaType()
val body = response.body.bytes().toResponseBody(type) val body = response.body.source().asResponseBody(type)
return@addInterceptor response.newBuilder().body(body) return@addInterceptor response.newBuilder().body(body).build()
.header("Content-Type", "image/jpeg").build()
} }
} }
response response

View File

@ -3,7 +3,7 @@ ext {
extClass = '.ArthurScan' extClass = '.ArthurScan'
themePkg = 'madara' themePkg = 'madara'
baseUrl = 'https://arthurscan.xyz' baseUrl = 'https://arthurscan.xyz'
overrideVersionCode = 5 overrideVersionCode = 6
isNsfw = false isNsfw = false
} }

View File

@ -4,7 +4,7 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.asResponseBody
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -24,9 +24,8 @@ class ArthurScan : Madara(
if (response.isSuccessful) { if (response.isSuccessful) {
if (mime == "application/octet-stream" || mime == null) { if (mime == "application/octet-stream" || mime == null) {
val type = "image/jpeg".toMediaType() val type = "image/jpeg".toMediaType()
val body = response.body.bytes().toResponseBody(type) val body = response.body.source().asResponseBody(type)
return@addInterceptor response.newBuilder().body(body) return@addInterceptor response.newBuilder().body(body).build()
.header("Content-Type", "image/jpeg").build()
} }
} }
response response