added vip sources to SoraExtractor

This commit is contained in:
hexated 2022-10-21 11:15:49 +07:00
parent 4095d90a1a
commit 3578908b86
3 changed files with 100 additions and 31 deletions

View file

@ -1,5 +1,5 @@
// use an integer for version numbers // use an integer for version numbers
version = 9 version = 10
cloudstream { cloudstream {

View file

@ -262,15 +262,69 @@ object SoraExtractor : SoraStream() {
} }
} }
// suspend fun invokeOpenvids( suspend fun invokeSoraVIP(
// id: Int? = null, id: Int? = null,
// season: Int? = null, season: Int? = null,
// episode: Int? = null, episode: Int? = null,
// subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
// callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
// ) { ) {
// val providerId = if (season == null) {
// } val url = "$mainServerAPI/movies/$id/?_data=routes/movies/\$movieId"
val data = app.get(url).parsedSafe<DetailVipResult>()?.detail
app.get(
"$mainServerAPI/api/provider?title=${data?.title ?: data?.name}&type=movie&origTitle=${data?.original_title ?: data?.original_name}&year=${
(data?.release_date ?: data?.first_air_date)?.substringBefore("-")
}&_data=routes/api/provider"
)
.parsedSafe<ProvidersResult>()?.provider?.first { it.provider == "Loklok" }?.id
} else {
val url = "$mainServerAPI/tv-shows/$id/?_data=routes/tv-shows/\$tvId"
val data = app.get(url).parsedSafe<DetailVipResult>()?.detail
app.get(
"$mainServerAPI/api/provider?title=${data?.title ?: data?.name}&type=tv&origTitle=${data?.original_title ?: data?.original_name}&year=${
(data?.release_date ?: data?.first_air_date)?.substringBefore("-")
}&season=$season&_data=routes/api/provider"
)
.parsedSafe<ProvidersResult>()?.provider?.first { it.provider == "Loklok" }?.id
}
val query = if (season == null) {
"$mainServerAPI/movies/$id/watch?provider=Loklok&id=$providerId&_data=routes/movies/\$movieId.watch"
} else {
"$mainServerAPI/tv-shows/$id/season/$season/episode/$episode?provider=Loklok&id=$providerId&_data=routes/tv-shows/\$tvId.season.\$seasonId.episode.\$episodeId"
}
val json = app.get(
query,
headers = mapOf("User-Agent" to RandomUserAgent.getRandomUserAgent())
).parsedSafe<LoadLinks>()
json?.sources?.map { source ->
callback.invoke(
ExtractorLink(
"${this.name} (VIP)",
"${this.name} (VIP)",
source.url ?: return@map null,
"$mainServerAPI/",
source.quality?.toIntOrNull() ?: Qualities.Unknown.value,
isM3u8 = source.isM3U8,
headers = mapOf("Origin" to mainServerAPI)
)
)
}
json?.subtitles?.map { sub ->
subtitleCallback.invoke(
SubtitleFile(
sub.lang.toString(),
sub.url ?: return@map null
)
)
}
}
suspend fun invokeGogo( suspend fun invokeGogo(
aniId: String? = null, aniId: String? = null,
@ -380,12 +434,3 @@ private data class MovieHabRes(
@JsonProperty("data") val data: MovieHabData? = null, @JsonProperty("data") val data: MovieHabData? = null,
) )
private data class Sources(
@JsonProperty("url") val url: String? = null,
@JsonProperty("quality") val quality: String? = null,
@JsonProperty("isM3U8") val isM3U8: Boolean = true,
)
private data class LoadLinks(
@JsonProperty("sources") val sources: ArrayList<Sources>? = arrayListOf(),
)

View file

@ -1,5 +1,6 @@
package com.hexated package com.hexated
import android.util.Log
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.hexated.RandomUserAgent.getRandomUserAgent import com.hexated.RandomUserAgent.getRandomUserAgent
import com.hexated.SoraExtractor.invoke123Movie import com.hexated.SoraExtractor.invoke123Movie
@ -8,12 +9,14 @@ import com.hexated.SoraExtractor.invokeGogo
import com.hexated.SoraExtractor.invokeLocalSources import com.hexated.SoraExtractor.invokeLocalSources
import com.hexated.SoraExtractor.invokeMovieHab import com.hexated.SoraExtractor.invokeMovieHab
import com.hexated.SoraExtractor.invokeOlgply import com.hexated.SoraExtractor.invokeOlgply
import com.hexated.SoraExtractor.invokeSoraVIP
import com.hexated.SoraExtractor.invokeTwoEmbed import com.hexated.SoraExtractor.invokeTwoEmbed
import com.hexated.SoraExtractor.invokeVidSrc import com.hexated.SoraExtractor.invokeVidSrc
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId
import com.lagradost.cloudstream3.metaproviders.TmdbProvider import com.lagradost.cloudstream3.metaproviders.TmdbProvider
import com.lagradost.cloudstream3.mvvm.safeApiCall
import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -26,7 +29,6 @@ open class SoraStream : TmdbProvider() {
override val hasDownloadSupport = true override val hasDownloadSupport = true
override val instantLinkLoading = true override val instantLinkLoading = true
override val useMetaLoadResponse = true override val useMetaLoadResponse = true
override val hasQuickSearch = true
override val supportedTypes = setOf( override val supportedTypes = setOf(
TvType.Movie, TvType.Movie,
TvType.TvSeries, TvType.TvSeries,
@ -121,8 +123,6 @@ open class SoraStream : TmdbProvider() {
} }
} }
override suspend fun quickSearch(query: String) = search(query)
override suspend fun search(query: String): List<SearchResponse> { override suspend fun search(query: String): List<SearchResponse> {
val searchResponse = mutableListOf<SearchResponse>() val searchResponse = mutableListOf<SearchResponse>()
@ -286,16 +286,10 @@ open class SoraStream : TmdbProvider() {
headers = mapOf("User-Agent" to getRandomUserAgent()) headers = mapOf("User-Agent" to getRandomUserAgent())
).parsedSafe<LoadLinks>() ).parsedSafe<LoadLinks>()
json?.subtitles?.map { sub ->
subtitleCallback.invoke(
SubtitleFile(
sub.lang.toString(),
sub.url ?: return@map null
)
)
}
argamap( argamap(
{
invokeSoraVIP(res.id, res.season, res.episode, subtitleCallback, callback)
},
{ {
if (json?.sources.isNullOrEmpty()) { if (json?.sources.isNullOrEmpty()) {
invokeLocalSources(referer, subtitleCallback, callback) invokeLocalSources(referer, subtitleCallback, callback)
@ -313,6 +307,14 @@ open class SoraStream : TmdbProvider() {
) )
) )
} }
json?.subtitles?.map { sub ->
subtitleCallback.invoke(
SubtitleFile(
sub.lang.toString(),
sub.url ?: return@map null
)
)
}
} }
}, },
{ {
@ -518,4 +520,26 @@ open class SoraStream : TmdbProvider() {
@JsonProperty("detail") val detail: DetailAnime? = null, @JsonProperty("detail") val detail: DetailAnime? = null,
) )
data class DetailVip(
@JsonProperty("title") val title: String? = null,
@JsonProperty("name") val name: String? = null,
@JsonProperty("original_title") val original_title: String? = null,
@JsonProperty("original_name") val original_name: String? = null,
@JsonProperty("release_date") val release_date: String? = null,
@JsonProperty("first_air_date") val first_air_date: String? = null,
)
data class DetailVipResult(
@JsonProperty("detail") val detail: DetailVip? = null,
)
data class Providers(
@JsonProperty("id") val id: String? = null,
@JsonProperty("provider") val provider: String? = null,
)
data class ProvidersResult(
@JsonProperty("provider") val provider: ArrayList<Providers>? = arrayListOf(),
)
} }