From 59652a8f1f24d4919d4a4f466ee522769ce2324f Mon Sep 17 00:00:00 2001 From: V3u47ZoN Date: Mon, 21 Apr 2025 16:03:18 +0000 Subject: [PATCH 01/13] Fix subtitles --- .../megacloudextractor/MegaCloudExtractor.kt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt b/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt index eb8ff488..d9fab72f 100644 --- a/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt +++ b/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.lib.megacloudextractor import android.content.SharedPreferences +import android.net.Uri import eu.kanade.tachiyomi.animesource.model.Track import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES @@ -20,6 +21,7 @@ import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient import uy.kohesive.injekt.injectLazy +import java.io.File class MegaCloudExtractor( private val client: OkHttpClient, @@ -48,6 +50,8 @@ class MegaCloudExtractor( private const val PREF_KEY_KEY = "megacloud_key_" private const val PREF_KEY_DEFAULT = "[[0, 0]]" + private val FIX_SUBTITLE_REGEX = Regex("""${'$'}(\n{2,})(?!\d+:\d+(?:\.\d+)?\s-+>\s\d+:\d+(?:\.\d+)?)""", RegexOption.MULTILINE) + private inline fun runLocked(crossinline block: () -> R) = runBlocking(Dispatchers.IO) { MUTEX.withLock { block() } } @@ -132,6 +136,7 @@ class MegaCloudExtractor( ?.filter { it.kind == "captions" } ?.map { Track(it.file, it.label) } .orEmpty() + .let { fixSubtitles(it) } return playlistUtils.extractFromHls( masterUrl, videoNameGen = { "$name - $it - $type" }, @@ -140,6 +145,29 @@ class MegaCloudExtractor( ) } + private fun cleanSubtitleData(matchResult: MatchResult): String { + val lineCount = matchResult.groupValues[1].count { it == '\n' } + return "\n" + " \n".repeat(lineCount - 1) + } + + private fun fixSubtitles(subtitleList: List): List { + return subtitleList.mapNotNull { + try { + val subData = client.newCall(GET(it.url)).execute().body.string() + + val file = File.createTempFile("subs", "vtt") + .also(File::deleteOnExit) + + file.writeText(FIX_SUBTITLE_REGEX.replace(subData, ::cleanSubtitleData)) + val uri = Uri.fromFile(file) + + Track(uri.toString(), it.lang) + } catch (_: Exception) { + null + } + } + } + private fun getVideoDto(url: String): VideoDto { val type = if (url.startsWith("https://megacloud.tv") or url.startsWith("https://megacloud.blog")) 0 else 1 -- 2.47.2 From a8a2b0f54835b21e75a2ddc505bf0f8c0f08d923 Mon Sep 17 00:00:00 2001 From: V3u47ZoN Date: Mon, 21 Apr 2025 16:32:05 +0000 Subject: [PATCH 02/13] Update PlaylistUtils.kt --- .../lib/playlistutils/PlaylistUtils.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt b/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt index f7adb84c..0bf42b05 100644 --- a/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt +++ b/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.lib.playlistutils +import android.net.Uri import eu.kanade.tachiyomi.animesource.model.Track import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.network.GET @@ -8,6 +9,7 @@ import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient import okhttp3.internal.commonEmptyHeaders +import java.io.File import kotlin.math.abs class PlaylistUtils(private val client: OkHttpClient, private val headers: Headers = commonEmptyHeaders) { @@ -342,7 +344,32 @@ class PlaylistUtils(private val client: OkHttpClient, private val headers: Heade return "${result}p" } + private fun cleanSubtitleData(matchResult: MatchResult): String { + val lineCount = matchResult.groupValues[1].count { it == '\n' } + return "\n" + " \n".repeat(lineCount - 1) + } + + fun fixSubtitles(subtitleList: List): List { + return subtitleList.mapNotNull { + try { + val subData = client.newCall(GET(it.url)).execute().body.string() + + val file = File.createTempFile("subs", "vtt") + .also(File::deleteOnExit) + + file.writeText(FIX_SUBTITLE_REGEX.replace(subData, ::cleanSubtitleData)) + val uri = Uri.fromFile(file) + + Track(uri.toString(), it.lang) + } catch (_: Exception) { + null + } + } + } + companion object { + private val FIX_SUBTITLE_REGEX = Regex("""${'$'}(\n{2,})(?!\d+:\d+(?:\.\d+)?\s-+>\s\d+:\d+(?:\.\d+)?)""", RegexOption.MULTILINE) + private const val PLAYLIST_SEPARATOR = "#EXT-X-STREAM-INF:" private val SUBTITLE_REGEX by lazy { Regex("""#EXT-X-MEDIA:TYPE=SUBTITLES.*?NAME="(.*?)".*?URI="(.*?)"""") } -- 2.47.2 From fe5677035b65fc04812a9ee8dad511b88fe3b8fb Mon Sep 17 00:00:00 2001 From: V3u47ZoN Date: Mon, 21 Apr 2025 16:34:12 +0000 Subject: [PATCH 03/13] Update MegaCloudExtractor.kt --- .../megacloudextractor/MegaCloudExtractor.kt | 27 +------------------ 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt b/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt index d9fab72f..a32afed7 100644 --- a/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt +++ b/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt @@ -1,7 +1,6 @@ package eu.kanade.tachiyomi.lib.megacloudextractor import android.content.SharedPreferences -import android.net.Uri import eu.kanade.tachiyomi.animesource.model.Track import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES @@ -21,7 +20,6 @@ import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient import uy.kohesive.injekt.injectLazy -import java.io.File class MegaCloudExtractor( private val client: OkHttpClient, @@ -136,7 +134,7 @@ class MegaCloudExtractor( ?.filter { it.kind == "captions" } ?.map { Track(it.file, it.label) } .orEmpty() - .let { fixSubtitles(it) } + .let { playlistUtils.fixSubtitles(it) } return playlistUtils.extractFromHls( masterUrl, videoNameGen = { "$name - $it - $type" }, @@ -145,29 +143,6 @@ class MegaCloudExtractor( ) } - private fun cleanSubtitleData(matchResult: MatchResult): String { - val lineCount = matchResult.groupValues[1].count { it == '\n' } - return "\n" + " \n".repeat(lineCount - 1) - } - - private fun fixSubtitles(subtitleList: List): List { - return subtitleList.mapNotNull { - try { - val subData = client.newCall(GET(it.url)).execute().body.string() - - val file = File.createTempFile("subs", "vtt") - .also(File::deleteOnExit) - - file.writeText(FIX_SUBTITLE_REGEX.replace(subData, ::cleanSubtitleData)) - val uri = Uri.fromFile(file) - - Track(uri.toString(), it.lang) - } catch (_: Exception) { - null - } - } - } - private fun getVideoDto(url: String): VideoDto { val type = if (url.startsWith("https://megacloud.tv") or url.startsWith("https://megacloud.blog")) 0 else 1 -- 2.47.2 From 7b0a463cdc080a0c96b29c77b8092ca0e0864512 Mon Sep 17 00:00:00 2001 From: V3u47ZoN Date: Mon, 21 Apr 2025 16:43:02 +0000 Subject: [PATCH 04/13] Update AniPlay.kt --- .../eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt b/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt index d67d4714..ffc65aaa 100644 --- a/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt +++ b/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt @@ -291,7 +291,7 @@ class AniPlay : AniListAnimeHttpSource(), ConfigurableAnimeSource { return playlistUtils.extractFromHls( playlistUrl = url, videoNameGen = { quality -> "$serverName - $quality - $typeName" }, - subtitleList = subtitles, + subtitleList = playlistUtils.fixSubtitles(subtitles), masterHeadersGen = { baseHeaders: Headers, _: String -> baseHeaders.newBuilder().apply { set("Accept", "*/*") -- 2.47.2 From 3433d4a58e0878a94f032b990d85acd56286c8b9 Mon Sep 17 00:00:00 2001 From: V3u47ZoN Date: Mon, 21 Apr 2025 17:19:28 +0000 Subject: [PATCH 05/13] Update MegaCloudExtractor.kt --- .../tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt b/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt index a32afed7..6b4d2fcf 100644 --- a/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt +++ b/lib/megacloud-extractor/src/main/java/eu/kanade/tachiyomi/lib/megacloudextractor/MegaCloudExtractor.kt @@ -47,9 +47,7 @@ class MegaCloudExtractor( private var shouldUpdateKey = false private const val PREF_KEY_KEY = "megacloud_key_" private const val PREF_KEY_DEFAULT = "[[0, 0]]" - - private val FIX_SUBTITLE_REGEX = Regex("""${'$'}(\n{2,})(?!\d+:\d+(?:\.\d+)?\s-+>\s\d+:\d+(?:\.\d+)?)""", RegexOption.MULTILINE) - + private inline fun runLocked(crossinline block: () -> R) = runBlocking(Dispatchers.IO) { MUTEX.withLock { block() } } -- 2.47.2 From 27bce2914bb6efc49a0bcf65fb6c9f2eeb2f02e0 Mon Sep 17 00:00:00 2001 From: V3u47ZoN Date: Tue, 22 Apr 2025 06:29:15 +0000 Subject: [PATCH 06/13] Fix regex --- .../java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt b/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt index 0bf42b05..2bf6f1de 100644 --- a/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt +++ b/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt @@ -368,7 +368,7 @@ class PlaylistUtils(private val client: OkHttpClient, private val headers: Heade } companion object { - private val FIX_SUBTITLE_REGEX = Regex("""${'$'}(\n{2,})(?!\d+:\d+(?:\.\d+)?\s-+>\s\d+:\d+(?:\.\d+)?)""", RegexOption.MULTILINE) + private val FIX_SUBTITLE_REGEX = Regex("""${'$'}(\n{2,})(?!(?:\d+:)*\d+(?:\.\d+)?\s-+>\s(?:\d+:)*\d+(?:\.\d+)?)""", RegexOption.MULTILINE) private const val PLAYLIST_SEPARATOR = "#EXT-X-STREAM-INF:" -- 2.47.2 From 757694fabf5745a4a033c7d3cb09ca45d30a73f2 Mon Sep 17 00:00:00 2001 From: V3u47ZoN Date: Tue, 22 Apr 2025 06:30:53 +0000 Subject: [PATCH 07/13] Fix subtitles for kickassanime --- .../en/kickassanime/extractors/KickAssAnimeExtractor.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/en/kickassanime/src/eu/kanade/tachiyomi/animeextension/en/kickassanime/extractors/KickAssAnimeExtractor.kt b/src/en/kickassanime/src/eu/kanade/tachiyomi/animeextension/en/kickassanime/extractors/KickAssAnimeExtractor.kt index 0fc5d08c..d256986b 100644 --- a/src/en/kickassanime/src/eu/kanade/tachiyomi/animeextension/en/kickassanime/extractors/KickAssAnimeExtractor.kt +++ b/src/en/kickassanime/src/eu/kanade/tachiyomi/animeextension/en/kickassanime/extractors/KickAssAnimeExtractor.kt @@ -18,6 +18,8 @@ class KickAssAnimeExtractor( private val json: Json, private val headers: Headers, ) { + private val playlistUtils by lazy { PlaylistUtils(client, headers) } + fun videosFromUrl(url: String, name: String): List