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("^