forked from recloudstream/cloudstream
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.app
|
||||||
import com.lagradost.cloudstream3.metaproviders.TmdbLink
|
import com.lagradost.cloudstream3.metaproviders.TmdbLink
|
||||||
import com.lagradost.cloudstream3.metaproviders.TmdbProvider
|
import com.lagradost.cloudstream3.metaproviders.TmdbProvider
|
||||||
|
import com.lagradost.cloudstream3.network.WebViewResolver
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.Qualities
|
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() {
|
class OlgplyProvider : TmdbProvider() {
|
||||||
override var mainUrl = "https://olgply.com"
|
override var mainUrl = "https://olgply.com"
|
||||||
|
@ -17,6 +22,29 @@ class OlgplyProvider : TmdbProvider() {
|
||||||
override val useMetaLoadResponse = true
|
override val useMetaLoadResponse = true
|
||||||
override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie)
|
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(
|
override suspend fun loadLinks(
|
||||||
data: String,
|
data: String,
|
||||||
isCasting: Boolean,
|
isCasting: Boolean,
|
||||||
|
@ -24,24 +52,60 @@ class OlgplyProvider : TmdbProvider() {
|
||||||
callback: (ExtractorLink) -> Unit
|
callback: (ExtractorLink) -> Unit
|
||||||
): Boolean {
|
): Boolean {
|
||||||
val mappedData = parseJson<TmdbLink>(data)
|
val mappedData = parseJson<TmdbLink>(data)
|
||||||
val imdbId = mappedData.imdbID ?: return false
|
val tmdbId = mappedData.tmdbID ?: return false
|
||||||
val iframeUrl =
|
val jsRegex = Regex("""eval\(.*\);""")
|
||||||
"$mainUrl/api/?imdb=$imdbId${mappedData.season?.let { "&season=$it" } ?: ""}${mappedData.episode?.let { "&episode=$it" } ?: ""}"
|
|
||||||
|
|
||||||
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(){};
|
||||||
|
|
||||||
val html = app.get(iframeUrl).text
|
hlsPrototype = {
|
||||||
val link = iframeRegex.find(html)?.groupValues?.getOrNull(1) ?: return false
|
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(
|
callback.invoke(
|
||||||
ExtractorLink(
|
ExtractorLink(
|
||||||
this.name,
|
this.name,
|
||||||
this.name,
|
this.name,
|
||||||
link,
|
hls["url"].toString(),
|
||||||
this.mainUrl + "/",
|
this.mainUrl + "/",
|
||||||
Qualities.Unknown.value,
|
Qualities.Unknown.value,
|
||||||
headers = mapOf("range" to "bytes=0-")
|
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
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue