removed theflix

This commit is contained in:
LagradOst 2022-04-03 15:43:39 +02:00
parent ac2760bacf
commit 87560d66bd
4 changed files with 353 additions and 195 deletions

View file

@ -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
}

View file

@ -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(),

View file

@ -237,7 +237,7 @@
"TheFlixToProvider": {
"name": "TheFlix.to",
"url": "https://theflix.to",
"status": 1
"status": 0
},
"TwoEmbedProvider": {
"name": "2Embed",

View file

@ -237,7 +237,7 @@
"TheFlixToProvider": {
"name": "TheFlix.to",
"url": "https://theflix.to",
"status": 1
"status": 0
},
"TwoEmbedProvider": {
"name": "2Embed",