From 352a0c4f4129692b9d83aa96cad8864555dbf9d8 Mon Sep 17 00:00:00 2001 From: hexated Date: Sat, 8 Apr 2023 14:37:11 +0700 Subject: [PATCH] sora: fixed shinobiMovie --- SoraStream/build.gradle.kts | 2 +- .../main/kotlin/com/hexated/SoraExtractor.kt | 118 ++---------------- .../src/main/kotlin/com/hexated/SoraStream.kt | 7 +- .../src/main/kotlin/com/hexated/SoraUtils.kt | 60 --------- YugenAnime/build.gradle.kts | 2 +- .../src/main/kotlin/com/hexated/YugenAnime.kt | 2 +- 6 files changed, 13 insertions(+), 178 deletions(-) diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 7256f77e..16fe6939 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 112 +version = 113 cloudstream { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 8473ed91..e9e4ded8 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -91,16 +91,6 @@ object SoraExtractor : SoraStream() { } } - suspend fun invokeOlgply( - id: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit - ) { - val url = "$olgplyAPI/${id}${season?.let { "/$it" } ?: ""}${episode?.let { "/$it" } ?: ""}" - loadLinksWithWebView(url, callback) - } - suspend fun invokeDbgo( id: String? = null, season: Int? = null, @@ -1652,73 +1642,6 @@ object SoraExtractor : SoraStream() { } } - suspend fun invokeKickassanime( - title: String? = null, - epsTitle: String? = null, - season: Int? = null, - episode: Int? = null, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ) { - val body = """{"query":"$title"}""".toRequestBody( - RequestBodyTypes.JSON.toMediaTypeOrNull() - ) - val animeId = app.post( - "$kickassanimeAPI/api/search", requestBody = body - ).text.let { tryParseJson>(it) }.let { res -> - (if (res?.size == 1) { - res.firstOrNull() - } else { - res?.find { - it.title?.equals( - title, - true - ) == true || it.title.createSlug() - ?.equals("${title.createSlug()}", true) == true - } - })?._id - } ?: return - - val seasonData = - app.get("$kickassanimeAPI/api/season/$animeId").text.let { - tryParseJson>( - it - ) - }?.find { - val seasonNumber = when (title) { - "One Piece" -> 13 - "Hunter x Hunter" -> 5 - else -> season - } - it.number == seasonNumber - } - - val language = seasonData?.languages?.filter { - it == "ja-JP" || it == "en-US" - } - - language?.apmap { lang -> - val episodeSlug = - app.get("$kickassanimeAPI/api/episodes/${seasonData.id}?lh=$lang&page=1") - .parsedSafe()?.result?.find { eps -> - eps.episodeNumber == episode || eps.slug?.contains( - "${epsTitle.createSlug()}", - true - ) == true - }?.slug ?: return@apmap - - val server = app.get("$kickassanimeAPI/api/watch/$episodeSlug") - .parsedSafe()?.servers?.find { - it.contains("/sapphire-duck/") - } ?: return@apmap - - invokeSapphire(server, lang == "en-US", subtitleCallback, callback) - - } - - - } - suspend fun invokeMoviesbay( title: String? = null, year: Int? = null, @@ -2428,7 +2351,8 @@ object SoraExtractor : SoraStream() { }).text.let { path -> if (api in ddomainIndex) { val worker = app.get( - "${fixUrl(path, apiUrl)}?a=view" + "${fixUrl(path, apiUrl).encodeUrl()}?a=view", + referer = if(api in needRefererIndex) apiUrl else "" ).document.selectFirst("script:containsData(downloaddomain)")?.data() ?.substringAfter("\"downloaddomain\":\"")?.substringBefore("\",")?.let { "$it/0:" @@ -2796,19 +2720,19 @@ object SoraExtractor : SoraStream() { ) } - invokeCoatomotate( + invokeMonster( res.url.substringAfterLast("/"), episodeId, season, callback ) } - suspend fun invokeCoatomotate( + private suspend fun invokeMonster( urlSlug: String? = null, episodeId: String? = null, season: Int? = null, callback: (ExtractorLink) -> Unit, ) { - val coaMainUrl = "https://coatomotate.monster" + val monsterMainUrl = "https://dignes.monster" val playSlug = if (season == null) { "movies/play/$urlSlug" } else { @@ -2816,16 +2740,16 @@ object SoraExtractor : SoraStream() { } val sid = "9k9iupt5sebbnfajrc6ti3ht7l" val sec = "1974bc4a902c4d69fcbab261dcec69094a9b8164" - val url = "$coaMainUrl/$playSlug?mid=1&sid=$sid&sec=$sec&t=${System.currentTimeMillis()}" + val url = "$monsterMainUrl/$playSlug?mid=1&sid=$sid&sec=$sec&t=${System.currentTimeMillis()}" val res = app.get(url).document val script = res.selectFirst("script:containsData(window['show_storage'])")?.data() val hash = Regex("hash:\\s*['\"](\\S+)['\"],").find(script ?: return)?.groupValues?.get(1) val expires = Regex("expires:\\s*(\\d+),").find(script ?: return)?.groupValues?.get(1) val videoUrl = if (season == null) { - "$coaMainUrl/api/v1/security/movie-access?id_movie=$episodeId&hash=$hash&expires=$expires" + "$monsterMainUrl/api/v1/security/movie-access?id_movie=$episodeId&hash=$hash&expires=$expires" } else { - "$coaMainUrl/api/v1/security/episode-access?id_episode=$episodeId&hash=$hash&expires=$expires" + "$monsterMainUrl/api/v1/security/episode-access?id_episode=$episodeId&hash=$hash&expires=$expires" } app.get(videoUrl, referer = url) @@ -2835,7 +2759,7 @@ object SoraExtractor : SoraStream() { "WatchOnline", "WatchOnline", source.value, - "$coaMainUrl/", + "$monsterMainUrl/", getQualityFromName(source.key), true ) @@ -3161,30 +3085,6 @@ data class SorastreamVideos( @JsonProperty("currentDefinition") val currentDefinition: String? = null, ) -data class KaaServers( - @JsonProperty("servers") val servers: ArrayList? = arrayListOf(), -) - -data class KaaEpisode( - @JsonProperty("episodeNumber") val episodeNumber: Int? = null, - @JsonProperty("slug") val slug: String? = null, -) - -data class KaaEpisodeResults( - @JsonProperty("result") val result: ArrayList? = arrayListOf(), -) - -data class KaaSeason( - @JsonProperty("id") val id: String? = null, - @JsonProperty("number") val number: Int? = null, - @JsonProperty("languages") val languages: ArrayList? = arrayListOf(), -) - -data class KaaSearchResponse( - @JsonProperty("_id") val _id: String? = null, - @JsonProperty("title") val title: String? = null, -) - data class SapphireSubtitles( @JsonProperty("language") val language: String? = null, @JsonProperty("url") val url: String? = null, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 9cbb4446..74bb68ee 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -92,7 +92,6 @@ open class SoraStream : TmdbProvider() { const val series9API = "https://series9.la" const val idlixAPI = "https://idlixian.com" const val noverseAPI = "https://www.nollyverse.com" - const val olgplyAPI = "https://olgply.xyz" // dead const val uniqueStreamAPI = "https://uniquestream.net" const val filmxyAPI = "https://www.filmxy.vip" const val kimcartoonAPI = "https://kimcartoon.li" @@ -100,7 +99,6 @@ open class SoraStream : TmdbProvider() { const val haikeiFlixhqAPI = "https://api.haikei.xyz/movies/flixhq" // disabled due to rate limit const val consumetZoroAPI = "https://api.consumet.org/anime/zoro" const val consumetCrunchyrollAPI = "https://cronchy.consumet.stream" - const val kickassanimeAPI = "https://www2.kickassanime.ro" // disabled due to consumet const val kissKhAPI = "https://kisskh.me" const val lingAPI = "https://ling-online.net" const val uhdmoviesAPI = "https://uhdmovies.vip" @@ -115,7 +113,7 @@ open class SoraStream : TmdbProvider() { const val rStreamAPI = "https://remotestre.am" const val flixonAPI = "https://flixon.ru" const val animeKaizokuAPI = "https://animekaizoku.com" - const val movie123NetAPI = "https://ww7.0123movie.net" + const val movie123NetAPI = "https://ww8.0123movie.net" const val smashyStreamAPI = "https://embed.smashystream.com" const val watchSomuchAPI = "https://watchsomuch.tv" // sub only val gomoviesAPI = base64DecodeAPI("bQ==Y28=ZS4=aW4=bmw=LW8=ZXM=dmk=bW8=Z28=Ly8=czo=dHA=aHQ=") @@ -376,9 +374,6 @@ open class SoraStream : TmdbProvider() { { invokeVidSrc(res.id, res.season, res.episode, subtitleCallback, callback) }, -// { -// invokeOlgply(res.id, res.season, res.episode, callback) -// }, { invokeDbgo(res.imdbId, res.season, res.episode, subtitleCallback, callback) }, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt index d3af0da5..bc13756e 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt @@ -513,42 +513,6 @@ suspend fun fetchSoraEpisodes(id: String, type: String, episode: Int?) : Episode } } -suspend fun invokeSapphire( - url: String? = null, - isDub: Boolean = false, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit, -) { - var data = app.get("${url?.replace("player.php", "config.php")}&action=config", referer = url).text - while (true) { - if (data.startsWith("{")) break - if (data == "null") { - data = app.get("$url&action=config", referer = url).text - delay(1000) - } - data = data.decodeBase64() - } - - tryParseJson(data).let { res -> - res?.streams?.filter { it.format == "adaptive_hls" && it.hardsub_lang.isNullOrEmpty() }?.reversed()?.map { source -> - val name = if (isDub) "English Dub" else "Raw" - M3u8Helper.generateM3u8( - "Crunchyroll [$name]", - source.url ?: return@map null, - "https://static.crunchyroll.com/", - ).forEach(callback) - } - res?.subtitles?.map { sub -> - subtitleCallback.invoke( - SubtitleFile( - fixCrunchyrollLang(sub.language ?: return@map null) ?: sub.language, - sub.url ?: return@map null - ) - ) - } - } -} - suspend fun bypassOuo(url: String?): String? { var res = session.get(url ?: return null) run lit@{ @@ -1163,30 +1127,6 @@ fun fixUrl(url: String, domain: String): String { } } -suspend fun loadLinksWithWebView( - url: String, - callback: (ExtractorLink) -> Unit -) { - val foundVideo = WebViewResolver( - Regex("""\.m3u8|i7njdjvszykaieynzsogaysdgb0hm8u1mzubmush4maopa4wde\.com""") - ).resolveUsingWebView( - requestCreator( - "GET", url, referer = "https://olgply.com/" - ) - ).first ?: return - - callback.invoke( - ExtractorLink( - "Olgply", - "Olgply", - foundVideo.url.toString(), - "", - Qualities.P1080.value, - true - ) - ) -} - fun Int.toRomanNumeral(): String = Symbol.closestBelow(this) .let { symbol -> if (symbol != null) { diff --git a/YugenAnime/build.gradle.kts b/YugenAnime/build.gradle.kts index 00b73101..05423a6e 100644 --- a/YugenAnime/build.gradle.kts +++ b/YugenAnime/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 5 +version = 6 cloudstream { diff --git a/YugenAnime/src/main/kotlin/com/hexated/YugenAnime.kt b/YugenAnime/src/main/kotlin/com/hexated/YugenAnime.kt index df65990e..ddaeab16 100644 --- a/YugenAnime/src/main/kotlin/com/hexated/YugenAnime.kt +++ b/YugenAnime/src/main/kotlin/com/hexated/YugenAnime.kt @@ -13,7 +13,7 @@ import org.jsoup.nodes.Element import java.net.URI class YugenAnime : MainAPI() { - override var mainUrl = "https://yugenanime.ro" + override var mainUrl = "https://yugen.to" override var name = "YugenAnime" override val hasMainPage = true override var lang = "en"