From 29a1e11e4ec5e60b545e65a945b583d09c72a3db Mon Sep 17 00:00:00 2001 From: LikDev-256 <81100289+LikDev-256@users.noreply.github.com> Date: Tue, 29 Nov 2022 15:44:42 +0530 Subject: [PATCH 1/3] Better code and fully fix Eurostreaming + verbump (#59) Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com> --- EurostreamingProvider/build.gradle.kts | 3 +- .../com/lagradost/EurostreamingProvider.kt | 77 +++++++++---------- 2 files changed, 39 insertions(+), 41 deletions(-) diff --git a/EurostreamingProvider/build.gradle.kts b/EurostreamingProvider/build.gradle.kts index 62f8d76..46e2d8e 100644 --- a/EurostreamingProvider/build.gradle.kts +++ b/EurostreamingProvider/build.gradle.kts @@ -1,6 +1,5 @@ // use an integer for version numbers -version = 1 - +version = 2 cloudstream { language = "it" diff --git a/EurostreamingProvider/src/main/kotlin/com/lagradost/EurostreamingProvider.kt b/EurostreamingProvider/src/main/kotlin/com/lagradost/EurostreamingProvider.kt index ec81f4e..415c9a9 100644 --- a/EurostreamingProvider/src/main/kotlin/com/lagradost/EurostreamingProvider.kt +++ b/EurostreamingProvider/src/main/kotlin/com/lagradost/EurostreamingProvider.kt @@ -5,70 +5,68 @@ import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.loadExtractor import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.toJson - +import com.lagradost.cloudstream3.network.CloudflareKiller +import okhttp3.FormBody +import org.jsoup.nodes.Element class EurostreamingProvider : MainAPI() { override var lang = "it" - override var mainUrl = "https://eurostreaming.social" + override var mainUrl = "https://eurostreaming.taxi" override var name = "Eurostreaming" override val hasMainPage = true override val hasChromecastSupport = true + private val interceptor = CloudflareKiller() override val supportedTypes = setOf( TvType.TvSeries ) override val mainPage = mainPageOf( - Pair("$mainUrl/serie-tv-archive/page/", "Ultime serie Tv"), - Pair("$mainUrl/animazione/page/", "Ultime serie Animazione"), - + "$mainUrl/serie-tv-archive/page/" to "Ultime serie Tv", + "$mainUrl/animazione/page/" to "Ultime serie Animazione", ) override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { val url = request.data + page - val soup = app.get(url).document + val soup = app.get(url, interceptor = interceptor).document val home = soup.select("div.post-thumb").map { - val title = it.selectFirst("img")!!.attr("alt") - val link = it.selectFirst("a")!!.attr("href") - val image = fixUrl(it.selectFirst("img")!!.attr("src")) - - MovieSearchResponse( - title, - link, - this.name, - TvType.Movie, - image - ) + it.toSearchResult() + } + return newHomePageResponse(arrayListOf(HomePageList(request.name, home)), hasNext = true) + } + + private fun Element.toSearchResult(): SearchResponse { + val title = this.selectFirst("a")?.attr("title") + val link = this.selectFirst("a")?.attr("href") + val image = fixUrlNull(mainUrl + this.selectFirst("img")?.attr("src")?.trim()) + + return newTvSeriesSearchResponse(title, link, TvType.TvSeries){ + this.posterUrl = image + this.posterHeaders = interceptor.getCookieHeaders(mainUrl).toMap() } - return newHomePageResponse(request.name, home) } override suspend fun search(query: String): List { - val doc = app.post( - "$mainUrl/index.php", data = mapOf( - "do" to "search", - "subaction" to "search", - "story" to query, - "sortby" to "news_read" - ) - ).document - return doc.select("div.post-thumb").map { - val title = it.selectFirst("img")!!.attr("alt") - val link = it.selectFirst("a")!!.attr("href") - val image = mainUrl + it.selectFirst("img")!!.attr("src") + val body = FormBody.Builder() + .addEncoded("do", "search") + .addEncoded("subaction", "search") + .addEncoded("story", query) + .addEncoded("sortby", "news_read") + .build() - MovieSearchResponse( - title, - link, - this.name, - TvType.Movie, - image - ) + val doc = app.post( + "$mainUrl/index.php", + requestBody = body, + interceptor = interceptor + ).document + + return doc.select("div.post-thumb").mapNotNull { + it?.toSearchResult() } } override suspend fun load(url: String): LoadResponse { - val page = app.get(url) + val page = app.get(url, interceptor = interceptor) val document = page.document val title = document.selectFirst("h2")!!.text().replace("^([1-9+]]$","") val style = document.selectFirst("div.entry-cover")!!.attr("style") @@ -93,7 +91,8 @@ class EurostreamingProvider : MainAPI() { } } return newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodeList) { - posterUrl = poster + this.posterUrl = poster + this.posterHeaders = interceptor.getCookieHeaders(mainUrl).toMap() } } From 89b344b132d88ef247711eb99e55c3a90dae5d92 Mon Sep 17 00:00:00 2001 From: Cloudburst <18114966+C10udburst@users.noreply.github.com> Date: Tue, 29 Nov 2022 11:37:41 +0100 Subject: [PATCH 2/3] Update EurostreamingProvider.kt --- .../main/kotlin/com/lagradost/EurostreamingProvider.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EurostreamingProvider/src/main/kotlin/com/lagradost/EurostreamingProvider.kt b/EurostreamingProvider/src/main/kotlin/com/lagradost/EurostreamingProvider.kt index 415c9a9..ef507c0 100644 --- a/EurostreamingProvider/src/main/kotlin/com/lagradost/EurostreamingProvider.kt +++ b/EurostreamingProvider/src/main/kotlin/com/lagradost/EurostreamingProvider.kt @@ -29,15 +29,15 @@ class EurostreamingProvider : MainAPI() { val url = request.data + page val soup = app.get(url, interceptor = interceptor).document - val home = soup.select("div.post-thumb").map { + val home = soup.select("div.post-thumb").mapNotNull { it.toSearchResult() } return newHomePageResponse(arrayListOf(HomePageList(request.name, home)), hasNext = true) } - private fun Element.toSearchResult(): SearchResponse { - val title = this.selectFirst("a")?.attr("title") - val link = this.selectFirst("a")?.attr("href") + private fun Element.toSearchResult(): SearchResponse? { + val title = this.selectFirst("a")?.attr("title") ?: return null + val link = this.selectFirst("a")?.attr("href") ?: return null val image = fixUrlNull(mainUrl + this.selectFirst("img")?.attr("src")?.trim()) return newTvSeriesSearchResponse(title, link, TvType.TvSeries){ From 2faa926b2d03cead51de077fbb9bd2dc4ea2faff Mon Sep 17 00:00:00 2001 From: Zaw <42999156+ImZaw@users.noreply.github.com> Date: Tue, 29 Nov 2022 22:55:08 +0300 Subject: [PATCH 3/3] quality shit and removing domains name from source (#58) --- NineGoalProvider/build.gradle.kts | 2 +- .../main/kotlin/com/ninegoal/9GoalProvider.kt | 80 ++++++++++++------- 2 files changed, 54 insertions(+), 28 deletions(-) diff --git a/NineGoalProvider/build.gradle.kts b/NineGoalProvider/build.gradle.kts index bd90dd4..94d8a9c 100644 --- a/NineGoalProvider/build.gradle.kts +++ b/NineGoalProvider/build.gradle.kts @@ -1,4 +1,4 @@ -version = 3 +version = 4 cloudstream { description = "" diff --git a/NineGoalProvider/src/main/kotlin/com/ninegoal/9GoalProvider.kt b/NineGoalProvider/src/main/kotlin/com/ninegoal/9GoalProvider.kt index 77e190d..6033272 100644 --- a/NineGoalProvider/src/main/kotlin/com/ninegoal/9GoalProvider.kt +++ b/NineGoalProvider/src/main/kotlin/com/ninegoal/9GoalProvider.kt @@ -5,6 +5,7 @@ import com.lagradost.cloudstream3.utils.ExtractorLink import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.Qualities +import java.net.UnknownHostException import java.util.* data class Data ( @@ -58,6 +59,11 @@ data class sourceData ( data class sourcesJSON ( @JsonProperty("data" ) var data : sourceData? = sourceData() ) + +private fun String.getDomainFromUrl(): String? { + return Regex("""^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n\?\=]+)""").find(this)?.groupValues?.firstOrNull() +} + class NineGoal : MainAPI() { override var mainUrl = "https://9goaltv.to" override var name = "9Goal" @@ -74,7 +80,7 @@ class NineGoal : MainAPI() { val matchesData = parseJson(app.get("$apiUrl/v1/match/featured").text) val liveHomePageList = matchesData.data.filter { it.isLive == true }.map { LiveSearchResponse( - it.name.toString(), + it.name ?: "", apiUrl + "/v1/match/" + it.id, this@NineGoal.name, TvType.Live, @@ -83,7 +89,7 @@ class NineGoal : MainAPI() { } val featuredHomePageList = matchesData.data.filter { it.isLive == false }.map { LiveSearchResponse( - it.name.toString(), + it.name ?: "", apiUrl + "/v1/match/" + it.id, this@NineGoal.name, TvType.Live, @@ -101,12 +107,14 @@ class NineGoal : MainAPI() { override suspend fun load(url: String): LoadResponse { val json = parseJson(app.get(url).text).data return LiveStreamLoadResponse( - json?.name.toString(), + json?.name ?: "", url, this.name, "$url/stream", + "https://img.zr5.repl.co/vs?title=${json?.name}&home=${json?.home?.logo}&away=${json?.away?.logo}&live=${json?.isLive}" ) } + override suspend fun loadLinks( data: String, isCasting: Boolean, @@ -115,38 +123,56 @@ class NineGoal : MainAPI() { ): Boolean { val sourcesData = parseJson(app.get(data).text).data sourcesData?.playUrls?.apmap { - val brokenDomain = "canyou.letmestreamyou.net" - if(it.url.toString().startsWith("https://$brokenDomain")) { - mapOf( - "smoothlikebutterstream" to "playing.smoothlikebutterstream.com", - "tunnelcdnsw" to "playing.tunnelcdnsw.net", - "goforfreedomwme" to "playing.goforfreedomwme.net", - "gameon" to "turnthe.gameon.tel", - "whydontyoustreamwme" to "playing.whydontyoustreamwme.com" - ).apmap { (name, value) -> + val quality = it.name?.substringAfter("(")?.substringBefore(")").let { qualityText -> + when (qualityText) { + "Full HD" -> 1080 + "HD" -> 720 + "SD" -> 480 + else -> Qualities.Unknown.value + } + } + val language = it.name?.replace(""" \(.*""".toRegex(), "") ?: "" + val requestStatus = try { + app.head( + fixUrl( + it.url?.getDomainFromUrl() ?: "canyou.letmestreamyou.net" + ) + ).isSuccessful + } catch (e: UnknownHostException) { + false + } + val domain = fixUrl(it.url?.getDomainFromUrl() ?: "https://canyou.letmestreamyou.net") + if (!requestStatus) { + mapOf( + "(1)" to "https://playing.smoothlikebutterstream.com", + "(2)" to "https://playing.tunnelcdnsw.net", + "(3)" to "https://playing.goforfreedomwme.net", + "(4)" to "https://turnthe.gameon.tel", + "(5)" to "https://playing.whydontyoustreamwme.com" + ).apmap { (name, value) -> + callback.invoke( + ExtractorLink( + this.name, + "$language - $name", + it.url?.replace(domain, value) ?: "", + "$mainUrl/", + quality, + isM3u8 = true, + ) + ) + } + } else { callback.invoke( ExtractorLink( this.name, - "${this.name} ${it.name} - ${name}", - it.url.toString().replace(brokenDomain, value), + "$language - ${sourcesData.name}", + it.url ?: "", "$mainUrl/", - Qualities.Unknown.value, + quality, isM3u8 = true, ) ) } - } else { - callback.invoke( - ExtractorLink( - this.name, - "${this.name} ${it.name} - ${sourcesData.name}", - it.url.toString(), - "$mainUrl/", - Qualities.Unknown.value, - isM3u8 = true, - ) - ) - } } return true }