diff --git a/Animasu/build.gradle.kts b/Animasu/build.gradle.kts index e938935a..bc5a2b18 100644 --- a/Animasu/build.gradle.kts +++ b/Animasu/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 4 +version = 5 cloudstream { diff --git a/Animasu/src/main/kotlin/com/hexated/Animasu.kt b/Animasu/src/main/kotlin/com/hexated/Animasu.kt index 9be80866..25129feb 100644 --- a/Animasu/src/main/kotlin/com/hexated/Animasu.kt +++ b/Animasu/src/main/kotlin/com/hexated/Animasu.kt @@ -9,7 +9,7 @@ import org.jsoup.Jsoup import org.jsoup.nodes.Element class Animasu : MainAPI() { - override var mainUrl = "https://animasu.info" + override var mainUrl = "https://animasu.win" override var name = "Animasu" override val hasMainPage = true override var lang = "id" diff --git a/Gomov/build.gradle.kts b/Gomov/build.gradle.kts index 5fd2f2e1..61bf4792 100644 --- a/Gomov/build.gradle.kts +++ b/Gomov/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.konan.properties.Properties // use an integer for version numbers -version = 26 +version = 27 android { defaultConfig { diff --git a/Gomov/src/main/kotlin/com/hexated/DutaMovie.kt b/Gomov/src/main/kotlin/com/hexated/DutaMovie.kt index ea735403..170f71ba 100644 --- a/Gomov/src/main/kotlin/com/hexated/DutaMovie.kt +++ b/Gomov/src/main/kotlin/com/hexated/DutaMovie.kt @@ -6,7 +6,7 @@ import com.lagradost.cloudstream3.utils.httpsify import com.lagradost.cloudstream3.utils.loadExtractor class DutaMovie : Gomov() { - override var mainUrl = "https://stream.dutamovie21.club" + override var mainUrl = "https://movie.dutamovie21.club" override var name = "DutaMovie" override val mainPage = mainPageOf( "category/box-office/page/%d/" to "Box Office", diff --git a/Gomov/src/main/kotlin/com/hexated/Extractors.kt b/Gomov/src/main/kotlin/com/hexated/Extractors.kt index a215cc22..9fddb972 100644 --- a/Gomov/src/main/kotlin/com/hexated/Extractors.kt +++ b/Gomov/src/main/kotlin/com/hexated/Extractors.kt @@ -105,7 +105,16 @@ object NineTv { callback: (ExtractorLink) -> Unit ) { val mainUrl = getBaseUrl(url) - val res = app.get(url, referer = referer) + val res = app.get(url, headers = mapOf( + "Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", + "Accept-Language" to "en-US,en;q=0.5", + "Connection" to "keep-alive", + "Referer" to (referer ?: ""), + "Sec-Fetch-Dest" to "iframe", + "Sec-Fetch-Mode" to "navigate", + "Sec-Fetch-Site" to "same-origin", + "Upgrade-Insecure-Requests" to "1" + )) val master = Regex("\\s*=\\s*'([^']+)").find(res.text)?.groupValues?.get(1) val key = res.document.getKeys() ?: throw ErrorLoadingException("can't generate key") val decrypt = AesHelper.cryptoAESHandler(master ?: return, key.toByteArray(), false) @@ -148,7 +157,7 @@ object NineTv { return """,\s*'([^']+)""".toRegex().find(run)?.groupValues?.getOrNull(1) } - fun String.runJS(variable: String): String { + private fun String.runJS(variable: String): String { val rhino = Context.enter() rhino.optimizationLevel = -1 val scope: Scriptable = rhino.initSafeStandardObjects() diff --git a/Samehadaku/build.gradle.kts b/Samehadaku/build.gradle.kts index a3eeec24..ad80241e 100644 --- a/Samehadaku/build.gradle.kts +++ b/Samehadaku/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 16 +version = 17 cloudstream { diff --git a/Samehadaku/src/main/kotlin/com/hexated/Samehadaku.kt b/Samehadaku/src/main/kotlin/com/hexated/Samehadaku.kt index 6e1fd705..3946a988 100644 --- a/Samehadaku/src/main/kotlin/com/hexated/Samehadaku.kt +++ b/Samehadaku/src/main/kotlin/com/hexated/Samehadaku.kt @@ -14,7 +14,7 @@ import org.jsoup.Jsoup import org.jsoup.nodes.Element class Samehadaku : MainAPI() { - override var mainUrl = "https://samehadaku.help" + override var mainUrl = "https://samehadaku.rent" override var name = "Samehadaku" override val hasMainPage = true override var lang = "id" diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index cfdad7aa..02ef4167 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.konan.properties.Properties // use an integer for version numbers -version = 191 +version = 192 android { defaultConfig { diff --git a/SoraStream/src/main/kotlin/com/hexated/Extractors.kt b/SoraStream/src/main/kotlin/com/hexated/Extractors.kt index 35c01ba8..eb9c1257 100644 --- a/SoraStream/src/main/kotlin/com/hexated/Extractors.kt +++ b/SoraStream/src/main/kotlin/com/hexated/Extractors.kt @@ -247,7 +247,16 @@ object NineTv { callback: (ExtractorLink) -> Unit ) { val mainUrl = getBaseUrl(url) - val res = app.get(url, referer = referer) + val res = app.get(url, headers = mapOf( + "Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", + "Accept-Language" to "en-US,en;q=0.5", + "Connection" to "keep-alive", + "Referer" to (referer ?: ""), + "Sec-Fetch-Dest" to "iframe", + "Sec-Fetch-Mode" to "navigate", + "Sec-Fetch-Site" to "same-origin", + "Upgrade-Insecure-Requests" to "1" + )) val master = Regex("\\s*=\\s*'([^']+)").find(res.text)?.groupValues?.get(1) val key = res.document.getKeys() ?: throw ErrorLoadingException("can't generate key") val decrypt = AesHelper.cryptoAESHandler(master ?: return, key.toByteArray(), false) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 7b6c3574..4ae87aac 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -996,34 +996,13 @@ object SoraExtractor : SoraStream() { } }.filter { it.second?.contains(Regex("(https:)|(http:)")) == true } -// val sources = mutableListOf>() -// if (iframeList.any { -// it.first.contains( -// "2160p", -// true -// ) -// }) { -// sources.addAll(iframeList.filter { -// it.first.contains( -// "2160p", -// true -// ) -// }) -// sources.add(iframeList.first { -// it.first.contains( -// "1080p", -// true -// ) -// }) -// } else { -// sources.addAll(iframeList.filter { it.first.contains("1080p", true) }) -// } - iframeList.apmap { (quality, link) -> val driveLink = - if (link?.contains("driveleech") == true) bypassDriveleech(link) else bypassTechmny( - link ?: return@apmap - ) + when { + link?.contains("oddfirm") == true -> bypassHrefli(link) + link?.contains("driveleech") == true -> bypassDriveleech(link) + else -> bypassTechmny(link ?: return@apmap) + } val base = getBaseUrl(driveLink ?: return@apmap) val driveReq = app.get(driveLink) val driveRes = driveReq.document @@ -1661,28 +1640,25 @@ object SoraExtractor : SoraStream() { } suspend fun invokeSmashyStream( - imdbId: String? = null, + tmdbId: Int? = null, season: Int? = null, episode: Int? = null, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit, ) { val url = if (season == null) { - "$smashyStreamAPI/playere.php?imdb=$imdbId" + "$smashyStreamAPI/playere.php?tmdb=$tmdbId" } else { - "$smashyStreamAPI/playere.php?imdb=$imdbId&season=$season&episode=$episode" + "$smashyStreamAPI/playere.php?tmdb=$tmdbId&season=$season&episode=$episode" } app.get( - url, referer = "https://smashystream.com/" + url, referer = "https://smashystream.xyz/" ).document.select("div#_default-servers a.server").map { it.attr("data-id") to it.text() }.apmap { when { - it.second.equals("Player FM", true) -> invokeSmashyFm( - it.second, it.first, url, callback - ) - it.second.contains(Regex("(Player F|Player SE|Player N|Player D)")) -> { + it.second.contains(Regex("(Player F|Player FM)\$")) -> { invokeSmashyFfix(it.second, it.first, url, callback) } else -> return@apmap diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt index 47c821b1..ac8c2b17 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt @@ -415,4 +415,9 @@ data class RidoResponses( data class RidoSearch( @JsonProperty("data") var data: RidoData? = null, +) + +data class SmashySources( + @JsonProperty("sourceUrls") var sourceUrls: ArrayList? = arrayListOf(), + @JsonProperty("subtitleUrls") var subtitleUrls: String? = null, ) \ No newline at end of file diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index b81d4378..57af5a8b 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -103,7 +103,7 @@ open class SoraStream : TmdbProvider() { const val smashyStreamAPI = "https://embed.smashystream.com" const val watchSomuchAPI = "https://watchsomuch.tv" // sub only const val watchOnlineAPI = "https://lookmovie.foundation" - const val nineTvAPI = "https://ww1.moviesapi.club" + const val nineTvAPI = "https://moviesapi.club" const val nowTvAPI = "https://myfilestorage.xyz" const val gokuAPI = "https://goku.sx" const val ridomoviesAPI = "https://ridomovies.pw" @@ -118,7 +118,7 @@ open class SoraStream : TmdbProvider() { const val animetoshoAPI = "https://animetosho.org" const val movies123API = "https://new-movies123.link" const val jump1API = "https://ca.jump1.net" - const val vegaMoviesAPI = "https://vegamovies.zip" + const val vegaMoviesAPI = "https://vegamovies.care" const val hdmovies4uAPI = "https://hdmovies4u.name" const val watchflxAPI = "https://watchflx.tv" const val gomoviesAPI = "https://gomovies-online.cam" @@ -532,7 +532,7 @@ open class SoraStream : TmdbProvider() { }, { if (!res.isAnime) invokeSmashyStream( - res.imdbId, + res.id, res.season, res.episode, subtitleCallback, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt index 8e6dd0ac..eaf0db00 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -150,7 +150,7 @@ class SoraStreamLite : SoraStream() { }, { if (!res.isAnime) invokeSmashyStream( - res.imdbId, + res.id, res.season, res.episode, subtitleCallback, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt index 5fd6da83..37141d0f 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt @@ -445,51 +445,23 @@ suspend fun invokeSmashyFfix( ref: String, callback: (ExtractorLink) -> Unit, ) { - val res = app.get(url, referer = ref).text - val source = Regex("['\"]?file['\"]?:\\s*\"([^\"]+)").find(res)?.groupValues?.get(1) ?: return - - source.split(",").map { links -> - val quality = Regex("\\[(\\S+)]").find(links)?.groupValues?.getOrNull(1)?.trim() - val link = links.removePrefix("[$quality]").trim() + val json = app.get(url, referer = ref, headers = mapOf("X-Requested-With" to "XMLHttpRequest")) + .parsedSafe() + json?.sourceUrls?.map { callback.invoke( ExtractorLink( "Smashy [$name]", "Smashy [$name]", - decode(link).replace("\\/", "/"), - smashyStreamAPI, - getQualityFromName(quality), - INFER_TYPE, + it, + if(name == "Player FM") "https://vidplay.site/" else "", + Qualities.P1080.value, + INFER_TYPE ) ) } } -suspend fun invokeSmashyFm( - name: String, - url: String, - ref: String, - callback: (ExtractorLink) -> Unit, -) { - fun String.removeProxy(): String { - return if (this.contains("proxy")) { - "https${this.substringAfterLast("https")}" - } else { - this - } - } - - val res = app.get(url, referer = ref).text - val source = Regex("['\"]?file['\"]?:\\s*\"([^\"]+)").find(res)?.groupValues?.get(1) ?: return - - M3u8Helper.generateM3u8( - "Smashy [$name]", - source.removeProxy(), - "https://vidplay.site/" - ).forEach(callback) - -} - suspend fun getDumpIdAndType(title: String?, year: Int?, season: Int?): Pair { val res = tryParseJson( queryApi(