From 4fa60e6b5e4aaf162a0fb32cbb6909edf7826e95 Mon Sep 17 00:00:00 2001 From: Stormunblessed <86633626+Stormunblessed@users.noreply.github.com> Date: Tue, 24 May 2022 19:22:44 +0000 Subject: [PATCH] fixes on mcloud/vidstream/bflix/9anime (#1091) * fixes * minor thing * minor thing --- .../animeproviders/NineAnimeProvider.kt | 2 +- .../cloudstream3/extractors/Mcloud.kt | 49 +++++----- .../cloudstream3/extractors/WcoStream.kt | 92 +++++++++++++++---- .../movieproviders/BflixProvider.kt | 2 +- .../cloudstream3/utils/ExtractorApi.kt | 1 + docs/providers.json | 8 +- 6 files changed, 111 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/NineAnimeProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/NineAnimeProvider.kt index e32b6c92..08dddf49 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/NineAnimeProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/NineAnimeProvider.kt @@ -64,7 +64,7 @@ class NineAnimeProvider : MainAPI() { } //Credits to https://github.com/jmir1 - private val key = "0wMrYU+ixjJ4QdzgfN2HlyIVAt3sBOZnCT9Lm7uFDovkb/EaKpRWhqXS5168ePcG" + private val key = "c/aUAorINHBLxWTy3uRiPt8J+vjsOheFG1E0q2X9CYwDZlnmd4Kb5M6gSVzfk7pQ" //key credits to @Modder4869 private fun getVrf(id: String): String? { val reversed = ue(encode(id) + "0000000").slice(0..5).reversed() diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Mcloud.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Mcloud.kt index 3e4531fc..b11ae2cc 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Mcloud.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Mcloud.kt @@ -4,10 +4,12 @@ import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.USER_AGENT import com.lagradost.cloudstream3.apmap import com.lagradost.cloudstream3.app +import com.lagradost.cloudstream3.extractors.WcoStream.Companion.cipher +import com.lagradost.cloudstream3.extractors.WcoStream.Companion.encrypt import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.M3u8Helper +import com.lagradost.cloudstream3.utils.M3u8Helper.Companion.generateM3u8 open class Mcloud : ExtractorApi() { override var name = "Mcloud" @@ -27,42 +29,47 @@ open class Mcloud : ExtractorApi() { "Referer" to "https://animekisa.in/", //Referer works for wco and animekisa, probably with others too "Pragma" to "no-cache", "Cache-Control" to "no-cache",) + private val key = "LCbu3iYC7ln24K7P" // key credits @Modder4869 override suspend fun getUrl(url: String, referer: String?): List? { - val link = url.replace("$mainUrl/e/","$mainUrl/info/") + val id = url.substringAfter("e/").substringAfter("embed/").substringBefore("?") + val encryptedid = encrypt(cipher(key, encrypt(id))).replace("/", "_").replace("=","") + val link = "$mainUrl/info/$encryptedid" val response = app.get(link, headers = headers).text - if(response.startsWith("")) { // TODO decrypt html for link return emptyList() } - - data class Sources ( - @JsonProperty("file") val file: String + data class SourcesMcloud ( + @JsonProperty("file" ) val file : String ) - data class Media ( - @JsonProperty("sources") val sources: List + data class MediaMcloud ( + @JsonProperty("sources" ) val sources : ArrayList = arrayListOf() + ) + + data class DataMcloud ( + @JsonProperty("media" ) val media : MediaMcloud? = MediaMcloud() ) data class JsonMcloud ( - @JsonProperty("success") val success: Boolean, - @JsonProperty("media") val media: Media, + @JsonProperty("status" ) val status : Int? = null, + @JsonProperty("data" ) val data : DataMcloud = DataMcloud() ) val mapped = parseJson(response) val sources = mutableListOf() - - if (mapped.success) - mapped.media.sources.apmap { + val checkfile = mapped.status == 200 + if (checkfile) + mapped.data.media?.sources?.apmap { if (it.file.contains("m3u8")) { - M3u8Helper.generateM3u8( - name, - it.file, - url, - headers = app.get(url).headers.toMap() - ).forEach { link -> - sources.add(link) - } + sources.addAll( + generateM3u8( + name, + it.file, + url, + headers = mapOf("Referer" to url) + ) + ) } } return sources diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/WcoStream.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/WcoStream.kt index 78ddcc24..d249a1a0 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/WcoStream.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/WcoStream.kt @@ -45,43 +45,102 @@ class VizcloudDigital : WcoStream() { override var mainUrl = "https://vizcloud.digital" } +class VizcloudCloud : WcoStream() { + override var mainUrl = "https://vizcloud.cloud" +} + open class WcoStream : ExtractorApi() { override var name = "VidStream" // Cause works for animekisa and wco override var mainUrl = "https://vidstream.pro" override val requiresReferer = false + companion object { + private val keytwo = "0wMrYU+ixjJ4QdzgfN2HlyIVAt3sBOZnCT9Lm7uFDovkb/EaKpRWhqXS5168ePcG" + fun encrypt(input: String): String { + if (input.any { it.code >= 256 }) throw Exception("illegal characters!") + var output = "" + for (i in input.indices step 3) { + val a = intArrayOf(-1, -1, -1, -1) + a[0] = input[i].code shr 2 + a[1] = (3 and input[i].code) shl 4 + if (input.length > i + 1) { + a[1] = a[1] or (input[i + 1].code shr 4) + a[2] = (15 and input[i + 1].code) shl 2 + } + if (input.length > i + 2) { + a[2] = a[2] or (input[i + 2].code shr 6) + a[3] = 63 and input[i + 2].code + } + for (n in a) { + if (n == -1) output += "=" + else { + if (n in 0..63) output += keytwo[n] + } + } + } + return output; + } + + fun cipher(inputOne: String, inputTwo: String): String { + val arr = IntArray(256) { it } + var output = "" + var u = 0 + var r: Int + for (a in arr.indices) { + u = (u + arr[a] + inputOne[a % inputOne.length].code) % 256 + r = arr[a] + arr[a] = arr[u] + arr[u] = r + } + u = 0 + var c = 0 + for (f in inputTwo.indices) { + c = (c + f) % 256 + u = (u + arr[c]) % 256 + r = arr[c] + arr[c] = arr[u] + arr[u] = r + output += (inputTwo[f].code xor arr[(arr[c] + arr[u]) % 256]).toChar() + } + return output + } + } + private val key = "LCbu3iYC7ln24K7P" // key credits @Modder4869 override suspend fun getUrl(url: String, referer: String?): List { val baseUrl = url.split("/e/")[0] - val html = app.get(url, headers = mapOf("Referer" to "https://wcostream.cc/")).text val (Id) = (Regex("/e/(.*?)?domain").find(url)?.destructured ?: Regex("""/e/(.*)""").find( url )?.destructured) ?: return emptyList() - val (skey) = Regex("""skey\s=\s['"](.*?)['"];""").find(html)?.destructured - ?: return emptyList() + // val (skey) = Regex("""skey\s=\s['"](.*?)['"];""").find(html)?.destructured + // ?: return emptyList() - val apiLink = "$baseUrl/info/$Id?domain=wcostream.cc&skey=$skey" + val encryptedID = encrypt(cipher(key, encrypt(Id))).replace("/", "_").replace("=","") + val apiLink = "$baseUrl/info/$encryptedID" val referrer = "$baseUrl/e/$Id?domain=wcostream.cc" - data class Sources( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String? + data class SourcesWco ( + @JsonProperty("file" ) val file : String ) - data class Media( - @JsonProperty("sources") val sources: List + data class MediaWco ( + @JsonProperty("sources" ) val sources : ArrayList = arrayListOf() ) - data class WcoResponse( - @JsonProperty("success") val success: Boolean, - @JsonProperty("media") val media: Media + data class DataWco ( + @JsonProperty("media" ) val media : MediaWco? = MediaWco() + ) + + data class WcoResponse ( + @JsonProperty("status" ) val status : Int? = null, + @JsonProperty("data" ) val data : DataWco? = DataWco() ) val mapped = app.get(apiLink, headers = mapOf("Referer" to referrer)).parsed() val sources = mutableListOf() - - if (mapped.success) { - mapped.media.sources.forEach { + val check = mapped.status == 200 + if (check) { + mapped.data?.media?.sources?.forEach { if (mainUrl == "https://vizcloud2.ru" || mainUrl == "https://vizcloud.online") { if (it.file.contains("vizcloud2.ru") || it.file.contains("vizcloud.online")) { // Had to do this thing 'cause "list.m3u8#.mp4" gives 404 error so no quality is added @@ -128,7 +187,8 @@ open class WcoStream : ExtractorApi() { "https://vizcloud.live", "https://vizcloud.info", "https://mwvn.vizcloud.info", - "https://vizcloud.digital" + "https://vizcloud.digital", + "https://vizcloud.cloud" ).contains(mainUrl) ) { if (it.file.contains("m3u8")) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/BflixProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/BflixProvider.kt index b660db0b..f454a5ee 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/BflixProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/BflixProvider.kt @@ -57,7 +57,7 @@ open class BflixProvider : MainAPI() { } //Credits to https://github.com/jmir1 - val key = "eST4kCjadnvlAm5b1BOGyLJzrE90Q6oKgRfhV+M8NDYtcxW3IP/qp2i7XHuwZFUs" + private val key = "5uLKesbh0nkrpPq9VwMC6+tQBdomjJ4HNl/fWOSiREvAYagT8yIG7zx2D13UZFXc" //key credits to @Modder4869 private fun getVrf(id: String): String? { val reversed = ue(encode(id) + "0000000").slice(0..5).reversed() diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt index 3f851ff1..44b9fe69 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -117,6 +117,7 @@ val extractorApis: Array = arrayOf( VizcloudInfo(), MwvnVizcloudInfo(), VizcloudDigital(), + VizcloudCloud(), Mp4Upload(), StreamTape(), diff --git a/docs/providers.json b/docs/providers.json index 7ffcd295..f180d76c 100644 --- a/docs/providers.json +++ b/docs/providers.json @@ -68,7 +68,7 @@ "BflixProvider": { "language": "en", "name": "Bflix", - "status": 0, + "status": 1, "url": "https://bflix.ru" }, "CinecalidadProvider": { @@ -151,7 +151,7 @@ "FmoviesToProvider": { "language": "en", "name": "Fmovies.to", - "status": 0, + "status": 1, "url": "https://fmovies.to" }, "FrenchStreamProvider": { @@ -253,7 +253,7 @@ "NineAnimeProvider": { "language": "en", "name": "9Anime", - "status": 0, + "status": 1, "url": "https://9anime.id" }, "NontonAnimeIDProvider": { @@ -331,7 +331,7 @@ "SflixProProvider": { "language": "en", "name": "Sflix.pro", - "status": 0, + "status": 1, "url": "https://sflix.pro" }, "SflixProvider": {