From f9650081e18d088c182376829ccf53b767754a32 Mon Sep 17 00:00:00 2001 From: imper1aldev <23511335+imper1aldev@users.noreply.github.com> Date: Thu, 9 Jan 2025 05:34:54 -0600 Subject: [PATCH] fix(src/es): JkAnime fixes (#504) * JkAnime fixes Closes #355 * Update StreamWishExtractor.kt --- .../StreamWishExtractor.kt | 26 ++++- src/es/jkanime/build.gradle | 4 +- .../animeextension/es/jkanime/Jkanime.kt | 98 ++++++++++++++----- 3 files changed, 101 insertions(+), 27 deletions(-) diff --git a/lib/streamwish-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamwishextractor/StreamWishExtractor.kt b/lib/streamwish-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamwishextractor/StreamWishExtractor.kt index 5d79a577..d5d7ecee 100644 --- a/lib/streamwish-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamwishextractor/StreamWishExtractor.kt +++ b/lib/streamwish-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamwishextractor/StreamWishExtractor.kt @@ -1,15 +1,20 @@ package eu.kanade.tachiyomi.lib.streamwishextractor import dev.datlag.jsunpacker.JsUnpacker +import eu.kanade.tachiyomi.animesource.model.Track import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.Serializable +import kotlinx.serialization.SerializationException +import kotlinx.serialization.json.Json import okhttp3.Headers import okhttp3.OkHttpClient class StreamWishExtractor(private val client: OkHttpClient, private val headers: Headers) { private val playlistUtils by lazy { PlaylistUtils(client, headers) } + private val json = Json { isLenient = true; ignoreUnknownKeys = true } fun videosFromUrl(url: String, prefix: String) = videosFromUrl(url) { "$prefix - $it" } @@ -32,7 +37,9 @@ class StreamWishExtractor(private val client: OkHttpClient, private val headers: ?.takeIf(String::isNotBlank) ?: return emptyList() - return playlistUtils.extractFromHls(masterUrl, url, videoNameGen = videoNameGen) + val subtitleList = extractSubtitles(scriptBody) + + return playlistUtils.extractFromHls(masterUrl, url, videoNameGen = videoNameGen, subtitleList = subtitleList) } private fun getEmbedUrl(url: String): String { @@ -43,4 +50,21 @@ class StreamWishExtractor(private val client: OkHttpClient, private val headers: url } } + + private fun extractSubtitles(script: String): List { + return try { + val subtitleStr = script + .substringAfter("tracks") + .substringAfter("[") + .substringBefore("]") + json.decodeFromString>("[$subtitleStr]") + .filter { it.kind.equals("captions", true) } + .map { Track(it.file, it.label ?: "") } + } catch (e: SerializationException) { + emptyList() + } + } + + @Serializable + private data class TrackDto(val file: String, val kind: String, val label: String? = null) } diff --git a/src/es/jkanime/build.gradle b/src/es/jkanime/build.gradle index 6a774799..07cf9550 100644 --- a/src/es/jkanime/build.gradle +++ b/src/es/jkanime/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Jkanime' extClass = '.Jkanime' - extVersionCode = 25 + extVersionCode = 26 } apply from: "$rootDir/common.gradle" @@ -14,4 +14,6 @@ dependencies { implementation(project(':lib:filemoon-extractor')) implementation(project(':lib:streamtape-extractor')) implementation(project(':lib:voe-extractor')) + implementation(project(':lib:vidhide-extractor')) + implementation 'org.mozilla:rhino:1.7.14' } diff --git a/src/es/jkanime/src/eu/kanade/tachiyomi/animeextension/es/jkanime/Jkanime.kt b/src/es/jkanime/src/eu/kanade/tachiyomi/animeextension/es/jkanime/Jkanime.kt index bf4fbb3d..0b305cb4 100644 --- a/src/es/jkanime/src/eu/kanade/tachiyomi/animeextension/es/jkanime/Jkanime.kt +++ b/src/es/jkanime/src/eu/kanade/tachiyomi/animeextension/es/jkanime/Jkanime.kt @@ -20,16 +20,21 @@ import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor import eu.kanade.tachiyomi.lib.streamwishextractor.StreamWishExtractor +import eu.kanade.tachiyomi.lib.vidhideextractor.VidHideExtractor import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking import eu.kanade.tachiyomi.util.parseAs +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import org.mozilla.javascript.Context +import org.mozilla.javascript.Scriptable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -43,6 +48,13 @@ class Jkanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val supportsLatest = true + private val json = Json { + ignoreUnknownKeys = true + isLenient = true + prettyPrint = true + coerceInputValues = true + } + private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } @@ -172,6 +184,7 @@ class Jkanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { private val mp4uploadExtractor by lazy { Mp4uploadExtractor(client) } private val mixDropExtractor by lazy { MixDropExtractor(client) } private val streamWishExtractor by lazy { StreamWishExtractor(client, headers) } + private val vidHideExtractor by lazy { VidHideExtractor(client, headers) } private val jkanimeExtractor by lazy { JkanimeExtractor(client) } override fun videoListParse(response: Response): List