From 36c6022afae72ebbc218a838941f3197282536f1 Mon Sep 17 00:00:00 2001 From: hexated Date: Sat, 29 Jul 2023 04:41:04 +0700 Subject: [PATCH] sora: added moment --- SoraStream/build.gradle.kts | 2 +- .../main/kotlin/com/hexated/SoraExtractor.kt | 49 ++++++++++++------- .../src/main/kotlin/com/hexated/SoraStream.kt | 5 ++ .../main/kotlin/com/hexated/SoraStreamLite.kt | 6 ++- .../src/main/kotlin/com/hexated/SoraUtils.kt | 19 ++----- 5 files changed, 46 insertions(+), 35 deletions(-) diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 1301ca94..e39d81fb 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 = 150 +version = 151 android { defaultConfig { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 99143a88..a419b1d1 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -596,16 +596,8 @@ object SoraExtractor : SoraStream() { } else { "${filmxyAPI}/tv/$imdbId" } - val filmxyCookies = getFilmxyCookies(imdbId, season) ?: return - - val cookies = mapOf( - "G_ENABLED_IDPS" to "google", - "wp-secure-id" to "${filmxyCookies.wpSec}", - "wp-guest-token" to "${filmxyCookies.wpGuest}", - "PHPSESSID" to "${filmxyCookies.phpsessid}" - ) - - val doc = session.get(url, cookies = cookies).document + val filmxyCookies = getFilmxyCookies(imdbId, season) + val doc = session.get(url, cookies = filmxyCookies).document val script = doc.selectFirst("script:containsData(var isSingle)")?.data() ?: return val sourcesData = @@ -655,7 +647,7 @@ object SoraExtractor : SoraStream() { "Origin" to filmxyAPI, "X-Requested-With" to "XMLHttpRequest", ), - cookies = cookies + cookies = filmxyCookies ).text.let { tryParseJson>(it) } sources?.map { source -> @@ -3109,18 +3101,39 @@ object SoraExtractor : SoraStream() { season: Int? = null, episode: Int? = null, callback: (ExtractorLink) -> Unit, + ) { + invokeHindi(navyAPI, navyAPI, imdbId, season, episode, callback) + } + + suspend fun invokeMoment( + imdbId: String? = null, + season: Int? = null, + episode: Int? = null, + callback: (ExtractorLink) -> Unit, + ) { + invokeHindi(momentAPI, "https://hdmovies4u.green", imdbId, season, episode, callback) + } + + private suspend fun invokeHindi( + host: String? = null, + referer: String? = null, + imdbId: String? = null, + season: Int? = null, + episode: Int? = null, + callback: (ExtractorLink) -> Unit, ) { val res = app.get( - "$navyAPI/play/$imdbId", - referer = "$navyAPI/" + "$host/play/$imdbId", + referer = "$referer/" ).document.selectFirst("script:containsData(player =)")?.data()?.substringAfter("{") ?.substringBefore(";")?.substringBefore(")") val json = tryParseJson("{${res ?: return}") val headers = mapOf( "X-CSRF-TOKEN" to "${json?.key}" ) + val serverRes = app.get( - fixUrl(json?.file ?: return, navyAPI), headers = headers, referer = "$navyAPI/" + fixUrl(json?.file ?: return, navyAPI), headers = headers, referer = "$referer/" ).text.replace(Regex(""",\s*\[]"""), "") val server = tryParseJson>(serverRes).let { server -> if (season == null) { @@ -3135,15 +3148,15 @@ object SoraExtractor : SoraStream() { } val path = app.post( - "${navyAPI}/playlist/${server ?: return}.txt", + "${host}/playlist/${server ?: return}.txt", headers = headers, - referer = "$navyAPI/" + referer = "$referer/" ).text M3u8Helper.generateM3u8( - "Navy", + if(host == navyAPI) "Navy" else "Moment", path, - "${navyAPI}/" + "${referer}/" ).forEach(callback) } diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index a9107b84..d54ef39a 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -50,6 +50,7 @@ import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies import com.hexated.SoraExtractor.invokeFourCartoon +import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokePobmovies @@ -135,6 +136,7 @@ open class SoraStream : TmdbProvider() { const val fourCartoonAPI = "https://4cartoon.net" const val multimoviesAPI = "https://multimovies.xyz" const val netmoviesAPI = "https://netmovies.to" + const val momentAPI = "https://moment-explanation-i-244.site" // INDEX SITE const val blackMoviesAPI = "https://dl.blacklistedbois.workers.dev/0:" @@ -835,6 +837,9 @@ open class SoraStream : TmdbProvider() { { invokeNavy(res.imdbId, res.season, res.episode, callback) }, + { + invokeMoment(res.imdbId, res.season, res.episode, callback) + }, { if (!res.isAnime) invokeEmovies( res.title, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt index d40c12d5..e7771f1c 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -29,6 +29,7 @@ import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies import com.hexated.SoraExtractor.invokeFourCartoon +import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokeVidSrc @@ -345,7 +346,10 @@ class SoraStreamLite : SoraStream() { subtitleCallback, callback ) - } + }, + { + invokeMoment(res.imdbId, res.season, res.episode, callback) + }, ) return true diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt index 20e9194c..2f912165 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt @@ -105,12 +105,6 @@ val mimeType = arrayOf( "video/x-msvideo" ) -data class FilmxyCookies( - val phpsessid: String? = null, - val wpSec: String? = null, - val wpGuest: String? = null, -) - fun String.filterIframe( seasonNum: Int? = null, lastSeason: Int? = null, @@ -901,7 +895,7 @@ suspend fun getTvMoviesServer(url: String, season: Int?, episode: Int?): Pair { val url = if (season == null) { "${filmxyAPI}/movie/$imdbId" @@ -917,7 +911,7 @@ suspend fun getFilmxyCookies(imdbId: String? = null, season: Int? = null): Filmx ), ) - if (!res.isSuccessful) return FilmxyCookies() + if (!res.isSuccessful) return emptyMap() val userNonce = res.document.select("script").find { it.data().contains("var userNonce") }?.data()?.let { @@ -938,13 +932,8 @@ suspend fun getFilmxyCookies(imdbId: String? = null, season: Int? = null): Filmx "X-Requested-With" to "XMLHttpRequest", ) ) - - val cookieJar = session.baseClient.cookieJar.loadForRequest(cookieUrl.toHttpUrl()) - phpsessid = cookieJar.first { it.name == "PHPSESSID" }.value - val wpSec = cookieJar.first { it.name == "wp-secure-id" }.value - val wpGuest = cookieJar.first { it.name == "wp-guest-token" }.value - - return FilmxyCookies(phpsessid, wpSec, wpGuest) + val cookieJar = session.baseClient.cookieJar.loadForRequest(cookieUrl.toHttpUrl()).associate { it.name to it.value }.toMutableMap() + return cookieJar.plus(mapOf("G_ENABLED_IDPS" to "google")) } fun Document.findTvMoviesIframe(): String? {