cloudstream/app/src/main/java/com/lagradost/cloudstream3/extractors/Userload.kt

117 lines
4.0 KiB
Kotlin

package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.*
import org.mozilla.javascript.Context
import org.mozilla.javascript.EvaluatorException
import org.mozilla.javascript.Scriptable
import java.util.*
open class Userload : ExtractorApi() {
override var name = "Userload"
override var mainUrl = "https://userload.co"
override val requiresReferer = false
private fun splitInput(input: String): List<String> {
var counter = 0
val array = ArrayList<String>()
var buffer = ""
for (c in input) {
when (c) {
'(' -> counter++
')' -> counter--
else -> {}
}
buffer += c
if (counter == 0) {
if (buffer.isNotBlank() && buffer != "+")
array.add(buffer)
buffer = ""
}
}
return array
}
private fun evaluateMath(mathExpression : String): String {
val rhino = Context.enter()
rhino.initStandardObjects()
rhino.optimizationLevel = -1
val scope: Scriptable = rhino.initStandardObjects()
return try {
rhino.evaluateString(scope, "eval($mathExpression)", "JavaScript", 1, null).toString()
}
catch (e: EvaluatorException){
""
}
}
private fun decodeVideoJs(text: String): List<String> {
text.replace("""\s+|/\*.*?\*/""".toRegex(), "")
val data = text.split("""+(゚Д゚)[゚o゚]""")[1]
val chars = data.split("""+ (゚Д゚)[゚ε゚]+""").drop(1)
val newchars = chars.map { char ->
char.replace("(o゚ー゚o)", "u")
.replace("c", "0")
.replace("(゚Д゚)['0']", "c")
.replace("゚Θ゚", "1")
.replace("!+[]", "1")
.replace("-~", "1+")
.replace("o", "3")
.replace("_", "3")
.replace("゚ー゚", "4")
.replace("(+", "(")
}
val subchar = mutableListOf<String>()
newchars.dropLast(1).forEach { v ->
subchar.add(splitInput(v).map { evaluateMath(it).substringBefore(".") }.toString().filter { it.isDigit() })
}
var txtresult = ""
subchar.forEach{
txtresult = txtresult.plus(Char(it.toInt(8)))
}
val val1 = Regex(""""morocco="((.|\\n)*?)"&mycountry="""").find(txtresult)?.groups?.get(1)?.value.toString().drop(1).dropLast(1)
val val2 = txtresult.substringAfter("""&mycountry="+""").substringBefore(")")
return listOf(
val1,
val2
)
}
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
val response = app.get(url).text
val jsToUnpack = Regex("ext/javascript\">eval((.|\\n)*?)</script>").find(response)?.groups?.get(1)?.value
val unpacked = JsUnpacker(jsToUnpack).unpack()
val videoJs = app.get("$mainUrl/api/assets/userload/js/videojs.js")
val videoJsToDecode = videoJs.text
val values = decodeVideoJs(videoJsToDecode)
val morocco = unpacked!!.split(";").filter { it.contains(values[0]) }[0].split("=")[1].drop(1).dropLast(1)
val mycountry = unpacked.split(";").filter { it.contains(values[1]) }[0].split("=")[1].drop(1).dropLast(1)
val videoLinkPage = app.post("$mainUrl/api/request/", data = mapOf(
"morocco" to morocco,
"mycountry" to mycountry
))
val videoLink = videoLinkPage.text
val nameSource = app.get(url).document.head().selectFirst("title")!!.text()
extractedLinksList.add(
ExtractorLink(
name,
name,
videoLink,
mainUrl,
getQualityFromName(nameSource),
)
)
return extractedLinksList
}
}