fix(en/fmovies): Fix vidsrc extractor + vrf helper (#2363)
This commit is contained in:
@ -8,7 +8,7 @@ ext {
|
|||||||
extName = 'FMovies'
|
extName = 'FMovies'
|
||||||
pkgNameSuffix = 'en.fmovies'
|
pkgNameSuffix = 'en.fmovies'
|
||||||
extClass = '.FMovies'
|
extClass = '.FMovies'
|
||||||
extVersionCode = 10
|
extVersionCode = 11
|
||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ class FMoviesHelper(private val client: OkHttpClient, private val headers: Heade
|
|||||||
|
|
||||||
fun getVidSrc(query: String, host: String): String {
|
fun getVidSrc(query: String, host: String): String {
|
||||||
val url = API_URL.newBuilder().apply {
|
val url = API_URL.newBuilder().apply {
|
||||||
addPathSegment(if (host == "vidstream.pro") "rawVizcloud" else "rawMcloud")
|
addPathSegment(if (host.contains("mcloud", true)) "rawMcloud" else "rawVizcloud")
|
||||||
addQueryParameter("apikey", API_KEY)
|
addQueryParameter("apikey", API_KEY)
|
||||||
}.build().toString()
|
}.build().toString()
|
||||||
|
|
||||||
|
@ -21,19 +21,27 @@ class VidsrcExtractor(private val client: OkHttpClient, private val headers: Hea
|
|||||||
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
|
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
|
||||||
|
|
||||||
fun videosFromUrl(url: String, name: String): List<Video> {
|
fun videosFromUrl(url: String, name: String): List<Video> {
|
||||||
val host = when (name) {
|
val httpUrl = url.toHttpUrl()
|
||||||
"Vidplay" -> "vidstream.pro"
|
val host = httpUrl.host
|
||||||
else -> "mcloud.to"
|
|
||||||
}
|
|
||||||
val referer = "https://$host/"
|
val referer = "https://$host/"
|
||||||
|
|
||||||
val httpUrl = url.toHttpUrl()
|
val query = buildString {
|
||||||
|
append(httpUrl.pathSegments.last())
|
||||||
|
append("?")
|
||||||
|
append(
|
||||||
|
httpUrl.queryParameterNames.joinToString("&") {
|
||||||
|
"$it=${httpUrl.queryParameter(it)}"
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val query = "${httpUrl.pathSegments.last()}?t=${httpUrl.queryParameter("t")!!}"
|
val rawUrl = vrfHelper.getVidSrc(query, host).addAutoStart()
|
||||||
val rawUrl = vrfHelper.getVidSrc(query, host)
|
|
||||||
|
|
||||||
val refererHeaders = headers.newBuilder().apply {
|
val refererHeaders = headers.newBuilder().apply {
|
||||||
add("Referer", referer)
|
add("Accept", "application/json, text/javascript, */*; q=0.01")
|
||||||
|
add("Host", host)
|
||||||
|
add("Referer", url.addAutoStart())
|
||||||
|
add("X-Requested-With", "XMLHttpRequest")
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
val infoJson = client.newCall(
|
val infoJson = client.newCall(
|
||||||
@ -41,18 +49,36 @@ class VidsrcExtractor(private val client: OkHttpClient, private val headers: Hea
|
|||||||
).execute().parseAs<VidsrcResponse>()
|
).execute().parseAs<VidsrcResponse>()
|
||||||
|
|
||||||
val subtitleList = httpUrl.queryParameter("sub.info")?.let {
|
val subtitleList = httpUrl.queryParameter("sub.info")?.let {
|
||||||
|
val subtitlesHeaders = headers.newBuilder().apply {
|
||||||
|
add("Accept", "application/json, text/javascript, */*; q=0.01")
|
||||||
|
add("Host", it.toHttpUrl().host)
|
||||||
|
add("Origin", "https://$host")
|
||||||
|
add("Referer", referer)
|
||||||
|
}.build()
|
||||||
|
|
||||||
client.newCall(
|
client.newCall(
|
||||||
GET(it, headers = refererHeaders),
|
GET(it, headers = subtitlesHeaders),
|
||||||
).execute().parseAs<List<FMoviesSubs>>().map {
|
).execute().parseAs<List<FMoviesSubs>>().map {
|
||||||
Track(it.file, it.label)
|
Track(it.file, it.label)
|
||||||
}
|
}
|
||||||
} ?: emptyList()
|
} ?: emptyList()
|
||||||
|
|
||||||
return infoJson.result.sources.distinctBy { it.file }.flatMap {
|
return infoJson.result.sources.distinctBy { it.file }.flatMap {
|
||||||
playlistUtils.extractFromHls(it.file, subtitleList = subtitleList, referer = referer, videoNameGen = { q -> "$name - $q" })
|
val url = it.file
|
||||||
|
.toHttpUrl()
|
||||||
|
.newBuilder()
|
||||||
|
.fragment(null)
|
||||||
|
.build()
|
||||||
|
.toString()
|
||||||
|
|
||||||
|
playlistUtils.extractFromHls(url, subtitleList = subtitleList, referer = referer, videoNameGen = { q -> "$name - $q" })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun String.addAutoStart(): String {
|
||||||
|
return this.toHttpUrl().newBuilder().setQueryParameter("autostart", "true").build().toString()
|
||||||
|
}
|
||||||
|
|
||||||
private inline fun <reified T> Response.parseAs(transform: (String) -> String = { it }): T {
|
private inline fun <reified T> Response.parseAs(transform: (String) -> String = { it }): T {
|
||||||
val responseBody = use { transform(it.body.string()) }
|
val responseBody = use { transform(it.body.string()) }
|
||||||
return json.decodeFromString(responseBody)
|
return json.decodeFromString(responseBody)
|
||||||
|
@ -8,7 +8,7 @@ ext {
|
|||||||
extName = 'Seez'
|
extName = 'Seez'
|
||||||
pkgNameSuffix = 'en.seez'
|
pkgNameSuffix = 'en.seez'
|
||||||
extClass = '.Seez'
|
extClass = '.Seez'
|
||||||
extVersionCode = 3
|
extVersionCode = 4
|
||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ class VrfHelper(private val client: OkHttpClient, private val headers: Headers)
|
|||||||
|
|
||||||
fun getVidSrc(query: String, host: String): String {
|
fun getVidSrc(query: String, host: String): String {
|
||||||
val url = API_URL.newBuilder().apply {
|
val url = API_URL.newBuilder().apply {
|
||||||
addPathSegment("rawVizcloud")
|
addPathSegment(if (host.contains("mcloud", true)) "rawMcloud" else "rawVizcloud")
|
||||||
addQueryParameter("apikey", API_KEY)
|
addQueryParameter("apikey", API_KEY)
|
||||||
}.build().toString()
|
}.build().toString()
|
||||||
|
|
||||||
|
@ -21,17 +21,27 @@ class VidsrcExtractor(private val client: OkHttpClient, private val headers: Hea
|
|||||||
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
|
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
|
||||||
|
|
||||||
fun videosFromUrl(url: String, name: String): List<Video> {
|
fun videosFromUrl(url: String, name: String): List<Video> {
|
||||||
val host = "vidstream.pro"
|
val httpUrl = url.toHttpUrl()
|
||||||
|
val host = httpUrl.host
|
||||||
val referer = "https://$host/"
|
val referer = "https://$host/"
|
||||||
|
|
||||||
val httpUrl = url.toHttpUrl()
|
val query = buildString {
|
||||||
|
append(httpUrl.pathSegments.last())
|
||||||
|
append("?")
|
||||||
|
append(
|
||||||
|
httpUrl.queryParameterNames.joinToString("&") {
|
||||||
|
"$it=${httpUrl.queryParameter(it)}"
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val query = "${httpUrl.pathSegments.last()}?t=${httpUrl.queryParameter("t")!!}"
|
val rawUrl = vrfHelper.getVidSrc(query, host).addAutoStart()
|
||||||
val rawUrl = vrfHelper.getVidSrc(query, host)
|
|
||||||
|
|
||||||
val refererHeaders = headers.newBuilder().apply {
|
val refererHeaders = headers.newBuilder().apply {
|
||||||
add("Referer", referer)
|
add("Accept", "application/json, text/javascript, */*; q=0.01")
|
||||||
|
add("Host", host)
|
||||||
|
add("Referer", url.addAutoStart())
|
||||||
|
add("X-Requested-With", "XMLHttpRequest")
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
val infoJson = client.newCall(
|
val infoJson = client.newCall(
|
||||||
@ -39,18 +49,36 @@ class VidsrcExtractor(private val client: OkHttpClient, private val headers: Hea
|
|||||||
).execute().parseAs<VidsrcResponse>()
|
).execute().parseAs<VidsrcResponse>()
|
||||||
|
|
||||||
val subtitleList = httpUrl.queryParameter("sub.info")?.let {
|
val subtitleList = httpUrl.queryParameter("sub.info")?.let {
|
||||||
|
val subtitlesHeaders = headers.newBuilder().apply {
|
||||||
|
add("Accept", "application/json, text/javascript, */*; q=0.01")
|
||||||
|
add("Host", it.toHttpUrl().host)
|
||||||
|
add("Origin", "https://$host")
|
||||||
|
add("Referer", referer)
|
||||||
|
}.build()
|
||||||
|
|
||||||
client.newCall(
|
client.newCall(
|
||||||
GET(it, headers = refererHeaders),
|
GET(it, headers = subtitlesHeaders),
|
||||||
).execute().parseAs<List<FMoviesSubs>>().map {
|
).execute().parseAs<List<FMoviesSubs>>().map {
|
||||||
Track(it.file, it.label)
|
Track(it.file, it.label)
|
||||||
}
|
}
|
||||||
} ?: emptyList()
|
} ?: emptyList()
|
||||||
|
|
||||||
return infoJson.result.sources.distinctBy { it.file }.flatMap {
|
return infoJson.result.sources.distinctBy { it.file }.flatMap {
|
||||||
playlistUtils.extractFromHls(it.file, subtitleList = subtitleList, referer = referer, videoNameGen = { q -> "$name - $q" })
|
val url = it.file
|
||||||
|
.toHttpUrl()
|
||||||
|
.newBuilder()
|
||||||
|
.fragment(null)
|
||||||
|
.build()
|
||||||
|
.toString()
|
||||||
|
|
||||||
|
playlistUtils.extractFromHls(url, subtitleList = subtitleList, referer = referer, videoNameGen = { q -> "$name - $q" })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun String.addAutoStart(): String {
|
||||||
|
return this.toHttpUrl().newBuilder().setQueryParameter("autostart", "true").build().toString()
|
||||||
|
}
|
||||||
|
|
||||||
private inline fun <reified T> Response.parseAs(transform: (String) -> String = { it }): T {
|
private inline fun <reified T> Response.parseAs(transform: (String) -> String = { it }): T {
|
||||||
val responseBody = use { transform(it.body.string()) }
|
val responseBody = use { transform(it.body.string()) }
|
||||||
return json.decodeFromString(responseBody)
|
return json.decodeFromString(responseBody)
|
||||||
|
Reference in New Issue
Block a user