package com.lagradost import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.metaproviders.TmdbLink import com.lagradost.cloudstream3.metaproviders.TmdbProvider import com.lagradost.cloudstream3.network.WebViewResolver import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.nicehttp.requestCreator import org.mozilla.javascript.Context import org.mozilla.javascript.Scriptable import org.mozilla.javascript.ScriptableObject class OlgplyProvider : TmdbProvider() { override var mainUrl = "https://olgply.com" override val apiName = "Olgply" override var name = "Olgply" override val instantLinkLoading = true override val useMetaLoadResponse = true override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie) private suspend fun loadLinksWithWebView( url: String, // subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit ) { println("URKKKKKKKKKK $url") val foundVideo = WebViewResolver( Regex("""\.m3u8|i7njdjvszykaieynzsogaysdgb0hm8u1mzubmush4maopa4wde\.com""") ).resolveUsingWebView( requestCreator( "GET", url, referer = "https://olgply.xyz/" ) ) .first ?: return callback.invoke( ExtractorLink( this.name, "Movies4Discord", foundVideo.url.toString(), "", Qualities.Unknown.value, true ) ) } override suspend fun loadLinks( data: String, isCasting: Boolean, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit ): Boolean { val mappedData = parseJson(data) val tmdbId = mappedData.tmdbID ?: return false val jsRegex = Regex("""eval\(.*\);""") val apiUrl = "https://olgply.xyz/${tmdbId}${mappedData.season?.let { "/$it" } ?: ""}${mappedData.episode?.let { "/$it" } ?: ""}" val html = app.get(apiUrl, referer = "https://olgply.xyz/").text val rhino = Context.enter() rhino.optimizationLevel = -1 val scope: Scriptable = rhino.initSafeStandardObjects() val documentJs = """ Plyr = function(){}; hlsPrototype = { loadSource(url) { this.url = url; } }; function Hls() {}; Hls.isSupported = function(){return true}; Hls.prototype = hlsPrototype; Hls.prototype.constructor = Hls; document = { "querySelector" : function() {} }; """.trimIndent() val foundJs = jsRegex.find(html)?.groupValues?.getOrNull(0) ?: return false try { rhino.evaluateString(scope, documentJs + foundJs, "JavaScript", 1, null) } catch (e: Exception) { } val hls = scope.get("hls", scope) as? ScriptableObject if (hls != null) { callback.invoke( ExtractorLink( this.name, this.name, hls["url"].toString(), this.mainUrl + "/", Qualities.Unknown.value, headers = mapOf("range" to "bytes=0-"), isM3u8 = true ) ) } else { // Disgraceful fallback, but the js for Movies4Discord refuses to work correctly :( loadLinksWithWebView(apiUrl, callback) } return true } }