This commit is contained in:
monica 2023-12-30 16:09:19 +07:00
parent bf4337aa9c
commit 638b60dd5d
5 changed files with 51 additions and 79 deletions

View file

@ -1,7 +1,7 @@
import org.jetbrains.kotlin.konan.properties.Properties import org.jetbrains.kotlin.konan.properties.Properties
// use an integer for version numbers // use an integer for version numbers
version = 209 version = 210
android { android {
defaultConfig { defaultConfig {

View file

@ -1,6 +1,5 @@
package com.hexated package com.hexated
import com.hexated.AESGCM.decrypt
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.APIHolder.unixTime import com.lagradost.cloudstream3.APIHolder.unixTime
import com.lagradost.cloudstream3.APIHolder.unixTimeMS 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.Requests
import com.lagradost.nicehttp.Session import com.lagradost.nicehttp.Session
import com.lagradost.cloudstream3.extractors.helper.AesHelper.cryptoAESHandler import com.lagradost.cloudstream3.extractors.helper.AesHelper.cryptoAESHandler
import com.lagradost.cloudstream3.network.CloudflareKiller
import com.lagradost.nicehttp.RequestBodyTypes import com.lagradost.nicehttp.RequestBodyTypes
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull
@ -294,7 +292,7 @@ object SoraExtractor : SoraStream() {
}?.subjectId }?.subjectId
val data = app.get( 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 headers = headers
).parsedSafe<AoneroomResponse>()?.data?.list?.findLast { ).parsedSafe<AoneroomResponse>()?.data?.list?.findLast {
it.se == (season ?: 0) && it.ep == (episode ?: 0) it.se == (season ?: 0) && it.ep == (episode ?: 0)
@ -1229,7 +1227,7 @@ object SoraExtractor : SoraStream() {
val selector = val selector =
if (season == null) "p a:contains(V-Cloud)" else "h4:matches(0?$episode) + p a:contains(V-Cloud)" if (season == null) "p a:contains(V-Cloud)" else "h4:matches(0?$episode) + p a:contains(V-Cloud)"
val server = app.get( val server = app.get(
href ?: return, interceptor = CloudflareKiller() href ?: return, interceptor = wpredisInterceptor
).document.selectFirst("div.entry-content > $selector") ).document.selectFirst("div.entry-content > $selector")
?.attr("href") ?: return ?.attr("href") ?: return
@ -1695,9 +1693,9 @@ object SoraExtractor : SoraStream() {
imdbId: String? = null, imdbId: String? = null,
season: Int? = null, season: Int? = null,
episode: 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 request = if (season == null) {
val res = app.get("$flixonAPI/$imdbId", referer = onionUrl) val res = app.get("$flixonAPI/$imdbId", referer = onionUrl)
if (res.text.contains("BEGIN PGP SIGNED MESSAGE")) app.get( if (res.text.contains("BEGIN PGP SIGNED MESSAGE")) app.get(
@ -2319,13 +2317,10 @@ object SoraExtractor : SoraStream() {
lastSeason: Int? = null, lastSeason: Int? = null,
episode: Int? = null, episode: Int? = null,
callback: (ExtractorLink) -> Unit, callback: (ExtractorLink) -> Unit,
showboxApi: String = "https://www.showbox.media"
) { ) {
val showboxApi = "https://www.showbox.media"
val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode)
val res = app.get("$showboxApi/search?keyword=$title", interceptor = showboxInterceptor).document
val res = app.get("$showboxApi/search?keyword=$title").document
val mediaRes = res.select("div.film_list-wrap div.flw-item").map { val mediaRes = res.select("div.film_list-wrap div.flw-item").map {
ShowboxMedia( ShowboxMedia(
it.select("h2.film-name a").attr("href"), it.select("h2.film-name a").attr("href"),
@ -2350,7 +2345,7 @@ object SoraExtractor : SoraStream() {
val shareId = media?.url?.substringAfterLast("/") ?: return val shareId = media?.url?.substringAfterLast("/") ?: return
val shareKey = 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<FebboxResponse>()?.data?.link?.substringAfterLast("/") .parsedSafe<FebboxResponse>()?.data?.link?.substringAfterLast("/")
val headers = mapOf("Accept-Language" to "en") val headers = mapOf("Accept-Language" to "en")
@ -2417,9 +2412,9 @@ object SoraExtractor : SoraStream() {
imdbId: String? = null, imdbId: String? = null,
season: Int? = null, season: Int? = null,
episode: 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) val slug = getEpisodeSlug(season, episode)
var url = var url =
if (season == null) "$nowTvAPI/$tmdbId.mp4" else "$nowTvAPI/tv/$tmdbId/s${season}e${slug.second}.mp4" 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( suspend fun invokeAllMovieland(
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,
imdbId: String? = null, imdbId: String? = null,
season: Int? = null, season: Int? = null,
episode: Int? = null, episode: Int? = null,
callback: (ExtractorLink) -> Unit, callback: (ExtractorLink) -> Unit,
host: String = "https://esh-bostewsom-i-273.site",
) { ) {
val res = app.get( val res = app.get(
"$host/play/$imdbId", referer = "$referer/" "$host/play/$imdbId", referer = "$allmovielandAPI/"
).document.selectFirst("script:containsData(player =)")?.data()?.substringAfter("{") ).document.selectFirst("script:containsData(player =)")?.data()?.substringAfter("{")
?.substringBefore(";")?.substringBefore(")") ?.substringBefore(";")?.substringBefore(")")
val json = tryParseJson<NavyPlaylist>("{${res ?: return}") val json = tryParseJson<AllMovielandPlaylist>("{${res ?: return}")
val headers = mapOf( val headers = mapOf(
"X-CSRF-TOKEN" to "${json?.key}" "X-CSRF-TOKEN" to "${json?.key}"
) )
val serverRes = app.get( 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*\[]"""), "") ).text.replace(Regex(""",\s*\[]"""), "")
val server = tryParseJson<ArrayList<NavyServer>>(serverRes).let { server -> val servers = tryParseJson<ArrayList<AllMovielandServer>>(serverRes).let { server ->
if (season == null) { if (season == null) {
server?.find { it.title == "English" }?.file server?.map { it.file to it.title }
} else { } else {
server?.find { it.id.equals("$season") }?.folder?.find { it.episode.equals("$episode") }?.folder?.find { server?.find { it.id.equals("$season") }?.folder?.find { it.episode.equals("$episode") }?.folder?.map {
it.title.equals( it.file to it.title
"English" }
)
}?.file
} }
} }
val path = app.post( servers?.apmap { (server, lang) ->
"${host}/playlist/${server ?: return}.txt", headers = headers, referer = "$referer/" val path = app.post(
).text "${host}/playlist/${server ?: return@apmap}.txt", headers = headers, referer = "$allmovielandAPI/"
).text
M3u8Helper.generateM3u8( M3u8Helper.generateM3u8(
if (host == navyAPI) "Navy" else "Moment", path, "${referer}/" "Allmovieland [$lang]",
).forEach(callback) path,
"$allmovielandAPI/"
).forEach(callback)
}
} }

View file

@ -269,26 +269,26 @@ data class GokuServer(
@JsonProperty("data") val data: GokuData? = GokuData(), @JsonProperty("data") val data: GokuData? = GokuData(),
) )
data class NavyEpisodeFolder( data class AllMovielandEpisodeFolder(
@JsonProperty("title") val title: String? = null, @JsonProperty("title") val title: String? = null,
@JsonProperty("id") val id: String? = null, @JsonProperty("id") val id: String? = null,
@JsonProperty("file") val file: String? = null, @JsonProperty("file") val file: String? = null,
) )
data class NavySeasonFolder( data class AllMovielandSeasonFolder(
@JsonProperty("episode") val episode: String? = null, @JsonProperty("episode") val episode: String? = null,
@JsonProperty("id") val id: String? = null, @JsonProperty("id") val id: String? = null,
@JsonProperty("folder") val folder: ArrayList<NavyEpisodeFolder>? = arrayListOf(), @JsonProperty("folder") val folder: ArrayList<AllMovielandEpisodeFolder>? = arrayListOf(),
) )
data class NavyServer( data class AllMovielandServer(
@JsonProperty("title") val title: String? = null, @JsonProperty("title") val title: String? = null,
@JsonProperty("id") val id: String? = null, @JsonProperty("id") val id: String? = null,
@JsonProperty("file") val file: String? = null, @JsonProperty("file") val file: String? = null,
@JsonProperty("folder") val folder: ArrayList<NavySeasonFolder>? = arrayListOf(), @JsonProperty("folder") val folder: ArrayList<AllMovielandSeasonFolder>? = arrayListOf(),
) )
data class NavyPlaylist( data class AllMovielandPlaylist(
@JsonProperty("file") val file: String? = null, @JsonProperty("file") val file: String? = null,
@JsonProperty("key") val key: String? = null, @JsonProperty("key") val key: String? = null,
@JsonProperty("href") val href: String? = null, @JsonProperty("href") val href: String? = null,

View file

@ -2,6 +2,7 @@ package com.hexated
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.hexated.SoraExtractor.invoke2embed import com.hexated.SoraExtractor.invoke2embed
import com.hexated.SoraExtractor.invokeAllMovieland
import com.hexated.SoraExtractor.invokeAnimes import com.hexated.SoraExtractor.invokeAnimes
import com.hexated.SoraExtractor.invokeAoneroom import com.hexated.SoraExtractor.invokeAoneroom
import com.hexated.SoraExtractor.invokeBollyMaza import com.hexated.SoraExtractor.invokeBollyMaza
@ -25,7 +26,6 @@ import com.hexated.SoraExtractor.invokeKisskh
import com.hexated.SoraExtractor.invokeLing import com.hexated.SoraExtractor.invokeLing
import com.hexated.SoraExtractor.invokeM4uhd import com.hexated.SoraExtractor.invokeM4uhd
import com.hexated.SoraExtractor.invokeMoviezAdd import com.hexated.SoraExtractor.invokeMoviezAdd
import com.hexated.SoraExtractor.invokeNavy
import com.hexated.SoraExtractor.invokeNinetv import com.hexated.SoraExtractor.invokeNinetv
import com.hexated.SoraExtractor.invokeNowTv import com.hexated.SoraExtractor.invokeNowTv
import com.hexated.SoraExtractor.invokeRStream import com.hexated.SoraExtractor.invokeRStream
@ -34,7 +34,6 @@ import com.hexated.SoraExtractor.invokeSmashyStream
import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeDumpStream
import com.hexated.SoraExtractor.invokeEmovies import com.hexated.SoraExtractor.invokeEmovies
import com.hexated.SoraExtractor.invokeHdmovies4u import com.hexated.SoraExtractor.invokeHdmovies4u
import com.hexated.SoraExtractor.invokeMoment
import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeMultimovies
import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokeNetmovies
import com.hexated.SoraExtractor.invokeSFMovies import com.hexated.SoraExtractor.invokeSFMovies
@ -51,6 +50,7 @@ import com.hexated.SoraExtractor.invokeWatchsomuch
import com.hexated.SoraExtractor.invokeZshow import com.hexated.SoraExtractor.invokeZshow
import com.lagradost.cloudstream3.LoadResponse.Companion.addImdbId import com.lagradost.cloudstream3.LoadResponse.Companion.addImdbId
import com.lagradost.cloudstream3.LoadResponse.Companion.addTMDbId 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.parseJson
import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -68,6 +68,9 @@ open class SoraStream : TmdbProvider() {
TvType.Anime, TvType.Anime,
) )
val showboxInterceptor by lazy { CloudflareKiller() }
val wpredisInterceptor by lazy { CloudflareKiller() }
/** AUTHOR : Hexated & Sora */ /** AUTHOR : Hexated & Sora */
companion object { companion object {
/** TOOLS */ /** TOOLS */
@ -102,12 +105,11 @@ open class SoraStream : TmdbProvider() {
const val gokuAPI = "https://goku.sx" const val gokuAPI = "https://goku.sx"
const val zshowAPI = BuildConfig.ZSHOW_API const val zshowAPI = BuildConfig.ZSHOW_API
const val ridomoviesAPI = "https://ridomovies.pw" const val ridomoviesAPI = "https://ridomovies.pw"
const val navyAPI = "https://navy-issue-i-239.site"
const val emoviesAPI = "https://emovies.si" const val emoviesAPI = "https://emovies.si"
const val multimoviesAPI = "https://multimovies.top" const val multimoviesAPI = "https://multimovies.top"
const val multimovies2API = "https://multimovies.click" const val multimovies2API = "https://multimovies.click"
const val netmoviesAPI = "https://netmovies.to" 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 doomoviesAPI = "https://doomovies.net"
const val vidsrctoAPI = "https://vidsrc.to" const val vidsrctoAPI = "https://vidsrc.to"
const val dramadayAPI = "https://dramaday.me" const val dramadayAPI = "https://dramaday.me"
@ -121,7 +123,7 @@ open class SoraStream : TmdbProvider() {
const val fdMoviesAPI = "https://freedrivemovie.com" const val fdMoviesAPI = "https://freedrivemovie.com"
const val uhdmoviesAPI = "https://uhdmovies.zip" const val uhdmoviesAPI = "https://uhdmovies.zip"
const val gMoviesAPI = "https://gdrivemovies.xyz" 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 vegaMoviesAPI = "https://vegamovies.dad"
const val dotmoviesAPI = "https://dotmovies.bet" const val dotmoviesAPI = "https://dotmovies.bet"
const val tvMoviesAPI = "https://www.tvseriesnmovies.com" const val tvMoviesAPI = "https://www.tvseriesnmovies.com"
@ -632,10 +634,7 @@ open class SoraStream : TmdbProvider() {
) )
}, },
{ {
invokeNavy(res.imdbId, res.season, res.episode, callback) if (!res.isAnime) invokeAllMovieland(res.imdbId, res.season, res.episode, callback)
},
{
invokeMoment(res.imdbId, res.season, res.episode, callback)
}, },
{ {
if (!res.isAnime) invokeEmovies( if (!res.isAnime) invokeEmovies(

View file

@ -1,6 +1,7 @@
package com.hexated package com.hexated
import com.hexated.SoraExtractor.invoke2embed import com.hexated.SoraExtractor.invoke2embed
import com.hexated.SoraExtractor.invokeAllMovieland
import com.hexated.SoraExtractor.invokeAnimes import com.hexated.SoraExtractor.invokeAnimes
import com.hexated.SoraExtractor.invokeAoneroom import com.hexated.SoraExtractor.invokeAoneroom
import com.hexated.SoraExtractor.invokeDbgo import com.hexated.SoraExtractor.invokeDbgo
@ -14,7 +15,6 @@ import com.hexated.SoraExtractor.invokeKimcartoon
import com.hexated.SoraExtractor.invokeKisskh import com.hexated.SoraExtractor.invokeKisskh
import com.hexated.SoraExtractor.invokeLing import com.hexated.SoraExtractor.invokeLing
import com.hexated.SoraExtractor.invokeM4uhd import com.hexated.SoraExtractor.invokeM4uhd
import com.hexated.SoraExtractor.invokeNavy
import com.hexated.SoraExtractor.invokeNinetv import com.hexated.SoraExtractor.invokeNinetv
import com.hexated.SoraExtractor.invokeNowTv import com.hexated.SoraExtractor.invokeNowTv
import com.hexated.SoraExtractor.invokeRStream import com.hexated.SoraExtractor.invokeRStream
@ -22,7 +22,6 @@ import com.hexated.SoraExtractor.invokeRidomovies
import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeSmashyStream
import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeDumpStream
import com.hexated.SoraExtractor.invokeEmovies import com.hexated.SoraExtractor.invokeEmovies
import com.hexated.SoraExtractor.invokeMoment
import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeMultimovies
import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokeNetmovies
import com.hexated.SoraExtractor.invokeSFMovies import com.hexated.SoraExtractor.invokeSFMovies
@ -244,9 +243,6 @@ class SoraStreamLite : SoraStream() {
callback callback
) )
}, },
{
invokeNavy(res.imdbId, res.season, res.episode, callback)
},
{ {
if (!res.isAnime && res.season == null) invokeRidomovies( if (!res.isAnime && res.season == null) invokeRidomovies(
res.id, 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( if (!res.isAnime && res.season == null) invokeDoomovies(