From 783ae437d13e6d78f665ba1d08a70af8cbd7a546 Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 27 Oct 2023 17:03:06 +0700 Subject: [PATCH] fixed Vidsrc --- SoraStream/build.gradle.kts | 2 +- .../main/kotlin/com/hexated/SoraExtractor.kt | 60 ++++++++++++------- .../src/main/kotlin/com/hexated/SoraStream.kt | 2 +- .../main/kotlin/com/hexated/SoraStreamLite.kt | 1 + .../src/main/kotlin/com/hexated/SoraUtils.kt | 9 +++ 5 files changed, 50 insertions(+), 24 deletions(-) diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index a873dd7b..670a18b4 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.konan.properties.Properties // use an integer for version numbers -version = 187 +version = 188 android { defaultConfig { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 8b660dc7..47d8f979 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -105,12 +105,35 @@ object SoraExtractor : SoraStream() { callback: (ExtractorLink) -> Unit ) { val url = if (season == null) { - "$vidSrcAPI/embed/$id" + "$vidSrcAPI/embed/movie?tmdb=$id" } else { - "$vidSrcAPI/embed/$id/${season}-${episode}" + "$vidSrcAPI/embed/tv?tmdb=$id&season=$season&episode=$episode" } - loadCustomExtractor(null, url, null, subtitleCallback, callback) + val iframedoc = app.get(url).document.select("iframe#player_iframe").attr("src").let { httpsify(it) } + val doc = app.get(iframedoc, referer = url).document + + val index = doc.select("body").attr("data-i") + val hash = doc.select("div#hidden").attr("data-h") + val srcrcp = deobfstr(hash, index) + + val script = app.get( + httpsify(srcrcp), + referer = iframedoc + ).document.selectFirst("script:containsData(Playerjs)")?.data() + val video = script?.substringAfter("file:\"#2")?.substringBefore("\"") + ?.replace(Regex("(//\\S+?=)"), "")?.let { base64Decode(it) } + + callback.invoke( + ExtractorLink( + "Vidsrc", + "Vidsrc", + video ?: return, + "https://vidsrc.stream/", + Qualities.P1080.value, + INFER_TYPE + ) + ) } suspend fun invokeDbgo( @@ -1721,14 +1744,12 @@ object SoraExtractor : SoraStream() { it.attr("data-id") to it.text() }.apmap { when { - it.second.contains(Regex("(Player F|Player SE|Player N)")) -> { - invokeSmashyFfix(it.second, it.first, url, callback) - } - it.second.equals("Player FM", true) -> invokeSmashyFm( it.second, it.first, url, callback ) - + it.second.contains(Regex("(Player F|Player SE|Player N)")) -> { + invokeSmashyFfix(it.second, it.first, url, callback) + } else -> return@apmap } } @@ -1991,30 +2012,25 @@ object SoraExtractor : SoraStream() { } suspend fun invoke2embed( - imdbId: String?, season: Int?, episode: Int?, callback: (ExtractorLink) -> Unit + imdbId: String?, + season: Int?, + episode: Int?, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit ) { - val server = "https://stream.2embed.cc" val url = if (season == null) { "$twoEmbedAPI/embed/$imdbId" } else { "$twoEmbedAPI/embedtv/$imdbId&s=$season&e=$episode" } - val iframesrc = app.get(url).document.selectFirst("iframe#iframesrc")?.attr("src") + val iframesrc = app.get(url).document.selectFirst("iframe#vsrcs")?.attr("data-src") ?: return + val ref = getBaseUrl(iframesrc) val framesrc = app.get( - fixUrl( - iframesrc ?: return, twoEmbedAPI - ) + iframesrc ).document.selectFirst("iframe#framesrc")?.attr("src") - val video = app.get(fixUrl(framesrc ?: return, "$server/e/")).text.let { - Regex("file:\\s*\"(.*?m3u8.*?)\"").find(it)?.groupValues?.getOrNull(1) - } - M3u8Helper.generateM3u8( - "2embed", - video ?: return, - "$server/", - ).forEach(callback) + loadExtractor("https://embedwish.com/e/$framesrc", "$ref/", subtitleCallback, callback) } diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 2a8f3a4c..b3221789 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -694,7 +694,7 @@ open class SoraStream : TmdbProvider() { ) }, { - if (!res.isAnime) invoke2embed(res.imdbId, res.season, res.episode, callback) + if (!res.isAnime) invoke2embed(res.imdbId, res.season, res.episode, subtitleCallback, callback) }, { if (!res.isAnime) invokeJump1( diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt index 8d49be6b..8e6dd0ac 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -290,6 +290,7 @@ class SoraStreamLite : SoraStream() { res.imdbId, res.season, res.episode, + subtitleCallback, callback ) }, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt index 6960d848..5fd6da83 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt @@ -375,6 +375,15 @@ suspend fun extractOiya(url: String, quality: String): String? { ?: doc.selectFirst("div.wp-block-button a")?.attr("href") } +fun deobfstr(hash: String, index: String): String { + var result = "" + for (i in hash.indices step 2) { + val j = hash.substring(i, i + 2) + result += (j.toInt(16) xor index[(i / 2) % index.length].code).toChar() + } + return result +} + suspend fun extractCovyn(url: String?): Pair? { val request = session.get(url ?: return null, referer = "${tvMoviesAPI}/") val filehosting = session.baseClient.cookieJar.loadForRequest(url.toHttpUrl())