mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
fix
This commit is contained in:
parent
852796cc15
commit
b77d6ead50
5 changed files with 163 additions and 35 deletions
|
@ -342,6 +342,96 @@ open class Netembed : ExtractorApi() {
|
|||
}
|
||||
}
|
||||
|
||||
open class Ridoo : ExtractorApi() {
|
||||
override val name = "Ridoo"
|
||||
override var mainUrl = "https://ridoo.net"
|
||||
override val requiresReferer = true
|
||||
|
||||
override suspend fun getUrl(
|
||||
url: String,
|
||||
referer: String?,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
) {
|
||||
val response = app.get(url, referer = referer)
|
||||
val script = if (!getPacked(response.text).isNullOrEmpty()) {
|
||||
getAndUnpack(response.text)
|
||||
} else {
|
||||
response.document.selectFirst("script:containsData(sources:)")?.data()
|
||||
}
|
||||
val m3u8 = Regex("file:\\s*\"(.*?m3u8.*?)\"").find(script ?: return)?.groupValues?.getOrNull(1)
|
||||
callback.invoke(
|
||||
ExtractorLink(
|
||||
this.name,
|
||||
this.name,
|
||||
m3u8 ?: return,
|
||||
mainUrl,
|
||||
Qualities.P1080.value,
|
||||
INFER_TYPE
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
open class Streamvid : ExtractorApi() {
|
||||
override val name = "Streamvid"
|
||||
override val mainUrl = "https://streamvid.net"
|
||||
override val requiresReferer = true
|
||||
|
||||
override suspend fun getUrl(
|
||||
url: String,
|
||||
referer: String?,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
) {
|
||||
val response = app.get(url, referer = referer)
|
||||
val script = if (!getPacked(response.text).isNullOrEmpty()) {
|
||||
getAndUnpack(response.text)
|
||||
} else {
|
||||
response.document.selectFirst("script:containsData(sources:)")?.data()
|
||||
}
|
||||
val m3u8 =
|
||||
Regex("src:\\s*\"(.*?m3u8.*?)\"").find(script ?: return)?.groupValues?.getOrNull(1)
|
||||
M3u8Helper.generateM3u8(
|
||||
name,
|
||||
m3u8 ?: return,
|
||||
mainUrl
|
||||
).forEach(callback)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
open class Embedrise : ExtractorApi() {
|
||||
override val name = "Embedrise"
|
||||
override val mainUrl = "https://embedrise.com"
|
||||
override val requiresReferer = true
|
||||
|
||||
override suspend fun getUrl(
|
||||
url: String,
|
||||
referer: String?,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
) {
|
||||
val res = app.get(url, referer = referer).document
|
||||
val title = res.select("title").text()
|
||||
val video = res.select("video#player source").attr("src")
|
||||
|
||||
callback.invoke(
|
||||
ExtractorLink(
|
||||
this.name,
|
||||
this.name,
|
||||
video,
|
||||
"$mainUrl/",
|
||||
getIndexQuality(title),
|
||||
INFER_TYPE
|
||||
)
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class Streamwish : Filesim() {
|
||||
override val name = "Streamwish"
|
||||
override var mainUrl = "https://streamwish.to"
|
||||
|
|
|
@ -476,17 +476,34 @@ object SoraExtractor : SoraStream() {
|
|||
document.select("ul#playeroptionsul > li")
|
||||
.filter { element -> element.select("span.flag img").attr("src").contains("/en.") }
|
||||
.map {
|
||||
Triple(it.attr("data-post"), it.attr("data-nume"), it.attr("data-type"))
|
||||
Triple(
|
||||
it.attr("data-post"),
|
||||
it.attr("data-nume"),
|
||||
it.attr("data-type")
|
||||
)
|
||||
}.apmap { (id, nume, type) ->
|
||||
val source = app.get(
|
||||
"$host/wp-json/dooplayer/v2/${id}/${type}/${nume}",
|
||||
headers = mapOf("X-Requested-With" to "XMLHttpRequest"),
|
||||
referer = "$host/"
|
||||
).parsed<ResponseHash>().embed_url
|
||||
if (!source.contains("youtube")) {
|
||||
loadExtractor(source, "$host/", subtitleCallback, callback)
|
||||
val source = app.get(
|
||||
"$host/wp-json/dooplayer/v2/${id}/${type}/${nume}",
|
||||
headers = mapOf("X-Requested-With" to "XMLHttpRequest"),
|
||||
referer = "$host/"
|
||||
).parsed<ResponseHash>().embed_url
|
||||
if (!source.contains("youtube")) {
|
||||
if (source.startsWith("https://voe.sx")) {
|
||||
val req = app.get(source, referer = "$host/")
|
||||
val server = getBaseUrl(req.url)
|
||||
val script = req.text.substringAfter("wc0 = '").substringBefore("'")
|
||||
val video = tryParseJson<Map<String, String>>(base64Decode(script))?.get("file")
|
||||
M3u8Helper.generateM3u8(
|
||||
"Voe",
|
||||
video ?: return@apmap,
|
||||
"$server/",
|
||||
headers = mapOf("Origin" to server)
|
||||
).forEach(callback)
|
||||
} else {
|
||||
loadExtractor(source, "$host/", subtitleCallback, callback)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun invokeNoverse(
|
||||
|
@ -2339,25 +2356,51 @@ object SoraExtractor : SoraStream() {
|
|||
suspend fun invokeRidomovies(
|
||||
tmdbId: Int? = null,
|
||||
imdbId: String? = null,
|
||||
title: String? = null,
|
||||
season: Int? = null,
|
||||
episode: Int? = null,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit,
|
||||
) {
|
||||
val slug = app.get("$ridomoviesAPI/core/api/search?q=$imdbId")
|
||||
.parsedSafe<RidoSearch>()?.data?.items?.find {
|
||||
it.contentable?.tmdbId == tmdbId || it.contentable?.imdbId == imdbId
|
||||
}?.slug ?: return
|
||||
app.get("$ridomoviesAPI/core/api/movies/$slug/videos")
|
||||
.parsedSafe<RidoResponses>()?.data?.apmap { link ->
|
||||
val slug = if (season == null) {
|
||||
app.get("$ridomoviesAPI/core/api/search?q=$imdbId")
|
||||
.parsedSafe<RidoSearch>()?.data?.items?.find {
|
||||
it.contentable?.tmdbId == tmdbId || it.contentable?.imdbId == imdbId
|
||||
}?.slug
|
||||
} else {
|
||||
app.get("$ridomoviesAPI/tv/${title.createSlug()}/season-$season/episode-$episode").text.substringAfterLast(
|
||||
"""postid\":\""""
|
||||
).substringBefore("""\"""")
|
||||
} ?: return
|
||||
val url = if(season == null) {
|
||||
"$ridomoviesAPI/core/api/movies/$slug/videos"
|
||||
} else {
|
||||
"$ridomoviesAPI/core/api/episodes/$slug/videos"
|
||||
}
|
||||
app.get(url).parsedSafe<RidoResponses>()?.data?.apmap { link ->
|
||||
val iframe = Jsoup.parse(link.url ?: return@apmap).select("iframe").attr("data-src")
|
||||
val unpacked = getAndUnpack(app.get(iframe, referer = "$ridomoviesAPI/").text)
|
||||
val video = Regex("=\"(aHR.*?)\";").find(unpacked)?.groupValues?.get(1)
|
||||
callback.invoke(
|
||||
ExtractorLink(
|
||||
"Ridomovies", "Ridomovies", base64Decode(
|
||||
video
|
||||
?: return@apmap
|
||||
), "${getBaseUrl(iframe)}/", Qualities.P1080.value, isM3u8 = true
|
||||
if(iframe.startsWith("https://closeload.top")) {
|
||||
val unpacked =
|
||||
getAndUnpack(
|
||||
app.get(
|
||||
iframe,
|
||||
referer = "$ridomoviesAPI/"
|
||||
).text
|
||||
)
|
||||
val video = Regex("=\"(aHR.*?)\";").find(unpacked)?.groupValues?.get(1)
|
||||
callback.invoke(
|
||||
ExtractorLink(
|
||||
"Ridomovies",
|
||||
"Ridomovies",
|
||||
base64Decode(video ?: return@apmap),
|
||||
"${getBaseUrl(iframe)}/",
|
||||
Qualities.P1080.value,
|
||||
isM3u8 = true
|
||||
)
|
||||
)
|
||||
)
|
||||
} else {
|
||||
loadExtractor(iframe, "$ridomoviesAPI/", subtitleCallback, callback)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ open class SoraStream : TmdbProvider() {
|
|||
const val nowTvAPI = "https://myfilestorage.xyz"
|
||||
const val gokuAPI = "https://goku.sx"
|
||||
const val zshowAPI = BuildConfig.ZSHOW_API
|
||||
const val ridomoviesAPI = "https://ridomovies.pw"
|
||||
const val ridomoviesAPI = "https://ridomovies.tv"
|
||||
const val emoviesAPI = "https://emovies.si"
|
||||
const val multimoviesAPI = "https://multimovies.top"
|
||||
const val multimovies2API = "https://multimovies.click"
|
||||
|
@ -584,11 +584,7 @@ open class SoraStream : TmdbProvider() {
|
|||
if (!res.isAnime) invokeNowTv(res.id, res.imdbId, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.season == null) invokeRidomovies(
|
||||
res.id,
|
||||
res.imdbId,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.season == null) invokeRidomovies(res.id, res.imdbId, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeAllMovieland(res.imdbId, res.season, res.episode, callback)
|
||||
|
|
|
@ -223,11 +223,7 @@ class SoraStreamLite : SoraStream() {
|
|||
)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.season == null) invokeRidomovies(
|
||||
res.id,
|
||||
res.imdbId,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.season == null) invokeRidomovies(res.id, res.imdbId, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeEmovies(
|
||||
|
|
|
@ -30,5 +30,8 @@ class SoraStreamPlugin: Plugin() {
|
|||
registerExtractorAPI(Netembed())
|
||||
registerExtractorAPI(Flaswish())
|
||||
registerExtractorAPI(Comedyshow())
|
||||
registerExtractorAPI(Ridoo())
|
||||
registerExtractorAPI(Streamvid())
|
||||
registerExtractorAPI(Embedrise())
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue