From e404a16ae90432d56b466c7ae79dbc88f0c84070 Mon Sep 17 00:00:00 2001 From: Rushikesh Chavan <66415100+rushi-chavan@users.noreply.github.com> Date: Fri, 12 Apr 2024 01:53:30 -0700 Subject: [PATCH 1/7] Extractor: Update Vidplay Extractor --- .../main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt index b9a07a6d..d5d0fb32 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt @@ -66,7 +66,7 @@ open class Vidplay : ExtractorApi() { } private suspend fun callFutoken(id: String, url: String): String? { - val script = app.get("$mainUrl/futoken").text + val script = app.get("$mainUrl/futoken", referer = url).text val k = "k='(\\S+)'".toRegex().find(script)?.groupValues?.get(1) ?: return null val a = mutableListOf(k) for (i in id.indices) { From 47ca5aa5cc29f305453cb8bd6a9f2ca92056a7b5 Mon Sep 17 00:00:00 2001 From: RowdyRushya <66415100+rushi-chavan@users.noreply.github.com> Date: Mon, 15 Apr 2024 21:05:50 -0700 Subject: [PATCH 2/7] Extractor: New extractor VidSrcTo + new AnyVidplay extractor which can be used on alternate vidplay domains by AnyVidplay(),getUrl(...) --- .../cloudstream3/extractors/VidSrcTo.kt | 74 +++++++++++++++++++ .../cloudstream3/extractors/Vidplay.kt | 4 + .../cloudstream3/utils/ExtractorApi.kt | 4 + 3 files changed, 82 insertions(+) create mode 100644 app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt new file mode 100644 index 00000000..a58d3fee --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt @@ -0,0 +1,74 @@ +package com.lagradost.cloudstream3.extractors + +import android.util.Base64 +import android.util.Log +import com.fasterxml.jackson.annotation.JsonProperty +import com.lagradost.cloudstream3.SubtitleFile +import com.lagradost.cloudstream3.apmap +import com.lagradost.cloudstream3.app +import com.lagradost.cloudstream3.utils.ExtractorApi +import com.lagradost.cloudstream3.utils.ExtractorLink +import java.net.URLDecoder +import javax.crypto.Cipher +import javax.crypto.spec.SecretKeySpec + +class VidSrcTo : ExtractorApi() { + override val name = "VidSrcTo" + override val mainUrl = "https://vidsrc.to" + override val requiresReferer = true + + override suspend fun getUrl( + url: String, + referer: String?, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ) { + val mediaId = + app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id") ?: return + val res = + app.get("$mainUrl/ajax/embed/episode/$mediaId/sources") + .parsedSafe() + if (res?.status == 200) { + res.result?.apmap { source -> + val embedRes = + app.get("$mainUrl/ajax/embed/source/${source.id}") + .parsedSafe() + val finalUrl = DecryptUrl(embedRes?.result?.encUrl ?: "") + Log.d("rowdyTest", source.title + ": " + finalUrl) + when (source.title) { + "Vidplay" -> + AnyVidplay(finalUrl.substringBefore("/e/")) + .getUrl(finalUrl, referer, subtitleCallback, callback) + "Filemoon" -> FileMoon().getUrl(finalUrl, referer, subtitleCallback, callback) + else -> {} + } + } + } + } + + private fun DecryptUrl(encUrl: String): String { + var data = encUrl.toByteArray() + data = Base64.decode(data, Base64.URL_SAFE) + val rc4Key = SecretKeySpec("WXrUARXb1aDLaZjI".toByteArray(), "RC4") + val cipher = Cipher.getInstance("RC4") + cipher.init(Cipher.DECRYPT_MODE, rc4Key, cipher.parameters) + data = cipher.doFinal(data) + return URLDecoder.decode(data.toString(Charsets.UTF_8), "utf-8") + } + data class VidsrctoEpisodeSources( + @JsonProperty("status") val status: Int, + @JsonProperty("result") val result: List? + ) + + data class VidsrctoResult( + @JsonProperty("id") val id: String, + @JsonProperty("title") val title: String + ) + + data class VidsrctoEmbedSource( + @JsonProperty("status") val status: Int, + @JsonProperty("result") val result: VidsrctoUrl + ) + + data class VidsrctoUrl(@JsonProperty("url") val encUrl: String) +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt index d5d0fb32..c5e01552 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidplay.kt @@ -13,6 +13,10 @@ import javax.crypto.spec.SecretKeySpec // Code found in https://github.com/KillerDogeEmpire/vidplay-keys // special credits to @KillerDogeEmpire for providing key +class AnyVidplay(hostUrl: String) : Vidplay() { + override val mainUrl = hostUrl +} + class MyCloud : Vidplay() { override val name = "MyCloud" override val mainUrl = "https://mcloud.bz" 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 5a845326..77367b61 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -10,6 +10,7 @@ import com.lagradost.cloudstream3.extractors.AStreamHub import com.lagradost.cloudstream3.extractors.Acefile import com.lagradost.cloudstream3.extractors.Ahvsh import com.lagradost.cloudstream3.extractors.Aico +import com.lagradost.cloudstream3.extractors.AnyVidplay import com.lagradost.cloudstream3.extractors.AsianLoad import com.lagradost.cloudstream3.extractors.Bestx import com.lagradost.cloudstream3.extractors.Blogger @@ -182,6 +183,7 @@ import com.lagradost.cloudstream3.extractors.Vanfem import com.lagradost.cloudstream3.extractors.Vicloud import com.lagradost.cloudstream3.extractors.VidSrcExtractor import com.lagradost.cloudstream3.extractors.VidSrcExtractor2 +import com.lagradost.cloudstream3.extractors.VidSrcTo import com.lagradost.cloudstream3.extractors.VideoVard import com.lagradost.cloudstream3.extractors.VideovardSX import com.lagradost.cloudstream3.extractors.Vidgomunime @@ -871,8 +873,10 @@ val extractorApis: MutableList = arrayListOf( Streamlare(), VidSrcExtractor(), VidSrcExtractor2(), + VidSrcTo(), PlayLtXyz(), AStreamHub(), + AnyVidplay(""); Vidplay(), VidplayOnline(), MyCloud(), From c82d2e329e07f7bcbe6293a50c1144dd4190ebe3 Mon Sep 17 00:00:00 2001 From: rushi-chavan Date: Mon, 15 Apr 2024 21:40:33 -0700 Subject: [PATCH 3/7] Update ExtractorApi.kt --- .../main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 77367b61..1df2556e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -876,7 +876,7 @@ val extractorApis: MutableList = arrayListOf( VidSrcTo(), PlayLtXyz(), AStreamHub(), - AnyVidplay(""); + AnyVidplay(""), Vidplay(), VidplayOnline(), MyCloud(), From a936fc9ac89ba64912222ae0895ca039276d2090 Mon Sep 17 00:00:00 2001 From: RowdyRushya <66415100+rushi-chavan@users.noreply.github.com> Date: Wed, 17 Apr 2024 10:14:39 -0700 Subject: [PATCH 4/7] suggestions --- .../cloudstream3/extractors/VidSrcTo.kt | 31 +++++++------------ .../cloudstream3/utils/ExtractorApi.kt | 2 -- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt index a58d3fee..0b0ab9ca 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt @@ -1,10 +1,9 @@ package com.lagradost.cloudstream3.extractors import android.util.Base64 -import android.util.Log import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.SubtitleFile -import com.lagradost.cloudstream3.apmap +import com.lagradost.cloudstream3.amap import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink @@ -23,24 +22,16 @@ class VidSrcTo : ExtractorApi() { subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit ) { - val mediaId = - app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id") ?: return - val res = - app.get("$mainUrl/ajax/embed/episode/$mediaId/sources") - .parsedSafe() - if (res?.status == 200) { - res.result?.apmap { source -> - val embedRes = - app.get("$mainUrl/ajax/embed/source/${source.id}") - .parsedSafe() - val finalUrl = DecryptUrl(embedRes?.result?.encUrl ?: "") - Log.d("rowdyTest", source.title + ": " + finalUrl) - when (source.title) { - "Vidplay" -> - AnyVidplay(finalUrl.substringBefore("/e/")) - .getUrl(finalUrl, referer, subtitleCallback, callback) - "Filemoon" -> FileMoon().getUrl(finalUrl, referer, subtitleCallback, callback) - else -> {} + app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id")?.let { mediaId -> + val res = app.get("$mainUrl/ajax/embed/episode/$mediaId/sources").parsedSafe() + if (res?.status == 200) { + res.result?.amap { source -> + val embedRes = app.get("$mainUrl/ajax/embed/source/${source.id}").parsedSafe() + val finalUrl = DecryptUrl(embedRes?.result?.encUrl ?: "") + when (source.title) { + "Vidplay" -> AnyVidplay(finalUrl.substringBefore("/e/")).getUrl(finalUrl, referer, subtitleCallback, callback) + "Filemoon" -> FileMoon().getUrl(finalUrl, referer, subtitleCallback, callback) + } } } } 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 1df2556e..274294cb 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -10,7 +10,6 @@ import com.lagradost.cloudstream3.extractors.AStreamHub import com.lagradost.cloudstream3.extractors.Acefile import com.lagradost.cloudstream3.extractors.Ahvsh import com.lagradost.cloudstream3.extractors.Aico -import com.lagradost.cloudstream3.extractors.AnyVidplay import com.lagradost.cloudstream3.extractors.AsianLoad import com.lagradost.cloudstream3.extractors.Bestx import com.lagradost.cloudstream3.extractors.Blogger @@ -876,7 +875,6 @@ val extractorApis: MutableList = arrayListOf( VidSrcTo(), PlayLtXyz(), AStreamHub(), - AnyVidplay(""), Vidplay(), VidplayOnline(), MyCloud(), From dc8ba3399c98bed6f847dd56e2775c76d9f67172 Mon Sep 17 00:00:00 2001 From: RowdyRushya <66415100+rushi-chavan@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:49:00 -0700 Subject: [PATCH 5/7] Learned and understood what is flattening the code. --- .../cloudstream3/extractors/VidSrcTo.kt | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt index 0b0ab9ca..94f10518 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt @@ -22,17 +22,15 @@ class VidSrcTo : ExtractorApi() { subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit ) { - app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id")?.let { mediaId -> - val res = app.get("$mainUrl/ajax/embed/episode/$mediaId/sources").parsedSafe() - if (res?.status == 200) { - res.result?.amap { source -> - val embedRes = app.get("$mainUrl/ajax/embed/source/${source.id}").parsedSafe() - val finalUrl = DecryptUrl(embedRes?.result?.encUrl ?: "") - when (source.title) { - "Vidplay" -> AnyVidplay(finalUrl.substringBefore("/e/")).getUrl(finalUrl, referer, subtitleCallback, callback) - "Filemoon" -> FileMoon().getUrl(finalUrl, referer, subtitleCallback, callback) - } - } + val mediaId = app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id") ?: return + val res = app.get("$mainUrl/ajax/embed/episode/$mediaId/sources").parsedSafe() ?: return + if (res?.status == 200) return + res.result?.amap { source -> + val embedRes = app.get("$mainUrl/ajax/embed/source/${source.id}").parsedSafe() ?: return@amap + val finalUrl = DecryptUrl(embedRes?.result?.encUrl) + when (source.title) { + "Vidplay" -> AnyVidplay(finalUrl.substringBefore("/e/")).getUrl(finalUrl, referer, subtitleCallback, callback) + "Filemoon" -> FileMoon().getUrl(finalUrl, referer, subtitleCallback, callback) } } } @@ -46,6 +44,7 @@ class VidSrcTo : ExtractorApi() { data = cipher.doFinal(data) return URLDecoder.decode(data.toString(Charsets.UTF_8), "utf-8") } + data class VidsrctoEpisodeSources( @JsonProperty("status") val status: Int, @JsonProperty("result") val result: List? From c363596d4f7fbf7afcd9ff5cf0cc2efff7e4ad85 Mon Sep 17 00:00:00 2001 From: RowdyRushya <66415100+rushi-chavan@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:56:16 -0700 Subject: [PATCH 6/7] Including series name in episode data. This data is passed to loadLinks but name is not included in TvSeriesLoadResponse which is crucial as not all sites support filtering using ids and name is required. --- .../com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt index 50301e22..c5b4d453 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt @@ -105,6 +105,7 @@ open class TmdbProvider : MainAPI() { this.id, episode.episode_number, episode.season_number, + this.name ?: this.original_name, ).toJson(), episode.name, episode.season_number, @@ -122,6 +123,7 @@ open class TmdbProvider : MainAPI() { this.id, episodeNum, season.season_number, + this.name ?: this.original_name, ).toJson(), season = season.season_number ) From ce3359c0fab19988033ca4db46442856f7fff8fd Mon Sep 17 00:00:00 2001 From: RowdyRushya <66415100+rushi-chavan@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:59:15 -0700 Subject: [PATCH 7/7] silly change --- .../main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt index 94f10518..62806b2f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcTo.kt @@ -24,7 +24,7 @@ class VidSrcTo : ExtractorApi() { ) { val mediaId = app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id") ?: return val res = app.get("$mainUrl/ajax/embed/episode/$mediaId/sources").parsedSafe() ?: return - if (res?.status == 200) return + if (res?.status != 200) return res.result?.amap { source -> val embedRes = app.get("$mainUrl/ajax/embed/source/${source.id}").parsedSafe() ?: return@amap val finalUrl = DecryptUrl(embedRes?.result?.encUrl)