From d4d56a94a26f04eaf29b30d630cc6d5c602de686 Mon Sep 17 00:00:00 2001 From: Sphereso Date: Tue, 29 Apr 2025 14:59:58 +0200 Subject: [PATCH] Voe: adapt to changes in obfuscation (Kohi-den#959) --- .../lib/voeextractor/VoeExtractor.kt | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt index 1e30fb57..fe017e16 100644 --- a/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt +++ b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt @@ -18,14 +18,33 @@ class VoeExtractor(private val client: OkHttpClient) { private val playlistUtils by lazy { PlaylistUtils(clientDdos) } - private val linkRegex = "(http|https)://([\\w_-]+(?:\\.[\\w_-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])".toRegex() - - private val base64Regex = Regex("'.*'") - - private val scriptBase64Regex = "(let|var)\\s+\\w+\\s*=\\s*'(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)';".toRegex() - @Serializable - data class VideoLinkDTO(val file: String) + data class VideoLinkDTO(val source: String) + + private fun decodeVoeData(data: String): String { + val shifted = data.map { char -> + when (char) { + in 'A'..'Z' -> 'A' + (char - 'A' + 13).mod(26) + in 'a'..'z' -> 'a' + (char - 'a' + 13).mod(26) + else -> char + } + }.joinToString() + + val junk = listOf("@$", "^^", "~@", "%?", "*~", "!!", "#&") + var result = shifted + for (part in junk) { + result = result.replace(part, "_") + } + val clean = result.replace("_", "") + + val transformed = String(Base64.decode(clean, Base64.DEFAULT)).map { + (it.code - 3).toChar() + }.joinToString().reversed() + + val decoded = String(Base64.decode(transformed, Base64.DEFAULT)) + + return json.decodeFromString(decoded).source + } fun videosFromUrl(url: String, prefix: String = ""): List