From b1d2972f9ffc1ab159458558bb10d2d3f66ec5f1 Mon Sep 17 00:00:00 2001 From: AlmightyHak Date: Thu, 19 Jun 2025 23:37:08 -0500 Subject: [PATCH 01/11] ci: increased ci chunk size and removed (chunk ${{ matrix.chunk }}) in build extensions from name --- .github/workflows/build_pull_request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index 251290d9..edf31bba 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -13,7 +13,7 @@ concurrency: cancel-in-progress: true env: - CI_CHUNK_SIZE: 65 + CI_CHUNK_SIZE: 288 jobs: prepare: @@ -86,7 +86,7 @@ jobs: build-cache-${{ github.event.pull_request.base.sha }}- build-cache- - - name: Build extensions (chunk ${{ matrix.chunk }}) + - name: Build extensions env: CI_CHUNK_NUM: ${{ matrix.chunk }} run: chmod +x ./gradlew && ./gradlew -p src assembleDebug From 0ba38fb4a7c001b15fa7aaa916bd8a9459981385 Mon Sep 17 00:00:00 2001 From: Ghost <> Date: Thu, 19 Jun 2025 23:38:05 -0500 Subject: [PATCH 02/11] Voe: adapt to changes in obfuscation (Kohi-den#959) (#960) fixes #959 Checklist: - [x] Updated `extVersionCode` value in `build.gradle` for individual extensions - [x] Updated `overrideVersionCode` or `baseVersionCode` as needed for all multisrc extensions - [x] Referenced all related issues in the PR body (e.g. "Closes #xyz") - [x] Added the `isNsfw = true` flag in `build.gradle` when appropriate - [x] Have not changed source names - [x] Have explicitly kept the `id` if a source's name or language were changed - [x] Have tested the modifications by compiling and running the extension through Android Studio - [x] Have removed `web_hi_res_512.png` when adding a new extension - [x] Have made sure all the icons are in png format Co-authored-by: Sphereso Reviewed-on: https://kohiden.xyz/Kohi-den/extensions-source/pulls/960 Co-authored-by: Ghost <> Co-committed-by: Ghost <> --- .../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