forked from recloudstream/cloudstream
		
	Added Egy.best (#774)
This commit is contained in:
		
							parent
							
								
									c1060592c8
								
							
						
					
					
						commit
						cd4994fee8
					
				
					 2 changed files with 154 additions and 0 deletions
				
			
		|  | @ -86,6 +86,7 @@ object APIHolder { | ||||||
|         KdramaHoodProvider(), |         KdramaHoodProvider(), | ||||||
|         AkwamProvider(), |         AkwamProvider(), | ||||||
|         MyCimaProvider(), |         MyCimaProvider(), | ||||||
|  |         EgyBestProvider(), | ||||||
|         AnimePaheProvider(), |         AnimePaheProvider(), | ||||||
|         NineAnimeProvider(), |         NineAnimeProvider(), | ||||||
|         AnimeWorldProvider(), |         AnimeWorldProvider(), | ||||||
|  |  | ||||||
|  | @ -0,0 +1,153 @@ | ||||||
|  | package com.lagradost.cloudstream3.movieproviders | ||||||
|  | 
 | ||||||
|  | import com.lagradost.cloudstream3.* | ||||||
|  | import com.lagradost.cloudstream3.utils.ExtractorLink | ||||||
|  | import com.lagradost.cloudstream3.utils.AppUtils.parseJson | ||||||
|  | import com.fasterxml.jackson.annotation.JsonProperty | ||||||
|  | import org.jsoup.nodes.Element | ||||||
|  | 
 | ||||||
|  | class EgyBestProvider : MainAPI() { | ||||||
|  |     override val lang = "ar" | ||||||
|  |     override val mainUrl = "https://egy.best" | ||||||
|  |     override val name = "EgyBest" | ||||||
|  |     override val usesWebView = false | ||||||
|  |     override val hasMainPage = true | ||||||
|  |     override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie) | ||||||
|  | 
 | ||||||
|  |     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") | ||||||
|  |         val title = select("span.title").text() | ||||||
|  |             .replace("\\(.*\\)".toRegex(), "") | ||||||
|  |         val year = select("span.title").text() | ||||||
|  |             .replace(".*\\(|\\)".toRegex(), "") | ||||||
|  |         val tvType = if (url.contains("/movie/")) TvType.Movie else TvType.TvSeries | ||||||
|  |         // If you need to differentiate use the url. | ||||||
|  |         return MovieSearchResponse( | ||||||
|  |             title, | ||||||
|  |             url, | ||||||
|  |             this@EgyBestProvider.name, | ||||||
|  |             tvType, | ||||||
|  |             posterUrl, | ||||||
|  |             year.toIntOrNull(), | ||||||
|  |             null, | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override suspend fun getMainPage(): HomePageResponse { | ||||||
|  |         // url, title | ||||||
|  |         val pagesUrl = listOf( | ||||||
|  |             Pair("$mainUrl/movies/?page="+(0..25).random(), "Movies"), | ||||||
|  |             Pair("$mainUrl/tv/?page="+(0..25).random(), "Series"), | ||||||
|  |         ) | ||||||
|  |         val pages = pagesUrl.apmap { (url, name) -> | ||||||
|  |             val doc = app.get(url).document | ||||||
|  |             val list = doc.select("div.movies a").not("a.auto.load.btn.b").mapNotNull { element -> | ||||||
|  |                 element.toSearchResponse() | ||||||
|  |             } | ||||||
|  |             HomePageList(name, list) | ||||||
|  |         }.sortedBy { it.name } | ||||||
|  |         return HomePageResponse(pages) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override suspend fun search(query: String): List<SearchResponse> { | ||||||
|  |         val q = query.replace(" ","%20") | ||||||
|  |         val result = arrayListOf<SearchResponse>() | ||||||
|  |         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 } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override suspend fun load(url: String): LoadResponse { | ||||||
|  |         val doc = app.get(url).document | ||||||
|  |         val isMovie = url.contains("/movie/") | ||||||
|  |         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[itemprop=\"name\"]").text() | ||||||
|  | 
 | ||||||
|  |         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() } | ||||||
|  | 
 | ||||||
|  |         return if (isMovie) { | ||||||
|  |             newMovieLoadResponse( | ||||||
|  |                 title, | ||||||
|  |                 url, | ||||||
|  |                 TvType.Movie, | ||||||
|  |                 url | ||||||
|  |             ) { | ||||||
|  |                 this.posterUrl = posterUrl | ||||||
|  |                 this.year = year | ||||||
|  |                 this.plot = synopsis | ||||||
|  |                 this.tags = tags | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             val episodes = ArrayList<TvSeriesEpisode>() | ||||||
|  |             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() | ||||||
|  |                 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( | ||||||
|  |                         TvSeriesEpisode( | ||||||
|  |                             eit.select("span.title").text(), | ||||||
|  |                             season, | ||||||
|  |                             ep, | ||||||
|  |                             eit.attr("href"), | ||||||
|  |                             null, | ||||||
|  |                             null | ||||||
|  |                         ) | ||||||
|  |                     ) | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes.distinct().sortedBy { it.episode }) { | ||||||
|  |                 this.posterUrl = posterUrl | ||||||
|  |                 this.tags = tags | ||||||
|  |                 this.year = year | ||||||
|  |                 this.plot = synopsis | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     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 requestJSON = app.get("https://zawmedia-api.herokuapp.com/egybest?url=$data").text | ||||||
|  |         val jsonArray = parseJson<List<Sources>>(requestJSON) | ||||||
|  |         for (i in jsonArray) { | ||||||
|  |             val quality = i.quality | ||||||
|  |             val link = i.link | ||||||
|  |                 callback.invoke( | ||||||
|  |                     ExtractorLink( | ||||||
|  |                         this.name, | ||||||
|  |                         this.name + " ${quality}p", | ||||||
|  |                         link, | ||||||
|  |                         this.mainUrl, | ||||||
|  |                         2, | ||||||
|  |                         true | ||||||
|  |                     ) | ||||||
|  |                 ) | ||||||
|  |         } | ||||||
|  |         return true | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue