mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
Merge branch 'master' into adityajd-patch-1
This commit is contained in:
commit
f11306ef91
13 changed files with 196 additions and 39 deletions
|
@ -1,5 +1,5 @@
|
||||||
// use an integer for version numbers
|
// use an integer for version numbers
|
||||||
version = 8
|
version = 9
|
||||||
|
|
||||||
|
|
||||||
cloudstream {
|
cloudstream {
|
||||||
|
|
|
@ -79,7 +79,7 @@ class Animasu : MainAPI() {
|
||||||
private fun Element.toSearchResult(): AnimeSearchResponse {
|
private fun Element.toSearchResult(): AnimeSearchResponse {
|
||||||
val href = getProperAnimeLink(fixUrlNull(this.selectFirst("a")?.attr("href")).toString())
|
val href = getProperAnimeLink(fixUrlNull(this.selectFirst("a")?.attr("href")).toString())
|
||||||
val title = this.select("div.tt").text().trim()
|
val title = this.select("div.tt").text().trim()
|
||||||
val posterUrl = fixUrlNull(this.selectFirst("img")?.attr("src"))
|
val posterUrl = fixUrlNull(this.selectFirst("img")?.getImageAttr())
|
||||||
val epNum = this.selectFirst("span.epx")?.text()?.filter { it.isDigit() }?.toIntOrNull()
|
val epNum = this.selectFirst("span.epx")?.text()?.filter { it.isDigit() }?.toIntOrNull()
|
||||||
return newAnimeSearchResponse(title, href, TvType.Anime) {
|
return newAnimeSearchResponse(title, href, TvType.Anime) {
|
||||||
this.posterUrl = posterUrl
|
this.posterUrl = posterUrl
|
||||||
|
@ -98,7 +98,7 @@ class Animasu : MainAPI() {
|
||||||
val document = app.get(url).document
|
val document = app.get(url).document
|
||||||
|
|
||||||
val title = document.selectFirst("div.infox h1")?.text().toString().replace("Sub Indo", "").trim()
|
val title = document.selectFirst("div.infox h1")?.text().toString().replace("Sub Indo", "").trim()
|
||||||
val poster = document.selectFirst("div.bigcontent img")?.attr("src")?.replace("\n", "")
|
val poster = document.selectFirst("div.bigcontent img")?.getImageAttr()
|
||||||
|
|
||||||
val table = document.selectFirst("div.infox div.spe")
|
val table = document.selectFirst("div.infox div.spe")
|
||||||
val type = getType(table?.selectFirst("span:contains(Jenis:)")?.ownText())
|
val type = getType(table?.selectFirst("span:contains(Jenis:)")?.ownText())
|
||||||
|
@ -179,4 +179,13 @@ class Animasu : MainAPI() {
|
||||||
?: Qualities.Unknown.value
|
?: Qualities.Unknown.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun Element.getImageAttr(): String? {
|
||||||
|
return when {
|
||||||
|
this.hasAttr("data-src") -> this.attr("abs:data-src")
|
||||||
|
this.hasAttr("data-lazy-src") -> this.attr("abs:data-lazy-src")
|
||||||
|
this.hasAttr("srcset") -> this.attr("abs:srcset").substringBefore(" ")
|
||||||
|
else -> this.attr("abs:src")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -12,5 +12,6 @@ class AnimasuPlugin: Plugin() {
|
||||||
registerMainAPI(Animasu())
|
registerMainAPI(Animasu())
|
||||||
registerExtractorAPI(Archivd())
|
registerExtractorAPI(Archivd())
|
||||||
registerExtractorAPI(Newuservideo())
|
registerExtractorAPI(Newuservideo())
|
||||||
|
registerExtractorAPI(Vidhidepro())
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@ package com.hexated
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
import com.lagradost.cloudstream3.SubtitleFile
|
import com.lagradost.cloudstream3.SubtitleFile
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.extractors.Filesim
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils
|
import com.lagradost.cloudstream3.utils.AppUtils
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorApi
|
import com.lagradost.cloudstream3.utils.ExtractorApi
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
|
@ -100,3 +101,8 @@ class Newuservideo : ExtractorApi() {
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Vidhidepro : Filesim() {
|
||||||
|
override val mainUrl = "https://vidhidepro.com"
|
||||||
|
override val name = "Vidhidepro"
|
||||||
|
}
|
|
@ -8,7 +8,6 @@ import com.lagradost.cloudstream3.*
|
||||||
class Pusatfilm : Gomov() {
|
class Pusatfilm : Gomov() {
|
||||||
override var mainUrl = "https://tv2.pusatfilm21.art"
|
override var mainUrl = "https://tv2.pusatfilm21.art"
|
||||||
override var name = "Pusatfilm"
|
override var name = "Pusatfilm"
|
||||||
|
|
||||||
override val mainPage = mainPageOf(
|
override val mainPage = mainPageOf(
|
||||||
"film-terbaru/page/%d/" to "Film Terbaru",
|
"film-terbaru/page/%d/" to "Film Terbaru",
|
||||||
"series-terbaru/page/%d/" to "Series Terbaru",
|
"series-terbaru/page/%d/" to "Series Terbaru",
|
||||||
|
|
|
@ -42,10 +42,7 @@ class Hdmovie2 : Movierulzhd() {
|
||||||
callback
|
callback
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
var document = app.get(data).document
|
val document = app.get(data).document
|
||||||
if (document.select("title").text() == "Just a moment...") {
|
|
||||||
document = app.get(data).document
|
|
||||||
}
|
|
||||||
val id = document.select("meta#dooplay-ajax-counter").attr("data-postid")
|
val id = document.select("meta#dooplay-ajax-counter").attr("data-postid")
|
||||||
val type = if (data.contains("/movies/")) "movie" else "tv"
|
val type = if (data.contains("/movies/")) "movie" else "tv"
|
||||||
|
|
||||||
|
|
|
@ -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 = 204
|
version = 205
|
||||||
|
|
||||||
android {
|
android {
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
|
|
@ -401,3 +401,8 @@ class Embedwish : Filesim() {
|
||||||
class Vidplay2 : Vidplay() {
|
class Vidplay2 : Vidplay() {
|
||||||
override val mainUrl = "https://vidplay.online"
|
override val mainUrl = "https://vidplay.online"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Flaswish : Filesim() {
|
||||||
|
override val name = "Flaswish"
|
||||||
|
override var mainUrl = "https://flaswish.com"
|
||||||
|
}
|
|
@ -236,6 +236,7 @@ object SoraExtractor : SoraStream() {
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun invokeMultimovies(
|
suspend fun invokeMultimovies(
|
||||||
|
apiUrl: String,
|
||||||
title: String? = null,
|
title: String? = null,
|
||||||
season: Int? = null,
|
season: Int? = null,
|
||||||
episode: Int? = null,
|
episode: Int? = null,
|
||||||
|
@ -244,11 +245,82 @@ object SoraExtractor : SoraStream() {
|
||||||
) {
|
) {
|
||||||
val fixTitle = title.createSlug()
|
val fixTitle = title.createSlug()
|
||||||
val url = if (season == null) {
|
val url = if (season == null) {
|
||||||
"$multimoviesAPI/movies/$fixTitle"
|
"$apiUrl/movies/$fixTitle"
|
||||||
} else {
|
} else {
|
||||||
"$multimoviesAPI/episodes/$fixTitle-${season}x${episode}"
|
"$apiUrl/episodes/$fixTitle-${season}x${episode}"
|
||||||
}
|
}
|
||||||
invokeWpmovies(null, url, subtitleCallback, callback)
|
val req = app.get(url)
|
||||||
|
val directUrl = getBaseUrl(req.url)
|
||||||
|
val iframe = req.document.selectFirst("div.pframe iframe")?.attr("src") ?: return
|
||||||
|
if(!iframe.contains("youtube")) {
|
||||||
|
loadExtractor(iframe, "$directUrl/", subtitleCallback) { link ->
|
||||||
|
if(link.quality == Qualities.Unknown.value) {
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
link.source,
|
||||||
|
link.name,
|
||||||
|
link.url,
|
||||||
|
link.referer,
|
||||||
|
Qualities.P1080.value,
|
||||||
|
link.type,
|
||||||
|
link.headers,
|
||||||
|
link.extractorData
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun invokeAoneroom(
|
||||||
|
title: String? = null,
|
||||||
|
year: Int? = null,
|
||||||
|
season: Int? = null,
|
||||||
|
episode: Int? = null,
|
||||||
|
subtitleCallback: (SubtitleFile) -> Unit,
|
||||||
|
callback: (ExtractorLink) -> Unit,
|
||||||
|
) {
|
||||||
|
val headers = mapOf(
|
||||||
|
"Authorization" to "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjcyODc3MjQ5OTg4MzA0NzM5NzYsInV0cCI6MSwiZXhwIjoxNzEwMzg4NzczLCJpYXQiOjE3MDI2MTI3NzN9.Myt-gVHfPfQFbFyRX3WXtiiwvRzDwBrXTEKy1l-GDRU"
|
||||||
|
)
|
||||||
|
val subjectId = app.post(
|
||||||
|
"$aoneroomAPI/wefeed-mobile-bff/subject-api/search", data = mapOf(
|
||||||
|
"page" to "1",
|
||||||
|
"perPage" to "10",
|
||||||
|
"keyword" to "$title",
|
||||||
|
"subjectType" to if (season == null) "1" else "2",
|
||||||
|
), headers = headers
|
||||||
|
).parsedSafe<AoneroomResponse>()?.data?.items?.find {
|
||||||
|
it.title.equals(title, true) && it.releaseDate?.substringBefore("-") == "$year"
|
||||||
|
}?.subjectId
|
||||||
|
|
||||||
|
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",
|
||||||
|
headers = headers
|
||||||
|
).parsedSafe<AoneroomResponse>()?.data?.list?.findLast {
|
||||||
|
it.se == (season ?: 0) && it.ep == (episode ?: 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
"Aoneroom",
|
||||||
|
"Aoneroom",
|
||||||
|
data?.resourceLink ?: return,
|
||||||
|
"",
|
||||||
|
data.resolution ?: Qualities.Unknown.value,
|
||||||
|
INFER_TYPE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
data.extCaptions?.map { sub ->
|
||||||
|
subtitleCallback.invoke(
|
||||||
|
SubtitleFile(
|
||||||
|
sub.lanName ?: return@map,
|
||||||
|
sub.url ?: return@map,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun invokeNetmovies(
|
suspend fun invokeNetmovies(
|
||||||
|
@ -733,15 +805,16 @@ object SoraExtractor : SoraStream() {
|
||||||
res.first().id to res.first().title
|
res.first().id to res.first().title
|
||||||
} else {
|
} else {
|
||||||
val data = res.find {
|
val data = res.find {
|
||||||
val slugTitle = it.title.createSlug()
|
val slugTitle = it.title.createSlug() ?: return
|
||||||
when {
|
when {
|
||||||
season == null -> slugTitle?.equals(slug) == true
|
season == null -> slugTitle == slug
|
||||||
lastSeason == 1 -> slugTitle?.contains(slug) == true
|
lastSeason == 1 -> slugTitle.contains(slug)
|
||||||
else -> slugTitle?.contains(slug) == true && it.title?.contains(
|
else -> (slugTitle.contains(slug) && it.title?.contains(
|
||||||
"Season $season", true
|
"Season $season",
|
||||||
) == true
|
true
|
||||||
}
|
) == true)
|
||||||
}
|
}
|
||||||
|
} ?: res.find { it.title.equals(title) }
|
||||||
data?.id to data?.title
|
data?.id to data?.title
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -974,7 +1047,7 @@ object SoraExtractor : SoraStream() {
|
||||||
val fixTitle = title.createSlug()
|
val fixTitle = title.createSlug()
|
||||||
val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode)
|
val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode)
|
||||||
|
|
||||||
val url = if(season == null) {
|
val url = if (season == null) {
|
||||||
"$uhdmoviesAPI/download-$fixTitle-$year"
|
"$uhdmoviesAPI/download-$fixTitle-$year"
|
||||||
} else {
|
} else {
|
||||||
"$uhdmoviesAPI/download-$fixTitle"
|
"$uhdmoviesAPI/download-$fixTitle"
|
||||||
|
@ -982,7 +1055,7 @@ object SoraExtractor : SoraStream() {
|
||||||
|
|
||||||
val detailDoc = app.get(url).document
|
val detailDoc = app.get(url).document
|
||||||
|
|
||||||
val iSelector = if(season == null) {
|
val iSelector = if (season == null) {
|
||||||
"div.entry-content p:has(:matches($year))"
|
"div.entry-content p:has(:matches($year))"
|
||||||
} else {
|
} else {
|
||||||
"div.entry-content p:has(:matches((?i)(?:S\\s*$seasonSlug|Season\\s*$seasonSlug)))"
|
"div.entry-content p:has(:matches((?i)(?:S\\s*$seasonSlug|Season\\s*$seasonSlug)))"
|
||||||
|
@ -1003,15 +1076,18 @@ object SoraExtractor : SoraStream() {
|
||||||
val driveReq = app.get(driveLink)
|
val driveReq = app.get(driveLink)
|
||||||
val driveRes = driveReq.document
|
val driveRes = driveReq.document
|
||||||
val bitLink = driveRes.select("a.btn.btn-outline-success").attr("href")
|
val bitLink = driveRes.select("a.btn.btn-outline-success").attr("href")
|
||||||
val insLink = driveRes.select("a.btn.btn-danger:contains(Instant Download)").attr("href")
|
val insLink =
|
||||||
|
driveRes.select("a.btn.btn-danger:contains(Instant Download)").attr("href")
|
||||||
val downloadLink = when {
|
val downloadLink = when {
|
||||||
insLink.isNotEmpty() -> extractInstantUHD(insLink)
|
insLink.isNotEmpty() -> extractInstantUHD(insLink)
|
||||||
driveRes.select("button.btn.btn-success").text()
|
driveRes.select("button.btn.btn-success").text()
|
||||||
.contains("Direct Download", true) -> extractDirectUHD(driveLink, driveReq)
|
.contains("Direct Download", true) -> extractDirectUHD(driveLink, driveReq)
|
||||||
|
|
||||||
bitLink.isNullOrEmpty() -> {
|
bitLink.isNullOrEmpty() -> {
|
||||||
val backupIframe = driveRes.select("a.btn.btn-outline-warning").attr("href")
|
val backupIframe = driveRes.select("a.btn.btn-outline-warning").attr("href")
|
||||||
extractBackupUHD(backupIframe ?: return@apmap)
|
extractBackupUHD(backupIframe ?: return@apmap)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
extractMirrorUHD(bitLink, base)
|
extractMirrorUHD(bitLink, base)
|
||||||
}
|
}
|
||||||
|
@ -1091,7 +1167,8 @@ object SoraExtractor : SoraStream() {
|
||||||
1 -> "Season 1"
|
1 -> "Season 1"
|
||||||
else -> "Season 1 – $lastSeason"
|
else -> "Season 1 – $lastSeason"
|
||||||
}
|
}
|
||||||
val media = res.selectFirst("div.blog-items article:has(h3.entry-title:matches((?i)$title.*$match)) a")
|
val media =
|
||||||
|
res.selectFirst("div.blog-items article:has(h3.entry-title:matches((?i)$title.*$match)) a")
|
||||||
?.attr("href")
|
?.attr("href")
|
||||||
|
|
||||||
res = app.get(media ?: return).document
|
res = app.get(media ?: return).document
|
||||||
|
@ -2070,8 +2147,8 @@ object SoraExtractor : SoraStream() {
|
||||||
"$blackvidAPI/v3/tv/sources/$tmdbId/$season/$episode?key=$key"
|
"$blackvidAPI/v3/tv/sources/$tmdbId/$season/$episode?key=$key"
|
||||||
}
|
}
|
||||||
|
|
||||||
val data = request(url,).peekBody(1024 * 512).source().buffer.readByteArray()
|
val res = request(url).peekBody(1024 * 512)
|
||||||
.decrypt("2378f8e4e844f2dc839ab48f66e00acc2305a401")
|
val data = res.source().buffer.readByteArray().decrypt("2378f8e4e844f2dc839ab48f66e00acc2305a401")
|
||||||
val json = tryParseJson<BlackvidResponses>(data)
|
val json = tryParseJson<BlackvidResponses>(data)
|
||||||
|
|
||||||
json?.sources?.map { source ->
|
json?.sources?.map { source ->
|
||||||
|
@ -2179,9 +2256,9 @@ object SoraExtractor : SoraStream() {
|
||||||
"$cinemaTvAPI/shows/play/$id-$slug-$year"
|
"$cinemaTvAPI/shows/play/$id-$slug-$year"
|
||||||
}
|
}
|
||||||
|
|
||||||
val specialCookies = "PHPSESSID=e555h63ilisoj2l6j7b5d4jb6p; _csrf=9597150e45f485ad9c4f2e06a2572534d8415337eda9d48d0ecfa25b73b6a9e1a%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%222HcnegjGB0nX205FAUPb86fqMx9HWIF1%22%3B%7D; _ga=GA1.1.1195498587.1701871187; _ga_VZD7HJ3WK6=GS1.1.$unixTime.4.0.1.$unixTime.0.0.0"
|
val session = "PHPSESSID=ngr4cudjrimdnhkth30ssohs0n; _csrf=a6ffd7bb7654083fce6df528225a238d0e85aa1fb885dc7638c1259ec1ba0d5ca%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22mTTLiDLjxohs-CpKk0bjRH3HdYMB9uBV%22%3B%7D; _ga=GA1.1.1195498587.1701871187; _ga_VZD7HJ3WK6=GS1.1.$unixTime.4.0.1.$unixTime.0.0.0"
|
||||||
val headers = mapOf(
|
val headers = mapOf(
|
||||||
"Cookie" to specialCookies,
|
"Cookie" to session,
|
||||||
"Connection" to "keep-alive",
|
"Connection" to "keep-alive",
|
||||||
"x-requested-with" to "XMLHttpRequest",
|
"x-requested-with" to "XMLHttpRequest",
|
||||||
)
|
)
|
||||||
|
|
|
@ -434,3 +434,31 @@ data class SmashyDSourcesUrls(
|
||||||
@JsonProperty("file") var file: String? = null,
|
@JsonProperty("file") var file: String? = null,
|
||||||
@JsonProperty("title") var title: String? = null,
|
@JsonProperty("title") var title: String? = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
data class AoneroomResponse(
|
||||||
|
@JsonProperty("data") val data: Data? = null,
|
||||||
|
) {
|
||||||
|
data class Data(
|
||||||
|
@JsonProperty("items") val items: ArrayList<Items>? = arrayListOf(),
|
||||||
|
@JsonProperty("list") val list: ArrayList<List>? = arrayListOf(),
|
||||||
|
) {
|
||||||
|
data class Items(
|
||||||
|
@JsonProperty("subjectId") val subjectId: String? = null,
|
||||||
|
@JsonProperty("title") val title: String? = null,
|
||||||
|
@JsonProperty("releaseDate") val releaseDate: String? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class List(
|
||||||
|
@JsonProperty("resourceLink") val resourceLink: String? = null,
|
||||||
|
@JsonProperty("extCaptions") val extCaptions: ArrayList<ExtCaptions>? = arrayListOf(),
|
||||||
|
@JsonProperty("se") val se: Int? = null,
|
||||||
|
@JsonProperty("ep") val ep: Int? = null,
|
||||||
|
@JsonProperty("resolution") val resolution: Int? = null,
|
||||||
|
) {
|
||||||
|
data class ExtCaptions(
|
||||||
|
@JsonProperty("lanName") val lanName: String? = null,
|
||||||
|
@JsonProperty("url") val url: String? = null,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,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.invokeAnimes
|
import com.hexated.SoraExtractor.invokeAnimes
|
||||||
|
import com.hexated.SoraExtractor.invokeAoneroom
|
||||||
import com.hexated.SoraExtractor.invokeBlackvid
|
import com.hexated.SoraExtractor.invokeBlackvid
|
||||||
import com.hexated.SoraExtractor.invokeBollyMaza
|
import com.hexated.SoraExtractor.invokeBollyMaza
|
||||||
import com.hexated.SoraExtractor.invokeDbgo
|
import com.hexated.SoraExtractor.invokeDbgo
|
||||||
|
@ -94,7 +95,7 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val flixonAPI = "https://flixon.lol"
|
const val flixonAPI = "https://flixon.lol"
|
||||||
const val smashyStreamAPI = "https://embed.smashystream.com"
|
const val smashyStreamAPI = "https://embed.smashystream.com"
|
||||||
const val watchSomuchAPI = "https://watchsomuch.tv" // sub only
|
const val watchSomuchAPI = "https://watchsomuch.tv" // sub only
|
||||||
var cinemaTvAPI = BuildConfig.CINEMATV_API
|
const val cinemaTvAPI = BuildConfig.CINEMATV_API
|
||||||
const val nineTvAPI = "https://moviesapi.club"
|
const val nineTvAPI = "https://moviesapi.club"
|
||||||
const val nowTvAPI = "https://myfilestorage.xyz"
|
const val nowTvAPI = "https://myfilestorage.xyz"
|
||||||
const val gokuAPI = "https://goku.sx"
|
const val gokuAPI = "https://goku.sx"
|
||||||
|
@ -102,7 +103,8 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val ridomoviesAPI = "https://ridomovies.pw"
|
const val ridomoviesAPI = "https://ridomovies.pw"
|
||||||
const val navyAPI = "https://navy-issue-i-239.site"
|
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.live"
|
const val multimoviesAPI = "https://multimovies.top"
|
||||||
|
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 momentAPI = "https://izzillent-dickstonyx-i-262.site"
|
||||||
const val doomoviesAPI = "https://doomovies.net"
|
const val doomoviesAPI = "https://doomovies.net"
|
||||||
|
@ -112,6 +114,7 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val watchflxAPI = "https://watchflx.tv"
|
const val watchflxAPI = "https://watchflx.tv"
|
||||||
const val blackvidAPI = "https://prod.api.blackvid.space"
|
const val blackvidAPI = "https://prod.api.blackvid.space"
|
||||||
const val showflixAPI = "https://showflix.space"
|
const val showflixAPI = "https://showflix.space"
|
||||||
|
const val aoneroomAPI = "https://api3.aoneroom.com"
|
||||||
|
|
||||||
const val fdMoviesAPI = "https://freedrivemovie.lol"
|
const val fdMoviesAPI = "https://freedrivemovie.lol"
|
||||||
const val uhdmoviesAPI = "https://uhdmovies.zip"
|
const val uhdmoviesAPI = "https://uhdmovies.zip"
|
||||||
|
@ -228,10 +231,12 @@ open class SoraStream : TmdbProvider() {
|
||||||
val year = releaseDate?.split("-")?.first()?.toIntOrNull()
|
val year = releaseDate?.split("-")?.first()?.toIntOrNull()
|
||||||
val rating = res.vote_average.toString().toRatingInt()
|
val rating = res.vote_average.toString().toRatingInt()
|
||||||
val genres = res.genres?.mapNotNull { it.name }
|
val genres = res.genres?.mapNotNull { it.name }
|
||||||
val isAnime =
|
|
||||||
genres?.contains("Animation") == true && (res.original_language == "zh" || res.original_language == "ja")
|
val isCartoon = genres?.contains("Animation") ?: false
|
||||||
|
val isAnime = isCartoon && (res.original_language == "zh" || res.original_language == "ja")
|
||||||
val isAsian = !isAnime && (res.original_language == "zh" || res.original_language == "ko")
|
val isAsian = !isAnime && (res.original_language == "zh" || res.original_language == "ko")
|
||||||
val isBollywood = res.production_countries?.any { it.name == "India" } ?: false
|
val isBollywood = res.production_countries?.any { it.name == "India" } ?: false
|
||||||
|
|
||||||
val keywords = res.keywords?.results?.mapNotNull { it.name }.orEmpty()
|
val keywords = res.keywords?.results?.mapNotNull { it.name }.orEmpty()
|
||||||
.ifEmpty { res.keywords?.keywords?.mapNotNull { it.name } }
|
.ifEmpty { res.keywords?.keywords?.mapNotNull { it.name } }
|
||||||
|
|
||||||
|
@ -274,7 +279,8 @@ open class SoraStream : TmdbProvider() {
|
||||||
date = season.airDate,
|
date = season.airDate,
|
||||||
airedDate = res.releaseDate ?: res.firstAirDate,
|
airedDate = res.releaseDate ?: res.firstAirDate,
|
||||||
isAsian = isAsian,
|
isAsian = isAsian,
|
||||||
isBollywood = isBollywood
|
isBollywood = isBollywood,
|
||||||
|
isCartoon = isCartoon
|
||||||
).toJson(),
|
).toJson(),
|
||||||
name = eps.name + if (isUpcoming(eps.airDate)) " - [UPCOMING]" else "",
|
name = eps.name + if (isUpcoming(eps.airDate)) " - [UPCOMING]" else "",
|
||||||
season = eps.seasonNumber,
|
season = eps.seasonNumber,
|
||||||
|
@ -391,6 +397,16 @@ open class SoraStream : TmdbProvider() {
|
||||||
{
|
{
|
||||||
invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback)
|
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) invokeAnimes(
|
if (res.isAnime) invokeAnimes(
|
||||||
res.title,
|
res.title,
|
||||||
|
@ -425,7 +441,7 @@ open class SoraStream : TmdbProvider() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeKimcartoon(
|
if (!res.isAnime && res.isCartoon) invokeKimcartoon(
|
||||||
res.title,
|
res.title,
|
||||||
res.season,
|
res.season,
|
||||||
res.episode,
|
res.episode,
|
||||||
|
@ -641,7 +657,10 @@ open class SoraStream : TmdbProvider() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeMultimovies(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)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeNetmovies(
|
invokeNetmovies(
|
||||||
|
@ -739,6 +758,7 @@ open class SoraStream : TmdbProvider() {
|
||||||
val airedDate: String? = null,
|
val airedDate: String? = null,
|
||||||
val isAsian: Boolean = false,
|
val isAsian: Boolean = false,
|
||||||
val isBollywood: Boolean = false,
|
val isBollywood: Boolean = false,
|
||||||
|
val isCartoon: Boolean = false,
|
||||||
)
|
)
|
||||||
|
|
||||||
data class Data(
|
data class Data(
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.hexated
|
||||||
|
|
||||||
import com.hexated.SoraExtractor.invoke2embed
|
import com.hexated.SoraExtractor.invoke2embed
|
||||||
import com.hexated.SoraExtractor.invokeAnimes
|
import com.hexated.SoraExtractor.invokeAnimes
|
||||||
|
import com.hexated.SoraExtractor.invokeAoneroom
|
||||||
import com.hexated.SoraExtractor.invokeBlackvid
|
import com.hexated.SoraExtractor.invokeBlackvid
|
||||||
import com.hexated.SoraExtractor.invokeDbgo
|
import com.hexated.SoraExtractor.invokeDbgo
|
||||||
import com.hexated.SoraExtractor.invokeDoomovies
|
import com.hexated.SoraExtractor.invokeDoomovies
|
||||||
|
@ -144,7 +145,7 @@ class SoraStreamLite : SoraStream() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeKimcartoon(
|
if (!res.isAnime && res.isCartoon) invokeKimcartoon(
|
||||||
res.title,
|
res.title,
|
||||||
res.season,
|
res.season,
|
||||||
res.episode,
|
res.episode,
|
||||||
|
@ -221,6 +222,16 @@ class SoraStreamLite : SoraStream() {
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeNowTv(res.id, res.imdbId, res.season, res.episode, 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
|
||||||
|
)
|
||||||
|
},
|
||||||
{
|
{
|
||||||
invokeNavy(res.imdbId, res.season, res.episode, callback)
|
invokeNavy(res.imdbId, res.season, res.episode, callback)
|
||||||
},
|
},
|
||||||
|
@ -242,7 +253,10 @@ class SoraStreamLite : SoraStream() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeMultimovies(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)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeNetmovies(
|
invokeNetmovies(
|
||||||
|
|
|
@ -29,5 +29,6 @@ class SoraStreamPlugin: Plugin() {
|
||||||
registerExtractorAPI(Uploadever())
|
registerExtractorAPI(Uploadever())
|
||||||
registerExtractorAPI(Netembed())
|
registerExtractorAPI(Netembed())
|
||||||
registerExtractorAPI(Vidplay2())
|
registerExtractorAPI(Vidplay2())
|
||||||
|
registerExtractorAPI(Flaswish())
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue