From b77d6ead500af353b3c81fedbd010de529bccfa9 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 11 Jan 2024 18:49:11 +0700 Subject: [PATCH] fix --- .../src/main/kotlin/com/hexated/Extractors.kt | 90 ++++++++++++++++++ .../main/kotlin/com/hexated/SoraExtractor.kt | 91 ++++++++++++++----- .../src/main/kotlin/com/hexated/SoraStream.kt | 8 +- .../main/kotlin/com/hexated/SoraStreamLite.kt | 6 +- .../kotlin/com/hexated/SoraStreamPlugin.kt | 3 + 5 files changed, 163 insertions(+), 35 deletions(-) diff --git a/SoraStream/src/main/kotlin/com/hexated/Extractors.kt b/SoraStream/src/main/kotlin/com/hexated/Extractors.kt index b11a554b..78d52668 100644 --- a/SoraStream/src/main/kotlin/com/hexated/Extractors.kt +++ b/SoraStream/src/main/kotlin/com/hexated/Extractors.kt @@ -342,6 +342,96 @@ open class Netembed : ExtractorApi() { } } +open class Ridoo : ExtractorApi() { + override val name = "Ridoo" + override var mainUrl = "https://ridoo.net" + override val requiresReferer = true + + override suspend fun getUrl( + url: String, + referer: String?, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ) { + val response = app.get(url, referer = referer) + val script = if (!getPacked(response.text).isNullOrEmpty()) { + getAndUnpack(response.text) + } else { + response.document.selectFirst("script:containsData(sources:)")?.data() + } + val m3u8 = Regex("file:\\s*\"(.*?m3u8.*?)\"").find(script ?: return)?.groupValues?.getOrNull(1) + callback.invoke( + ExtractorLink( + this.name, + this.name, + m3u8 ?: return, + mainUrl, + Qualities.P1080.value, + INFER_TYPE + ) + ) + } + +} + +open class Streamvid : ExtractorApi() { + override val name = "Streamvid" + override val mainUrl = "https://streamvid.net" + override val requiresReferer = true + + override suspend fun getUrl( + url: String, + referer: String?, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ) { + val response = app.get(url, referer = referer) + val script = if (!getPacked(response.text).isNullOrEmpty()) { + getAndUnpack(response.text) + } else { + response.document.selectFirst("script:containsData(sources:)")?.data() + } + val m3u8 = + Regex("src:\\s*\"(.*?m3u8.*?)\"").find(script ?: return)?.groupValues?.getOrNull(1) + M3u8Helper.generateM3u8( + name, + m3u8 ?: return, + mainUrl + ).forEach(callback) + } + +} + +open class Embedrise : ExtractorApi() { + override val name = "Embedrise" + override val mainUrl = "https://embedrise.com" + override val requiresReferer = true + + override suspend fun getUrl( + url: String, + referer: String?, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ) { + val res = app.get(url, referer = referer).document + val title = res.select("title").text() + val video = res.select("video#player source").attr("src") + + callback.invoke( + ExtractorLink( + this.name, + this.name, + video, + "$mainUrl/", + getIndexQuality(title), + INFER_TYPE + ) + ) + + } + +} + class Streamwish : Filesim() { override val name = "Streamwish" override var mainUrl = "https://streamwish.to" diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index a3aa728f..25c6f27f 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -476,17 +476,34 @@ object SoraExtractor : SoraStream() { document.select("ul#playeroptionsul > li") .filter { element -> element.select("span.flag img").attr("src").contains("/en.") } .map { - Triple(it.attr("data-post"), it.attr("data-nume"), it.attr("data-type")) + Triple( + it.attr("data-post"), + it.attr("data-nume"), + it.attr("data-type") + ) }.apmap { (id, nume, type) -> - val source = app.get( - "$host/wp-json/dooplayer/v2/${id}/${type}/${nume}", - headers = mapOf("X-Requested-With" to "XMLHttpRequest"), - referer = "$host/" - ).parsed().embed_url - if (!source.contains("youtube")) { - loadExtractor(source, "$host/", subtitleCallback, callback) + val source = app.get( + "$host/wp-json/dooplayer/v2/${id}/${type}/${nume}", + headers = mapOf("X-Requested-With" to "XMLHttpRequest"), + referer = "$host/" + ).parsed().embed_url + if (!source.contains("youtube")) { + if (source.startsWith("https://voe.sx")) { + val req = app.get(source, referer = "$host/") + val server = getBaseUrl(req.url) + val script = req.text.substringAfter("wc0 = '").substringBefore("'") + val video = tryParseJson>(base64Decode(script))?.get("file") + M3u8Helper.generateM3u8( + "Voe", + video ?: return@apmap, + "$server/", + headers = mapOf("Origin" to server) + ).forEach(callback) + } else { + loadExtractor(source, "$host/", subtitleCallback, callback) + } + } } - } } suspend fun invokeNoverse( @@ -2339,25 +2356,51 @@ object SoraExtractor : SoraStream() { suspend fun invokeRidomovies( tmdbId: Int? = null, imdbId: String? = null, + title: String? = null, + season: Int? = null, + episode: Int? = null, + subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit, ) { - val slug = app.get("$ridomoviesAPI/core/api/search?q=$imdbId") - .parsedSafe()?.data?.items?.find { - it.contentable?.tmdbId == tmdbId || it.contentable?.imdbId == imdbId - }?.slug ?: return - app.get("$ridomoviesAPI/core/api/movies/$slug/videos") - .parsedSafe()?.data?.apmap { link -> + val slug = if (season == null) { + app.get("$ridomoviesAPI/core/api/search?q=$imdbId") + .parsedSafe()?.data?.items?.find { + it.contentable?.tmdbId == tmdbId || it.contentable?.imdbId == imdbId + }?.slug + } else { + app.get("$ridomoviesAPI/tv/${title.createSlug()}/season-$season/episode-$episode").text.substringAfterLast( + """postid\":\"""" + ).substringBefore("""\"""") + } ?: return + val url = if(season == null) { + "$ridomoviesAPI/core/api/movies/$slug/videos" + } else { + "$ridomoviesAPI/core/api/episodes/$slug/videos" + } + app.get(url).parsedSafe()?.data?.apmap { link -> val iframe = Jsoup.parse(link.url ?: return@apmap).select("iframe").attr("data-src") - val unpacked = getAndUnpack(app.get(iframe, referer = "$ridomoviesAPI/").text) - val video = Regex("=\"(aHR.*?)\";").find(unpacked)?.groupValues?.get(1) - callback.invoke( - ExtractorLink( - "Ridomovies", "Ridomovies", base64Decode( - video - ?: return@apmap - ), "${getBaseUrl(iframe)}/", Qualities.P1080.value, isM3u8 = true + if(iframe.startsWith("https://closeload.top")) { + val unpacked = + getAndUnpack( + app.get( + iframe, + referer = "$ridomoviesAPI/" + ).text + ) + val video = Regex("=\"(aHR.*?)\";").find(unpacked)?.groupValues?.get(1) + callback.invoke( + ExtractorLink( + "Ridomovies", + "Ridomovies", + base64Decode(video ?: return@apmap), + "${getBaseUrl(iframe)}/", + Qualities.P1080.value, + isM3u8 = true + ) ) - ) + } else { + loadExtractor(iframe, "$ridomoviesAPI/", subtitleCallback, callback) + } } } diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index b9b4b147..bbcac45e 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -104,7 +104,7 @@ open class SoraStream : TmdbProvider() { const val nowTvAPI = "https://myfilestorage.xyz" const val gokuAPI = "https://goku.sx" const val zshowAPI = BuildConfig.ZSHOW_API - const val ridomoviesAPI = "https://ridomovies.pw" + const val ridomoviesAPI = "https://ridomovies.tv" const val emoviesAPI = "https://emovies.si" const val multimoviesAPI = "https://multimovies.top" const val multimovies2API = "https://multimovies.click" @@ -584,11 +584,7 @@ open class SoraStream : TmdbProvider() { if (!res.isAnime) invokeNowTv(res.id, res.imdbId, res.season, res.episode, callback) }, { - if (!res.isAnime && res.season == null) invokeRidomovies( - res.id, - res.imdbId, - callback - ) + if (!res.isAnime && res.season == null) invokeRidomovies(res.id, res.imdbId, res.title, res.season, res.episode, subtitleCallback, callback) }, { if (!res.isAnime) invokeAllMovieland(res.imdbId, 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 03d63963..5ab38d6c 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -223,11 +223,7 @@ class SoraStreamLite : SoraStream() { ) }, { - if (!res.isAnime && res.season == null) invokeRidomovies( - res.id, - res.imdbId, - callback - ) + if (!res.isAnime && res.season == null) invokeRidomovies(res.id, res.imdbId, res.title, res.season, res.episode, subtitleCallback, callback) }, { if (!res.isAnime) invokeEmovies( diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamPlugin.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamPlugin.kt index d2456f6e..abc461c1 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamPlugin.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamPlugin.kt @@ -30,5 +30,8 @@ class SoraStreamPlugin: Plugin() { registerExtractorAPI(Netembed()) registerExtractorAPI(Flaswish()) registerExtractorAPI(Comedyshow()) + registerExtractorAPI(Ridoo()) + registerExtractorAPI(Streamvid()) + registerExtractorAPI(Embedrise()) } } \ No newline at end of file