From 50d25fdef0d7f5b4463c302f6b586d34b2a9f25a Mon Sep 17 00:00:00 2001 From: antonydp <38143733+antonydp@users.noreply.github.com> Date: Thu, 6 Oct 2022 22:09:36 +0200 Subject: [PATCH] StarLive fix --- .../kotlin/com/lagradost/StarLiveProvider.kt | 115 ++++++++++-------- 1 file changed, 62 insertions(+), 53 deletions(-) diff --git a/StarLiveProvider/src/main/kotlin/com/lagradost/StarLiveProvider.kt b/StarLiveProvider/src/main/kotlin/com/lagradost/StarLiveProvider.kt index 0541e02..cac74f5 100644 --- a/StarLiveProvider/src/main/kotlin/com/lagradost/StarLiveProvider.kt +++ b/StarLiveProvider/src/main/kotlin/com/lagradost/StarLiveProvider.kt @@ -3,19 +3,33 @@ package com.lagradost import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.utils.* +import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import org.jsoup.nodes.Element - class StarLiveProvider : MainAPI() { - override var lang = "it" override var mainUrl = "https://starlive.xyz" override var name = "StarLive" override val hasMainPage = true + override var lang = "it" override val hasChromecastSupport = true - override val supportedTypes = setOf( - TvType.Live, - ) + override val supportedTypes = setOf(TvType.Live) + + private data class LinkParser( + @JsonProperty("link") val link: String, + @JsonProperty("lang") val language: String, + @JsonProperty("name") val name: String + ) + + private data class MatchDataParser( + @JsonProperty("time") val time: String, + @JsonProperty("poster") val poster: String + ) + + private data class MatchParser( + @JsonProperty("linkData") val linkData: List, + @JsonProperty("matchData") val MatchData: MatchDataParser + ) + override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { val document = app.get(mainUrl).document @@ -24,25 +38,35 @@ class StarLiveProvider : MainAPI() { return HomePageResponse(sections.map { sport -> val dayMatch = sport.previousElementSiblings().toList().first { it.`is`("h3") }.text() - val categoryName = sport.selectFirst("h4")?.text()?:"Other" - val showsList = sport.select("tr").takeWhile { it.text().contains("Player").not() }.filter { it.hasAttr("class")}.drop(1) - val shows = showsList.groupBy { it.text().substringBeforeLast(" ")}.map { matchs -> - val posterUrl = fixUrl(sport.selectFirst("h4")?.attr("style")?.substringAfter("(")?.substringBefore(")")?:"") - val href = mutableListOf() - val hasDate = matchs.key.contains(":") - val matchName = if (hasDate){matchs.key.substringAfter(" ")} else{matchs.key} + val categoryName = sport.selectFirst("h4")?.text() ?: "Other" - matchs.value.map { match -> + val showsList = sport.select("tr").takeWhile { it.text().contains("Player").not() } + .filter { it.hasAttr("class") }.drop(1) + + val shows = showsList.groupBy { it.text().substringBeforeLast(" ") }.map { matchs -> + val posterUrl = fixUrl( + sport.selectFirst("h4")?.attr("style") + ?.substringAfter("(")?.substringBefore(")") ?: "" + ) + val hasDate = matchs.key.contains(":") + val matchName = if (hasDate) { matchs.key.substringAfter(" ")} + else { matchs.key } + + val href = matchs.value.map { match -> val linkUrl = fixUrl(match.selectFirst("a")?.attr("href") ?: "") val lang = match.attr("class") - href.add( "{\"link\": \"$linkUrl\", \"lang\":\"$lang\", \"name\": \"$matchName\"}") + LinkParser(linkUrl, lang, matchName) } - val date = if (hasDate){dayMatch + " - " + matchs.key.substringBefore(" ")} else{dayMatch} + val date = if (hasDate) { + dayMatch + " - " + matchs.key.substringBefore(" ") + } else { + dayMatch + } LiveSearchResponse( matchName, - "{\"linkData\": $href , \"matchData\":{\"time\": \"$date\", \"poster\":\"$posterUrl\"}}", + MatchParser(href, MatchDataParser(date, posterUrl)).toJson(), this@StarLiveProvider.name, TvType.Live, posterUrl, @@ -57,62 +81,47 @@ class StarLiveProvider : MainAPI() { } - private data class LinkParser( - @JsonProperty("link") val link: String, - @JsonProperty("lang") val language: String, - @JsonProperty("name") val name: String - ) - private data class MatchDataParser( - @JsonProperty("time") val time: String, - @JsonProperty("poster") val poster: String - ) - private data class MatchParser( - @JsonProperty("linkData") val linkData: List, - @JsonProperty("matchData") val MatchData: MatchDataParser - ) - override suspend fun load(url: String): LoadResponse { val matchdata = tryParseJson(url) - val poster = matchdata?.MatchData?.poster - val Matchstart = matchdata?.MatchData?.time + val poster = matchdata?.MatchData?.poster + val matchstart = matchdata?.MatchData?.time return LiveStreamLoadResponse( dataUrl = url, - url = matchdata?.linkData?.firstOrNull()?.link?:mainUrl, - name = matchdata?.linkData?.firstOrNull()?.name?:mainUrl, + url = matchdata?.linkData?.firstOrNull()?.link ?: mainUrl, + name = matchdata?.linkData?.firstOrNull()?.name ?: mainUrl, posterUrl = poster, - plot = Matchstart, + plot = matchstart, apiName = this@StarLiveProvider.name ) - - } - - - private suspend fun extractVideoLinks( data: LinkParser, callback: (ExtractorLink) -> Unit ) { - val linktoStream = "https:"+app.get(data.link).document.selectFirst("iframe")!!.attr("src") + val linktoStream = fixUrl(app.get(data.link).document.selectFirst("iframe")!!.attr("src")) - val referrerLink = if(linktoStream.contains("starlive")){ - app.get(linktoStream, referer = data.link).document.selectFirst("iframe")?.attr("src")?:"" - } - else{ + val referrerLink = if (linktoStream.contains("starlive")) { + app.get(linktoStream, referer = data.link).document.selectFirst("iframe")?.attr("src") + ?: "" + } else { linktoStream } - val packed = when(linktoStream.contains("starlive")){ - true -> app.get(referrerLink, referer = linktoStream).document.select("script")[6].childNodes()[0].toString() - false -> app.get(linktoStream, referer = data.link).document.select("script").select("script")[6].childNodes()[0].toString() + val packed = when (linktoStream.contains("starlive")) { + true -> app.get( + referrerLink, + referer = linktoStream + ).document.select("script").toString() + false -> app.get(linktoStream, referer = data.link).document.select("script") + .select("script").toString() } - val streamurl = getAndUnpack(packed).substringAfter("var src=\"").substringBefore("\"") + val streamUrl = getAndUnpack(packed).substringAfter("var src=\"").substringBefore("\"") callback( ExtractorLink( source = this.name, name = data.name + " - " + data.language, - url = streamurl, - quality = 0, + url = streamUrl, + quality = Qualities.Unknown.value, referer = referrerLink, isM3u8 = true ) @@ -127,7 +136,7 @@ class StarLiveProvider : MainAPI() { subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit ): Boolean { - tryParseJson(data)?.linkData?.map {link-> + tryParseJson(data)?.linkData?.map { link -> extractVideoLinks(link, callback) }