From a47811680db6b8b4312042e9ee4baf9d0d13cf91 Mon Sep 17 00:00:00 2001 From: hexated Date: Thu, 20 Apr 2023 14:22:52 +0700 Subject: [PATCH] sora: clean series9 & cryMovies --- SoraStream/build.gradle.kts | 2 +- .../src/main/kotlin/com/hexated/Extractors.kt | 5 + .../main/kotlin/com/hexated/SoraExtractor.kt | 104 ++++++++---------- .../src/main/kotlin/com/hexated/SoraStream.kt | 16 +-- .../main/kotlin/com/hexated/SoraStreamLite.kt | 11 -- .../kotlin/com/hexated/SoraStreamPlugin.kt | 1 + 6 files changed, 59 insertions(+), 80 deletions(-) diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 6b150733..4a493efb 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 121 +version = 122 cloudstream { diff --git a/SoraStream/src/main/kotlin/com/hexated/Extractors.kt b/SoraStream/src/main/kotlin/com/hexated/Extractors.kt index 746aed00..c37af8f5 100644 --- a/SoraStream/src/main/kotlin/com/hexated/Extractors.kt +++ b/SoraStream/src/main/kotlin/com/hexated/Extractors.kt @@ -45,6 +45,11 @@ class StreamhideCom : Filesim() { override var mainUrl: String = "https://streamhide.com" } +class Movhide : Filesim() { + override var name: String = "Movhide" + override var mainUrl: String = "https://movhide.pro" +} + class Watchx : Chillx() { override val name = "Watchx" override val mainUrl = "https://watchx.top" diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index f2139a81..a9b1282d 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -1,6 +1,7 @@ package com.hexated import com.fasterxml.jackson.annotation.JsonProperty +import com.hexated.GogoExtractor.extractVidstream import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson @@ -157,38 +158,6 @@ object SoraExtractor : SoraStream() { } - suspend fun invoke123Movie( - tmdbId: Int? = null, - imdbId: String? = null, - season: Int? = null, - episode: Int? = null, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ) { - val url = if (season == null) { - "$movie123API/imdb.php?imdb=$imdbId&server=vcu" - } else { - "$movie123API/tmdb_api.php?se=$season&ep=$episode&tmdb=$tmdbId&server_name=vcu" - } - val iframe = app.get(url).document.selectFirst("iframe")?.attr("src") ?: return - - val doc = app.get( - iframe, - referer = url, - headers = mapOf("Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") - ).document - - doc.select("ul.list-server-items li.linkserver").mapNotNull { server -> - server.attr("data-video").let { - Regex("(.*?)((\\?cap)|(\\?sub)|(#cap)|(#sub))").find(it)?.groupValues?.get(1) - } - }.apmap { link -> - loadExtractor( - link, "https://123moviesjr.cc/", subtitleCallback, callback - ) - } - } - suspend fun invokeMovieHab( imdbId: String? = null, season: Int? = null, @@ -336,32 +305,41 @@ object SoraExtractor : SoraStream() { app.get("$series9API/film/$fixTitle-season-$season/watching.html").document } - doc.select("div#list-eps div.le-server").apmap { ele -> - val server = if (season == null) { + val server = doc.select("div#list-eps div.le-server").map { ele -> + if (season == null) { ele.select("a").attr("player-data") } else { ele.select("a[episode-data=$episode]").attr("player-data") - }.let { httpsify(it) } - - if (server.startsWith("https://movembed.cc")) { - val iv = "9225679083961858" - val secretKey = "25742532592138496744665879883281" - val secretDecryptKey = secretKey - GogoExtractor.extractVidstream( - server, - "Vidstream", - callback, - iv, - secretKey, - secretDecryptKey, - isUsingAdaptiveKeys = false, - isUsingAdaptiveData = true, - iframeDocument = app.get(server).document - ) - } else { - loadExtractor(server, series9API, subtitleCallback, callback) } - } + }.find { it.contains(Regex("movembed|membed")) } + + val iframe = app.get(httpsify(server ?: return)) + val iframeDoc = iframe.document + + argamap({ + iframeDoc.select(".list-server-items > .linkserver") + .forEach { element -> + val status = element.attr("data-status") ?: return@forEach + if (status != "1") return@forEach + val extractorData = element.attr("data-video") ?: return@forEach + loadExtractor(extractorData, iframe.url, subtitleCallback, callback) + } + }, { + val iv = "9225679083961858" + val secretKey = "25742532592138496744665879883281" + val secretDecryptKey = secretKey + extractVidstream( + iframe.url, + "Vidstream", + callback, + iv, + secretKey, + secretDecryptKey, + isUsingAdaptiveKeys = false, + isUsingAdaptiveData = true, + iframeDocument = iframeDoc + ) + }) } suspend fun invokeIdlix( @@ -2983,12 +2961,26 @@ object SoraExtractor : SoraStream() { suspend fun invokeCryMovies( imdbId: String? = null, + title: String? = null, + year: Int? = null, + season: Int? = null, + episode: Int? = null, callback: (ExtractorLink) -> Unit ) { app.get("$cryMoviesAPI/stream/movie/$imdbId.json") - .parsedSafe()?.streams?.map { stream -> + .parsedSafe()?.streams?.filter { + matchingIndex( + it.title, + null, + title, + year, + season, + episode, + true + ) + }?.map { stream -> val quality = getIndexQuality(stream.title) - val tags = getIndexQualityTags(stream.title, true) + val tags = getIndexQualityTags(stream.title) val size = getIndexSize(stream.title) val headers = stream.behaviorHints?.proxyHeaders?.request ?: mapOf() diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 140c7505..1bce77cf 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -1,7 +1,6 @@ package com.hexated import com.fasterxml.jackson.annotation.JsonProperty -import com.hexated.SoraExtractor.invoke123Movie import com.hexated.SoraExtractor.invokeAnimes import com.hexated.SoraExtractor.invokeAsk4Movies import com.hexated.SoraExtractor.invokeBlackmovies @@ -90,7 +89,6 @@ open class SoraStream : TmdbProvider() { const val twoEmbedAPI = "https://www.2embed.to" const val vidSrcAPI = "https://v2.vidsrc.me" const val dbgoAPI = "https://dbgo.fun" - const val movie123API = "https://api.123movie.cc" const val movieHabAPI = "https://moviehab.com" const val databaseGdriveAPI = "https://databasegdriveplayer.co" const val hdMovieBoxAPI = "https://hdmoviebox.net" @@ -387,16 +385,6 @@ open class SoraStream : TmdbProvider() { { invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback) }, - { - invoke123Movie( - res.id, - res.imdbId, - res.season, - res.episode, - subtitleCallback, - callback - ) - }, { invokeMovieHab(res.imdbId, res.season, res.episode, subtitleCallback, callback) }, @@ -817,6 +805,10 @@ open class SoraStream : TmdbProvider() { { if(!res.isAnime && res.season == null) invokeCryMovies( res.imdbId, + 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 92b1fa67..68d78333 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -1,6 +1,5 @@ package com.hexated -import com.hexated.SoraExtractor.invoke123Movie import com.hexated.SoraExtractor.invokeAnimes import com.hexated.SoraExtractor.invokeAsk4Movies import com.hexated.SoraExtractor.invokeCrunchyroll @@ -93,16 +92,6 @@ class SoraStreamLite : SoraStream() { { invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback) }, - { - invoke123Movie( - res.id, - res.imdbId, - res.season, - res.episode, - subtitleCallback, - callback - ) - }, { invokeMovie123Net( res.title, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamPlugin.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamPlugin.kt index 0070c27f..ae575911 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamPlugin.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamPlugin.kt @@ -19,5 +19,6 @@ class SoraStreamPlugin: Plugin() { registerExtractorAPI(Chillx()) registerExtractorAPI(Watchx()) registerExtractorAPI(StreamhideCom()) + registerExtractorAPI(Movhide()) } } \ No newline at end of file