mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
removed theflix
This commit is contained in:
parent
ac2760bacf
commit
87560d66bd
4 changed files with 353 additions and 195 deletions
|
@ -9,6 +9,10 @@ import com.lagradost.cloudstream3.utils.getQualityFromName
|
|||
|
||||
|
||||
class TheFlixToProvider : MainAPI() {
|
||||
companion object {
|
||||
var latestCookies: Map<String, String> = emptyMap()
|
||||
}
|
||||
|
||||
override var name = "TheFlix.to"
|
||||
override var mainUrl = "https://theflix.to"
|
||||
override val instantLinkLoading = false
|
||||
|
@ -99,16 +103,34 @@ class TheFlixToProvider : MainAPI() {
|
|||
val json = parseJson<HomeJson>(scriptText)
|
||||
val homePageProps = json.props.pageProps
|
||||
listOf(
|
||||
Triple(homePageProps.moviesListNewArrivals.docs, homePageProps.moviesListNewArrivals.type, "New Movie arrivals"),
|
||||
Triple(homePageProps.moviesListTrending.docs, homePageProps.moviesListTrending.type, "Trending Movies"),
|
||||
Triple(homePageProps.tvsListTrending.docs, homePageProps.tvsListTrending.type, "Trending TV Series"),
|
||||
Triple(homePageProps.tvsListNewEpisodes.docs, homePageProps.tvsListNewEpisodes.type, "New Episodes")
|
||||
Triple(
|
||||
homePageProps.moviesListNewArrivals.docs,
|
||||
homePageProps.moviesListNewArrivals.type,
|
||||
"New Movie arrivals"
|
||||
),
|
||||
Triple(
|
||||
homePageProps.moviesListTrending.docs,
|
||||
homePageProps.moviesListTrending.type,
|
||||
"Trending Movies"
|
||||
),
|
||||
Triple(
|
||||
homePageProps.tvsListTrending.docs,
|
||||
homePageProps.tvsListTrending.type,
|
||||
"Trending TV Series"
|
||||
),
|
||||
Triple(
|
||||
homePageProps.tvsListNewEpisodes.docs,
|
||||
homePageProps.tvsListNewEpisodes.type,
|
||||
"New Episodes"
|
||||
)
|
||||
).map { (docs, type, homename) ->
|
||||
val home = docs.map { info ->
|
||||
val title = info.name
|
||||
val poster = info.posterUrl
|
||||
val typeinfo = if (type?.contains("TV") == true) TvType.TvSeries else TvType.Movie
|
||||
val link = if (typeinfo == TvType.Movie) "$mainUrl/movie/${info.id}-${cleanTitle(title)}"
|
||||
val typeinfo =
|
||||
if (type?.contains("TV") == true) TvType.TvSeries else TvType.Movie
|
||||
val link =
|
||||
if (typeinfo == TvType.Movie) "$mainUrl/movie/${info.id}-${cleanTitle(title)}"
|
||||
else "$mainUrl/tv-show/${info.id}-${cleanTitle(title)}/season-1/episode-1"
|
||||
TvSeriesSearchResponse(
|
||||
title,
|
||||
|
@ -168,8 +190,11 @@ class TheFlixToProvider : MainAPI() {
|
|||
docs.map { info ->
|
||||
val title = info.name
|
||||
val poster = info.posterUrl
|
||||
val typeinfo = if (type?.contains("TV") == true) TvType.TvSeries else TvType.Movie
|
||||
val link = if (typeinfo == TvType.Movie) "$mainUrl/movie/${info.id}-${cleanTitle(title)}"
|
||||
val typeinfo =
|
||||
if (type?.contains("TV") == true) TvType.TvSeries else TvType.Movie
|
||||
val link = if (typeinfo == TvType.Movie) "$mainUrl/movie/${info.id}-${
|
||||
cleanTitle(title)
|
||||
}"
|
||||
else "$mainUrl/tv-show/${info.id}-${cleanTitle(title)}/season-1/episode-1"
|
||||
if (typeinfo == TvType.Movie) {
|
||||
search.add(
|
||||
|
@ -205,7 +230,47 @@ class TheFlixToProvider : MainAPI() {
|
|||
|
||||
data class LoadMain(
|
||||
@JsonProperty("props") val props: LoadProps = LoadProps(),
|
||||
@JsonProperty("page") var page: String? = null,
|
||||
//@JsonProperty("query") val query: Query? = Query(),
|
||||
@JsonProperty("buildId") val buildId: String? = null,
|
||||
@JsonProperty("runtimeConfig") val runtimeConfig: RuntimeConfig? = RuntimeConfig(),
|
||||
@JsonProperty("isFallback") val isFallback: Boolean? = null,
|
||||
@JsonProperty("customServer") val customServer: Boolean? = null,
|
||||
@JsonProperty("appGip") val appGip: Boolean? = null
|
||||
)
|
||||
|
||||
data class RuntimeConfig(
|
||||
@JsonProperty("AddThisService") val AddThisService: AddThisService? = AddThisService(),
|
||||
//@JsonProperty("Application") val Application: Application? = Application(),
|
||||
//@JsonProperty("Content") val Content: Content? = Content(),
|
||||
//@JsonProperty("GtmService") val GtmService: GtmService? = GtmService(),
|
||||
//@JsonProperty("IptvChannels") val IptvChannels: IptvChannels? = IptvChannels(),
|
||||
//@JsonProperty("Notifications") val Notifications: Notifications? = Notifications(),
|
||||
//@JsonProperty("Payments") val Payments: Payments? = Payments(),
|
||||
//@JsonProperty("Redux") val Redux: Redux? = Redux(),
|
||||
//@JsonProperty("Search") val Search: Search? = Search(),
|
||||
@JsonProperty("Services") val Services: Services? = Services(),
|
||||
//@JsonProperty("Sitemap") val Sitemap: Sitemap? = Sitemap(),
|
||||
//@JsonProperty("Support") val Support: Support? = Support(),
|
||||
@JsonProperty("Videos") val Videos: Videos? = Videos()
|
||||
)
|
||||
|
||||
|
||||
data class Server(
|
||||
@JsonProperty("Url") var Url: String? = null
|
||||
)
|
||||
|
||||
data class Services(
|
||||
|
||||
@JsonProperty("Server") val Server: Server? = Server(),
|
||||
@JsonProperty("TmdbServer") val TmdbServer: Server? = Server()
|
||||
|
||||
)
|
||||
|
||||
data class AddThisService(
|
||||
@JsonProperty("PublicId") val PublicId: String? = null
|
||||
)
|
||||
|
||||
data class LoadProps(
|
||||
@JsonProperty("pageProps") val pageProps: LoadPageProps = LoadPageProps(),
|
||||
)
|
||||
|
@ -220,7 +285,6 @@ class TheFlixToProvider : MainAPI() {
|
|||
data class Genres(
|
||||
@JsonProperty("name") val name: String,
|
||||
@JsonProperty("id") val id: Int? = null
|
||||
|
||||
)
|
||||
|
||||
data class Seasons(
|
||||
|
@ -330,11 +394,54 @@ class TheFlixToProvider : MainAPI() {
|
|||
.replace("'", "-")).lowercase()
|
||||
}
|
||||
|
||||
private suspend fun getLoadMan(url: String): LoadMain {
|
||||
val og = app.get(url, cookies = latestCookies)
|
||||
val soup = og.document
|
||||
val script = soup.selectFirst("script[type=application/json]").data()
|
||||
return parseJson(script)
|
||||
}
|
||||
|
||||
// I legit cant figure this out
|
||||
private suspend fun getLoadMainRetry(url: String): LoadMain {
|
||||
val first = getLoadMan(url)
|
||||
val notFound = "/404"
|
||||
if (first.page == notFound) {
|
||||
first.runtimeConfig?.Services?.TmdbServer?.Url?.let { authUrl ->
|
||||
val optionsUrl = "$authUrl/authorization/session/continue?contentUsageType=Viewing"
|
||||
val options = app.options(
|
||||
optionsUrl,
|
||||
headers = mapOf(
|
||||
"User-Agent" to USER_AGENT,
|
||||
"Access-Control-Request-Method" to "POST",
|
||||
"Access-Control-Request-Headers" to "content-type",
|
||||
"Origin" to url,
|
||||
"Referer" to mainUrl,
|
||||
)
|
||||
)
|
||||
//{"affiliateCode":"","pathname":"/movie/696806-the-adam-project"}
|
||||
val data = mapOf("affiliateCode" to "", "pathname" to url.removePrefix(mainUrl))
|
||||
val resp = app.post(optionsUrl, headers = mapOf(
|
||||
"User-Agent" to USER_AGENT,
|
||||
"Content-Type" to "application/json;charset=UTF-8",
|
||||
"Accept" to "application/json, text/plain, */*",
|
||||
"Origin" to url,
|
||||
"Referer" to mainUrl,
|
||||
), data = data)
|
||||
|
||||
latestCookies = resp.cookies
|
||||
val newData = getLoadMan(url)
|
||||
if (newData.page == notFound) {
|
||||
throw ErrorLoadingException("404 Not found")
|
||||
}
|
||||
return newData
|
||||
}
|
||||
}
|
||||
return first
|
||||
}
|
||||
|
||||
override suspend fun load(url: String): LoadResponse? {
|
||||
val soup = app.get(url).document
|
||||
val scripttext = soup.selectFirst("script[type=application/json]").data()
|
||||
val tvtype = if (url.contains("movie")) TvType.Movie else TvType.TvSeries
|
||||
val json = parseJson<LoadMain>(scripttext)
|
||||
val json = getLoadMainRetry(url)
|
||||
val episodes = ArrayList<TvSeriesEpisode>()
|
||||
val isMovie = tvtype == TvType.Movie
|
||||
val pageMain = json.props.pageProps
|
||||
|
@ -343,7 +450,7 @@ class TheFlixToProvider : MainAPI() {
|
|||
|
||||
val available = metadata?.available
|
||||
|
||||
val comingsoon = !available!!
|
||||
val comingsoon = available!!
|
||||
|
||||
val movieId = metadata.id
|
||||
|
||||
|
@ -443,9 +550,7 @@ class TheFlixToProvider : MainAPI() {
|
|||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
): Boolean {
|
||||
val doc = app.get(data).document
|
||||
val script = doc.selectFirst("script[type=application/json]").data()
|
||||
val json = parseJson<LoadMain>(script)
|
||||
val json = getLoadMainRetry(data)
|
||||
val extractedLink = json.props.pageProps.videoUrl
|
||||
val qualityReg = Regex("(\\d+p)")
|
||||
if (extractedLink != null) {
|
||||
|
@ -458,7 +563,8 @@ class TheFlixToProvider : MainAPI() {
|
|||
"",
|
||||
getQualityFromName(quality),
|
||||
false
|
||||
))
|
||||
)
|
||||
)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
|
|
@ -226,6 +226,24 @@ fun putRequestCreator(
|
|||
.build()
|
||||
}
|
||||
|
||||
fun optionsRequestCreator(
|
||||
url: String,
|
||||
headers: Map<String, String>,
|
||||
referer: String?,
|
||||
params: Map<String, String?>,
|
||||
cookies: Map<String, String>,
|
||||
data: Map<String, String?>,
|
||||
cacheTime: Int,
|
||||
cacheUnit: TimeUnit
|
||||
): Request {
|
||||
return Request.Builder()
|
||||
.url(addParamsToUrl(url, params))
|
||||
.cacheControl(getCache(cacheTime, cacheUnit))
|
||||
.headers(getHeaders(headers, referer, cookies))
|
||||
.method("OPTIONS", getData(data))
|
||||
.build()
|
||||
}
|
||||
|
||||
// https://stackoverflow.com/a/59322754
|
||||
// Issues with Akwam otherwise
|
||||
fun OkHttpClient.Builder.ignoreAllSSLErrors(): OkHttpClient.Builder {
|
||||
|
@ -370,6 +388,40 @@ open class Requests {
|
|||
return AppResponse(response)
|
||||
}
|
||||
|
||||
suspend fun options(
|
||||
url: String,
|
||||
headers: Map<String, String> = mapOf(),
|
||||
referer: String? = null,
|
||||
params: Map<String, String> = mapOf(),
|
||||
cookies: Map<String, String> = mapOf(),
|
||||
data: Map<String, String?> = DEFAULT_DATA,
|
||||
allowRedirects: Boolean = true,
|
||||
cacheTime: Int = DEFAULT_TIME,
|
||||
cacheUnit: TimeUnit = DEFAULT_TIME_UNIT,
|
||||
timeout: Long = 0L
|
||||
): AppResponse {
|
||||
Log.i("OPTIONS", url)
|
||||
val client = baseClient
|
||||
.newBuilder()
|
||||
.followRedirects(allowRedirects)
|
||||
.followSslRedirects(allowRedirects)
|
||||
.callTimeout(timeout, TimeUnit.SECONDS)
|
||||
.build()
|
||||
val request =
|
||||
optionsRequestCreator(
|
||||
url,
|
||||
headers,
|
||||
referer,
|
||||
params,
|
||||
cookies,
|
||||
data,
|
||||
cacheTime,
|
||||
cacheUnit
|
||||
)
|
||||
val response = client.newCall(request).await()
|
||||
return AppResponse(response)
|
||||
}
|
||||
|
||||
suspend fun put(
|
||||
url: String,
|
||||
headers: Map<String, String> = mapOf(),
|
||||
|
|
|
@ -237,7 +237,7 @@
|
|||
"TheFlixToProvider": {
|
||||
"name": "TheFlix.to",
|
||||
"url": "https://theflix.to",
|
||||
"status": 1
|
||||
"status": 0
|
||||
},
|
||||
"TwoEmbedProvider": {
|
||||
"name": "2Embed",
|
||||
|
|
|
@ -237,7 +237,7 @@
|
|||
"TheFlixToProvider": {
|
||||
"name": "TheFlix.to",
|
||||
"url": "https://theflix.to",
|
||||
"status": 1
|
||||
"status": 0
|
||||
},
|
||||
"TwoEmbedProvider": {
|
||||
"name": "2Embed",
|
||||
|
|
Loading…
Reference in a new issue