DragonTea: Decrypt image attributes (#17343)

* DragonTea: Decrypt image attributes

* Remove unnecessary import

* Trim whitespace
This commit is contained in:
beerpsi 2023-08-03 00:52:22 +07:00 committed by GitHub
parent c367e3b126
commit bf6740e7e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 2 deletions

View File

@ -4,9 +4,13 @@ import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Rect import android.graphics.Rect
import android.util.Base64
import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
@ -53,7 +57,31 @@ class DragonTea : Madara(
.firstOrNull() != null .firstOrNull() != null
if (!hasSplitImages) { if (!hasSplitImages) {
return super.pageListParse(document) return document.select(pageListParseSelector).mapIndexed { index, element ->
val imageUrl = element.selectFirst("img")?.let {
val src = when {
it.hasAttr("data-src") -> it.attr("data-src")
it.hasAttr("data-lazy-src") -> it.attr("data-lazy-src")
it.hasAttr("srcset") -> it.attr("srcset").substringBefore(" ")
else -> it.attr("src")
}.trim()
if (!src.startsWith("{\"")) {
return@let imageFromElement(it)
}
val srcData = json.parseToJsonElement(src).jsonObject
val unsaltedCiphertext = Base64.decode(srcData["ct"]!!.jsonPrimitive.content, Base64.DEFAULT)
val salt = srcData["s"]!!.jsonPrimitive.content.decodeHex()
val ciphertext = SALTED + salt + unsaltedCiphertext
val plaintext = CryptoAES.decrypt(Base64.encodeToString(ciphertext, Base64.DEFAULT), PASSWORD)
json.parseToJsonElement(plaintext).jsonPrimitive.content
}
Page(index, document.location(), imageUrl)
}
} }
return document.select("div.page-break, li.blocks-gallery-item, $begonepeconSelector") return document.select("div.page-break, li.blocks-gallery-item, $begonepeconSelector")
@ -119,8 +147,19 @@ class DragonTea : Madara(
.build() .build()
} }
fun String.decodeHex(): ByteArray {
check(length % 2 == 0) { "Must have an even length" }
return chunked(2)
.map { it.toInt(16).toByte() }
.toByteArray()
}
companion object { companion object {
private const val BEGONEPECON_SUFFIX = "?begonepecon" private const val BEGONEPECON_SUFFIX = "?begonepecon"
private val PNG_MEDIA_TYPE = "image/png".toMediaType() private val PNG_MEDIA_TYPE = "image/png".toMediaType()
private val SALTED = "Salted__".toByteArray(Charsets.UTF_8)
private val PASSWORD = "releasethestormy888"
} }
} }

View File

@ -83,7 +83,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("DokkoManga", "https://dokkomanga.com", "es", overrideVersionCode = 1), SingleLang("DokkoManga", "https://dokkomanga.com", "es", overrideVersionCode = 1),
SingleLang("Doodmanga", "https://www.doodmanga.com", "th"), SingleLang("Doodmanga", "https://www.doodmanga.com", "th"),
SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true, overrideVersionCode = 1), SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true, overrideVersionCode = 1),
SingleLang("DragonTea", "https://dragontea.ink", "en"), SingleLang("DragonTea", "https://dragontea.ink", "en", overrideVersionCode = 1),
SingleLang("DragonTranslation.net", "https://dragontranslation.net", "es", isNsfw = true, className = "DragonTranslationNet"), SingleLang("DragonTranslation.net", "https://dragontranslation.net", "es", isNsfw = true, className = "DragonTranslationNet"),
SingleLang("Drake Scans", "https://drakescans.com", "en", overrideVersionCode = 3), SingleLang("Drake Scans", "https://drakescans.com", "en", overrideVersionCode = 3),
SingleLang("Dream Manga", "https://www.swarmmanga.com", "en", overrideVersionCode = 3), SingleLang("Dream Manga", "https://www.swarmmanga.com", "en", overrideVersionCode = 3),