diff --git a/FushaarProvider/build.gradle.kts b/FushaarProvider/build.gradle.kts new file mode 100644 index 0000000..df7c009 --- /dev/null +++ b/FushaarProvider/build.gradle.kts @@ -0,0 +1,12 @@ +version = 1 + +cloudstream { + description = "" + authors = listOf( "Spoonge" ) + language = "ar" + status = 1 + + tvTypes = listOf( "Movie") + + iconUrl = "https://www.google.com/s2/favicons?domain=www.fushaar.com&sz=%size%" +} diff --git a/FushaarProvider/src/main/AndroidManifest.xml b/FushaarProvider/src/main/AndroidManifest.xml new file mode 100644 index 0000000..63e74f0 --- /dev/null +++ b/FushaarProvider/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/FushaarProvider/src/main/kotlin/com/fushaar/FushaarPlugin.kt b/FushaarProvider/src/main/kotlin/com/fushaar/FushaarPlugin.kt new file mode 100644 index 0000000..909ac2a --- /dev/null +++ b/FushaarProvider/src/main/kotlin/com/fushaar/FushaarPlugin.kt @@ -0,0 +1,11 @@ +package com.fushaar +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class FushaarPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(Fushaar()) + } +} \ No newline at end of file diff --git a/FushaarProvider/src/main/kotlin/com/fushaar/FushaarProvider.kt b/FushaarProvider/src/main/kotlin/com/fushaar/FushaarProvider.kt new file mode 100644 index 0000000..8f7c30d --- /dev/null +++ b/FushaarProvider/src/main/kotlin/com/fushaar/FushaarProvider.kt @@ -0,0 +1,124 @@ +package com.lagradost.cloudstream3.movieproviders + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities +import org.jsoup.nodes.Element + +class FushaarProvider : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://www.fushaar.com" + override var name = "Fushaar" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.Movie) + + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + private fun Element.toSearchResponse(): SearchResponse? { + val url = select("article.poster") + val posterUrl = select("img").attr("data-lazy-src") + val year = select("ul.labels li.year").text()?.getIntFromText() + var quality = select("div").first()?.attr("class")?.replace("hdd","hd")?.replace("caam","cam") + val title = select("div.info h3").text()+"\n"+select("div.info h4").text() + + return MovieSearchResponse( + title, + url.select("a").attr("href"), + this@FushaarProvider.name, + TvType.Movie, + posterUrl, + year, + null, + quality = getQualityFromString(quality), + ) + } + + override val mainPage = mainPageOf( + "Movies" to "$mainUrl" + (0..25).random(), + "Herror" to "$mainUrl/gerne/herror", + "Thriller" to "$mainUrl/gerne/thriller", + "Action" to "$mainUrl/gerne/action", + "Animation" to "$mainUrl/gerne/animation", + "Comedy" to "$mainUrl/gerne/comedy", + "Sci-fi" to "$mainUrl/gerne/sci-fi", + "Crime" to "$mainUrl/gerne/crime", + "Drama" to "$mainUrl/gerne/drama", + "Adventure" to "$mainUrl/gerne/adventure", + "Biography" to "$mainUrl/gerne/biography", + "Music" to "$mainUrl/gerne/music", + "Sport" to "$mainUrl/gerne/sport", + "Documentary" to "$mainUrl/gerne/documentary", + "History" to "$mainUrl/gerne/history", + "Family" to "$mainUrl/gerne/family", + "Romance" to "$mainUrl/gerne/romance", + "Mystery" to "$mainUrl/gerne/mystery" + ) + + override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { + val doc = app.get(request.data + "/page/$page/").document + val list = doc.select("article.poster").mapNotNull { element -> + element.toSearchResponse() + } + return newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val q = query.replace(" ", "%20") + return app.get("$mainUrl/?s=$q").document.select("article.poster").mapNotNull { + it.toSearchResponse() + } + } + + + override suspend fun load(url: String): LoadResponse { + var doc = app.get(url).document + val posterUrl = doc.select("figure.poster noscript img").attr("src") + val year = doc.select("header span.yearz").text()?.getIntFromText() + val title = doc.select("header h1").text()+"\n"+doc.select("header h2").text() + val synopsis = doc.select("div.postz").text() + val trailer = doc.select("div.rll-youtube-player iframe").attr("src") + val tags = doc.select("div.z-info li").map { it.text() } + + + return newMovieLoadResponse( + title, + url, + TvType.Movie, + url + ) { + this.posterUrl = posterUrl + this.year = year + this.tags = tags + this.plot = synopsis + addTrailer(trailer) + } + } + + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + app.get(data).document + .select("#fancyboxID-8 > script").map { + callback.invoke( + ExtractorLink( + source = this.name, + name = name, + url = it.html().substring(252,384), + referer = this.mainUrl, + quality = Qualities.Unknown.value, + isM3u8 = true + ) + ) + } +return true + } +}