mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
sora: fix source
This commit is contained in:
parent
a47811680d
commit
0608e1f452
5 changed files with 74 additions and 130 deletions
|
@ -1,6 +1,19 @@
|
||||||
// use an integer for version numbers
|
import org.jetbrains.kotlin.konan.properties.Properties
|
||||||
version = 122
|
|
||||||
|
|
||||||
|
// use an integer for version numbers
|
||||||
|
version = 123
|
||||||
|
|
||||||
|
android {
|
||||||
|
defaultConfig {
|
||||||
|
val properties = Properties()
|
||||||
|
properties.load(project.rootProject.file("local.properties").inputStream())
|
||||||
|
|
||||||
|
buildConfigField("String", "SORA_API", "\"${properties.getProperty("SORA_API")}\"")
|
||||||
|
buildConfigField("String", "SORA_WEB", "\"${properties.getProperty("SORA_WEB")}\"")
|
||||||
|
buildConfigField("String", "CRY_API", "\"${properties.getProperty("CRY_API")}\"")
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cloudstream {
|
cloudstream {
|
||||||
language = "en"
|
language = "en"
|
||||||
|
|
|
@ -637,14 +637,7 @@ object SoraExtractor : SoraStream() {
|
||||||
subtitleCallback: (SubtitleFile) -> Unit,
|
subtitleCallback: (SubtitleFile) -> Unit,
|
||||||
callback: (ExtractorLink) -> Unit,
|
callback: (ExtractorLink) -> Unit,
|
||||||
) {
|
) {
|
||||||
val (id, type) = getSoraIdAndType(title, year, season) ?: return invokeSoraBackup(
|
val (id, type) = getSoraIdAndType(title, year, season) ?: return
|
||||||
title,
|
|
||||||
year,
|
|
||||||
season,
|
|
||||||
episode,
|
|
||||||
subtitleCallback,
|
|
||||||
callback
|
|
||||||
)
|
|
||||||
val json = fetchSoraEpisodes(id, type, episode) ?: return
|
val json = fetchSoraEpisodes(id, type, episode) ?: return
|
||||||
|
|
||||||
json.subtitlingList?.map { sub ->
|
json.subtitlingList?.map { sub ->
|
||||||
|
@ -656,9 +649,10 @@ object SoraExtractor : SoraStream() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(season == null) return
|
||||||
json.definitionList?.map { video ->
|
json.definitionList?.map { video ->
|
||||||
val media = app.get(
|
val media = app.get(
|
||||||
"$soraAPI/media/previewInfo?category=${type}&contentId=${id}&episodeId=${json.id}&definition=${video.code}",
|
"${BuildConfig.SORA_API}/movieDrama/getPlayInfo?category=${type}&contentId=${id}&episodeId=${json.id}&definition=${video.code}",
|
||||||
headers = soraHeaders,
|
headers = soraHeaders,
|
||||||
).parsedSafe<SorastreamResponse>()?.data
|
).parsedSafe<SorastreamResponse>()?.data
|
||||||
|
|
||||||
|
@ -667,7 +661,7 @@ object SoraExtractor : SoraStream() {
|
||||||
this.name,
|
this.name,
|
||||||
this.name,
|
this.name,
|
||||||
media?.mediaUrl ?: return@map null,
|
media?.mediaUrl ?: return@map null,
|
||||||
"",
|
"${BuildConfig.SORA_WEB}/",
|
||||||
getSoraQuality(media.currentDefinition ?: ""),
|
getSoraQuality(media.currentDefinition ?: ""),
|
||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
|
@ -675,75 +669,6 @@ object SoraExtractor : SoraStream() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun invokeSoraBackup(
|
|
||||||
title: String? = null,
|
|
||||||
year: Int? = null,
|
|
||||||
season: Int? = null,
|
|
||||||
episode: Int? = null,
|
|
||||||
subtitleCallback: (SubtitleFile) -> Unit,
|
|
||||||
callback: (ExtractorLink) -> Unit,
|
|
||||||
) {
|
|
||||||
val results =
|
|
||||||
app.get("$soraBackupAPI/api/search?keyword=$title")
|
|
||||||
.parsedSafe<ChillSearch>()?.data?.results
|
|
||||||
val media = if (results?.size == 1) {
|
|
||||||
results.firstOrNull()
|
|
||||||
} else {
|
|
||||||
results?.find {
|
|
||||||
when (season) {
|
|
||||||
null -> {
|
|
||||||
it.name.equals(
|
|
||||||
title,
|
|
||||||
true
|
|
||||||
) && it.releaseTime == "$year"
|
|
||||||
}
|
|
||||||
1 -> {
|
|
||||||
it.name.contains(
|
|
||||||
"$title",
|
|
||||||
true
|
|
||||||
) && (it.releaseTime == "$year" || it.name.contains("Season $season", true))
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
it.name.contains(Regex("(?i)$title\\s?($season|${season.toRomanNumeral()}|Season\\s$season)")) && it.releaseTime == "$year"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} ?: return
|
|
||||||
|
|
||||||
val episodeId =
|
|
||||||
app.get("$soraBackupAPI/api/detail?id=${media.id}&category=${media.domainType}")
|
|
||||||
.parsedSafe<Load>()?.data?.episodeVo?.find {
|
|
||||||
it.seriesNo == (episode ?: 0)
|
|
||||||
}?.id ?: return
|
|
||||||
|
|
||||||
val sources =
|
|
||||||
app.get("$soraBackupAPI/api/episode?id=${media.id}&category=${media.domainType}&episode=$episodeId")
|
|
||||||
.parsedSafe<ChillSources>()?.data
|
|
||||||
|
|
||||||
sources?.qualities?.map { source ->
|
|
||||||
callback.invoke(
|
|
||||||
ExtractorLink(
|
|
||||||
this.name,
|
|
||||||
this.name,
|
|
||||||
source.url ?: return@map null,
|
|
||||||
"",
|
|
||||||
source.quality ?: Qualities.Unknown.value,
|
|
||||||
true,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
sources?.subtitles?.map { sub ->
|
|
||||||
subtitleCallback.invoke(
|
|
||||||
SubtitleFile(
|
|
||||||
getVipLanguage(sub.lang ?: return@map),
|
|
||||||
sub.url?.substringAfter("?url=") ?: return@map
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun invokeXmovies(
|
suspend fun invokeXmovies(
|
||||||
title: String? = null,
|
title: String? = null,
|
||||||
year: Int? = null,
|
year: Int? = null,
|
||||||
|
@ -2967,7 +2892,7 @@ object SoraExtractor : SoraStream() {
|
||||||
episode: Int? = null,
|
episode: Int? = null,
|
||||||
callback: (ExtractorLink) -> Unit
|
callback: (ExtractorLink) -> Unit
|
||||||
) {
|
) {
|
||||||
app.get("$cryMoviesAPI/stream/movie/$imdbId.json")
|
app.get("${BuildConfig.CRY_API}/stream/movie/$imdbId.json")
|
||||||
.parsedSafe<CryMoviesResponse>()?.streams?.filter {
|
.parsedSafe<CryMoviesResponse>()?.streams?.filter {
|
||||||
matchingIndex(
|
matchingIndex(
|
||||||
it.title,
|
it.title,
|
||||||
|
@ -3365,41 +3290,6 @@ data class WatchOnlineResponse(
|
||||||
@JsonProperty("subtitles") val subtitles: Any? = null,
|
@JsonProperty("subtitles") val subtitles: Any? = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
data class ChillQualities(
|
|
||||||
@JsonProperty("quality") val quality: Int? = null,
|
|
||||||
@JsonProperty("url") val url: String? = null,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class ChillSubtitles(
|
|
||||||
@JsonProperty("lang") val lang: String? = null,
|
|
||||||
@JsonProperty("language") val language: String? = null,
|
|
||||||
@JsonProperty("url") val url: String? = null,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class ChillSource(
|
|
||||||
@JsonProperty("qualities") val qualities: ArrayList<ChillQualities>? = arrayListOf(),
|
|
||||||
@JsonProperty("subtitles") val subtitles: ArrayList<ChillSubtitles>? = arrayListOf(),
|
|
||||||
)
|
|
||||||
|
|
||||||
data class ChillSources(
|
|
||||||
@JsonProperty("data") val data: ChillSource? = null,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class ChillResults(
|
|
||||||
@JsonProperty("id") val id: String,
|
|
||||||
@JsonProperty("domainType") val domainType: Int,
|
|
||||||
@JsonProperty("name") val name: String,
|
|
||||||
@JsonProperty("releaseTime") val releaseTime: String,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class ChillData(
|
|
||||||
@JsonProperty("results") val results: ArrayList<ChillResults>? = arrayListOf(),
|
|
||||||
)
|
|
||||||
|
|
||||||
data class ChillSearch(
|
|
||||||
@JsonProperty("data") val data: ChillData? = null,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class PutlockerEpisodes(
|
data class PutlockerEpisodes(
|
||||||
@JsonProperty("html") val html: String? = null,
|
@JsonProperty("html") val html: String? = null,
|
||||||
)
|
)
|
||||||
|
|
|
@ -83,7 +83,8 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val gdbot = "https://gdbot.xyz"
|
const val gdbot = "https://gdbot.xyz"
|
||||||
const val consumetAnilistAPI = "https://api.consumet.org/meta/anilist"
|
const val consumetAnilistAPI = "https://api.consumet.org/meta/anilist"
|
||||||
|
|
||||||
private val apiKey = base64DecodeAPI("ZTM=NTg=MjM=MjM=ODc=MzI=OGQ=MmE=Nzk=Nzk=ZjI=NTA=NDY=NDA=MzA=YjA=") // PLEASE DON'T STEAL
|
private val apiKey =
|
||||||
|
base64DecodeAPI("ZTM=NTg=MjM=MjM=ODc=MzI=OGQ=MmE=Nzk=Nzk=ZjI=NTA=NDY=NDA=MzA=YjA=") // PLEASE DON'T STEAL
|
||||||
|
|
||||||
/** ALL SOURCES */
|
/** ALL SOURCES */
|
||||||
const val twoEmbedAPI = "https://www.2embed.to"
|
const val twoEmbedAPI = "https://www.2embed.to"
|
||||||
|
@ -120,12 +121,14 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val movie123NetAPI = "https://ww8.0123movie.net"
|
const val movie123NetAPI = "https://ww8.0123movie.net"
|
||||||
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
|
||||||
val gomoviesAPI = base64DecodeAPI("bQ==Y28=ZS4=aW4=bmw=LW8=ZXM=dmk=bW8=Z28=Ly8=czo=dHA=aHQ=")
|
val gomoviesAPI =
|
||||||
|
base64DecodeAPI("bQ==Y28=ZS4=aW4=bmw=LW8=ZXM=dmk=bW8=Z28=Ly8=czo=dHA=aHQ=")
|
||||||
const val ask4MoviesAPI = "https://ask4movie.mx"
|
const val ask4MoviesAPI = "https://ask4movie.mx"
|
||||||
const val biliBiliAPI = "https://api-vn.kaguya.app/server"
|
const val biliBiliAPI = "https://api-vn.kaguya.app/server"
|
||||||
const val watchOnlineAPI = "https://watchonline.ag"
|
const val watchOnlineAPI = "https://watchonline.ag"
|
||||||
const val nineTvAPI = "https://api.9animetv.live"
|
const val nineTvAPI = "https://api.9animetv.live"
|
||||||
const val putlockerAPI = "https://ww7.putlocker.vip"
|
const val putlockerAPI = "https://ww7.putlocker.vip"
|
||||||
|
|
||||||
// INDEX SITE
|
// INDEX SITE
|
||||||
const val baymoviesAPI = "https://opengatewayindex.pages.dev" // dead
|
const val baymoviesAPI = "https://opengatewayindex.pages.dev" // dead
|
||||||
const val chillmovies0API = "https://chill.aicirou.workers.dev/0:" // dead
|
const val chillmovies0API = "https://chill.aicirou.workers.dev/0:" // dead
|
||||||
|
@ -146,7 +149,6 @@ open class SoraStream : TmdbProvider() {
|
||||||
const val shinobiMovieAPI = "https://home.shinobicloud.cf/0:"
|
const val shinobiMovieAPI = "https://home.shinobicloud.cf/0:"
|
||||||
const val vitoenMovieAPI = "https://openmatte.vitoencodes.workers.dev/0:"
|
const val vitoenMovieAPI = "https://openmatte.vitoencodes.workers.dev/0:"
|
||||||
const val shivamhwAPI = "https://foogle.shivamhw.me"
|
const val shivamhwAPI = "https://foogle.shivamhw.me"
|
||||||
val cryMoviesAPI = base64DecodeAPI("ZXY=LmQ=cnM=a2U=b3I=Lnc=ZXI=ZGQ=bGE=cy0=b2I=YWM=Lmo=YWw=aW4=LWY=cm4=Ym8=cmU=Ly8=czo=dHA=aHQ=")
|
|
||||||
|
|
||||||
fun getType(t: String?): TvType {
|
fun getType(t: String?): TvType {
|
||||||
return when (t) {
|
return when (t) {
|
||||||
|
@ -429,7 +431,14 @@ open class SoraStream : TmdbProvider() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeSeries9(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
invokeSeries9(
|
||||||
|
res.title,
|
||||||
|
res.year,
|
||||||
|
res.season,
|
||||||
|
res.episode,
|
||||||
|
subtitleCallback,
|
||||||
|
callback
|
||||||
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeIdlix(
|
invokeIdlix(
|
||||||
|
@ -455,7 +464,13 @@ open class SoraStream : TmdbProvider() {
|
||||||
// )
|
// )
|
||||||
// },
|
// },
|
||||||
{
|
{
|
||||||
if (!res.isAnime) 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)
|
||||||
|
@ -471,7 +486,14 @@ open class SoraStream : TmdbProvider() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeFmovies(res.title, res.airedYear ?: res.year, res.season, res.episode, subtitleCallback, callback)
|
invokeFmovies(
|
||||||
|
res.title,
|
||||||
|
res.airedYear ?: res.year,
|
||||||
|
res.season,
|
||||||
|
res.episode,
|
||||||
|
subtitleCallback,
|
||||||
|
callback
|
||||||
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeKisskh(res.title, res.season, res.episode, subtitleCallback, callback)
|
invokeKisskh(res.title, res.season, res.episode, subtitleCallback, callback)
|
||||||
|
@ -624,7 +646,13 @@ open class SoraStream : TmdbProvider() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeNinetv(res.id, res.season, res.episode, subtitleCallback, callback)
|
if (!res.isAnime) invokeNinetv(
|
||||||
|
res.id,
|
||||||
|
res.season,
|
||||||
|
res.episode,
|
||||||
|
subtitleCallback,
|
||||||
|
callback
|
||||||
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeBlackmovies(
|
if (!res.isAnime) invokeBlackmovies(
|
||||||
|
@ -732,7 +760,13 @@ open class SoraStream : TmdbProvider() {
|
||||||
// if (!res.isAnime) invokeTgarMovies(res.title, res.year, res.season, res.episode, callback)
|
// if (!res.isAnime) invokeTgarMovies(res.title, res.year, res.season, res.episode, callback)
|
||||||
// },
|
// },
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeGdbotMovies(res.title, res.year, res.season, res.episode, callback)
|
if (!res.isAnime) invokeGdbotMovies(
|
||||||
|
res.title,
|
||||||
|
res.year,
|
||||||
|
res.season,
|
||||||
|
res.episode,
|
||||||
|
callback
|
||||||
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeJmdkhMovies(
|
if (!res.isAnime) invokeJmdkhMovies(
|
||||||
|
@ -779,7 +813,14 @@ open class SoraStream : TmdbProvider() {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeAsk4Movies(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
if (!res.isAnime) invokeAsk4Movies(
|
||||||
|
res.title,
|
||||||
|
res.year,
|
||||||
|
res.season,
|
||||||
|
res.episode,
|
||||||
|
subtitleCallback,
|
||||||
|
callback
|
||||||
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
invokeWatchOnline(
|
invokeWatchOnline(
|
||||||
|
|
|
@ -42,7 +42,6 @@ import kotlin.math.min
|
||||||
|
|
||||||
val soraAPI =
|
val soraAPI =
|
||||||
base64DecodeAPI("cA==YXA=cy8=Y20=di8=LnQ=b2s=a2w=bG8=aS4=YXA=ZS0=aWw=b2I=LW0=Z2E=Ly8=czo=dHA=aHQ=")
|
base64DecodeAPI("cA==YXA=cy8=Y20=di8=LnQ=b2s=a2w=bG8=aS4=YXA=ZS0=aWw=b2I=LW0=Z2E=Ly8=czo=dHA=aHQ=")
|
||||||
val soraBackupAPI = base64DecodeAPI("dHY=bC4=aWw=Y2g=c3Q=anU=MS4=b2s=a2w=bG8=Ly8=czo=dHA=aHQ=")
|
|
||||||
|
|
||||||
val soraHeaders = mapOf(
|
val soraHeaders = mapOf(
|
||||||
"lang" to "en",
|
"lang" to "en",
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import com.lagradost.cloudstream3.gradle.CloudstreamExtension
|
import com.lagradost.cloudstream3.gradle.CloudstreamExtension
|
||||||
import com.android.build.gradle.BaseExtension
|
import com.android.build.gradle.BaseExtension
|
||||||
|
//import org.jetbrains.kotlin.konan.properties.Properties
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
|
@ -51,7 +52,7 @@ subprojects {
|
||||||
// val properties = Properties()
|
// val properties = Properties()
|
||||||
// properties.load(project.rootProject.file("local.properties").inputStream())
|
// properties.load(project.rootProject.file("local.properties").inputStream())
|
||||||
//
|
//
|
||||||
// buildConfigField("String", "API_KEY", "\"${properties.getProperty("API_KEY")}\"")
|
// buildConfigField("String", "LOKLOK_API", "\"${properties.getProperty("LOKLOK_API")}\"")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue