mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
sora: clean series9 & cryMovies
This commit is contained in:
parent
9df7df0cd7
commit
a47811680d
6 changed files with 59 additions and 80 deletions
|
@ -1,5 +1,5 @@
|
||||||
// use an integer for version numbers
|
// use an integer for version numbers
|
||||||
version = 121
|
version = 122
|
||||||
|
|
||||||
|
|
||||||
cloudstream {
|
cloudstream {
|
||||||
|
|
|
@ -45,6 +45,11 @@ class StreamhideCom : Filesim() {
|
||||||
override var mainUrl: String = "https://streamhide.com"
|
override var mainUrl: String = "https://streamhide.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Movhide : Filesim() {
|
||||||
|
override var name: String = "Movhide"
|
||||||
|
override var mainUrl: String = "https://movhide.pro"
|
||||||
|
}
|
||||||
|
|
||||||
class Watchx : Chillx() {
|
class Watchx : Chillx() {
|
||||||
override val name = "Watchx"
|
override val name = "Watchx"
|
||||||
override val mainUrl = "https://watchx.top"
|
override val mainUrl = "https://watchx.top"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.hexated
|
package com.hexated
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
import com.hexated.GogoExtractor.extractVidstream
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
||||||
|
@ -157,38 +158,6 @@ object SoraExtractor : SoraStream() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun invoke123Movie(
|
|
||||||
tmdbId: Int? = null,
|
|
||||||
imdbId: String? = null,
|
|
||||||
season: Int? = null,
|
|
||||||
episode: Int? = null,
|
|
||||||
subtitleCallback: (SubtitleFile) -> Unit,
|
|
||||||
callback: (ExtractorLink) -> Unit
|
|
||||||
) {
|
|
||||||
val url = if (season == null) {
|
|
||||||
"$movie123API/imdb.php?imdb=$imdbId&server=vcu"
|
|
||||||
} else {
|
|
||||||
"$movie123API/tmdb_api.php?se=$season&ep=$episode&tmdb=$tmdbId&server_name=vcu"
|
|
||||||
}
|
|
||||||
val iframe = app.get(url).document.selectFirst("iframe")?.attr("src") ?: return
|
|
||||||
|
|
||||||
val doc = app.get(
|
|
||||||
iframe,
|
|
||||||
referer = url,
|
|
||||||
headers = mapOf("Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
).document
|
|
||||||
|
|
||||||
doc.select("ul.list-server-items li.linkserver").mapNotNull { server ->
|
|
||||||
server.attr("data-video").let {
|
|
||||||
Regex("(.*?)((\\?cap)|(\\?sub)|(#cap)|(#sub))").find(it)?.groupValues?.get(1)
|
|
||||||
}
|
|
||||||
}.apmap { link ->
|
|
||||||
loadExtractor(
|
|
||||||
link, "https://123moviesjr.cc/", subtitleCallback, callback
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun invokeMovieHab(
|
suspend fun invokeMovieHab(
|
||||||
imdbId: String? = null,
|
imdbId: String? = null,
|
||||||
season: Int? = null,
|
season: Int? = null,
|
||||||
|
@ -336,19 +305,31 @@ object SoraExtractor : SoraStream() {
|
||||||
app.get("$series9API/film/$fixTitle-season-$season/watching.html").document
|
app.get("$series9API/film/$fixTitle-season-$season/watching.html").document
|
||||||
}
|
}
|
||||||
|
|
||||||
doc.select("div#list-eps div.le-server").apmap { ele ->
|
val server = doc.select("div#list-eps div.le-server").map { ele ->
|
||||||
val server = if (season == null) {
|
if (season == null) {
|
||||||
ele.select("a").attr("player-data")
|
ele.select("a").attr("player-data")
|
||||||
} else {
|
} else {
|
||||||
ele.select("a[episode-data=$episode]").attr("player-data")
|
ele.select("a[episode-data=$episode]").attr("player-data")
|
||||||
}.let { httpsify(it) }
|
}
|
||||||
|
}.find { it.contains(Regex("movembed|membed")) }
|
||||||
|
|
||||||
if (server.startsWith("https://movembed.cc")) {
|
val iframe = app.get(httpsify(server ?: return))
|
||||||
|
val iframeDoc = iframe.document
|
||||||
|
|
||||||
|
argamap({
|
||||||
|
iframeDoc.select(".list-server-items > .linkserver")
|
||||||
|
.forEach { element ->
|
||||||
|
val status = element.attr("data-status") ?: return@forEach
|
||||||
|
if (status != "1") return@forEach
|
||||||
|
val extractorData = element.attr("data-video") ?: return@forEach
|
||||||
|
loadExtractor(extractorData, iframe.url, subtitleCallback, callback)
|
||||||
|
}
|
||||||
|
}, {
|
||||||
val iv = "9225679083961858"
|
val iv = "9225679083961858"
|
||||||
val secretKey = "25742532592138496744665879883281"
|
val secretKey = "25742532592138496744665879883281"
|
||||||
val secretDecryptKey = secretKey
|
val secretDecryptKey = secretKey
|
||||||
GogoExtractor.extractVidstream(
|
extractVidstream(
|
||||||
server,
|
iframe.url,
|
||||||
"Vidstream",
|
"Vidstream",
|
||||||
callback,
|
callback,
|
||||||
iv,
|
iv,
|
||||||
|
@ -356,12 +337,9 @@ object SoraExtractor : SoraStream() {
|
||||||
secretDecryptKey,
|
secretDecryptKey,
|
||||||
isUsingAdaptiveKeys = false,
|
isUsingAdaptiveKeys = false,
|
||||||
isUsingAdaptiveData = true,
|
isUsingAdaptiveData = true,
|
||||||
iframeDocument = app.get(server).document
|
iframeDocument = iframeDoc
|
||||||
)
|
)
|
||||||
} else {
|
})
|
||||||
loadExtractor(server, series9API, subtitleCallback, callback)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun invokeIdlix(
|
suspend fun invokeIdlix(
|
||||||
|
@ -2983,12 +2961,26 @@ object SoraExtractor : SoraStream() {
|
||||||
|
|
||||||
suspend fun invokeCryMovies(
|
suspend fun invokeCryMovies(
|
||||||
imdbId: String? = null,
|
imdbId: String? = null,
|
||||||
|
title: String? = null,
|
||||||
|
year: Int? = null,
|
||||||
|
season: Int? = null,
|
||||||
|
episode: Int? = null,
|
||||||
callback: (ExtractorLink) -> Unit
|
callback: (ExtractorLink) -> Unit
|
||||||
) {
|
) {
|
||||||
app.get("$cryMoviesAPI/stream/movie/$imdbId.json")
|
app.get("$cryMoviesAPI/stream/movie/$imdbId.json")
|
||||||
.parsedSafe<CryMoviesResponse>()?.streams?.map { stream ->
|
.parsedSafe<CryMoviesResponse>()?.streams?.filter {
|
||||||
|
matchingIndex(
|
||||||
|
it.title,
|
||||||
|
null,
|
||||||
|
title,
|
||||||
|
year,
|
||||||
|
season,
|
||||||
|
episode,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
}?.map { stream ->
|
||||||
val quality = getIndexQuality(stream.title)
|
val quality = getIndexQuality(stream.title)
|
||||||
val tags = getIndexQualityTags(stream.title, true)
|
val tags = getIndexQualityTags(stream.title)
|
||||||
val size = getIndexSize(stream.title)
|
val size = getIndexSize(stream.title)
|
||||||
val headers = stream.behaviorHints?.proxyHeaders?.request ?: mapOf()
|
val headers = stream.behaviorHints?.proxyHeaders?.request ?: mapOf()
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.hexated
|
package com.hexated
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
import com.hexated.SoraExtractor.invoke123Movie
|
|
||||||
import com.hexated.SoraExtractor.invokeAnimes
|
import com.hexated.SoraExtractor.invokeAnimes
|
||||||
import com.hexated.SoraExtractor.invokeAsk4Movies
|
import com.hexated.SoraExtractor.invokeAsk4Movies
|
||||||
import com.hexated.SoraExtractor.invokeBlackmovies
|
import com.hexated.SoraExtractor.invokeBlackmovies
|
||||||
|
@ -90,7 +89,6 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val twoEmbedAPI = "https://www.2embed.to"
|
const val twoEmbedAPI = "https://www.2embed.to"
|
||||||
const val vidSrcAPI = "https://v2.vidsrc.me"
|
const val vidSrcAPI = "https://v2.vidsrc.me"
|
||||||
const val dbgoAPI = "https://dbgo.fun"
|
const val dbgoAPI = "https://dbgo.fun"
|
||||||
const val movie123API = "https://api.123movie.cc"
|
|
||||||
const val movieHabAPI = "https://moviehab.com"
|
const val movieHabAPI = "https://moviehab.com"
|
||||||
const val databaseGdriveAPI = "https://databasegdriveplayer.co"
|
const val databaseGdriveAPI = "https://databasegdriveplayer.co"
|
||||||
const val hdMovieBoxAPI = "https://hdmoviebox.net"
|
const val hdMovieBoxAPI = "https://hdmoviebox.net"
|
||||||
|
@ -387,16 +385,6 @@ open class SoraStream : TmdbProvider() {
|
||||||
{
|
{
|
||||||
invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
invoke123Movie(
|
|
||||||
res.id,
|
|
||||||
res.imdbId,
|
|
||||||
res.season,
|
|
||||||
res.episode,
|
|
||||||
subtitleCallback,
|
|
||||||
callback
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
invokeMovieHab(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
invokeMovieHab(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||||
},
|
},
|
||||||
|
@ -817,6 +805,10 @@ open class SoraStream : TmdbProvider() {
|
||||||
{
|
{
|
||||||
if(!res.isAnime && res.season == null) invokeCryMovies(
|
if(!res.isAnime && res.season == null) invokeCryMovies(
|
||||||
res.imdbId,
|
res.imdbId,
|
||||||
|
res.title,
|
||||||
|
res.year,
|
||||||
|
res.season,
|
||||||
|
res.episode,
|
||||||
callback
|
callback
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package com.hexated
|
package com.hexated
|
||||||
|
|
||||||
import com.hexated.SoraExtractor.invoke123Movie
|
|
||||||
import com.hexated.SoraExtractor.invokeAnimes
|
import com.hexated.SoraExtractor.invokeAnimes
|
||||||
import com.hexated.SoraExtractor.invokeAsk4Movies
|
import com.hexated.SoraExtractor.invokeAsk4Movies
|
||||||
import com.hexated.SoraExtractor.invokeCrunchyroll
|
import com.hexated.SoraExtractor.invokeCrunchyroll
|
||||||
|
@ -93,16 +92,6 @@ class SoraStreamLite : SoraStream() {
|
||||||
{
|
{
|
||||||
invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
invoke123Movie(
|
|
||||||
res.id,
|
|
||||||
res.imdbId,
|
|
||||||
res.season,
|
|
||||||
res.episode,
|
|
||||||
subtitleCallback,
|
|
||||||
callback
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
invokeMovie123Net(
|
invokeMovie123Net(
|
||||||
res.title,
|
res.title,
|
||||||
|
|
|
@ -19,5 +19,6 @@ class SoraStreamPlugin: Plugin() {
|
||||||
registerExtractorAPI(Chillx())
|
registerExtractorAPI(Chillx())
|
||||||
registerExtractorAPI(Watchx())
|
registerExtractorAPI(Watchx())
|
||||||
registerExtractorAPI(StreamhideCom())
|
registerExtractorAPI(StreamhideCom())
|
||||||
|
registerExtractorAPI(Movhide())
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue