mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
sora: added mMovies & fix oploverz
This commit is contained in:
parent
2d23f05fa0
commit
29c78d2468
10 changed files with 1079 additions and 2486 deletions
|
@ -1,5 +1,5 @@
|
|||
// use an integer for version numbers
|
||||
version = 24
|
||||
version = 25
|
||||
|
||||
|
||||
cloudstream {
|
||||
|
|
|
@ -43,3 +43,38 @@ open class Qiwi : ExtractorApi() {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
open class Mediafire : ExtractorApi() {
|
||||
override val name = "Mediafire"
|
||||
override val mainUrl = "https://www.mediafire.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("div.dl-btn-label").text()
|
||||
val video = res.selectFirst("a#downloadButton")?.attr("href")
|
||||
|
||||
callback.invoke(
|
||||
ExtractorLink(
|
||||
this.name,
|
||||
this.name,
|
||||
video ?: return,
|
||||
"",
|
||||
getQuality(title),
|
||||
INFER_TYPE
|
||||
)
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
private fun getQuality(str: String?): Int {
|
||||
return Regex("(\\d{3,4})[pP]").find(str ?: "")?.groupValues?.getOrNull(1)?.toIntOrNull()
|
||||
?: Qualities.Unknown.value
|
||||
}
|
||||
|
||||
}
|
|
@ -7,7 +7,7 @@ import com.lagradost.cloudstream3.utils.*
|
|||
import org.jsoup.nodes.Element
|
||||
|
||||
class OploverzProvider : MainAPI() {
|
||||
override var mainUrl = "https://oploverz.red"
|
||||
override var mainUrl = "https://oploverz.life"
|
||||
override var name = "Oploverz"
|
||||
override val hasMainPage = true
|
||||
override var lang = "id"
|
||||
|
|
|
@ -11,5 +11,6 @@ class OploverzProviderPlugin: Plugin() {
|
|||
// All providers should be added in this manner. Please don't edit the providers list directly.
|
||||
registerMainAPI(OploverzProvider())
|
||||
registerExtractorAPI(Qiwi())
|
||||
registerExtractorAPI(Mediafire())
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
import org.jetbrains.kotlin.konan.properties.Properties
|
||||
|
||||
// use an integer for version numbers
|
||||
version = 211
|
||||
version = 212
|
||||
|
||||
android {
|
||||
defaultConfig {
|
||||
|
|
|
@ -339,13 +339,7 @@ open class Netembed : ExtractorApi() {
|
|||
val script = getAndUnpack(response.text)
|
||||
val m3u8 = Regex("((https:|http:)//.*\\.m3u8)").find(script)?.groupValues?.getOrNull(1) ?: return
|
||||
|
||||
if (!m3u8.startsWith("https://www.febbox.com")) {
|
||||
M3u8Helper.generateM3u8(
|
||||
this.name,
|
||||
m3u8,
|
||||
"$mainUrl/",
|
||||
).forEach(callback)
|
||||
}
|
||||
M3u8Helper.generateM3u8(this.name, m3u8, "$mainUrl/", ).forEach(callback)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -11,12 +11,6 @@ data class CrunchyrollAccessToken(
|
|||
val key_pair_id: String? = null,
|
||||
)
|
||||
|
||||
data class ShowboxMedia(
|
||||
val url: String,
|
||||
val title: String,
|
||||
val infor: String,
|
||||
val type: String,
|
||||
)
|
||||
data class FDMovieIFrame(
|
||||
val link: String,
|
||||
val quality: String,
|
||||
|
@ -24,32 +18,20 @@ data class FDMovieIFrame(
|
|||
val type: String,
|
||||
)
|
||||
|
||||
data class AniIds(
|
||||
var id: Int? = null,
|
||||
var idMal: Int? = null
|
||||
)
|
||||
data class AniIds(var id: Int? = null, var idMal: Int? = null)
|
||||
|
||||
data class TmdbDate(
|
||||
val today: String,
|
||||
val nextWeek: String,
|
||||
)
|
||||
|
||||
data class AniMedia(
|
||||
@JsonProperty("id") var id: Int? = null,
|
||||
@JsonProperty("idMal") var idMal: Int? = null
|
||||
)
|
||||
data class AniMedia(@JsonProperty("id") var id: Int? = null, @JsonProperty("idMal") var idMal: Int? = null)
|
||||
|
||||
data class AniPage(
|
||||
@JsonProperty("media") var media: java.util.ArrayList<AniMedia> = arrayListOf()
|
||||
)
|
||||
data class AniPage(@JsonProperty("media") var media: java.util.ArrayList<AniMedia> = arrayListOf())
|
||||
|
||||
data class AniData(
|
||||
@JsonProperty("Page") var Page: AniPage? = AniPage()
|
||||
)
|
||||
data class AniData(@JsonProperty("Page") var Page: AniPage? = AniPage())
|
||||
|
||||
data class AniSearch(
|
||||
@JsonProperty("data") var data: AniData? = AniData()
|
||||
)
|
||||
data class AniSearch(@JsonProperty("data") var data: AniData? = AniData())
|
||||
|
||||
data class GpressSources(
|
||||
@JsonProperty("src") val src: String,
|
||||
|
@ -203,17 +185,11 @@ data class AnilistExternalLinks(
|
|||
@JsonProperty("type") var type: String? = null,
|
||||
)
|
||||
|
||||
data class AnilistMedia(
|
||||
@JsonProperty("externalLinks") var externalLinks: ArrayList<AnilistExternalLinks> = arrayListOf()
|
||||
)
|
||||
data class AnilistMedia(@JsonProperty("externalLinks") var externalLinks: ArrayList<AnilistExternalLinks> = arrayListOf())
|
||||
|
||||
data class AnilistData(
|
||||
@JsonProperty("Media") var Media: AnilistMedia? = AnilistMedia()
|
||||
)
|
||||
data class AnilistData(@JsonProperty("Media") var Media: AnilistMedia? = AnilistMedia())
|
||||
|
||||
data class AnilistResponses(
|
||||
@JsonProperty("data") var data: AnilistData? = AnilistData()
|
||||
)
|
||||
data class AnilistResponses(@JsonProperty("data") var data: AnilistData? = AnilistData())
|
||||
|
||||
data class CrunchyrollToken(
|
||||
@JsonProperty("access_token") val accessToken: String? = null,
|
||||
|
@ -388,10 +364,7 @@ data class SFMoviesAttributes(
|
|||
@JsonProperty("contentId") var contentId: String? = null,
|
||||
)
|
||||
|
||||
data class SFMoviesData(
|
||||
@JsonProperty("id") var id: Int? = null,
|
||||
@JsonProperty("attributes") var attributes: SFMoviesAttributes? = SFMoviesAttributes()
|
||||
)
|
||||
data class SFMoviesData(@JsonProperty("id") var id: Int? = null, @JsonProperty("attributes") var attributes: SFMoviesAttributes? = SFMoviesAttributes())
|
||||
|
||||
data class SFMoviesSearch(
|
||||
@JsonProperty("data") var data: ArrayList<SFMoviesData>? = arrayListOf(),
|
||||
|
@ -461,18 +434,3 @@ data class AoneroomResponse(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class FebboxResponse(
|
||||
@JsonProperty("data") val data: Data? = null,
|
||||
) {
|
||||
data class Data(
|
||||
@JsonProperty("link") val link: String? = null,
|
||||
@JsonProperty("file_list") val file_list: ArrayList<FileList>? = arrayListOf(),
|
||||
) {
|
||||
data class FileList(
|
||||
@JsonProperty("fid") val fid: Long? = null,
|
||||
@JsonProperty("file_name") val file_name: String? = null,
|
||||
@JsonProperty("oss_fid") val oss_fid: Long? = null,
|
||||
)
|
||||
}
|
||||
}
|
|
@ -43,7 +43,7 @@ import com.hexated.SoraExtractor.invokeUhdmovies
|
|||
import com.hexated.SoraExtractor.invokeVegamovies
|
||||
import com.hexated.SoraExtractor.invokeVidsrcto
|
||||
import com.hexated.SoraExtractor.invokeCinemaTv
|
||||
import com.hexated.SoraExtractor.invokeFebbox
|
||||
import com.hexated.SoraExtractor.invokeMMovies
|
||||
import com.hexated.SoraExtractor.invokeOmovies
|
||||
import com.hexated.SoraExtractor.invokeWatchCartoon
|
||||
import com.hexated.SoraExtractor.invokeWatchsomuch
|
||||
|
@ -68,8 +68,8 @@ open class SoraStream : TmdbProvider() {
|
|||
TvType.Anime,
|
||||
)
|
||||
|
||||
val showboxInterceptor by lazy { CloudflareKiller() }
|
||||
val wpredisInterceptor by lazy { CloudflareKiller() }
|
||||
val multiInterceptor by lazy { CloudflareKiller() }
|
||||
|
||||
/** AUTHOR : Hexated & Sora */
|
||||
companion object {
|
||||
|
@ -114,10 +114,9 @@ open class SoraStream : TmdbProvider() {
|
|||
const val vidsrctoAPI = "https://vidsrc.to"
|
||||
const val dramadayAPI = "https://dramaday.me"
|
||||
const val animetoshoAPI = "https://animetosho.org"
|
||||
const val watchflxAPI = "https://watchflx.tv"
|
||||
const val showflixAPI = "https://showflix.space"
|
||||
const val aoneroomAPI = "https://api3.aoneroom.com"
|
||||
const val febboxAPI = "https://www.febbox.com"
|
||||
const val mMoviesAPI = "https://multimovies.uno"
|
||||
const val watchCartoonAPI = "https://www1.watchcartoononline.bz"
|
||||
|
||||
const val fdMoviesAPI = "https://freedrivemovie.com"
|
||||
|
@ -180,16 +179,10 @@ open class SoraStream : TmdbProvider() {
|
|||
return if (link.startsWith("/")) "https://image.tmdb.org/t/p/original/$link" else link
|
||||
}
|
||||
|
||||
override suspend fun getMainPage(
|
||||
page: Int,
|
||||
request: MainPageRequest
|
||||
): HomePageResponse {
|
||||
val adultQuery =
|
||||
if (settingsForProvider.enableAdult) "" else "&without_keywords=190370|13059|226161|195669"
|
||||
override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse {
|
||||
val adultQuery = if (settingsForProvider.enableAdult) "" else "&without_keywords=190370|13059|226161|195669"
|
||||
val type = if (request.data.contains("/movie")) "movie" else "tv"
|
||||
val home = app.get("${request.data}$adultQuery&page=$page")
|
||||
.parsedSafe<Results>()?.results
|
||||
?.mapNotNull { media ->
|
||||
val home = app.get("${request.data}$adultQuery&page=$page").parsedSafe<Results>()?.results?.mapNotNull { media ->
|
||||
media.toSearchResponse(type)
|
||||
} ?: throw ErrorLoadingException("Invalid Json reponse")
|
||||
return newHomePageResponse(request.name, home)
|
||||
|
@ -208,9 +201,7 @@ open class SoraStream : TmdbProvider() {
|
|||
override suspend fun quickSearch(query: String): List<SearchResponse>? = search(query)
|
||||
|
||||
override suspend fun search(query: String): List<SearchResponse>? {
|
||||
return app.get(
|
||||
"$tmdbAPI/search/multi?api_key=$apiKey&language=en-US&query=$query&page=1&include_adult=${settingsForProvider.enableAdult}"
|
||||
).parsedSafe<Results>()?.results?.mapNotNull { media ->
|
||||
return app.get("$tmdbAPI/search/multi?api_key=$apiKey&language=en-US&query=$query&page=1&include_adult=${settingsForProvider.enableAdult}").parsedSafe<Results>()?.results?.mapNotNull { media ->
|
||||
media.toSearchResponse()
|
||||
}
|
||||
}
|
||||
|
@ -241,68 +232,27 @@ open class SoraStream : TmdbProvider() {
|
|||
val isAsian = !isAnime && (res.original_language == "zh" || res.original_language == "ko")
|
||||
val isBollywood = res.production_countries?.any { it.name == "India" } ?: false
|
||||
|
||||
val keywords = res.keywords?.results?.mapNotNull { it.name }.orEmpty()
|
||||
.ifEmpty { res.keywords?.keywords?.mapNotNull { it.name } }
|
||||
val keywords = res.keywords?.results?.mapNotNull { it.name }.orEmpty().ifEmpty { res.keywords?.keywords?.mapNotNull { it.name } }
|
||||
|
||||
val actors = res.credits?.cast?.mapNotNull { cast ->
|
||||
ActorData(
|
||||
Actor(
|
||||
cast.name ?: cast.originalName ?: return@mapNotNull null,
|
||||
getImageUrl(cast.profilePath)
|
||||
),
|
||||
roleString = cast.character
|
||||
)
|
||||
ActorData(Actor(cast.name ?: cast.originalName
|
||||
?: return@mapNotNull null, getImageUrl(cast.profilePath)), roleString = cast.character)
|
||||
} ?: return null
|
||||
val recommendations =
|
||||
res.recommendations?.results?.mapNotNull { media -> media.toSearchResponse() }
|
||||
val recommendations = res.recommendations?.results?.mapNotNull { media -> media.toSearchResponse() }
|
||||
|
||||
val trailer = res.videos?.results?.map { "https://www.youtube.com/watch?v=${it.key}" }
|
||||
?.randomOrNull()
|
||||
val trailer = res.videos?.results?.map { "https://www.youtube.com/watch?v=${it.key}" }?.randomOrNull()
|
||||
|
||||
return if (type == TvType.TvSeries) {
|
||||
val lastSeason = res.last_episode_to_air?.season_number
|
||||
val episodes = res.seasons?.mapNotNull { season ->
|
||||
app.get("$tmdbAPI/${data.type}/${data.id}/season/${season.seasonNumber}?api_key=$apiKey")
|
||||
.parsedSafe<MediaDetailEpisodes>()?.episodes?.map { eps ->
|
||||
Episode(
|
||||
LinkData(
|
||||
data.id,
|
||||
res.external_ids?.imdb_id,
|
||||
res.external_ids?.tvdb_id,
|
||||
data.type,
|
||||
eps.seasonNumber,
|
||||
eps.episodeNumber,
|
||||
title = title,
|
||||
year = season.airDate?.split("-")?.first()?.toIntOrNull(),
|
||||
orgTitle = orgTitle,
|
||||
isAnime = isAnime,
|
||||
airedYear = year,
|
||||
lastSeason = lastSeason,
|
||||
epsTitle = eps.name,
|
||||
jpTitle = res.alternative_titles?.results?.find { it.iso_3166_1 == "JP" }?.title,
|
||||
date = season.airDate,
|
||||
airedDate = res.releaseDate ?: res.firstAirDate,
|
||||
isAsian = isAsian,
|
||||
isBollywood = isBollywood,
|
||||
isCartoon = isCartoon
|
||||
).toJson(),
|
||||
name = eps.name + if (isUpcoming(eps.airDate)) " - [UPCOMING]" else "",
|
||||
season = eps.seasonNumber,
|
||||
episode = eps.episodeNumber,
|
||||
posterUrl = getImageUrl(eps.stillPath),
|
||||
rating = eps.voteAverage?.times(10)?.roundToInt(),
|
||||
description = eps.overview
|
||||
).apply {
|
||||
app.get("$tmdbAPI/${data.type}/${data.id}/season/${season.seasonNumber}?api_key=$apiKey").parsedSafe<MediaDetailEpisodes>()?.episodes?.map { eps ->
|
||||
Episode(LinkData(data.id, res.external_ids?.imdb_id, res.external_ids?.tvdb_id, data.type, eps.seasonNumber, eps.episodeNumber, title = title, year = season.airDate?.split("-")?.first()?.toIntOrNull(), orgTitle = orgTitle, isAnime = isAnime, airedYear = year, lastSeason = lastSeason, epsTitle = eps.name, jpTitle = res.alternative_titles?.results?.find { it.iso_3166_1 == "JP" }?.title, date = season.airDate, airedDate = res.releaseDate
|
||||
?: res.firstAirDate, isAsian = isAsian, isBollywood = isBollywood, isCartoon = isCartoon).toJson(), name = eps.name + if (isUpcoming(eps.airDate)) " - [UPCOMING]" else "", season = eps.seasonNumber, episode = eps.episodeNumber, posterUrl = getImageUrl(eps.stillPath), rating = eps.voteAverage?.times(10)?.roundToInt(), description = eps.overview).apply {
|
||||
this.addDate(eps.airDate)
|
||||
}
|
||||
}
|
||||
}?.flatten() ?: listOf()
|
||||
newTvSeriesLoadResponse(
|
||||
title,
|
||||
url,
|
||||
if (isAnime) TvType.Anime else TvType.TvSeries,
|
||||
episodes
|
||||
) {
|
||||
newTvSeriesLoadResponse(title, url, if (isAnime) TvType.Anime else TvType.TvSeries, episodes) {
|
||||
this.posterUrl = poster
|
||||
this.backgroundPosterUrl = bgPoster
|
||||
this.year = year
|
||||
|
@ -322,20 +272,8 @@ open class SoraStream : TmdbProvider() {
|
|||
title,
|
||||
url,
|
||||
TvType.Movie,
|
||||
LinkData(
|
||||
data.id,
|
||||
res.external_ids?.imdb_id,
|
||||
res.external_ids?.tvdb_id,
|
||||
data.type,
|
||||
title = title,
|
||||
year = year,
|
||||
orgTitle = orgTitle,
|
||||
isAnime = isAnime,
|
||||
jpTitle = res.alternative_titles?.results?.find { it.iso_3166_1 == "JP" }?.title,
|
||||
airedDate = res.releaseDate ?: res.firstAirDate,
|
||||
isAsian = isAsian,
|
||||
isBollywood = isBollywood
|
||||
).toJson(),
|
||||
LinkData(data.id, res.external_ids?.imdb_id, res.external_ids?.tvdb_id, data.type, title = title, year = year, orgTitle = orgTitle, isAnime = isAnime, jpTitle = res.alternative_titles?.results?.find { it.iso_3166_1 == "JP" }?.title, airedDate = res.releaseDate
|
||||
?: res.firstAirDate, isAsian = isAsian, isBollywood = isBollywood).toJson(),
|
||||
) {
|
||||
this.posterUrl = poster
|
||||
this.backgroundPosterUrl = bgPoster
|
||||
|
@ -355,46 +293,16 @@ open class SoraStream : TmdbProvider() {
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun loadLinks(
|
||||
data: String,
|
||||
isCasting: Boolean,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
): Boolean {
|
||||
override suspend fun loadLinks(data: String, isCasting: Boolean, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit): Boolean {
|
||||
|
||||
val res = parseJson<LinkData>(data)
|
||||
|
||||
argamap(
|
||||
// {
|
||||
// invokeFebbox(
|
||||
// res.title,
|
||||
// res.year,
|
||||
// res.season,
|
||||
// res.lastSeason,
|
||||
// res.episode,
|
||||
// callback
|
||||
// )
|
||||
// },
|
||||
{
|
||||
invokeDumpStream(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeDumpStream(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeGoku(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.lastSeason,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeGoku(res.title, res.year, res.season, res.lastSeason, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeVidSrc(res.id, res.season, res.episode, callback)
|
||||
|
@ -403,347 +311,136 @@ open class SoraStream : TmdbProvider() {
|
|||
invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeAoneroom(
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeAoneroom(res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (res.isAnime) invokeAnimes(
|
||||
res.title,
|
||||
res.epsTitle,
|
||||
res.date,
|
||||
res.airedDate,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (res.isAnime) invokeAnimes(res.title, res.epsTitle, res.date, res.airedDate, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeDreamfilm(
|
||||
res.title,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeDreamfilm(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
// {
|
||||
// invokeNoverse(res.title, res.season, res.episode, callback)
|
||||
// },
|
||||
{
|
||||
if (!res.isAnime) invokeFilmxy(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeFilmxy(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.isCartoon) invokeKimcartoon(
|
||||
res.title,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.isCartoon) invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.isCartoon) invokeWatchCartoon(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.isCartoon) invokeWatchCartoon(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeVidsrcto(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeVidsrcto(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (res.isAsian || res.isAnime) invokeKisskh(
|
||||
res.title,
|
||||
res.season,
|
||||
res.episode,
|
||||
res.isAnime,
|
||||
res.lastSeason,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (res.isAsian || res.isAnime) invokeKisskh(res.title, res.season, res.episode, res.isAnime, res.lastSeason, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeOmovies (
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeOmovies(res.title, res.year, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeLing(
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeLing(res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeUhdmovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeUhdmovies(res.title, res.year, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeGMovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeGMovies(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeFDMovies(
|
||||
res.title,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeFDMovies(res.title, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeM4uhd(
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeM4uhd(res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeTvMovies(res.title, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeMoviezAdd(
|
||||
moviezAddAPI,
|
||||
"MoviezAdd",
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeMoviezAdd(moviezAddAPI, "MoviezAdd", res.title, res.year, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.isBollywood) invokeBollyMaza(
|
||||
bollyMazaAPI,
|
||||
"BollyMaza",
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.isBollywood) invokeBollyMaza(bollyMazaAPI, "BollyMaza", res.title, res.year, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeRStream(res.id, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeFlixon(
|
||||
res.id,
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeFlixon(res.id, res.imdbId, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeSmashyStream(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeSmashyStream(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeWatchsomuch(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback
|
||||
)
|
||||
if (!res.isAnime) invokeWatchsomuch(res.imdbId, res.season, res.episode, subtitleCallback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeNinetv(
|
||||
res.id,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeNinetv(res.id, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeDahmerMovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
invokeDahmerMovies(res.title, res.year, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
invokeCinemaTv(
|
||||
res.imdbId,
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeCinemaTv(res.imdbId, res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
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, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeAllMovieland(res.imdbId, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeEmovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeEmovies(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeVegamovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.lastSeason,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeVegamovies(res.title, res.year, res.season, res.lastSeason, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.isBollywood) invokeDotmovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.lastSeason,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.isBollywood) invokeDotmovies(res.title, res.year, res.season, res.lastSeason, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if(res.isBollywood) invokeMultimovies(multimoviesAPI, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
if (res.isBollywood) invokeMultimovies(multimoviesAPI, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if(res.isBollywood) invokeMultimovies(multimovies2API, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
if (res.isBollywood) invokeMultimovies(multimovies2API, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeNetmovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeNetmovies(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.season == null) invokeDoomovies(
|
||||
res.title,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.season == null) invokeDoomovies(res.title, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (res.isAsian) invokeDramaday(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (res.isAsian) invokeDramaday(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invoke2embed(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeHdmovies4u(
|
||||
res.title,
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeHdmovies4u(res.title, res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeZshow(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeZshow(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeShowflix(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeShowflix(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeSFMovies(
|
||||
res.id,
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
}
|
||||
if (!res.isAnime) invokeSFMovies(res.id, res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
invokeMMovies(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
)
|
||||
|
||||
return true
|
||||
|
|
|
@ -29,7 +29,7 @@ import com.hexated.SoraExtractor.invokeShowflix
|
|||
import com.hexated.SoraExtractor.invokeVidSrc
|
||||
import com.hexated.SoraExtractor.invokeVidsrcto
|
||||
import com.hexated.SoraExtractor.invokeCinemaTv
|
||||
import com.hexated.SoraExtractor.invokeFebbox
|
||||
import com.hexated.SoraExtractor.invokeMMovies
|
||||
import com.hexated.SoraExtractor.invokeOmovies
|
||||
import com.hexated.SoraExtractor.invokeWatchCartoon
|
||||
import com.hexated.SoraExtractor.invokeWatchsomuch
|
||||
|
@ -42,63 +42,22 @@ import com.lagradost.cloudstream3.utils.ExtractorLink
|
|||
class SoraStreamLite : SoraStream() {
|
||||
override var name = "SoraStream-Lite"
|
||||
|
||||
override suspend fun loadLinks(
|
||||
data: String,
|
||||
isCasting: Boolean,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
): Boolean {
|
||||
override suspend fun loadLinks(data: String, isCasting: Boolean, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit): Boolean {
|
||||
|
||||
val res = AppUtils.parseJson<LinkData>(data)
|
||||
|
||||
argamap(
|
||||
// {
|
||||
// invokeFebbox(
|
||||
// res.title,
|
||||
// res.year,
|
||||
// res.season,
|
||||
// res.lastSeason,
|
||||
// res.episode,
|
||||
// callback
|
||||
// )
|
||||
// },
|
||||
{
|
||||
if (!res.isAnime) invokeWatchsomuch(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback
|
||||
)
|
||||
if (!res.isAnime) invokeWatchsomuch(res.imdbId, res.season, res.episode, subtitleCallback)
|
||||
},
|
||||
{
|
||||
invokeDumpStream(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeDumpStream(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeNinetv(
|
||||
res.id,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeNinetv(res.id, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeGoku(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.lastSeason,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeGoku(res.title, res.year, res.season, res.lastSeason, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeVidSrc(res.id, res.season, res.episode, callback)
|
||||
|
@ -107,111 +66,39 @@ class SoraStreamLite : SoraStream() {
|
|||
invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.isCartoon) invokeWatchCartoon(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.isCartoon) invokeWatchCartoon(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (res.isAnime) invokeAnimes(
|
||||
res.title,
|
||||
res.epsTitle,
|
||||
res.date,
|
||||
res.airedDate,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (res.isAnime) invokeAnimes(res.title, res.epsTitle, res.date, res.airedDate, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeDreamfilm(
|
||||
res.title,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeDreamfilm(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeFilmxy(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeFilmxy(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeOmovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeOmovies(res.title, res.year, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.isCartoon) invokeKimcartoon(
|
||||
res.title,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.isCartoon) invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeSmashyStream(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeSmashyStream(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeVidsrcto(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeVidsrcto(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (res.isAsian || res.isAnime) invokeKisskh(
|
||||
res.title,
|
||||
res.season,
|
||||
res.episode,
|
||||
res.isAnime,
|
||||
res.lastSeason,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (res.isAsian || res.isAnime) invokeKisskh(res.title, res.season, res.episode, res.isAnime, res.lastSeason, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeLing(
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeLing(res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if(!res.isAnime) invokeM4uhd(
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeM4uhd(res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeRStream(res.id, res.season, res.episode, callback)
|
||||
|
@ -220,121 +107,56 @@ class SoraStreamLite : SoraStream() {
|
|||
if (!res.isAnime) invokeFlixon(res.id, res.imdbId, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
invokeCinemaTv(
|
||||
res.imdbId,
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeCinemaTv(res.imdbId, res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeNowTv(res.id, res.imdbId, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeAoneroom(
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeAoneroom(res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.season == null) invokeRidomovies(
|
||||
res.id,
|
||||
res.imdbId,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.season == null) invokeRidomovies(res.id, res.imdbId, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeEmovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeEmovies(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if(res.isBollywood) invokeMultimovies(multimoviesAPI, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
if (res.isBollywood) invokeMultimovies(multimoviesAPI, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if(res.isBollywood) invokeMultimovies(multimovies2API, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
if (res.isBollywood) invokeMultimovies(multimovies2API, res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeNetmovies(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeNetmovies(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeAllMovieland(res.imdbId, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime && res.season == null) invokeDoomovies(
|
||||
res.title,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime && res.season == null) invokeDoomovies(res.title, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if(res.isAsian) invokeDramaday(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (res.isAsian) invokeDramaday(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if(!res.isAnime) invoke2embed(
|
||||
res.imdbId,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invoke2embed(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
invokeZshow(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
invokeZshow(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if (!res.isAnime) invokeShowflix(
|
||||
res.title,
|
||||
res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
subtitleCallback,
|
||||
callback
|
||||
)
|
||||
if (!res.isAnime) invokeShowflix(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
{
|
||||
if(!res.isAnime) invokeSFMovies(
|
||||
res.id,
|
||||
res.title,
|
||||
res.airedYear ?: res.year,
|
||||
res.season,
|
||||
res.episode,
|
||||
callback
|
||||
)
|
||||
}
|
||||
if (!res.isAnime) invokeSFMovies(res.id, res.title, res.airedYear
|
||||
?: res.year, res.season, res.episode, callback)
|
||||
},
|
||||
{
|
||||
invokeMMovies(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||
},
|
||||
)
|
||||
|
||||
return true
|
||||
|
|
Loading…
Reference in a new issue