mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	Olgply fixes
This commit is contained in:
		
							parent
							
								
									a1f31da695
								
							
						
					
					
						commit
						28bb93372b
					
				
					 1 changed files with 79 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -5,9 +5,14 @@ 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"
 | 
			
		||||
| 
						 | 
				
			
			@ -17,6 +22,29 @@ class OlgplyProvider : TmdbProvider() {
 | 
			
		|||
    override val useMetaLoadResponse = true
 | 
			
		||||
    override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie)
 | 
			
		||||
 | 
			
		||||
    private suspend fun loadLinksWithWebView(
 | 
			
		||||
        url: String,
 | 
			
		||||
//        subtitleCallback: (SubtitleFile) -> Unit,
 | 
			
		||||
        callback: (ExtractorLink) -> Unit
 | 
			
		||||
    ) {
 | 
			
		||||
        val foundVideo = WebViewResolver(
 | 
			
		||||
            Regex("""movies4discord""")
 | 
			
		||||
        ).resolveUsingWebView(
 | 
			
		||||
            requestCreator("GET", url)
 | 
			
		||||
        ).first ?: return
 | 
			
		||||
 | 
			
		||||
        callback.invoke(
 | 
			
		||||
            ExtractorLink(
 | 
			
		||||
                this.name,
 | 
			
		||||
                "Movies4Discord",
 | 
			
		||||
                foundVideo.url.toString(),
 | 
			
		||||
                "",
 | 
			
		||||
                Qualities.Unknown.value
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    override suspend fun loadLinks(
 | 
			
		||||
        data: String,
 | 
			
		||||
        isCasting: Boolean,
 | 
			
		||||
| 
						 | 
				
			
			@ -24,24 +52,60 @@ class OlgplyProvider : TmdbProvider() {
 | 
			
		|||
        callback: (ExtractorLink) -> Unit
 | 
			
		||||
    ): Boolean {
 | 
			
		||||
        val mappedData = parseJson<TmdbLink>(data)
 | 
			
		||||
        val imdbId = mappedData.imdbID ?: return false
 | 
			
		||||
        val iframeUrl =
 | 
			
		||||
            "$mainUrl/api/?imdb=$imdbId${mappedData.season?.let { "&season=$it" } ?: ""}${mappedData.episode?.let { "&episode=$it" } ?: ""}"
 | 
			
		||||
        val tmdbId = mappedData.tmdbID ?: return false
 | 
			
		||||
        val jsRegex = Regex("""eval\(.*\);""")
 | 
			
		||||
 | 
			
		||||
        val iframeRegex = Regex("""file:.*?"([^"]*)""")
 | 
			
		||||
        val apiUrl =
 | 
			
		||||
            "https://olgply.xyz/${tmdbId}${mappedData.season?.let { "/$it" } ?: ""}${mappedData.episode?.let { "/$it" } ?: ""}"
 | 
			
		||||
        val html =
 | 
			
		||||
            app.get(apiUrl).text
 | 
			
		||||
        val rhino = Context.enter()
 | 
			
		||||
        rhino.optimizationLevel = -1
 | 
			
		||||
        val scope: Scriptable = rhino.initSafeStandardObjects()
 | 
			
		||||
        val documentJs = """
 | 
			
		||||
            Plyr = function(){};
 | 
			
		||||
            
 | 
			
		||||
            hlsPrototype = {
 | 
			
		||||
                loadSource(url) {
 | 
			
		||||
                    this.url = url;
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
        val html = app.get(iframeUrl).text
 | 
			
		||||
        val link = iframeRegex.find(html)?.groupValues?.getOrNull(1) ?: return false
 | 
			
		||||
        callback.invoke(
 | 
			
		||||
            ExtractorLink(
 | 
			
		||||
                this.name,
 | 
			
		||||
                this.name,
 | 
			
		||||
                link,
 | 
			
		||||
                this.mainUrl + "/",
 | 
			
		||||
                Qualities.Unknown.value,
 | 
			
		||||
                headers = mapOf("range" to "bytes=0-")
 | 
			
		||||
            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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue