diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index eb2e0eb9..81871eab 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -2870,6 +2870,35 @@ object SoraExtractor : SoraStream() { } + suspend fun invokeUpcloud( + imdbId: String? = null, + season: Int? = null, + episode: Int? = null, + callback: (ExtractorLink) -> Unit + ) { + val apiUrl = base64DecodeAPI("dWI=Y2w=cC4=bXU=ZWE=LWI=Ynk=YmE=bS4=ZWE=dHI=ZXM=aW4=LWM=NDA=MDg=NjE=YmQ=Y2I=MmU=Ly8=czo=dHA=aHQ=") + val url = if (season == null) { + "$apiUrl/stream/movie/$imdbId.json" + } else { + "$apiUrl/stream/series/$imdbId:$season:$episode.json" + } + + app.get(url).parsedSafe()?.streams?.map { stream -> + callback.invoke( + ExtractorLink( + "Upcloud", + "Upcloud", + stream.url ?: return@map, + "", + stream.description?.toIntOrNull() ?: Qualities.Unknown.value, + headers = stream.behaviorHints?.proxyHeaders?.request ?: mapOf(), + isM3u8 = true + ) + ) + } + + } + suspend fun invokeNowTv( tmdbId: Int? = null, callback: (ExtractorLink) -> Unit @@ -3219,6 +3248,7 @@ data class CryMoviesBehaviorHints( data class CryMoviesStream( @JsonProperty("title") val title: String? = null, @JsonProperty("url") val url: String? = null, + @JsonProperty("description") val description: String? = null, @JsonProperty("behaviorHints") val behaviorHints: CryMoviesBehaviorHints? = null, ) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 558ffd60..057d1ec9 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -50,6 +50,7 @@ import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeSoraStream import com.hexated.SoraExtractor.invokeTvMovies import com.hexated.SoraExtractor.invokeUhdmovies +import com.hexated.SoraExtractor.invokeUpcloud import com.hexated.SoraExtractor.invokeVitoenMovies import com.hexated.SoraExtractor.invokeWatchOnline import com.hexated.SoraExtractor.invokeWatchsomuch @@ -565,6 +566,14 @@ open class SoraStream : TmdbProvider() { callback ) }, + { + invokeUpcloud( + res.imdbId, + res.season, + res.episode, + callback + ) + }, { invokePutlocker(res.title, res.year, res.season, res.episode, callback) }, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt index 079aa124..dff36d27 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -25,6 +25,7 @@ import com.hexated.SoraExtractor.invokeSeries9 import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeSoraStream import com.hexated.SoraExtractor.invokeTwoEmbed +import com.hexated.SoraExtractor.invokeUpcloud import com.hexated.SoraExtractor.invokeVidSrc import com.hexated.SoraExtractor.invokeWatchOnline import com.hexated.SoraExtractor.invokeWatchsomuch @@ -196,6 +197,14 @@ class SoraStreamLite : SoraStream() { callback ) }, + { + invokeUpcloud( + res.imdbId, + res.season, + res.episode, + callback + ) + }, { invokeXmovies( res.title,