mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
sora: fixed few sources
This commit is contained in:
parent
5eafdd6e4b
commit
46644dd49f
5 changed files with 140 additions and 79 deletions
|
@ -1,5 +1,5 @@
|
||||||
// use an integer for version numbers
|
// use an integer for version numbers
|
||||||
version = 90
|
version = 91
|
||||||
|
|
||||||
|
|
||||||
cloudstream {
|
cloudstream {
|
||||||
|
|
|
@ -1611,21 +1611,16 @@ object SoraExtractor : SoraStream() {
|
||||||
|
|
||||||
val media = json?.find { it.first() == "${title.createSlug()}-$year" }
|
val media = json?.find { it.first() == "${title.createSlug()}-$year" }
|
||||||
|
|
||||||
media?.filter { it.startsWith("https://drive.google.com") }?.apmap {
|
media?.filter { it.startsWith("https://drive.google.com") || it.startsWith("https://cdn.moviesbay.live") }?.apmap {
|
||||||
val index = media.indexOf(it)
|
val index = media.indexOf(it)
|
||||||
val size = media[index.minus(1)]
|
val size = media[index.minus(1)]
|
||||||
val quality = media[index.minus(2)]
|
val quality = media[index.minus(2)]
|
||||||
val qualityName = media[index.minus(3)]
|
val qualityName = media[index.minus(3)]
|
||||||
val gdriveLink = getDirectGdrive(it)
|
val link = if(it.startsWith("https://drive.google.com")) {
|
||||||
|
getDirectGdrive(it)
|
||||||
val doc = app.get(gdriveLink).document
|
} else {
|
||||||
val form = doc.select("form#download-form").attr("action")
|
it.removeSuffix("?a=view")
|
||||||
val uc = doc.select("input#uc-download-link").attr("value")
|
}
|
||||||
val link = app.post(
|
|
||||||
form, data = mapOf(
|
|
||||||
"uc-download-link" to uc
|
|
||||||
)
|
|
||||||
).url
|
|
||||||
|
|
||||||
callback.invoke(
|
callback.invoke(
|
||||||
ExtractorLink(
|
ExtractorLink(
|
||||||
|
@ -1745,22 +1740,25 @@ object SoraExtractor : SoraStream() {
|
||||||
callback: (ExtractorLink) -> Unit
|
callback: (ExtractorLink) -> Unit
|
||||||
) {
|
) {
|
||||||
val url = if (season == null) {
|
val url = if (season == null) {
|
||||||
"$rStreamAPI/Movies/$id/$id.mp4"
|
"$rStreamAPI/e/?tmdb=$id"
|
||||||
} else {
|
} else {
|
||||||
"$rStreamAPI/Shows/$id/$season/$episode.mp4"
|
"$rStreamAPI/e/?tmdb=$id&s=$season&e=$episode"
|
||||||
}
|
}
|
||||||
val referer = "https://remotestre.am/"
|
|
||||||
|
|
||||||
if (!app.get(url, referer = referer).isSuccessful) return
|
val res = app.get(url).text
|
||||||
|
val link = Regex("\"file\":\"(http.*?)\"").find(res)?.groupValues?.getOrNull(1) ?: return
|
||||||
|
|
||||||
|
delay(1000)
|
||||||
|
if(!app.get(link, referer = mainUrl).isSuccessful) return
|
||||||
|
|
||||||
delay(4000)
|
|
||||||
callback.invoke(
|
callback.invoke(
|
||||||
ExtractorLink(
|
ExtractorLink(
|
||||||
"RStream",
|
"RStream",
|
||||||
"RStream",
|
"RStream",
|
||||||
url,
|
link,
|
||||||
referer,
|
mainUrl,
|
||||||
Qualities.P720.value
|
Qualities.P720.value,
|
||||||
|
link.contains(".m3u8")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -1902,38 +1900,24 @@ object SoraExtractor : SoraStream() {
|
||||||
callback: (ExtractorLink) -> Unit,
|
callback: (ExtractorLink) -> Unit,
|
||||||
) {
|
) {
|
||||||
val url = if (season == null) {
|
val url = if (season == null) {
|
||||||
"$smashyStreamAPI/gtop/tv.php?imdb=$imdbId"
|
"$smashyStreamAPI/playere.php?imdb=$imdbId"
|
||||||
} else {
|
} else {
|
||||||
"$smashyStreamAPI/gtop/tv.php?imdb=$imdbId&s=$season&e=$episode"
|
"$smashyStreamAPI/playere.php?imdb=$imdbId&season=$season&episode=$episode"
|
||||||
}
|
}
|
||||||
|
|
||||||
val doc = app.get(url).document
|
app.get(url).document.select("div#_default-servers a.server").map {
|
||||||
val script = doc.selectFirst("script:containsData(var secret)")?.data() ?: return
|
it.attr("data-id") to it.text()
|
||||||
val secret =
|
}.apmap {
|
||||||
script.substringAfter("secret = \"").substringBefore("\";").let { base64Decode(it) }
|
when {
|
||||||
val key = script.substringAfter("token = \"").substringBefore("\";")
|
it.first.contains("/flix") -> {
|
||||||
delay(3000)
|
invokeSmashyOne(it.second, it.first, callback)
|
||||||
val source = app.get(
|
}
|
||||||
"$secret$key",
|
it.first.contains("/gtop") -> {
|
||||||
headers = mapOf(
|
invokeSmashyTwo(it.second, it.first, callback)
|
||||||
"X-Requested-With" to "XMLHttpRequest"
|
}
|
||||||
)
|
else -> return@apmap
|
||||||
).parsedSafe<Smashy1Source>() ?: return
|
}
|
||||||
|
}
|
||||||
val videoUrl = base64Decode(source.file ?: return)
|
|
||||||
val quality =
|
|
||||||
Regex("(\\d{3,4})[Pp]").find(videoUrl)?.groupValues?.getOrNull(1)?.toIntOrNull()
|
|
||||||
?: Qualities.P720.value
|
|
||||||
callback.invoke(
|
|
||||||
ExtractorLink(
|
|
||||||
"SmashyStream",
|
|
||||||
"SmashyStream",
|
|
||||||
videoUrl,
|
|
||||||
"",
|
|
||||||
quality,
|
|
||||||
videoUrl.contains(".m3u8")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ import com.hexated.SoraExtractor.invokeFDMovies
|
||||||
import com.hexated.SoraExtractor.invokeFlixon
|
import com.hexated.SoraExtractor.invokeFlixon
|
||||||
import com.hexated.SoraExtractor.invokeFwatayako
|
import com.hexated.SoraExtractor.invokeFwatayako
|
||||||
import com.hexated.SoraExtractor.invokeGMovies
|
import com.hexated.SoraExtractor.invokeGMovies
|
||||||
|
import com.hexated.SoraExtractor.invokeGomovies
|
||||||
import com.hexated.SoraExtractor.invokeJsmovies
|
import com.hexated.SoraExtractor.invokeJsmovies
|
||||||
import com.hexated.SoraExtractor.invokeKisskh
|
import com.hexated.SoraExtractor.invokeKisskh
|
||||||
import com.hexated.SoraExtractor.invokeLing
|
import com.hexated.SoraExtractor.invokeLing
|
||||||
|
@ -104,7 +105,7 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val moviezAddAPI = "https://45.143.223.244"
|
const val moviezAddAPI = "https://45.143.223.244"
|
||||||
const val bollyMazaAPI = "https://b.bloginguru.info"
|
const val bollyMazaAPI = "https://b.bloginguru.info"
|
||||||
const val moviesbayAPI = "https://moviesbay.live"
|
const val moviesbayAPI = "https://moviesbay.live"
|
||||||
const val rStreamAPI = "https://fsa.remotestre.am"
|
const val rStreamAPI = "https://remotestre.am"
|
||||||
const val flixonAPI = "https://flixon.ru"
|
const val flixonAPI = "https://flixon.ru"
|
||||||
const val animeKaizokuAPI = "https://animekaizoku.com"
|
const val animeKaizokuAPI = "https://animekaizoku.com"
|
||||||
const val movie123NetAPI = "https://ww7.0123movie.net"
|
const val movie123NetAPI = "https://ww7.0123movie.net"
|
||||||
|
@ -115,12 +116,12 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val chillmovies0API = "https://chill.aicirou.workers.dev/0:" // dead
|
const val chillmovies0API = "https://chill.aicirou.workers.dev/0:" // dead
|
||||||
const val chillmovies1API = "https://chill.aicirou.workers.dev/1:" // dead
|
const val chillmovies1API = "https://chill.aicirou.workers.dev/1:" // dead
|
||||||
const val gamMoviesAPI = "https://drive.gamick.workers.dev/0:" // dead
|
const val gamMoviesAPI = "https://drive.gamick.workers.dev/0:" // dead
|
||||||
const val jsMoviesAPI = "https://jsupload.jnsbot.workers.dev/0:"
|
const val jsMoviesAPI = "https://jsupload.jnsbot.workers.dev/0:" // dead
|
||||||
|
const val xtremeMoviesAPI = "https://kartik19.xtrememirror0.workers.dev/0:" // dead
|
||||||
const val blackMoviesAPI = "https://dl.blacklistedbois.workers.dev/0:"
|
const val blackMoviesAPI = "https://dl.blacklistedbois.workers.dev/0:"
|
||||||
const val rinzryMoviesAPI = "https://rinzry.stream/0:"
|
const val rinzryMoviesAPI = "https://rinzry.stream/0:"
|
||||||
const val codexMoviesAPI = "https://packs.codexcloudx.tech/0:"
|
const val codexMoviesAPI = "https://packs.codexcloudx.tech/0:"
|
||||||
const val edithxMoviesAPI = "https://index.edithx.ga/0:"
|
const val edithxMoviesAPI = "https://index.edithx.ga/0:"
|
||||||
const val xtremeMoviesAPI = "https://kartik19.xtrememirror0.workers.dev/0:"
|
|
||||||
const val papaonMovies1API = "https://m.papaonwork.workers.dev/0:"
|
const val papaonMovies1API = "https://m.papaonwork.workers.dev/0:"
|
||||||
const val papaonMovies2API = "https://m.papaonwork.workers.dev/1:"
|
const val papaonMovies2API = "https://m.papaonwork.workers.dev/1:"
|
||||||
const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev"
|
const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev"
|
||||||
|
@ -439,7 +440,7 @@ open class SoraStream : TmdbProvider() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeFilmxy(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
if (!res.isAnime) invokeFilmxy(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback)
|
invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||||
|
@ -623,17 +624,17 @@ open class SoraStream : TmdbProvider() {
|
||||||
callback
|
callback
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
if (!res.isAnime) invokeJsmovies(
|
// if (!res.isAnime) invokeJsmovies(
|
||||||
jsMoviesAPI,
|
// jsMoviesAPI,
|
||||||
"JSMovies",
|
// "JSMovies",
|
||||||
res.title,
|
// res.title,
|
||||||
res.year,
|
// res.year,
|
||||||
res.season,
|
// res.season,
|
||||||
res.episode,
|
// res.episode,
|
||||||
callback
|
// callback
|
||||||
)
|
// )
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
invokeRinzrymovies(
|
invokeRinzrymovies(
|
||||||
rinzryMoviesAPI,
|
rinzryMoviesAPI,
|
||||||
|
@ -669,17 +670,17 @@ open class SoraStream : TmdbProvider() {
|
||||||
"Basic ZWRpdGg6amFydmlz"
|
"Basic ZWRpdGg6amFydmlz"
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
if (!res.isAnime) invokeXtrememovies(
|
// if (!res.isAnime) invokeXtrememovies(
|
||||||
xtremeMoviesAPI,
|
// xtremeMoviesAPI,
|
||||||
"XtremeMovies",
|
// "XtremeMovies",
|
||||||
res.title,
|
// res.title,
|
||||||
res.year,
|
// res.year,
|
||||||
res.season,
|
// res.season,
|
||||||
res.episode,
|
// res.episode,
|
||||||
callback
|
// callback
|
||||||
)
|
// )
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokePapaonMovies1(
|
if (!res.isAnime) invokePapaonMovies1(
|
||||||
papaonMovies1API,
|
papaonMovies1API,
|
||||||
|
@ -710,7 +711,10 @@ open class SoraStream : TmdbProvider() {
|
||||||
res.episode,
|
res.episode,
|
||||||
callback
|
callback
|
||||||
)
|
)
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
invokeGomovies(res.title, res.year, res.season, res.episode, callback)
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -148,7 +148,7 @@ class SoraStreamLite : SoraStream() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeFilmxy(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
if (!res.isAnime) invokeFilmxy(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback)
|
invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import com.hexated.SoraStream.Companion.baymoviesAPI
|
||||||
import com.hexated.SoraStream.Companion.consumetCrunchyrollAPI
|
import com.hexated.SoraStream.Companion.consumetCrunchyrollAPI
|
||||||
import com.hexated.SoraStream.Companion.filmxyAPI
|
import com.hexated.SoraStream.Companion.filmxyAPI
|
||||||
import com.hexated.SoraStream.Companion.gdbot
|
import com.hexated.SoraStream.Companion.gdbot
|
||||||
|
import com.hexated.SoraStream.Companion.smashyStreamAPI
|
||||||
import com.hexated.SoraStream.Companion.tvMoviesAPI
|
import com.hexated.SoraStream.Companion.tvMoviesAPI
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.APIHolder.getCaptchaToken
|
import com.lagradost.cloudstream3.APIHolder.getCaptchaToken
|
||||||
|
@ -324,14 +325,86 @@ suspend fun extractCovyn(url: String?): Pair<String?, String?>? {
|
||||||
return Pair(videoLink, size)
|
return Pair(videoLink, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getDirectGdrive(url: String): String {
|
suspend fun getDirectGdrive(url: String): String {
|
||||||
return if (url.contains("&export=download")) {
|
val fixUrl = if (url.contains("&export=download")) {
|
||||||
url
|
url
|
||||||
} else {
|
} else {
|
||||||
"https://drive.google.com/uc?id=${
|
"https://drive.google.com/uc?id=${
|
||||||
url.substringAfter("/d/").substringBefore("/")
|
url.substringAfter("/d/").substringBefore("/")
|
||||||
}&export=download"
|
}&export=download"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val doc = app.get(fixUrl).document
|
||||||
|
val form = doc.select("form#download-form").attr("action")
|
||||||
|
val uc = doc.select("input#uc-download-link").attr("value")
|
||||||
|
return app.post(
|
||||||
|
form, data = mapOf(
|
||||||
|
"uc-download-link" to uc
|
||||||
|
)
|
||||||
|
).url
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun invokeSmashyOne(
|
||||||
|
name: String,
|
||||||
|
url: String,
|
||||||
|
callback: (ExtractorLink) -> Unit,
|
||||||
|
) {
|
||||||
|
val script = app.get(url).document.selectFirst("script:containsData(player =)")?.data() ?: return
|
||||||
|
|
||||||
|
val source =
|
||||||
|
Regex("file:\\s['\"](\\S+?)['|\"]").find(script)?.groupValues?.get(
|
||||||
|
1
|
||||||
|
) ?: return
|
||||||
|
|
||||||
|
source.split(",").map { links ->
|
||||||
|
val quality = Regex("\\[(\\d+)]").find(links)?.groupValues?.getOrNull(1)?.trim()
|
||||||
|
val link = links.removePrefix("[$quality]").trim()
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
"Smashy [$name]",
|
||||||
|
"Smashy [$name]",
|
||||||
|
link,
|
||||||
|
smashyStreamAPI,
|
||||||
|
quality?.toIntOrNull() ?: return@map,
|
||||||
|
isM3u8 = link.contains(".m3u8"),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun invokeSmashyTwo(
|
||||||
|
name: String,
|
||||||
|
url: String,
|
||||||
|
callback: (ExtractorLink) -> Unit
|
||||||
|
) {
|
||||||
|
val doc = app.get(url).document
|
||||||
|
val script = doc.selectFirst("script:containsData(var secret)")?.data() ?: return
|
||||||
|
val secret =
|
||||||
|
script.substringAfter("secret = \"").substringBefore("\";").let { base64Decode(it) }
|
||||||
|
val key = script.substringAfter("token = \"").substringBefore("\";")
|
||||||
|
val source = app.get(
|
||||||
|
"$secret$key",
|
||||||
|
headers = mapOf(
|
||||||
|
"X-Requested-With" to "XMLHttpRequest"
|
||||||
|
)
|
||||||
|
).parsedSafe<Smashy1Source>() ?: return
|
||||||
|
|
||||||
|
val videoUrl = base64Decode(source.file ?: return)
|
||||||
|
val quality =
|
||||||
|
Regex("(\\d{3,4})[Pp]").find(videoUrl)?.groupValues?.getOrNull(1)?.toIntOrNull()
|
||||||
|
?: Qualities.P720.value
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
"Smashy [$name]",
|
||||||
|
"Smashy [$name]",
|
||||||
|
videoUrl,
|
||||||
|
"",
|
||||||
|
quality,
|
||||||
|
videoUrl.contains(".m3u8")
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun bypassOuo(url: String?): String? {
|
suspend fun bypassOuo(url: String?): String? {
|
||||||
|
|
Loading…
Reference in a new issue