diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/TheFlixToProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/TheFlixToProvider.kt index cf440d51..ffbea23c 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/TheFlixToProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/TheFlixToProvider.kt @@ -9,6 +9,10 @@ import com.lagradost.cloudstream3.utils.getQualityFromName class TheFlixToProvider : MainAPI() { + companion object { + var latestCookies: Map = emptyMap() + } + override var name = "TheFlix.to" override var mainUrl = "https://theflix.to" override val instantLinkLoading = false @@ -18,76 +22,76 @@ class TheFlixToProvider : MainAPI() { TvType.TvSeries, ) - data class HomeJson ( - @JsonProperty("props") val props : HomeProps = HomeProps(), + data class HomeJson( + @JsonProperty("props") val props: HomeProps = HomeProps(), ) - data class HomeProps ( - @JsonProperty("pageProps" ) val pageProps : PageProps = PageProps(), + data class HomeProps( + @JsonProperty("pageProps") val pageProps: PageProps = PageProps(), ) - data class PageProps ( - @JsonProperty("moviesListTrending" ) val moviesListTrending : MoviesListTrending = MoviesListTrending(), - @JsonProperty("moviesListNewArrivals" ) val moviesListNewArrivals : MoviesListNewArrivals = MoviesListNewArrivals(), - @JsonProperty("tvsListTrending" ) val tvsListTrending : TvsListTrending = TvsListTrending(), - @JsonProperty("tvsListNewEpisodes" ) val tvsListNewEpisodes : TvsListNewEpisodes = TvsListNewEpisodes(), + data class PageProps( + @JsonProperty("moviesListTrending") val moviesListTrending: MoviesListTrending = MoviesListTrending(), + @JsonProperty("moviesListNewArrivals") val moviesListNewArrivals: MoviesListNewArrivals = MoviesListNewArrivals(), + @JsonProperty("tvsListTrending") val tvsListTrending: TvsListTrending = TvsListTrending(), + @JsonProperty("tvsListNewEpisodes") val tvsListNewEpisodes: TvsListNewEpisodes = TvsListNewEpisodes(), ) - data class MoviesListTrending ( - @JsonProperty("docs" ) val docs : ArrayList = arrayListOf(), - @JsonProperty("total" ) val total : Int? = null, - @JsonProperty("page" ) val page : Int? = null, - @JsonProperty("limit" ) val limit : Int? = null, - @JsonProperty("pages" ) val pages : Int? = null, - @JsonProperty("type" ) val type : String? = null, + data class MoviesListTrending( + @JsonProperty("docs") val docs: ArrayList = arrayListOf(), + @JsonProperty("total") val total: Int? = null, + @JsonProperty("page") val page: Int? = null, + @JsonProperty("limit") val limit: Int? = null, + @JsonProperty("pages") val pages: Int? = null, + @JsonProperty("type") val type: String? = null, ) - data class MoviesListNewArrivals ( - @JsonProperty("docs" ) val docs : ArrayList = arrayListOf(), - @JsonProperty("total" ) val total : Int? = null, - @JsonProperty("page" ) val page : Int? = null, - @JsonProperty("limit" ) val limit : Int? = null, - @JsonProperty("pages" ) val pages : Int? = null, - @JsonProperty("type" ) val type : String? = null, + data class MoviesListNewArrivals( + @JsonProperty("docs") val docs: ArrayList = arrayListOf(), + @JsonProperty("total") val total: Int? = null, + @JsonProperty("page") val page: Int? = null, + @JsonProperty("limit") val limit: Int? = null, + @JsonProperty("pages") val pages: Int? = null, + @JsonProperty("type") val type: String? = null, ) - data class TvsListTrending ( - @JsonProperty("docs" ) val docs : ArrayList = arrayListOf(), - @JsonProperty("total" ) val total : Int? = null, - @JsonProperty("page" ) val page : Int? = null, - @JsonProperty("limit" ) val limit : Int? = null, - @JsonProperty("pages" ) val pages : Int? = null, - @JsonProperty("type" ) val type : String? = null, + data class TvsListTrending( + @JsonProperty("docs") val docs: ArrayList = arrayListOf(), + @JsonProperty("total") val total: Int? = null, + @JsonProperty("page") val page: Int? = null, + @JsonProperty("limit") val limit: Int? = null, + @JsonProperty("pages") val pages: Int? = null, + @JsonProperty("type") val type: String? = null, ) - data class TvsListNewEpisodes ( - @JsonProperty("docs" ) val docs : ArrayList = arrayListOf(), - @JsonProperty("total" ) val total : Int? = null, - @JsonProperty("page" ) val page : Int? = null, - @JsonProperty("limit" ) val limit : Int? = null, - @JsonProperty("pages" ) val pages : Int? = null, - @JsonProperty("type" ) val type : String? = null, + data class TvsListNewEpisodes( + @JsonProperty("docs") val docs: ArrayList = arrayListOf(), + @JsonProperty("total") val total: Int? = null, + @JsonProperty("page") val page: Int? = null, + @JsonProperty("limit") val limit: Int? = null, + @JsonProperty("pages") val pages: Int? = null, + @JsonProperty("type") val type: String? = null, ) - data class Docs ( - @JsonProperty("name" ) val name : String = String(), - @JsonProperty("originalLanguage" ) val originalLanguage : String? = null, - @JsonProperty("popularity" ) val popularity : Double? = null, - @JsonProperty("runtime" ) val runtime : Int? = null, - @JsonProperty("status" ) val status : String? = null, - @JsonProperty("voteAverage" ) val voteAverage : Double? = null, - @JsonProperty("voteCount" ) val voteCount : Int? = null, - @JsonProperty("cast" ) val cast : String? = null, - @JsonProperty("director" ) val director : String? = null, - @JsonProperty("overview" ) val overview : String? = null, - @JsonProperty("posterUrl" ) val posterUrl : String? = null, - @JsonProperty("releaseDate" ) val releaseDate : String? = null, - @JsonProperty("createdAt" ) val createdAt : String? = null, - @JsonProperty("updatedAt" ) val updatedAt : String? = null, - @JsonProperty("conversionDate" ) val conversionDate : String? = null, - @JsonProperty("id" ) val id : Int? = null, - @JsonProperty("available" ) val available : Boolean? = null, + data class Docs( + @JsonProperty("name") val name: String = String(), + @JsonProperty("originalLanguage") val originalLanguage: String? = null, + @JsonProperty("popularity") val popularity: Double? = null, + @JsonProperty("runtime") val runtime: Int? = null, + @JsonProperty("status") val status: String? = null, + @JsonProperty("voteAverage") val voteAverage: Double? = null, + @JsonProperty("voteCount") val voteCount: Int? = null, + @JsonProperty("cast") val cast: String? = null, + @JsonProperty("director") val director: String? = null, + @JsonProperty("overview") val overview: String? = null, + @JsonProperty("posterUrl") val posterUrl: String? = null, + @JsonProperty("releaseDate") val releaseDate: String? = null, + @JsonProperty("createdAt") val createdAt: String? = null, + @JsonProperty("updatedAt") val updatedAt: String? = null, + @JsonProperty("conversionDate") val conversionDate: String? = null, + @JsonProperty("id") val id: Int? = null, + @JsonProperty("available") val available: Boolean? = null, ) @@ -99,17 +103,35 @@ class TheFlixToProvider : MainAPI() { val json = parseJson(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)}" - else "$mainUrl/tv-show/${info.id}-${cleanTitle(title)}/season-1/episode-1" + 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, link, @@ -129,25 +151,25 @@ class TheFlixToProvider : MainAPI() { return HomePageResponse(items) } - data class SearchJson ( - @JsonProperty("props" ) val props : SearchProps = SearchProps(), + data class SearchJson( + @JsonProperty("props") val props: SearchProps = SearchProps(), ) - data class SearchProps ( - @JsonProperty("pageProps" ) val pageProps : SearchPageProps = SearchPageProps(), + data class SearchProps( + @JsonProperty("pageProps") val pageProps: SearchPageProps = SearchPageProps(), ) - data class SearchPageProps ( - @JsonProperty("mainList" ) val mainList : SearchMainList = SearchMainList(), + data class SearchPageProps( + @JsonProperty("mainList") val mainList: SearchMainList = SearchMainList(), ) - data class SearchMainList ( - @JsonProperty("docs" ) val docs : ArrayList = arrayListOf(), - @JsonProperty("total" ) val total : Int? = null, - @JsonProperty("page" ) val page : Int? = null, - @JsonProperty("limit" ) val limit : Int? = null, - @JsonProperty("pages" ) val pages : Int? = null, - @JsonProperty("type" ) val type : String? = null, + data class SearchMainList( + @JsonProperty("docs") val docs: ArrayList = arrayListOf(), + @JsonProperty("total") val total: Int? = null, + @JsonProperty("page") val page: Int? = null, + @JsonProperty("limit") val limit: Int? = null, + @JsonProperty("pages") val pages: Int? = null, + @JsonProperty("type") val type: String? = null, ) @@ -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( @@ -203,112 +228,151 @@ class TheFlixToProvider : MainAPI() { } - data class LoadMain ( - @JsonProperty("props") val props : LoadProps = LoadProps(), - ) - data class LoadProps ( - @JsonProperty("pageProps" ) val pageProps : LoadPageProps = LoadPageProps(), + 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 LoadPageProps ( - @JsonProperty("selectedTv" ) val selectedTv : TheFlixMetadata? = TheFlixMetadata(), - @JsonProperty("movie") val movie : TheFlixMetadata? = TheFlixMetadata(), - @JsonProperty("videoUrl") val videoUrl : String? = null, - @JsonProperty("recommendationsList") val recommendationsList : RecommendationsList? = RecommendationsList(), - ) - - data class Genres ( - @JsonProperty("name" ) val name : String, - @JsonProperty("id" ) val id : Int? = null - - ) - - data class Seasons ( - @JsonProperty("name" ) val name : String? = null, - @JsonProperty("numberOfEpisodes" ) val numberOfEpisodes : Int? = null, - @JsonProperty("seasonNumber" ) val seasonNumber : Int? = null, - @JsonProperty("overview" ) val overview : String? = null, - @JsonProperty("posterUrl" ) val posterUrl : String? = null, - @JsonProperty("releaseDate" ) val releaseDate : String? = null, - @JsonProperty("createdAt" ) val createdAt : String? = null, - @JsonProperty("updatedAt" ) val updatedAt : String? = null, - @JsonProperty("id" ) val id : Int? = null, - @JsonProperty("episodes" ) val episodes : ArrayList = arrayListOf() - ) - - data class Episodes ( - @JsonProperty("episodeNumber" ) val episodeNumber : Int? = null, - @JsonProperty("name" ) val name : String? = null, - @JsonProperty("seasonNumber" ) val seasonNumber : Int? = null, - @JsonProperty("voteAverage" ) val voteAverage : Double? = null, - @JsonProperty("voteCount" ) val voteCount : Int? = null, - @JsonProperty("overview" ) val overview : String? = null, - @JsonProperty("releaseDate" ) val releaseDate : String? = null, - @JsonProperty("createdAt" ) val createdAt : String? = null, - @JsonProperty("updatedAt" ) val updatedAt : String? = null, - @JsonProperty("id" ) val id : Int? = null, - @JsonProperty("videos" ) val videos : ArrayList = arrayListOf() - ) - - data class Videos ( - @JsonProperty("language" ) val language : String? = null, - @JsonProperty("name" ) val name : String? = null, - @JsonProperty("id" ) val id : Int? = null - ) - - data class RecommendationsList ( - @JsonProperty("docs" ) val docs : ArrayList = arrayListOf(), - @JsonProperty("total" ) val total : Int? = null, - @JsonProperty("page" ) val page : Int? = null, - @JsonProperty("limit" ) val limit : Int? = null, - @JsonProperty("pages" ) val pages : Int? = null, - @JsonProperty("type" ) val type : String? = null, - ) - - data class LoadDocs ( - @JsonProperty("name" ) val name : String = String(), - @JsonProperty("originalLanguage" ) val originalLanguage : String? = null, - @JsonProperty("popularity" ) val popularity : Double? = null, - @JsonProperty("runtime" ) val runtime : Int? = null, - @JsonProperty("status" ) val status : String? = null, - @JsonProperty("voteAverage" ) val voteAverage : Double? = null, - @JsonProperty("voteCount" ) val voteCount : Int? = null, - @JsonProperty("cast" ) val cast : String? = null, - @JsonProperty("director" ) val director : String? = null, - @JsonProperty("overview" ) val overview : String? = null, - @JsonProperty("posterUrl" ) val posterUrl : String? = null, - @JsonProperty("releaseDate" ) val releaseDate : String? = null, - @JsonProperty("createdAt" ) val createdAt : String? = null, - @JsonProperty("updatedAt" ) val updatedAt : String? = null, - @JsonProperty("id" ) val id : Int? = null, - @JsonProperty("available" ) val available : 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 TheFlixMetadata ( - @JsonProperty("episodeRuntime" ) val episodeRuntime : Int? = null, - @JsonProperty("name" ) val name : String = String(), - @JsonProperty("originalLanguage" ) val originalLanguage : String? = null, - @JsonProperty("popularity" ) val popularity : Double? = null, - @JsonProperty("runtime" ) val runtime : Int? = null, - @JsonProperty("numberOfSeasons" ) val numberOfSeasons : Int? = null, - @JsonProperty("numberOfEpisodes" ) val numberOfEpisodes : Int? = null, - @JsonProperty("status" ) val status : String? = null, - @JsonProperty("voteAverage" ) val voteAverage : Double? = null, - @JsonProperty("voteCount" ) val voteCount : Int? = null, - @JsonProperty("cast" ) val cast : String? = null, - @JsonProperty("director" ) val director : String? = null, - @JsonProperty("overview" ) val overview : String? = null, - @JsonProperty("posterUrl" ) val posterUrl : String? = null, - @JsonProperty("releaseDate" ) val releaseDate : String? = null, - @JsonProperty("conversionDate" ) val conversionDate : String? = null, - @JsonProperty("createdAt" ) val createdAt : String? = null, - @JsonProperty("updatedAt" ) val updatedAt : String? = null, - @JsonProperty("id" ) val id : Int? = null, - @JsonProperty("available" ) val available : Boolean? = null, - @JsonProperty("genres" ) val genres : ArrayList = arrayListOf(), - @JsonProperty("videos" ) val videos : ArrayList = arrayListOf(), - @JsonProperty("seasons" ) val seasons : ArrayList = arrayListOf() + 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(), + ) + + data class LoadPageProps( + @JsonProperty("selectedTv") val selectedTv: TheFlixMetadata? = TheFlixMetadata(), + @JsonProperty("movie") val movie: TheFlixMetadata? = TheFlixMetadata(), + @JsonProperty("videoUrl") val videoUrl: String? = null, + @JsonProperty("recommendationsList") val recommendationsList: RecommendationsList? = RecommendationsList(), + ) + + data class Genres( + @JsonProperty("name") val name: String, + @JsonProperty("id") val id: Int? = null + ) + + data class Seasons( + @JsonProperty("name") val name: String? = null, + @JsonProperty("numberOfEpisodes") val numberOfEpisodes: Int? = null, + @JsonProperty("seasonNumber") val seasonNumber: Int? = null, + @JsonProperty("overview") val overview: String? = null, + @JsonProperty("posterUrl") val posterUrl: String? = null, + @JsonProperty("releaseDate") val releaseDate: String? = null, + @JsonProperty("createdAt") val createdAt: String? = null, + @JsonProperty("updatedAt") val updatedAt: String? = null, + @JsonProperty("id") val id: Int? = null, + @JsonProperty("episodes") val episodes: ArrayList = arrayListOf() + ) + + data class Episodes( + @JsonProperty("episodeNumber") val episodeNumber: Int? = null, + @JsonProperty("name") val name: String? = null, + @JsonProperty("seasonNumber") val seasonNumber: Int? = null, + @JsonProperty("voteAverage") val voteAverage: Double? = null, + @JsonProperty("voteCount") val voteCount: Int? = null, + @JsonProperty("overview") val overview: String? = null, + @JsonProperty("releaseDate") val releaseDate: String? = null, + @JsonProperty("createdAt") val createdAt: String? = null, + @JsonProperty("updatedAt") val updatedAt: String? = null, + @JsonProperty("id") val id: Int? = null, + @JsonProperty("videos") val videos: ArrayList = arrayListOf() + ) + + data class Videos( + @JsonProperty("language") val language: String? = null, + @JsonProperty("name") val name: String? = null, + @JsonProperty("id") val id: Int? = null + ) + + data class RecommendationsList( + @JsonProperty("docs") val docs: ArrayList = arrayListOf(), + @JsonProperty("total") val total: Int? = null, + @JsonProperty("page") val page: Int? = null, + @JsonProperty("limit") val limit: Int? = null, + @JsonProperty("pages") val pages: Int? = null, + @JsonProperty("type") val type: String? = null, + ) + + data class LoadDocs( + @JsonProperty("name") val name: String = String(), + @JsonProperty("originalLanguage") val originalLanguage: String? = null, + @JsonProperty("popularity") val popularity: Double? = null, + @JsonProperty("runtime") val runtime: Int? = null, + @JsonProperty("status") val status: String? = null, + @JsonProperty("voteAverage") val voteAverage: Double? = null, + @JsonProperty("voteCount") val voteCount: Int? = null, + @JsonProperty("cast") val cast: String? = null, + @JsonProperty("director") val director: String? = null, + @JsonProperty("overview") val overview: String? = null, + @JsonProperty("posterUrl") val posterUrl: String? = null, + @JsonProperty("releaseDate") val releaseDate: String? = null, + @JsonProperty("createdAt") val createdAt: String? = null, + @JsonProperty("updatedAt") val updatedAt: String? = null, + @JsonProperty("id") val id: Int? = null, + @JsonProperty("available") val available: Boolean? = null, + ) + + + data class TheFlixMetadata( + @JsonProperty("episodeRuntime") val episodeRuntime: Int? = null, + @JsonProperty("name") val name: String = String(), + @JsonProperty("originalLanguage") val originalLanguage: String? = null, + @JsonProperty("popularity") val popularity: Double? = null, + @JsonProperty("runtime") val runtime: Int? = null, + @JsonProperty("numberOfSeasons") val numberOfSeasons: Int? = null, + @JsonProperty("numberOfEpisodes") val numberOfEpisodes: Int? = null, + @JsonProperty("status") val status: String? = null, + @JsonProperty("voteAverage") val voteAverage: Double? = null, + @JsonProperty("voteCount") val voteCount: Int? = null, + @JsonProperty("cast") val cast: String? = null, + @JsonProperty("director") val director: String? = null, + @JsonProperty("overview") val overview: String? = null, + @JsonProperty("posterUrl") val posterUrl: String? = null, + @JsonProperty("releaseDate") val releaseDate: String? = null, + @JsonProperty("conversionDate") val conversionDate: String? = null, + @JsonProperty("createdAt") val createdAt: String? = null, + @JsonProperty("updatedAt") val updatedAt: String? = null, + @JsonProperty("id") val id: Int? = null, + @JsonProperty("available") val available: Boolean? = null, + @JsonProperty("genres") val genres: ArrayList = arrayListOf(), + @JsonProperty("videos") val videos: ArrayList = arrayListOf(), + @JsonProperty("seasons") val seasons: ArrayList = arrayListOf() ) private fun cleanTitle(title: String): String { @@ -322,19 +386,62 @@ class TheFlixToProvider : MainAPI() { .replace("'", "-")).lowercase() } return (title - .replace(" - ","-") - .replace(" ","-") - .replace("-&","") - .replace("/","-") - .replace(Regex("(:|-&|\\.)"),"") - .replace("'","-")).lowercase() + .replace(" - ", "-") + .replace(" ", "-") + .replace("-&", "") + .replace("/", "-") + .replace(Regex("(:|-&|\\.)"), "") + .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(scripttext) + val json = getLoadMainRetry(url) val episodes = ArrayList() 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 @@ -385,7 +492,7 @@ class TheFlixToProvider : MainAPI() { val tags = metadata.genres.map { it.name } - val recommendationsitem = pageMain.recommendationsList?.docs?.map { loadDocs -> + val recommendationsitem = pageMain.recommendationsList?.docs?.map { loadDocs -> val title = loadDocs.name val posterrec = loadDocs.posterUrl val link = if (isMovie) "$mainUrl/movie/${loadDocs.id}-${cleanTitle(title)}" @@ -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(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 } diff --git a/app/src/main/java/com/lagradost/cloudstream3/network/Requests.kt b/app/src/main/java/com/lagradost/cloudstream3/network/Requests.kt index 41c2d5bb..292531fa 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/network/Requests.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/network/Requests.kt @@ -226,6 +226,24 @@ fun putRequestCreator( .build() } +fun optionsRequestCreator( + url: String, + headers: Map, + referer: String?, + params: Map, + cookies: Map, + data: Map, + 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 = mapOf(), + referer: String? = null, + params: Map = mapOf(), + cookies: Map = mapOf(), + data: Map = 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 = mapOf(), diff --git a/docs/providers.json b/docs/providers.json index 2bf5b540..f444e7af 100644 --- a/docs/providers.json +++ b/docs/providers.json @@ -237,7 +237,7 @@ "TheFlixToProvider": { "name": "TheFlix.to", "url": "https://theflix.to", - "status": 1 + "status": 0 }, "TwoEmbedProvider": { "name": "2Embed", diff --git a/providers.json b/providers.json index 57056f91..b279e529 100644 --- a/providers.json +++ b/providers.json @@ -237,7 +237,7 @@ "TheFlixToProvider": { "name": "TheFlix.to", "url": "https://theflix.to", - "status": 1 + "status": 0 }, "TwoEmbedProvider": { "name": "2Embed",