diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index e9cda9c9..7b7862d5 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 = 142 +version = 143 android { defaultConfig { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 5f105550..9b40016b 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -1017,14 +1017,14 @@ object SoraExtractor : SoraStream() { "X-Requested-With" to "XMLHttpRequest", ) animeId?.apmap { id -> - val episodeId = app.get("$zoroAPI/ajax/v2/episode/list/${id ?: return@apmap}", headers = headers) + val episodeId = app.get("$zoroAPI/ajax/episode/list/${id ?: return@apmap}", headers = headers) .parsedSafe()?.html?.let { Jsoup.parse(it) }?.select("div.ss-list a")?.find { it.attr("data-number") == "${episode ?: 1}" } ?.attr("data-id") val servers = - app.get("$zoroAPI/ajax/v2/episode/servers?episodeId=${episodeId ?: return@apmap}", headers = headers) + app.get("$zoroAPI/ajax/episode/servers?episodeId=${episodeId ?: return@apmap}", headers = headers) .parsedSafe()?.html?.let { Jsoup.parse(it) } ?.select("div.item.server-item")?.map { Triple( @@ -1036,10 +1036,10 @@ object SoraExtractor : SoraStream() { servers?.apmap servers@{ server -> val iframe = - app.get("$zoroAPI/ajax/v2/episode/sources?id=${server.second ?: return@servers}", headers = headers) + app.get("$zoroAPI/ajax/episode/sources?id=${server.second ?: return@servers}", headers = headers) .parsedSafe()?.link ?: return@servers val audio = if (server.third == "sub") "Raw" else "English Dub" - if (server.first == "Vidstreaming" || server.first == "MegaCloud") { + if (server.first.contains(Regex("Vidstreaming|MegaCloud|Vidcloud"))) { extractRabbitStream( "${server.first} [$audio]", iframe, @@ -3163,6 +3163,54 @@ object SoraExtractor : SoraStream() { } + suspend fun invokeFourCartoon( + title: String? = null, + year: Int? = null, + season: Int? = null, + episode: Int? = null, + callback: (ExtractorLink) -> Unit + ) { + val fixTitle = title.createSlug() + val headers = mapOf( + "X-Requested-With" to "XMLHttpRequest" + ) + val url = if (season == null) { + "$fourCartoonAPI/movies/$fixTitle-$year" + } else { + "$fourCartoonAPI/episode/$fixTitle-season-$season-episode-$episode" + } + + val document = app.get(url).document + val id = document.selectFirst("input[name=idpost]")?.attr("value") + val server = app.get( + "$fourCartoonAPI/ajax-get-link-stream/?server=streamango&filmId=${id ?: return}", + headers = headers + ).text + val hash = + getAndUnpack(app.get(server, referer = fourCartoonAPI).text).substringAfter("(\"") + .substringBefore("\",") + val iframeUrl = getBaseUrl(server) + val source = app.post( + "$iframeUrl/player/index.php?data=$hash&do=getVideo", data = mapOf( + "hast" to hash, + "r" to "$fourCartoonAPI/", + ), + headers = headers + ).parsedSafe()?.videoSource + + callback.invoke( + ExtractorLink( + "4Cartoon", + "4Cartoon", + source ?: return, + "$iframeUrl/", + Qualities.P720.value, + true, + ) + ) + + } + } diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt index 6651bb7d..9646b846 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt @@ -500,3 +500,7 @@ data class EMovieTraks( @JsonProperty("file") val file: String? = null, @JsonProperty("label") val label: String? = null, ) + +data class FourCartoonSources( + @JsonProperty("videoSource") val videoSource: String? = null, +) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 301e9685..2d3911bc 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.invokeShivamhw import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies +import com.hexated.SoraExtractor.invokeFourCartoon import com.hexated.SoraExtractor.invokePobmovies import com.hexated.SoraExtractor.invokeTvMovies import com.hexated.SoraExtractor.invokeUhdmovies @@ -99,11 +100,11 @@ open class SoraStream : TmdbProvider() { const val filmxyAPI = "https://www.filmxy.vip" const val kimcartoonAPI = "https://kimcartoon.li" const val xMovieAPI = "https://xemovies.to" - const val zoroAPI = "https://aniwatch.to" + const val zoroAPI = "https://kaido.to" const val crunchyrollAPI = "https://beta-api.crunchyroll.com" const val kissKhAPI = "https://kisskh.co" const val lingAPI = "https://ling-online.net" - const val uhdmoviesAPI = "https://uhdmovies.cc" + const val uhdmoviesAPI = "https://uhdmovies.life" const val fwatayakoAPI = "https://5100.svetacdn.in" const val gMoviesAPI = "https://gdrivemovies.xyz" const val fdMoviesAPI = "https://freedrivemovie.lol" @@ -131,6 +132,7 @@ open class SoraStream : TmdbProvider() { const val navyAPI = "https://navy-issue-i-239.site" const val emoviesAPI = "https://emovies.si" const val pobmoviesAPI = "https://pobmovies.cam" + const val fourCartoonAPI = "https://4cartoon.net" // INDEX SITE const val blackMoviesAPI = "https://dl.blacklistedbois.workers.dev/0:" @@ -265,8 +267,7 @@ open class SoraStream : TmdbProvider() { val year = releaseDate?.split("-")?.first()?.toIntOrNull() val rating = res.vote_average.toString().toRatingInt() val genres = res.genres?.mapNotNull { it.name } - val isAnime = - genres?.contains("Animation") == true && (res.original_language == "zh" || res.original_language == "ja") + val isAnime = genres?.contains("Animation") == true && (res.original_language == "zh" || res.original_language == "ja") val keywords = res.keywords?.results?.mapNotNull { it.name }.orEmpty() .ifEmpty { res.keywords?.keywords?.mapNotNull { it.name } } @@ -306,7 +307,7 @@ open class SoraStream : TmdbProvider() { epsTitle = eps.name, jpTitle = res.alternative_titles?.results?.find { it.iso_3166_1 == "JP" }?.title, date = season.airDate, - airedDate = res.releaseDate ?: res.firstAirDate + airedDate = res.releaseDate ?: res.firstAirDate, ).toJson(), name = eps.name + if(isUpcoming(eps.airDate)) " - [UPCOMING]" else "", season = eps.seasonNumber, @@ -350,7 +351,7 @@ open class SoraStream : TmdbProvider() { orgTitle = orgTitle, isAnime = isAnime, jpTitle = res.alternative_titles?.results?.find { it.iso_3166_1 == "JP" }?.title, - airedDate = res.releaseDate ?: res.firstAirDate + airedDate = res.releaseDate ?: res.firstAirDate, ).toJson(), ) { this.posterUrl = poster @@ -497,7 +498,7 @@ open class SoraStream : TmdbProvider() { ) }, { - invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback) + if(!res.isAnime) invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback) }, { invokeXmovies( @@ -812,6 +813,9 @@ open class SoraStream : TmdbProvider() { }, { if(!res.isAnime && res.season == null) invokePobmovies(res.title, res.year, callback) + }, + { + if(!res.isAnime) invokeFourCartoon(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 247485ab..6f02e50a 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -28,6 +28,7 @@ import com.hexated.SoraExtractor.invokeSeries9 import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies +import com.hexated.SoraExtractor.invokeFourCartoon import com.hexated.SoraExtractor.invokeVidSrc import com.hexated.SoraExtractor.invokeWatchOnline import com.hexated.SoraExtractor.invokeWatchsomuch @@ -187,7 +188,7 @@ class SoraStreamLite : SoraStream() { ) }, { - invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback) + if(!res.isAnime) invokeKimcartoon(res.title, res.season, res.episode, subtitleCallback, callback) }, { invokeSmashyStream( @@ -299,6 +300,15 @@ class SoraStreamLite : SoraStream() { callback ) }, + { + if(!res.isAnime) invokeFourCartoon( + res.title, + res.year, + res.season, + res.episode, + callback + ) + } ) return true diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt index 74ea627e..c47faa3b 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt @@ -1952,7 +1952,7 @@ object RabbitStream { } suspend fun getZoroKey(): String { - return app.get("https://raw.githubusercontent.com/enimax-anime/key/e6/key.txt").text + return app.get("https://raw.githubusercontent.com/enimax-anime/key/e0/key.txt").text } private inline fun decryptMapped(input: String, key: String): T? { diff --git a/YacienTVProvider/build.gradle.kts b/YacienTVProvider/build.gradle.kts index e785f5f1..76ef54dd 100644 --- a/YacienTVProvider/build.gradle.kts +++ b/YacienTVProvider/build.gradle.kts @@ -1,13 +1,13 @@ // use an integer for version numbers -version = 1 +version = 6 cloudstream { - language = "ar" + language = "id" // All of these properties are optional, you can safely remove them - description = "Yacien TV livestreams" - authors = listOf("KingLucius") + // description = "Lorem Ipsum" + authors = listOf("Hexated") /** * Status int as the following: @@ -18,8 +18,10 @@ cloudstream { * */ status = 1 // will be 3 if unspecified tvTypes = listOf( - "Live", + "AnimeMovie", + "Anime", + "OVA", ) - iconUrl = "https://raw.githubusercontent.com/KingLucius/cs-hx/master/YacienTVProvider/icon.png" -} + iconUrl = "https://www.google.com/s2/favicons?domain=gomunime.is&sz=%size%" +} \ No newline at end of file