diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 8ce610c3..f8d93318 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 = 209 +version = 210 android { defaultConfig { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index ab1e1441..3ee5c51a 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -1,6 +1,5 @@ package com.hexated -import com.hexated.AESGCM.decrypt import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.APIHolder.unixTime import com.lagradost.cloudstream3.APIHolder.unixTimeMS @@ -9,7 +8,6 @@ import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson import com.lagradost.nicehttp.Requests import com.lagradost.nicehttp.Session import com.lagradost.cloudstream3.extractors.helper.AesHelper.cryptoAESHandler -import com.lagradost.cloudstream3.network.CloudflareKiller import com.lagradost.nicehttp.RequestBodyTypes import kotlinx.coroutines.delay import okhttp3.MediaType.Companion.toMediaTypeOrNull @@ -294,7 +292,7 @@ object SoraExtractor : SoraStream() { }?.subjectId val data = app.get( - "$aoneroomAPI/wefeed-mobile-bff/subject-api/resource?subjectId=${subjectId ?: return}&page=1&perPage=10000&all=0&startPosition=1&endPosition=1&pagerMode=0&resolution=480", + "$aoneroomAPI/wefeed-mobile-bff/subject-api/resource?subjectId=${subjectId ?: return}&page=1&perPage=20&all=0&startPosition=1&endPosition=1&pagerMode=0&resolution=480", headers = headers ).parsedSafe()?.data?.list?.findLast { it.se == (season ?: 0) && it.ep == (episode ?: 0) @@ -1229,7 +1227,7 @@ object SoraExtractor : SoraStream() { val selector = if (season == null) "p a:contains(V-Cloud)" else "h4:matches(0?$episode) + p a:contains(V-Cloud)" val server = app.get( - href ?: return, interceptor = CloudflareKiller() + href ?: return, interceptor = wpredisInterceptor ).document.selectFirst("div.entry-content > $selector") ?.attr("href") ?: return @@ -1695,9 +1693,9 @@ object SoraExtractor : SoraStream() { imdbId: String? = null, season: Int? = null, episode: Int? = null, - callback: (ExtractorLink) -> Unit + callback: (ExtractorLink) -> Unit, + onionUrl: String = "https://onionplay.se/" ) { - val onionUrl = "https://onionplay.se/" val request = if (season == null) { val res = app.get("$flixonAPI/$imdbId", referer = onionUrl) if (res.text.contains("BEGIN PGP SIGNED MESSAGE")) app.get( @@ -2319,13 +2317,10 @@ object SoraExtractor : SoraStream() { lastSeason: Int? = null, episode: Int? = null, callback: (ExtractorLink) -> Unit, + showboxApi: String = "https://www.showbox.media" ) { - - val showboxApi = "https://www.showbox.media" val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) - - val res = app.get("$showboxApi/search?keyword=$title").document - + val res = app.get("$showboxApi/search?keyword=$title", interceptor = showboxInterceptor).document val mediaRes = res.select("div.film_list-wrap div.flw-item").map { ShowboxMedia( it.select("h2.film-name a").attr("href"), @@ -2350,7 +2345,7 @@ object SoraExtractor : SoraStream() { val shareId = media?.url?.substringAfterLast("/") ?: return val shareKey = - app.get("$showboxApi/index/share_link?id=${shareId}&type=${if (season == null) "1" else "2"}") + app.get("$showboxApi/index/share_link?id=${shareId}&type=${if (season == null) "1" else "2"}", interceptor = showboxInterceptor) .parsedSafe()?.data?.link?.substringAfterLast("/") val headers = mapOf("Accept-Language" to "en") @@ -2417,9 +2412,9 @@ object SoraExtractor : SoraStream() { imdbId: String? = null, season: Int? = null, episode: Int? = null, - callback: (ExtractorLink) -> Unit + callback: (ExtractorLink) -> Unit, + referer: String = "https://bflix.gs/" ) { - val referer = "https://bflix.gs/" val slug = getEpisodeSlug(season, episode) var url = if (season == null) "$nowTvAPI/$tmdbId.mp4" else "$nowTvAPI/tv/$tmdbId/s${season}e${slug.second}.mp4" @@ -2472,63 +2467,45 @@ object SoraExtractor : SoraStream() { } } - suspend fun invokeNavy( - imdbId: String? = null, - 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.band", imdbId, season, episode, callback) - } - - private suspend fun invokeHindi( - host: String? = null, - referer: String? = null, + suspend fun invokeAllMovieland( imdbId: String? = null, season: Int? = null, episode: Int? = null, callback: (ExtractorLink) -> Unit, + host: String = "https://esh-bostewsom-i-273.site", ) { val res = app.get( - "$host/play/$imdbId", referer = "$referer/" + "$host/play/$imdbId", referer = "$allmovielandAPI/" ).document.selectFirst("script:containsData(player =)")?.data()?.substringAfter("{") ?.substringBefore(";")?.substringBefore(")") - val json = tryParseJson("{${res ?: return}") + 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 = "$referer/" + fixUrl(json?.file ?: return, host), headers = headers, referer = "$allmovielandAPI/" ).text.replace(Regex(""",\s*\[]"""), "") - val server = tryParseJson>(serverRes).let { server -> + val servers = tryParseJson>(serverRes).let { server -> if (season == null) { - server?.find { it.title == "English" }?.file + server?.map { it.file to it.title } } else { - server?.find { it.id.equals("$season") }?.folder?.find { it.episode.equals("$episode") }?.folder?.find { - it.title.equals( - "English" - ) - }?.file + server?.find { it.id.equals("$season") }?.folder?.find { it.episode.equals("$episode") }?.folder?.map { + it.file to it.title + } } } - val path = app.post( - "${host}/playlist/${server ?: return}.txt", headers = headers, referer = "$referer/" - ).text - - M3u8Helper.generateM3u8( - if (host == navyAPI) "Navy" else "Moment", path, "${referer}/" - ).forEach(callback) + servers?.apmap { (server, lang) -> + val path = app.post( + "${host}/playlist/${server ?: return@apmap}.txt", headers = headers, referer = "$allmovielandAPI/" + ).text + M3u8Helper.generateM3u8( + "Allmovieland [$lang]", + path, + "$allmovielandAPI/" + ).forEach(callback) + } } diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt index 938462bc..21eb55a6 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt @@ -269,26 +269,26 @@ data class GokuServer( @JsonProperty("data") val data: GokuData? = GokuData(), ) -data class NavyEpisodeFolder( +data class AllMovielandEpisodeFolder( @JsonProperty("title") val title: String? = null, @JsonProperty("id") val id: String? = null, @JsonProperty("file") val file: String? = null, ) -data class NavySeasonFolder( - @JsonProperty("episode") val episode: String? = null, - @JsonProperty("id") val id: String? = null, - @JsonProperty("folder") val folder: ArrayList? = arrayListOf(), +data class AllMovielandSeasonFolder( + @JsonProperty("episode") val episode: String? = null, + @JsonProperty("id") val id: String? = null, + @JsonProperty("folder") val folder: ArrayList? = arrayListOf(), ) -data class NavyServer( - @JsonProperty("title") val title: String? = null, - @JsonProperty("id") val id: String? = null, - @JsonProperty("file") val file: String? = null, - @JsonProperty("folder") val folder: ArrayList? = arrayListOf(), +data class AllMovielandServer( + @JsonProperty("title") val title: String? = null, + @JsonProperty("id") val id: String? = null, + @JsonProperty("file") val file: String? = null, + @JsonProperty("folder") val folder: ArrayList? = arrayListOf(), ) -data class NavyPlaylist( +data class AllMovielandPlaylist( @JsonProperty("file") val file: String? = null, @JsonProperty("key") val key: String? = null, @JsonProperty("href") val href: String? = null, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 0ce3233c..7021b572 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -2,6 +2,7 @@ package com.hexated import com.fasterxml.jackson.annotation.JsonProperty import com.hexated.SoraExtractor.invoke2embed +import com.hexated.SoraExtractor.invokeAllMovieland import com.hexated.SoraExtractor.invokeAnimes import com.hexated.SoraExtractor.invokeAoneroom import com.hexated.SoraExtractor.invokeBollyMaza @@ -25,7 +26,6 @@ import com.hexated.SoraExtractor.invokeKisskh import com.hexated.SoraExtractor.invokeLing import com.hexated.SoraExtractor.invokeM4uhd import com.hexated.SoraExtractor.invokeMoviezAdd -import com.hexated.SoraExtractor.invokeNavy import com.hexated.SoraExtractor.invokeNinetv import com.hexated.SoraExtractor.invokeNowTv import com.hexated.SoraExtractor.invokeRStream @@ -34,7 +34,6 @@ import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies import com.hexated.SoraExtractor.invokeHdmovies4u -import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokeSFMovies @@ -51,6 +50,7 @@ import com.hexated.SoraExtractor.invokeWatchsomuch import com.hexated.SoraExtractor.invokeZshow import com.lagradost.cloudstream3.LoadResponse.Companion.addImdbId import com.lagradost.cloudstream3.LoadResponse.Companion.addTMDbId +import com.lagradost.cloudstream3.network.CloudflareKiller import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.ExtractorLink @@ -68,6 +68,9 @@ open class SoraStream : TmdbProvider() { TvType.Anime, ) + val showboxInterceptor by lazy { CloudflareKiller() } + val wpredisInterceptor by lazy { CloudflareKiller() } + /** AUTHOR : Hexated & Sora */ companion object { /** TOOLS */ @@ -102,12 +105,11 @@ open class SoraStream : TmdbProvider() { const val gokuAPI = "https://goku.sx" const val zshowAPI = BuildConfig.ZSHOW_API const val ridomoviesAPI = "https://ridomovies.pw" - const val navyAPI = "https://navy-issue-i-239.site" const val emoviesAPI = "https://emovies.si" const val multimoviesAPI = "https://multimovies.top" const val multimovies2API = "https://multimovies.click" const val netmoviesAPI = "https://netmovies.to" - const val momentAPI = "https://izzillent-dickstonyx-i-262.site" + const val allmovielandAPI = "https://allmovieland.fun" const val doomoviesAPI = "https://doomovies.net" const val vidsrctoAPI = "https://vidsrc.to" const val dramadayAPI = "https://dramaday.me" @@ -121,7 +123,7 @@ open class SoraStream : TmdbProvider() { const val fdMoviesAPI = "https://freedrivemovie.com" const val uhdmoviesAPI = "https://uhdmovies.zip" const val gMoviesAPI = "https://gdrivemovies.xyz" - const val hdmovies4uAPI = "https://hdmovies4u.band" + const val hdmovies4uAPI = "https://hdmovies4u.dad" const val vegaMoviesAPI = "https://vegamovies.dad" const val dotmoviesAPI = "https://dotmovies.bet" const val tvMoviesAPI = "https://www.tvseriesnmovies.com" @@ -632,10 +634,7 @@ open class SoraStream : TmdbProvider() { ) }, { - invokeNavy(res.imdbId, res.season, res.episode, callback) - }, - { - invokeMoment(res.imdbId, res.season, res.episode, callback) + if (!res.isAnime) invokeAllMovieland(res.imdbId, res.season, res.episode, callback) }, { if (!res.isAnime) invokeEmovies( diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt index 90ad38d5..fb015f5d 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -1,6 +1,7 @@ package com.hexated import com.hexated.SoraExtractor.invoke2embed +import com.hexated.SoraExtractor.invokeAllMovieland import com.hexated.SoraExtractor.invokeAnimes import com.hexated.SoraExtractor.invokeAoneroom import com.hexated.SoraExtractor.invokeDbgo @@ -14,7 +15,6 @@ import com.hexated.SoraExtractor.invokeKimcartoon import com.hexated.SoraExtractor.invokeKisskh import com.hexated.SoraExtractor.invokeLing import com.hexated.SoraExtractor.invokeM4uhd -import com.hexated.SoraExtractor.invokeNavy import com.hexated.SoraExtractor.invokeNinetv import com.hexated.SoraExtractor.invokeNowTv import com.hexated.SoraExtractor.invokeRStream @@ -22,7 +22,6 @@ import com.hexated.SoraExtractor.invokeRidomovies import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies -import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokeSFMovies @@ -244,9 +243,6 @@ class SoraStreamLite : SoraStream() { callback ) }, - { - invokeNavy(res.imdbId, res.season, res.episode, callback) - }, { if (!res.isAnime && res.season == null) invokeRidomovies( res.id, @@ -281,7 +277,7 @@ class SoraStreamLite : SoraStream() { ) }, { - invokeMoment(res.imdbId, res.season, res.episode, callback) + if (!res.isAnime) invokeAllMovieland(res.imdbId, res.season, res.episode, callback) }, { if (!res.isAnime && res.season == null) invokeDoomovies(