2022-08-20 07:46:57 +00:00
|
|
|
package com.lagradost.cloudstream3.extractors
|
|
|
|
|
|
|
|
import com.lagradost.cloudstream3.SubtitleFile
|
2022-10-31 00:16:15 +00:00
|
|
|
import com.lagradost.cloudstream3.amap
|
2022-08-20 07:46:57 +00:00
|
|
|
import com.lagradost.cloudstream3.app
|
2022-09-23 18:20:47 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.*
|
|
|
|
import kotlinx.coroutines.delay
|
|
|
|
import java.net.URI
|
2022-08-20 07:46:57 +00:00
|
|
|
|
|
|
|
class VidSrcExtractor2 : VidSrcExtractor() {
|
|
|
|
override val mainUrl = "https://vidsrc.me/embed"
|
|
|
|
override suspend fun getUrl(
|
|
|
|
url: String,
|
|
|
|
referer: String?,
|
|
|
|
subtitleCallback: (SubtitleFile) -> Unit,
|
|
|
|
callback: (ExtractorLink) -> Unit
|
|
|
|
) {
|
|
|
|
val newUrl = url.lowercase().replace(mainUrl, super.mainUrl)
|
|
|
|
super.getUrl(newUrl, referer, subtitleCallback, callback)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
open class VidSrcExtractor : ExtractorApi() {
|
|
|
|
override val name = "VidSrc"
|
|
|
|
private val absoluteUrl = "https://v2.vidsrc.me"
|
|
|
|
override val mainUrl = "$absoluteUrl/embed"
|
|
|
|
override val requiresReferer = false
|
|
|
|
|
2022-09-23 18:20:47 +00:00
|
|
|
companion object {
|
|
|
|
/** Infinite function to validate the vidSrc pass */
|
|
|
|
suspend fun validatePass(url: String) {
|
|
|
|
val uri = URI(url)
|
|
|
|
val host = uri.host
|
|
|
|
|
|
|
|
// Basically turn https://tm3p.vidsrc.stream/ -> https://vidsrc.stream/
|
|
|
|
val referer = host.split(".").let {
|
|
|
|
val size = it.size
|
|
|
|
"https://" + it.subList(maxOf(0, size - 2), size).joinToString(".") + "/"
|
|
|
|
}
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
app.get(url, referer = referer)
|
|
|
|
delay(60_000)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-20 07:46:57 +00:00
|
|
|
override suspend fun getUrl(
|
|
|
|
url: String,
|
|
|
|
referer: String?,
|
|
|
|
subtitleCallback: (SubtitleFile) -> Unit,
|
|
|
|
callback: (ExtractorLink) -> Unit
|
|
|
|
) {
|
|
|
|
val iframedoc = app.get(url).document
|
|
|
|
|
|
|
|
val serverslist =
|
|
|
|
iframedoc.select("div#sources.button_content div#content div#list div").map {
|
|
|
|
val datahash = it.attr("data-hash")
|
|
|
|
if (datahash.isNotBlank()) {
|
|
|
|
val links = try {
|
2022-09-23 18:20:47 +00:00
|
|
|
app.get(
|
2023-01-31 07:26:34 +00:00
|
|
|
"$absoluteUrl/srcrcp/$datahash",
|
|
|
|
referer = "https://rcp.vidsrc.me/"
|
2022-09-23 18:20:47 +00:00
|
|
|
).url
|
2022-08-20 07:46:57 +00:00
|
|
|
} catch (e: Exception) {
|
|
|
|
""
|
|
|
|
}
|
|
|
|
links
|
|
|
|
} else ""
|
|
|
|
}
|
|
|
|
|
2022-10-31 00:16:15 +00:00
|
|
|
serverslist.amap { server ->
|
2022-08-20 07:46:57 +00:00
|
|
|
val linkfixed = server.replace("https://vidsrc.xyz/", "https://embedsito.com/")
|
2023-01-31 07:26:34 +00:00
|
|
|
if (linkfixed.contains("/prorcp")) {
|
2022-08-20 07:46:57 +00:00
|
|
|
val srcresponse = app.get(server, referer = absoluteUrl).text
|
|
|
|
val m3u8Regex = Regex("((https:|http:)//.*\\.m3u8)")
|
2022-10-31 00:16:15 +00:00
|
|
|
val srcm3u8 = m3u8Regex.find(srcresponse)?.value ?: return@amap
|
2022-09-23 18:20:47 +00:00
|
|
|
val passRegex = Regex("""['"](.*set_pass[^"']*)""")
|
|
|
|
val pass = passRegex.find(srcresponse)?.groupValues?.get(1)?.replace(
|
|
|
|
Regex("""^//"""), "https://"
|
|
|
|
)
|
|
|
|
|
|
|
|
callback.invoke(
|
|
|
|
ExtractorLink(
|
|
|
|
this.name,
|
|
|
|
this.name,
|
|
|
|
srcm3u8,
|
2022-10-26 15:38:46 +00:00
|
|
|
"https://vidsrc.stream/",
|
2022-09-23 18:20:47 +00:00
|
|
|
Qualities.Unknown.value,
|
|
|
|
extractorData = pass,
|
|
|
|
isM3u8 = true
|
|
|
|
)
|
|
|
|
)
|
2022-08-20 07:46:57 +00:00
|
|
|
} else {
|
|
|
|
loadExtractor(linkfixed, url, subtitleCallback, callback)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|