AiYuManga: Decrypt image list (#15963)

Fix AiYuManga
This commit is contained in:
seew3l 2023-04-06 07:20:29 -05:00 committed by GitHub
parent c3b43bedd4
commit 50ebbf650a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 2 deletions

View File

@ -0,0 +1,3 @@
dependencies {
implementation(project(':lib-cryptoaes'))
}

View File

@ -1,6 +1,13 @@
package eu.kanade.tachiyomi.extension.es.aiyumanga package eu.kanade.tachiyomi.extension.es.aiyumanga
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.source.model.Page
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import org.jsoup.nodes.Document
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
@ -8,7 +15,51 @@ class AiYuManga : Madara(
"AiYuManga", "AiYuManga",
"https://aiyumangascanlation.com", "https://aiyumangascanlation.com",
"es", "es",
SimpleDateFormat("d 'de' MMM 'de' yyy", Locale("es")), SimpleDateFormat("MM/dd/yyyy", Locale("es")),
) { ) {
override val useNewChapterEndpoint = true override val useNewChapterEndpoint = true
override val useLoadMoreSearch = true
override val chapterUrlSuffix = ""
override val mangaDetailsSelectorStatus = "div.post-content_item:contains(Status) > div.summary-content"
override fun pageListParse(document: Document): List<Page> {
val chapterProtector = document.getElementById("chapter-protector-data")?.html()
?: return super.pageListParse(document)
val password = chapterProtector
.substringAfter("wpmangaprotectornonce='")
.substringBefore("';")
val chapterData = json.parseToJsonElement(
chapterProtector
.substringAfter("chapter_data='")
.substringBefore("';")
.replace("\\/", "/"),
).jsonObject
val unsaltedCiphertext = Base64.decode(chapterData["ct"]!!.jsonPrimitive.content, Base64.DEFAULT)
val salt = chapterData["s"]!!.jsonPrimitive.content.decodeHex()
val ciphertext = SALTED + salt + unsaltedCiphertext
val rawImgArray = CryptoAES.decrypt(Base64.encodeToString(ciphertext, Base64.DEFAULT), password)
val imgArrayString = json.parseToJsonElement(rawImgArray).jsonPrimitive.content
val imgArray = json.parseToJsonElement(imgArrayString).jsonArray
return imgArray.mapIndexed { idx, it ->
Page(idx, document.location(), it.jsonPrimitive.content)
}
}
// https://stackoverflow.com/a/66614516
private fun String.decodeHex(): ByteArray {
check(length % 2 == 0) { "Must have an even length" }
return chunked(2)
.map { it.toInt(16).toByte() }
.toByteArray()
}
companion object {
val SALTED = "Salted__".toByteArray(Charsets.UTF_8)
}
} }

View File

@ -26,7 +26,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Adonis Fansub", "https://manga.adonisfansub.com", "tr", overrideVersionCode = 1), SingleLang("Adonis Fansub", "https://manga.adonisfansub.com", "tr", overrideVersionCode = 1),
SingleLang("Adult Painful Nightz", "https://adults.painfulnightz.com", "en", isNsfw = true), SingleLang("Adult Painful Nightz", "https://adults.painfulnightz.com", "en", isNsfw = true),
SingleLang("Adult Webtoon", "https://adultwebtoon.com", "en", isNsfw = true, overrideVersionCode = 1), SingleLang("Adult Webtoon", "https://adultwebtoon.com", "en", isNsfw = true, overrideVersionCode = 1),
SingleLang("AiYuManga", "https://aiyumangascanlation.com", "es"), SingleLang("AiYuManga", "https://aiyumangascanlation.com", "es", overrideVersionCode = 1),
SingleLang("Akuma no Tenshi", "https://akumanotenshi.com", "pt-BR", className = "AkumaNoTenshi"), SingleLang("Akuma no Tenshi", "https://akumanotenshi.com", "pt-BR", className = "AkumaNoTenshi"),
SingleLang("AkuManga", "https://akumanga.com", "ar", overrideVersionCode = 1), SingleLang("AkuManga", "https://akumanga.com", "ar", overrideVersionCode = 1),
SingleLang("Akuzenai Arts", "https://akuzenaiarts.org", "en"), SingleLang("Akuzenai Arts", "https://akuzenaiarts.org", "en"),