forked from recloudstream/cloudstream
Fixed seasons in SuperStream, removed nsfw and fixed tags
This commit is contained in:
parent
b07a5253e6
commit
93c62a0298
2 changed files with 30 additions and 12 deletions
|
@ -167,6 +167,10 @@ object APIHolder {
|
||||||
apiMap = null
|
apiMap = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun String.capitalize(): String {
|
||||||
|
return this.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
|
||||||
|
}
|
||||||
|
|
||||||
var apis: List<MainAPI> = arrayListOf()
|
var apis: List<MainAPI> = arrayListOf()
|
||||||
var apiMap: Map<String, Int>? = null
|
var apiMap: Map<String, Int>? = null
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.lagradost.cloudstream3.movieproviders
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.APIHolder.capitalize
|
||||||
import com.lagradost.cloudstream3.APIHolder.unixTime
|
import com.lagradost.cloudstream3.APIHolder.unixTime
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addImdbId
|
import com.lagradost.cloudstream3.LoadResponse.Companion.addImdbId
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||||
|
@ -34,6 +35,9 @@ class SuperStream : MainAPI() {
|
||||||
TvType.AnimeMovie,
|
TvType.AnimeMovie,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// 0 to get nsfw
|
||||||
|
private val hideNsfw = 1
|
||||||
|
|
||||||
override val instantLinkLoading = true
|
override val instantLinkLoading = true
|
||||||
|
|
||||||
val headers = mapOf(
|
val headers = mapOf(
|
||||||
|
@ -214,7 +218,7 @@ class SuperStream : MainAPI() {
|
||||||
|
|
||||||
override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse {
|
override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse {
|
||||||
val json = queryApi(
|
val json = queryApi(
|
||||||
"""{"childmode":"0","app_version":"11.5","appid":"$appId","module":"Home_list_type_v2","channel":"Website","page":"$page","lang":"en","type":"all","pagelimit":"10","expired_date":"${getExpiryDate()}","platform":"android"}
|
"""{"childmode":"$hideNsfw","app_version":"11.5","appid":"$appId","module":"Home_list_type_v2","channel":"Website","page":"$page","lang":"en","type":"all","pagelimit":"10","expired_date":"${getExpiryDate()}","platform":"android"}
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
).text
|
).text
|
||||||
|
|
||||||
|
@ -261,7 +265,7 @@ class SuperStream : MainAPI() {
|
||||||
|
|
||||||
val apiQuery =
|
val apiQuery =
|
||||||
// Originally 8 pagelimit
|
// Originally 8 pagelimit
|
||||||
"""{"childmode":"0","app_version":"11.5","appid":"$appId","module":"Search3","channel":"Website","page":"1","lang":"en","type":"all","keyword":"$query","pagelimit":"20","expired_date":"${getExpiryDate()}","platform":"android"}"""
|
"""{"childmode":"$hideNsfw","app_version":"11.5","appid":"$appId","module":"Search3","channel":"Website","page":"1","lang":"en","type":"all","keyword":"$query","pagelimit":"20","expired_date":"${getExpiryDate()}","platform":"android"}"""
|
||||||
val searchResponse = parseJson<MainData>(queryApi(apiQuery).text).data.mapNotNull {
|
val searchResponse = parseJson<MainData>(queryApi(apiQuery).text).data.mapNotNull {
|
||||||
val type = if (it.boxType == 1) TvType.Movie else TvType.TvSeries
|
val type = if (it.boxType == 1) TvType.Movie else TvType.TvSeries
|
||||||
newMovieSearchResponse(
|
newMovieSearchResponse(
|
||||||
|
@ -273,7 +277,6 @@ class SuperStream : MainAPI() {
|
||||||
posterUrl = it.posterOrg ?: it.poster
|
posterUrl = it.posterOrg ?: it.poster
|
||||||
year = it.year
|
year = it.year
|
||||||
quality = getQualityFromString(it.qualityTag?.replace("-", "") ?: "")
|
quality = getQualityFromString(it.qualityTag?.replace("-", "") ?: "")
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return searchResponse
|
return searchResponse
|
||||||
|
@ -319,6 +322,11 @@ class SuperStream : MainAPI() {
|
||||||
@JsonProperty("data") val data: SeriesData? = SeriesData()
|
@JsonProperty("data") val data: SeriesData? = SeriesData()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private data class SeriesSeasonProp(
|
||||||
|
@JsonProperty("code") val code: Int? = null,
|
||||||
|
@JsonProperty("msg") val msg: String? = null,
|
||||||
|
@JsonProperty("data") val data: ArrayList<SeriesEpisode>? = arrayListOf()
|
||||||
|
)
|
||||||
// data class PlayProgress (
|
// data class PlayProgress (
|
||||||
//
|
//
|
||||||
// @JsonProperty("over" ) val over : Int? = null,
|
// @JsonProperty("over" ) val over : Int? = null,
|
||||||
|
@ -448,7 +456,7 @@ class SuperStream : MainAPI() {
|
||||||
|
|
||||||
if (isMovie) { // 1 = Movie
|
if (isMovie) { // 1 = Movie
|
||||||
val apiQuery =
|
val apiQuery =
|
||||||
"""{"childmode":"0","uid":"","app_version":"11.5","appid":"$appId","module":"Movie_detail","channel":"Website","mid":"${loadData.id}","lang":"en","expired_date":"${getExpiryDate()}","platform":"android","oss":"","group":""}"""
|
"""{"childmode":"$hideNsfw","uid":"","app_version":"11.5","appid":"$appId","module":"Movie_detail","channel":"Website","mid":"${loadData.id}","lang":"en","expired_date":"${getExpiryDate()}","platform":"android","oss":"","group":""}"""
|
||||||
val data = (queryApiParsed<MovieDataProp>(apiQuery)).data
|
val data = (queryApiParsed<MovieDataProp>(apiQuery)).data
|
||||||
?: throw RuntimeException("API error")
|
?: throw RuntimeException("API error")
|
||||||
|
|
||||||
|
@ -466,22 +474,28 @@ class SuperStream : MainAPI() {
|
||||||
this.posterUrl = data.posterOrg ?: data.poster
|
this.posterUrl = data.posterOrg ?: data.poster
|
||||||
this.year = data.year
|
this.year = data.year
|
||||||
this.plot = data.description
|
this.plot = data.description
|
||||||
this.tags = data.cats?.split(",")
|
this.tags = data.cats?.split(",")?.map { it.capitalize() }
|
||||||
this.rating = data.imdbRating?.split("/")?.get(0)?.toIntOrNull()
|
this.rating = data.imdbRating?.split("/")?.get(0)?.toIntOrNull()
|
||||||
addTrailer(data.trailerUrl)
|
addTrailer(data.trailerUrl)
|
||||||
this.addImdbId(data.imdbId)
|
this.addImdbId(data.imdbId)
|
||||||
}
|
}
|
||||||
} else { // 2 Series
|
} else { // 2 Series
|
||||||
val apiQuery =
|
val apiQuery =
|
||||||
"""{"childmode":"0","uid":"","app_version":"11.5","appid":"$appId","module":"TV_detail_1","display_all":"1","channel":"Website","lang":"en","expired_date":"${getExpiryDate()}","platform":"android","tid":"${loadData.id}"}"""
|
"""{"childmode":"$hideNsfw","uid":"","app_version":"11.5","appid":"$appId","module":"TV_detail_1","display_all":"1","channel":"Website","lang":"en","expired_date":"${getExpiryDate()}","platform":"android","tid":"${loadData.id}"}"""
|
||||||
val data = (queryApiParsed<SeriesDataProp>(apiQuery)).data
|
val data = (queryApiParsed<SeriesDataProp>(apiQuery)).data
|
||||||
?: throw RuntimeException("API error")
|
?: throw RuntimeException("API error")
|
||||||
|
|
||||||
|
val episodes = data.season.mapNotNull {
|
||||||
|
val seasonQuery =
|
||||||
|
"""{"childmode":"$hideNsfw","app_version":"11.5","year":"0","appid":"$appId","module":"TV_episode","display_all":"1","channel":"Website","season":"$it","lang":"en","expired_date":"${getExpiryDate()}","platform":"android","tid":"${loadData.id}"}"""
|
||||||
|
(queryApiParsed<SeriesSeasonProp>(seasonQuery)).data
|
||||||
|
}.flatten()
|
||||||
|
|
||||||
return newTvSeriesLoadResponse(
|
return newTvSeriesLoadResponse(
|
||||||
data.title ?: "",
|
data.title ?: "",
|
||||||
data.imdbLink ?: data.tomatoUrl ?: "",
|
data.imdbLink ?: data.tomatoUrl ?: "",
|
||||||
TvType.TvSeries,
|
TvType.TvSeries,
|
||||||
data.episode.mapNotNull {
|
episodes.mapNotNull {
|
||||||
Episode(
|
Episode(
|
||||||
LinkData(
|
LinkData(
|
||||||
it.tid ?: it.id ?: return@mapNotNull null,
|
it.tid ?: it.id ?: return@mapNotNull null,
|
||||||
|
@ -504,7 +518,7 @@ class SuperStream : MainAPI() {
|
||||||
this.plot = data.description
|
this.plot = data.description
|
||||||
this.posterUrl = data.posterOrg ?: data.poster
|
this.posterUrl = data.posterOrg ?: data.poster
|
||||||
this.rating = data.imdbRating?.split("/")?.get(0)?.toIntOrNull()
|
this.rating = data.imdbRating?.split("/")?.get(0)?.toIntOrNull()
|
||||||
this.tags = data.cats?.split(",")
|
this.tags = data.cats?.split(",")?.map { it.capitalize() }
|
||||||
this.addImdbId(data.imdbId)
|
this.addImdbId(data.imdbId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -615,11 +629,11 @@ class SuperStream : MainAPI() {
|
||||||
val parsed = parseJson<LinkData>(data)
|
val parsed = parseJson<LinkData>(data)
|
||||||
|
|
||||||
val query = if (parsed.type == TYPE_MOVIES) {
|
val query = if (parsed.type == TYPE_MOVIES) {
|
||||||
"""{"childmode":"0","uid":"","app_version":"11.5","appid":"$appId","module":"Movie_downloadurl_v3","channel":"Website","mid":"${parsed.id}","lang":"","expired_date":"${getExpiryDate()}","platform":"android","oss":"1","group":""}"""
|
"""{"childmode":"$hideNsfw","uid":"","app_version":"11.5","appid":"$appId","module":"Movie_downloadurl_v3","channel":"Website","mid":"${parsed.id}","lang":"","expired_date":"${getExpiryDate()}","platform":"android","oss":"1","group":""}"""
|
||||||
} else {
|
} else {
|
||||||
val episode = parsed.episode ?: throw RuntimeException("No episode number!")
|
val episode = parsed.episode ?: throw RuntimeException("No episode number!")
|
||||||
val season = parsed.season ?: throw RuntimeException("No season number!")
|
val season = parsed.season ?: throw RuntimeException("No season number!")
|
||||||
"""{"childmode":"0","app_version":"11.5","module":"TV_downloadurl_v3","channel":"Website","episode":"$episode","expired_date":"${getExpiryDate()}","platform":"android","tid":"${parsed.id}","oss":"1","uid":"","appid":"$appId","season":"$season","lang":"en","group":""}"""
|
"""{"childmode":"$hideNsfw","app_version":"11.5","module":"TV_downloadurl_v3","channel":"Website","episode":"$episode","expired_date":"${getExpiryDate()}","platform":"android","tid":"${parsed.id}","oss":"1","uid":"","appid":"$appId","season":"$season","lang":"en","group":""}"""
|
||||||
}
|
}
|
||||||
|
|
||||||
val linkData = queryApiParsed<LinkDataProp>(query)
|
val linkData = queryApiParsed<LinkDataProp>(query)
|
||||||
|
@ -631,9 +645,9 @@ class SuperStream : MainAPI() {
|
||||||
val fid = linkData.data?.list?.firstOrNull { it.fid != null }?.fid
|
val fid = linkData.data?.list?.firstOrNull { it.fid != null }?.fid
|
||||||
|
|
||||||
val subtitleQuery = if (parsed.type == TYPE_MOVIES) {
|
val subtitleQuery = if (parsed.type == TYPE_MOVIES) {
|
||||||
"""{"childmode":"0","fid":"$fid","uid":"","app_version":"11.5","appid":"$appId","module":"Movie_srt_list_v2","channel":"Website","mid":"${parsed.id}","lang":"en","expired_date":"${getExpiryDate()}","platform":"android"}"""
|
"""{"childmode":"$hideNsfw","fid":"$fid","uid":"","app_version":"11.5","appid":"$appId","module":"Movie_srt_list_v2","channel":"Website","mid":"${parsed.id}","lang":"en","expired_date":"${getExpiryDate()}","platform":"android"}"""
|
||||||
} else {
|
} else {
|
||||||
"""{"childmode":"0","fid":"$fid","app_version":"11.5","module":"TV_srt_list_v2","channel":"Website","episode":"${parsed.episode}","expired_date":"${getExpiryDate()}","platform":"android","tid":"${parsed.id}","uid":"","appid":"$appId","season":"${parsed.season}","lang":"en"}"""
|
"""{"childmode":"$hideNsfw","fid":"$fid","app_version":"11.5","module":"TV_srt_list_v2","channel":"Website","episode":"${parsed.episode}","expired_date":"${getExpiryDate()}","platform":"android","tid":"${parsed.id}","uid":"","appid":"$appId","season":"${parsed.season}","lang":"en"}"""
|
||||||
}
|
}
|
||||||
|
|
||||||
val subtitles = queryApiParsed<SubtitleDataProp>(subtitleQuery).data
|
val subtitles = queryApiParsed<SubtitleDataProp>(subtitleQuery).data
|
||||||
|
|
Loading…
Reference in a new issue