From a9190fa268bc9949897380aecb2390de75b2cf9c Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Wed, 17 Aug 2022 14:12:09 +0200 Subject: [PATCH] Remove Arabic providers from English repository --- AkwamProvider/build.gradle.kts | 26 -- AkwamProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/AkwamProvider.kt | 224 ------------ .../com/lagradost/AkwamProviderPlugin.kt | 14 - EgyBestProvider/build.gradle.kts | 26 -- EgyBestProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/EgyBestProvider.kt | 237 ------------- .../com/lagradost/EgyBestProviderPlugin.kt | 14 - FaselHDProvider/build.gradle.kts | 27 -- FaselHDProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/FaselHDProvider.kt | 163 --------- .../com/lagradost/FaselHDProviderPlugin.kt | 14 - MyCimaProvider/build.gradle.kts | 26 -- MyCimaProvider/src/main/AndroidManifest.xml | 2 - .../kotlin/com/lagradost/MyCimaProvider.kt | 327 ------------------ .../com/lagradost/MyCimaProviderPlugin.kt | 14 - 16 files changed, 1120 deletions(-) delete mode 100644 AkwamProvider/build.gradle.kts delete mode 100644 AkwamProvider/src/main/AndroidManifest.xml delete mode 100644 AkwamProvider/src/main/kotlin/com/lagradost/AkwamProvider.kt delete mode 100644 AkwamProvider/src/main/kotlin/com/lagradost/AkwamProviderPlugin.kt delete mode 100644 EgyBestProvider/build.gradle.kts delete mode 100644 EgyBestProvider/src/main/AndroidManifest.xml delete mode 100644 EgyBestProvider/src/main/kotlin/com/lagradost/EgyBestProvider.kt delete mode 100644 EgyBestProvider/src/main/kotlin/com/lagradost/EgyBestProviderPlugin.kt delete mode 100644 FaselHDProvider/build.gradle.kts delete mode 100644 FaselHDProvider/src/main/AndroidManifest.xml delete mode 100644 FaselHDProvider/src/main/kotlin/com/lagradost/FaselHDProvider.kt delete mode 100644 FaselHDProvider/src/main/kotlin/com/lagradost/FaselHDProviderPlugin.kt delete mode 100644 MyCimaProvider/build.gradle.kts delete mode 100644 MyCimaProvider/src/main/AndroidManifest.xml delete mode 100644 MyCimaProvider/src/main/kotlin/com/lagradost/MyCimaProvider.kt delete mode 100644 MyCimaProvider/src/main/kotlin/com/lagradost/MyCimaProviderPlugin.kt diff --git a/AkwamProvider/build.gradle.kts b/AkwamProvider/build.gradle.kts deleted file mode 100644 index 25e7ed4..0000000 --- a/AkwamProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "Anime", - "Cartoon", - "TvSeries", - "Movie", - ) - iconUrl = "https://www.google.com/s2/favicons?domain=akwam.to&sz=24" -} \ No newline at end of file diff --git a/AkwamProvider/src/main/AndroidManifest.xml b/AkwamProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/AkwamProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/AkwamProvider/src/main/kotlin/com/lagradost/AkwamProvider.kt b/AkwamProvider/src/main/kotlin/com/lagradost/AkwamProvider.kt deleted file mode 100644 index b262f3a..0000000 --- a/AkwamProvider/src/main/kotlin/com/lagradost/AkwamProvider.kt +++ /dev/null @@ -1,224 +0,0 @@ -package com.lagradost - -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addActors -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.Qualities -import org.jsoup.nodes.Element - -class AkwamProvider : MainAPI() { - override var lang = "ar" - override var mainUrl = "https://akwam.to" - override var name = "Akwam" - override val usesWebView = false - override val hasMainPage = true - override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie, TvType.Anime, TvType.Cartoon) - - private fun Element.toSearchResponse(): SearchResponse? { - val url = select("a.box").attr("href") ?: return null - if (url.contains("/games/") || url.contains("/programs/")) return null - val poster = select("picture > img") - val title = poster.attr("alt") - val posterUrl = poster.attr("data-src") - val year = select(".badge-secondary").text().toIntOrNull() - - // If you need to differentiate use the url. - return MovieSearchResponse( - title, - url, - this@AkwamProvider.name, - TvType.TvSeries, - posterUrl, - year, - null, - ) - } - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - // Title, Url - val moviesUrl = listOf( - "Movies" to "$mainUrl/movies", - "Series" to "$mainUrl/series", - "Shows" to "$mainUrl/shows" - ) - val pages = moviesUrl.apmap { - val doc = app.get(it.second).document - val list = doc.select("div.col-lg-auto.col-md-4.col-6.mb-12").mapNotNull { element -> - element.toSearchResponse() - } - HomePageList(it.first, list) - }.sortedBy { it.name } - return HomePageResponse(pages) - } - - override suspend fun search(query: String): List { - val url = "$mainUrl/search?q=$query" - val doc = app.get(url).document - return doc.select("div.col-lg-auto").mapNotNull { - it.toSearchResponse() - } - } - - private fun String.getIntFromText(): Int? { - return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() - } - - private fun Element.toEpisode(): Episode { - val a = select("a.text-white") - val url = a.attr("href") - val title = a.text() - val thumbUrl = select("picture > img").attr("src") - val date = select("p.entry-date").text() - return newEpisode(url) { - name = title - episode = title.getIntFromText() - posterUrl = thumbUrl - addDate(date) - } - } - - - override suspend fun load(url: String): LoadResponse { - val doc = app.get(url).document - val isMovie = url.contains("/movie/") - val title = doc.select("h1.entry-title").text() - val posterUrl = doc.select("picture > img").attr("src") - - val year = - doc.select("div.font-size-16.text-white.mt-2").firstOrNull { - it.text().contains("السنة") - }?.text()?.getIntFromText() - - // A bit iffy to parse twice like this, but it'll do. - val duration = - doc.select("div.font-size-16.text-white.mt-2").firstOrNull { - it.text().contains("مدة الفيلم") - }?.text()?.getIntFromText() - - val synopsis = doc.select("div.widget-body p:first-child").text() - - val rating = doc.select("span.mx-2").text().split("/").lastOrNull()?.toRatingInt() - - val tags = doc.select("div.font-size-16.d-flex.align-items-center.mt-3 > a").map { - it.text() - } - - val actors = doc.select("div.widget-body > div > div.entry-box > a").mapNotNull { - val name = it?.selectFirst("div > .entry-title")?.text() ?: return@mapNotNull null - val image = it.selectFirst("div > img")?.attr("src") ?: return@mapNotNull null - Actor(name, image) - } - - val recommendations = - doc.select("div > div.widget-body > div.row > div > div.entry-box").mapNotNull { - val recTitle = it?.selectFirst("div.entry-body > .entry-title > .text-white") - ?: return@mapNotNull null - val href = recTitle.attr("href") ?: return@mapNotNull null - val name = recTitle.text() ?: return@mapNotNull null - val poster = it.selectFirst(".entry-image > a > picture > img")?.attr("data-src") - ?: return@mapNotNull null - MovieSearchResponse(name, href, this.name, TvType.Movie, fixUrl(poster)) - } - - return if (isMovie) { - newMovieLoadResponse( - title, - url, - TvType.Movie, - url - ) { - this.posterUrl = posterUrl - this.year = year - this.plot = synopsis - this.rating = rating - this.tags = tags - this.duration = duration - this.recommendations = recommendations - addActors(actors) - } - } else { - val episodes = doc.select("div.bg-primary2.p-4.col-lg-4.col-md-6.col-12").map { - it.toEpisode() - }.let { - val isReversed = (it.lastOrNull()?.episode ?: 1) < (it.firstOrNull()?.episode ?: 0) - if (isReversed) - it.reversed() - else it - } - - newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) { - this.duration = duration - this.posterUrl = posterUrl - this.tags = tags.filterNotNull() - this.rating = rating - this.year = year - this.plot = synopsis - this.recommendations = recommendations - addActors(actors) - } - } - } - - -// // Maybe possible to not use the url shortener but cba investigating that. -// private suspend fun skipUrlShortener(url: String): AppResponse { -// return app.get(app.get(url).document.select("a.download-link").attr("href")) -// } - - private fun getQualityFromId(id: Int?): Qualities { - return when (id) { - 2 -> Qualities.P360 // Extrapolated - 3 -> Qualities.P480 - 4 -> Qualities.P720 - 5 -> Qualities.P1080 - else -> Qualities.Unknown - } - } - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - val doc = app.get(data).document - - val links = doc.select("div.tab-content.quality").map { element -> - val quality = getQualityFromId(element.attr("id").getIntFromText()) - element.select(".col-lg-6 > a:contains(تحميل)").map { linkElement -> - if (linkElement.attr("href").contains("/download/")) { - Pair( - linkElement.attr("href"), - quality, - ) - } else { - val url = "$mainUrl/download${ - linkElement.attr("href").split("/link")[1] - }${data.split("/movie|/episode|/show/episode".toRegex())[1]}" - Pair( - url, - quality, - ) - // just in case if they add the shorts urls again - } - } - }.flatten() - - links.map { - val linkDoc = app.get(it.first).document - val button = linkDoc.select("div.btn-loader > a") - val url = button.attr("href") - - callback.invoke( - ExtractorLink( - this.name, - this.name, - url, - this.mainUrl, - it.second.value - ) - ) - } - return true - } -} diff --git a/AkwamProvider/src/main/kotlin/com/lagradost/AkwamProviderPlugin.kt b/AkwamProvider/src/main/kotlin/com/lagradost/AkwamProviderPlugin.kt deleted file mode 100644 index 9f65a9c..0000000 --- a/AkwamProvider/src/main/kotlin/com/lagradost/AkwamProviderPlugin.kt +++ /dev/null @@ -1,14 +0,0 @@ - -package com.lagradost - -import com.lagradost.cloudstream3.plugins.CloudstreamPlugin -import com.lagradost.cloudstream3.plugins.Plugin -import android.content.Context - -@CloudstreamPlugin -class AkwamProviderPlugin: Plugin() { - override fun load(context: Context) { - // All providers should be added in this manner. Please don't edit the providers list directly. - registerMainAPI(AkwamProvider()) - } -} \ No newline at end of file diff --git a/EgyBestProvider/build.gradle.kts b/EgyBestProvider/build.gradle.kts deleted file mode 100644 index 31966d8..0000000 --- a/EgyBestProvider/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -// use an integer for version numbers -version = 1 - - -cloudstream { - // All of these properties are optional, you can safely remove them - - // description = "Lorem Ipsum" - // authors = listOf("Cloudburst") - - /** - * Status int as the following: - * 0: Down - * 1: Ok - * 2: Slow - * 3: Beta only - * */ - status = 1 // will be 3 if unspecified - tvTypes = listOf( - "Anime", - "TvSeries", - "Movie", - ) - - iconUrl = "https://www.google.com/s2/favicons?domain=www.egy.best&sz=24" -} \ No newline at end of file diff --git a/EgyBestProvider/src/main/AndroidManifest.xml b/EgyBestProvider/src/main/AndroidManifest.xml deleted file mode 100644 index 29aec9d..0000000 --- a/EgyBestProvider/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/EgyBestProvider/src/main/kotlin/com/lagradost/EgyBestProvider.kt b/EgyBestProvider/src/main/kotlin/com/lagradost/EgyBestProvider.kt deleted file mode 100644 index 933b0f2..0000000 --- a/EgyBestProvider/src/main/kotlin/com/lagradost/EgyBestProvider.kt +++ /dev/null @@ -1,237 +0,0 @@ -package com.lagradost - -import com.fasterxml.jackson.annotation.JsonProperty -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.utils.AppUtils.parseJson -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import org.jsoup.nodes.Element - -class EgyBestProvider : MainAPI() { - override var lang = "ar" - override var mainUrl = "https://www.egy.best" - override var name = "EgyBest" - override val usesWebView = false - override val hasMainPage = true - override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie, TvType.Anime) - - private fun String.getIntFromText(): Int? { - return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() - } - - private fun Element.toSearchResponse(): SearchResponse? { - val url = this.attr("href") ?: return null - val posterUrl = select("img")?.attr("src") - var title = select("span.title").text() - val year = title.getYearFromTitle() - val isMovie = Regex(".*/movie/.*|.*/masrahiya/.*").matches(url) - val tvType = if (isMovie) TvType.Movie else TvType.TvSeries - title = if (year !== null) title else title.split(" (")[0].trim() - val quality = select("span.ribbon span").text().replace("-", "") - // If you need to differentiate use the url. - return MovieSearchResponse( - title, - url, - this@EgyBestProvider.name, - tvType, - posterUrl, - year, - null, - quality = getQualityFromString(quality) - ) - } - - override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { - // url, title - val doc = app.get(mainUrl).document - val pages = arrayListOf() - doc.select("#mainLoad div.mbox").apmap { - val name = it.select(".bdb.pda > strong").text() - if (it.select(".movie").first()?.attr("href")?.contains("season-(.....)|ep-(.....)".toRegex()) == true) return@apmap - val list = arrayListOf() - it.select(".movie").map { element -> - list.add(element.toSearchResponse()!!) - } - pages.add(HomePageList(name, list)) - } - return HomePageResponse(pages) - } - - override suspend fun search(query: String): List { - val q = query.replace(" ","%20") - val result = arrayListOf() - listOf("$mainUrl/explore/?q=$q").apmap { url -> - val d = app.get(url).document - d.select("div.movies a").not("a.auto.load.btn.b").mapNotNull { - it.toSearchResponse()?.let { it1 -> result.add(it1) } - } - } - return result.distinct().sortedBy { it.name } - } - - private fun String.getYearFromTitle(): Int? { - return Regex("""\(\d{4}\)""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() - } - - override suspend fun load(url: String): LoadResponse { - val doc = app.get(url).document - val isMovie = Regex(".*/movie/.*|.*/masrahiya/.*").matches(url) - val posterUrl = doc.select("div.movie_img a img")?.attr("src") - val year = doc.select("div.movie_title h1 a")?.text()?.toIntOrNull() - val title = doc.select("div.movie_title h1 span").text() - val youtubeTrailer = doc.select("div.play")?.attr("url") - - val synopsis = doc.select("div.mbox").firstOrNull { - it.text().contains("القصة") - }?.text()?.replace("القصة ", "") - - val tags = doc.select("table.movieTable tbody tr").firstOrNull { - it.text().contains("النوع") - }?.select("a")?.map { it.text() } - - val actors = doc.select("div.cast_list .cast_item").mapNotNull { - val name = it.selectFirst("div > a > img")?.attr("alt") ?: return@mapNotNull null - val image = it.selectFirst("div > a > img")?.attr("src") ?: return@mapNotNull null - val roleString = it.selectFirst("div > span")!!.text() - val mainActor = Actor(name, image) - ActorData(actor = mainActor, roleString = roleString) - } - - return if (isMovie) { - val recommendations = doc.select(".movies_small .movie").mapNotNull { element -> - element.toSearchResponse() - } - - newMovieLoadResponse( - title, - url, - TvType.Movie, - url - ) { - this.posterUrl = posterUrl - this.year = year - this.recommendations = recommendations - this.plot = synopsis - this.tags = tags - this.actors = actors - addTrailer(youtubeTrailer) - } - } else { - val episodes = ArrayList() - doc.select("#mainLoad > div:nth-child(2) > div.h_scroll > div a").map { - it.attr("href") - }.apmap { - val d = app.get(it).document - val season = Regex("season-(.....)").find(it)?.groupValues?.getOrNull(1)?.getIntFromText() - if(d.select("tr.published").isNotEmpty()) { - d.select("tr.published").map { element -> - val ep = Regex("ep-(.....)").find(element.select(".ep_title a").attr("href"))?.groupValues?.getOrNull(1)?.getIntFromText() - episodes.add( - Episode( - element.select(".ep_title a").attr("href"), - name = element.select("td.ep_title").html().replace(".*|".toRegex(), ""), - season, - ep, - rating = element.select("td.tam:not(.date, .ep_len)").text().getIntFromText() - ) - ) - } - } else { - d.select("#mainLoad > div:nth-child(3) > div.movies_small a").map { eit -> - val ep = Regex("ep-(.....)").find(eit.attr("href"))?.groupValues?.getOrNull(1)?.getIntFromText() - episodes.add( - Episode( - eit.attr("href"), - eit.select("span.title").text(), - season, - ep, - ) - ) - } - } - } - newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes.distinct().sortedBy { it.episode }) { - this.posterUrl = posterUrl - this.tags = tags - this.year = year - this.plot = synopsis - this.actors = actors - addTrailer(youtubeTrailer) - } - } - } - data class Sources ( - @JsonProperty("quality") val quality: Int?, - @JsonProperty("link") val link: String - ) - - override suspend fun loadLinks( - data: String, - isCasting: Boolean, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ): Boolean { - /*val baseURL = data.split("/")[0] + "//" + data.split("/")[2] - val episodeSoup = app.get(data).document - - val vidstreamURL = fixUrlNull(episodeSoup.selectFirst("iframe.auto-size")?.attr("src") ) ?: throw ErrorLoadingException("No iframe") - val videoSoup = app.get(vidstreamURL).document - fixUrlNull( videoSoup.select("source").firstOrNull { it.hasAttr("src") }?.attr("src"))?.let { - callback.invoke(ExtractorLink(this.name,this.name,it,"",Qualities.Unknown.value,it.contains(".m3u8"))) - } ?: run { - var jsCode = videoSoup.select("script")[1].data() - - val verificationToken = Regex("{'[0-9a-zA-Z_]*':'ok'}").findAll(jsCode)[0][2:-7] - val encodedAdLinkVar = Regex("([0-9a-zA-Z_]{2,12}\[Math").findAll(jsCode)[0][1:-5] - val encodingArraysRegEx = Regex(",[0-9a-zA-Z_]{2,12}=\[\]").findAll(jsCode) - val firstEncodingArray = encodingArraysRegEx[1][1:-3] - val secondEncodingArray = encodingArraysRegEx[2][1:-3] - - jsCode = Regex("^