diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 4891d8da..a26c71b5 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 = 154 +version = 155 android { defaultConfig { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index b9723fa2..8004b826 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -507,70 +507,6 @@ object SoraExtractor : SoraStream() { } } - suspend fun invokeUniqueStream( - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ) { - val fixTitle = title.createSlug() - val url = if (season == null) { - "$uniqueStreamAPI/movies/$fixTitle-$year" - } else { - "$uniqueStreamAPI/episodes/$fixTitle-season-$season-episode-$episode" - } - - val res = app.get(url) - if (!res.isSuccessful) return - val baseApi = getBaseUrl(res.url) - - val document = res.document - val type = if (url.contains("/movies/")) "movie" else "tv" - document.select("ul#playeroptionsul > li").apmap { el -> - val id = el.attr("data-post") - val nume = el.attr("data-nume") - val source = app.post( - url = "$baseApi/wp-admin/admin-ajax.php", data = mapOf( - "action" to "doo_player_ajax", "post" to id, "nume" to nume, "type" to type - ), headers = mapOf("X-Requested-With" to "XMLHttpRequest"), referer = url - ).parsed().embed_url.let { fixUrl(it) } - - when { - source.contains("uniquestream") -> { - val resDoc = app.get( - source, referer = "$baseApi/", headers = mapOf( - "Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" - ) - ).document - val srcm3u8 = - resDoc.selectFirst("script:containsData(let url =)")?.data()?.let { - Regex("['|\"](.*?.m3u8)['|\"]").find(it)?.groupValues?.getOrNull(1) - } - callback.invoke( - ExtractorLink( - "UniqueStream", - "UniqueStream", - srcm3u8 ?: return@apmap null, - source, - Qualities.P1080.value, - true, - ) - ) - } - - !source.contains("youtube") -> loadExtractor( - source, "$uniqueStreamAPI/", subtitleCallback, callback - ) - - else -> { - // pass - } - } - } - } - suspend fun invokeNoverse( title: String? = null, season: Int? = null, @@ -765,59 +701,6 @@ object SoraExtractor : SoraStream() { } } - suspend fun invokeXmovies( - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit - ) { - val fixTitle = title.createSlug() - val doc = if (season == null) { - val res = app.get("$xMovieAPI/movies/$fixTitle/watch") - if (res.url == "$xMovieAPI/") app.get("$xMovieAPI/movies/$fixTitle-$year/watch").document else res.document - } else { - app.get("$xMovieAPI/series/$fixTitle-season-$season-episode-$episode/watch").document - } - - val script = doc.selectFirst("script:containsData(const player =)")?.data() ?: return - val link = - Regex("[\"|']file[\"|']:\\s?[\"|'](http.*?.(mp4|m3u8))[\"|'],").find(script)?.groupValues?.getOrNull( - 1 - ) ?: return - - if (link.contains(".m3u8")) { - M3u8Helper.generateM3u8( - "Xmovie", - link, - "", - ).forEach(callback) - } else { - callback.invoke( - ExtractorLink( - "Xmovie", - "Xmovie", - link, - "", - Qualities.P720.value, - ) - ) - } - - Regex(""""file":\s+?"(\S+\.(vtt|srt))""").find(script)?.groupValues?.getOrNull(1) - ?.let { sub -> - subtitleCallback.invoke( - SubtitleFile( - "English", - sub, - ) - ) - } - - - } - suspend fun invokeFmovies( title: String? = null, year: Int? = null, @@ -2035,110 +1918,6 @@ object SoraExtractor : SoraStream() { } - suspend fun invokeBlackmovies( - apiUrl: String, - api: String, - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit, - ) { - invokeIndex( - apiUrl, - api, - title, - year, - season, - episode, - callback, - ) - } - - suspend fun invokeCodexmovies( - apiUrl: String, - api: String, - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit, - password: String = "", - ) { - invokeIndex( - apiUrl, - api, - title, - year, - season, - episode, - callback, - password, - ) - } - - suspend fun invokeEdithxmovies( - apiUrl: String, - api: String, - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit, - password: String = "", - ) { - invokeIndex( - apiUrl, - api, - title, - year, - season, - episode, - callback, - password, - ) - } - - suspend fun invokeJmdkhMovies( - apiUrl: String, - api: String, - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit, - ) { - invokeIndex( - apiUrl, - api, - title, - year, - season, - episode, - callback, - ) - } - - suspend fun invokeRubyMovies( - apiUrl: String, - api: String, - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit, - ) { - invokeIndex( - apiUrl, - api, - title, - year, - season, - episode, - callback, - ) - } - suspend fun invokeShinobiMovies( apiUrl: String, api: String, @@ -2159,26 +1938,6 @@ object SoraExtractor : SoraStream() { ) } - suspend fun invokeVitoenMovies( - apiUrl: String, - api: String, - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit, - ) { - invokeIndex( - apiUrl, - api, - title, - year, - season, - episode, - callback, - ) - } - private suspend fun invokeIndex( apiUrl: String, api: String, @@ -2265,9 +2024,6 @@ object SoraExtractor : SoraStream() { } }.encodeUrl() -// removed due to rate limit -// if (!app.get(path).isSuccessful) return@apmap null - val size = "%.2f GB".format(bytesToGigaBytes(file.size?.toDouble() ?: return@apmap null)) val quality = getIndexQuality(file.name) @@ -2287,48 +2043,6 @@ object SoraExtractor : SoraStream() { } - suspend fun invokeTgarMovies( - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit, - ) { - val query = getIndexQuery(title, year, season, episode) - - val files = app.get( - "https://api.tgarchive.superfastsearch.zindex.eu.org/search?name=${encode(query)}&page=1", - referer = tgarMovieAPI, - timeout = 600L - ).parsedSafe()?.documents?.filter { media -> - matchingIndex( - media.name, - media.mime_type, - title, - year, - season, - episode, - true - ) && media.name?.contains("XXX") == false - } - - files?.map { file -> - val size = "%.2f GB".format(bytesToGigaBytes(file.size ?: return@map null)) - val quality = getIndexQuality(file.name) - val tags = getIndexQualityTags(file.name) - callback.invoke( - ExtractorLink( - "TgarMovies", - "TgarMovies $tags [$size]", - "https://api.southkoreacdn.workers.dev/telegram/${file._id}", - "$tgarMovieAPI/", - quality, - ) - ) - } - - } - suspend fun invokeGdbotMovies( title: String? = null, year: Int? = null, @@ -2769,73 +2483,6 @@ object SoraExtractor : SoraStream() { } - suspend fun invokeShivamhw( - title: String? = null, - year: Int? = null, - season: Int? = null, - episode: Int? = null, - callback: (ExtractorLink) -> Unit, - ) { - val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) - val url = if (season == null) { - "$shivamhwAPI/search?search_box=$title&release_year=$year" - } else { - "$shivamhwAPI/api/series_search?search_box=$title&sess_nm=$seasonSlug&epi_nm=$episodeSlug" - } - - val res = app.get(url) - - val media = if (season == null) { - res.document.select("table.rwd-table tr").map { - Triple( - it.select("td[data-th=File Name]").text(), - it.select("td[data-th=Size]").text(), - it.selectFirst("div.download_button.pls_wait > a")?.attr("href") - ) - } - } else { - tryParseJson>(res.text)?.map { - Triple( - it.name, - it.size, - it.stream_link, - ) - } - } - - media?.filter { - matchingIndex( - it.first, - null, - title, - year, - season, - episode, - false - ) - }?.sortedByDescending { - it.second.getFileSize() - }?.apmap { source -> - val quality = getIndexQuality(source.first) - val tags = getIndexQualityTags(source.first) - val video = source.third - if (!app.get( - video ?: return@apmap, - referer = "$shivamhwAPI/" - ).isSuccessful - ) return@apmap - callback.invoke( - ExtractorLink( - "Shivamhw", - "Shivamhw $tags [${source.second}]", - video, - "$shivamhwAPI/", - quality, - ) - ) - } - } - suspend fun invokeCryMovies( imdbId: String? = null, title: String? = null, @@ -2887,9 +2534,8 @@ object SoraExtractor : SoraStream() { callback: (ExtractorLink) -> Unit ) { val referer = "https://2now.tv/" - val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) - val url = - if (season == null) "$nowTvAPI/$tmdbId.mp4" else "$nowTvAPI/tv/$tmdbId/s${season}e${episodeSlug}.mp4" + val slug = getEpisodeSlug(season, episode) + val url = if (season == null) "$nowTvAPI/$tmdbId.mp4" else "$nowTvAPI/tv/$tmdbId/s${season}e${slug.second}.mp4" if (!app.get(url, referer = referer).isSuccessful) return callback.invoke( ExtractorLink( diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt index a1e91094..382d507c 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt @@ -202,18 +202,6 @@ data class IndexSearch( @JsonProperty("data") val data: IndexData? = null, ) -data class TgarMedia( - @JsonProperty("_id") val _id: Int? = null, - @JsonProperty("name") val name: String? = null, - @JsonProperty("size") val size: Double? = null, - @JsonProperty("file_unique_id") val file_unique_id: String? = null, - @JsonProperty("mime_type") val mime_type: String? = null, -) - -data class TgarData( - @JsonProperty("documents") val documents: ArrayList? = arrayListOf(), -) - data class SorastreamResponse( @JsonProperty("data") val data: SorastreamVideos? = null, ) @@ -285,14 +273,6 @@ data class PutlockerResponses( @JsonProperty("backupLink") val backupLink: String? = null, ) -data class ShivamhwSources( - @JsonProperty("id") val id: String? = null, - @JsonProperty("stream_link") val stream_link: String? = null, - @JsonProperty("process_link") val process_link: String? = null, - @JsonProperty("name") val name: String, - @JsonProperty("size") val size: String, -) - data class CryMoviesProxyHeaders( @JsonProperty("request") val request: Map?, ) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 14ee4366..88efd8de 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -3,9 +3,7 @@ package com.hexated import com.fasterxml.jackson.annotation.JsonProperty import com.hexated.SoraExtractor.invokeAnimes import com.hexated.SoraExtractor.invokeAsk4Movies -import com.hexated.SoraExtractor.invokeBlackmovies import com.hexated.SoraExtractor.invokeBollyMaza -import com.hexated.SoraExtractor.invokeCodexmovies import com.hexated.SoraExtractor.invokeCryMovies import com.hexated.SoraExtractor.invokeDbgo import com.hexated.SoraExtractor.invokeFilmxy @@ -22,7 +20,6 @@ import com.lagradost.cloudstream3.metaproviders.TmdbProvider import com.hexated.SoraExtractor.invokeDahmerMovies import com.hexated.SoraExtractor.invokeDoomovies import com.hexated.SoraExtractor.invokeDreamfilm -import com.hexated.SoraExtractor.invokeEdithxmovies import com.hexated.SoraExtractor.invokeFDMovies import com.hexated.SoraExtractor.invokeFlixon import com.hexated.SoraExtractor.invokeFmovies @@ -31,7 +28,6 @@ import com.hexated.SoraExtractor.invokeGMovies import com.hexated.SoraExtractor.invokeGdbotMovies import com.hexated.SoraExtractor.invokeGoku import com.hexated.SoraExtractor.invokeGomovies -import com.hexated.SoraExtractor.invokeJmdkhMovies import com.hexated.SoraExtractor.invokeKisskh import com.hexated.SoraExtractor.invokeLing import com.hexated.SoraExtractor.invokeM4uhd @@ -43,9 +39,7 @@ import com.hexated.SoraExtractor.invokeNowTv import com.hexated.SoraExtractor.invokePutlocker import com.hexated.SoraExtractor.invokeRStream import com.hexated.SoraExtractor.invokeRidomovies -import com.hexated.SoraExtractor.invokeRubyMovies import com.hexated.SoraExtractor.invokeShinobiMovies -import com.hexated.SoraExtractor.invokeShivamhw import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies @@ -56,7 +50,6 @@ import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokePobmovies import com.hexated.SoraExtractor.invokeTvMovies import com.hexated.SoraExtractor.invokeUhdmovies -import com.hexated.SoraExtractor.invokeVitoenMovies import com.hexated.SoraExtractor.invokeWatchOnline import com.hexated.SoraExtractor.invokeWatchsomuch import com.lagradost.cloudstream3.extractors.VidSrcExtractor @@ -98,7 +91,6 @@ open class SoraStream : TmdbProvider() { const val series9API = "https://series9.cx" const val idlixAPI = "https://tv.idlixprime.com" const val noverseAPI = "https://www.nollyverse.com" - const val uniqueStreamAPI = "https://uniquestream.net" const val filmxyAPI = "https://www.filmxy.vip" const val kimcartoonAPI = "https://kimcartoon.li" const val aniwatchAPI = "https://aniwatch.to" @@ -118,8 +110,7 @@ open class SoraStream : TmdbProvider() { const val flixonAPI = "https://flixon.lol" 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=") + val gomoviesAPI = base64DecodeAPI("bQ==Y28=ZS4=aW4=bmw=LW8=ZXM=dmk=bW8=Z28=Ly8=czo=dHA=aHQ=") const val ask4MoviesAPI = "https://ask4movie.nl" const val biliBiliAPI = "https://api-vn.otakuz.live/server" const val watchOnlineAPI = "https://watchonline.ag" @@ -139,29 +130,9 @@ open class SoraStream : TmdbProvider() { const val doomoviesAPI = "https://doomovies.net" // INDEX SITE - const val blackMoviesAPI = "https://dl.blacklistedbois.workers.dev/0:" - const val codexMoviesAPI = "https://packs.codexcloudx.tech/0:" - const val edithxMoviesAPI = "https://index.edithx.ga/0:" const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev" - const val jmdkhMovieAPI = "https://tg.jmdkh.eu.org/0:" - const val rubyMovieAPI = "https://upload.rubyshare111.workers.dev/0:" const val shinobiMovieAPI = "https://home.shinobicloud.cf/0:" - const val vitoenMovieAPI = "https://openmatte.vitoencodes.workers.dev/0:" - const val shivamhwAPI = "https://foogle.shivamhw.me" - val cryMoviesAPI = - base64DecodeAPI("ZXY=LmQ=cnM=a2U=b3I=Lnc=ZXI=ZGQ=bGE=cy0=b2I=YWM=Lmo=YWw=aW4=LWY=cm4=Ym8=cmU=Ly8=czo=dHA=aHQ=") - - // DEAD SITE - const val rinzryMoviesAPI = "https://rinzry.stream/0:" - const val chillmovies0API = "https://chill.aicirou.workers.dev/0:" - const val chillmovies1API = "https://chill.aicirou.workers.dev/1:" - const val gamMoviesAPI = "https://drive.gamick.workers.dev/0:" - const val jsMoviesAPI = "https://jsupload.jnsbot.workers.dev/0:" - const val xtremeMoviesAPI = "https://kartik19.xtrememirror0.workers.dev/0:" - const val tgarMovieAPI = "https://tgarchive.eu.org" - const val papaonMovies1API = "https://m.papaonwork.workers.dev/0:" - const val papaonMovies2API = "https://m.papaonwork.workers.dev/1:" - const val xMovieAPI = "https://xemovies.to" + val cryMoviesAPI = base64DecodeAPI("ZXY=LmQ=cnM=a2U=b3I=Lnc=ZXI=ZGQ=bGE=cy0=b2I=YWM=Lmo=YWw=aW4=LWY=cm4=Ym8=cmU=Ly8=czo=dHA=aHQ=") fun getType(t: String?): TvType { return when (t) { @@ -419,15 +390,6 @@ open class SoraStream : TmdbProvider() { { invokeMovieHab(res.imdbId, res.season, res.episode, subtitleCallback, callback) }, -// { -// invokeDatabaseGdrive( -// res.imdbId, -// res.season, -// res.episode, -// subtitleCallback, -// callback -// ) -// }, { if (res.isAnime) invokeAnimes( res.title, @@ -440,16 +402,6 @@ open class SoraStream : TmdbProvider() { callback ) }, -// { -// if (res.season != null && res.isAnime) invokeCrunchyroll( -// res.title, -// res.epsTitle, -// res.season, -// res.episode, -// subtitleCallback, -// callback -// ) -// }, { if (!res.isAnime) invokeHDMovieBox( res.title, @@ -488,18 +440,8 @@ open class SoraStream : TmdbProvider() { callback ) }, - { - invokeNoverse(res.title, res.season, res.episode, callback) - }, // { -// invokeUniqueStream( -// res.title, -// res.year, -// res.season, -// res.episode, -// subtitleCallback, -// callback -// ) +// invokeNoverse(res.title, res.season, res.episode, callback) // }, { if (!res.isAnime) invokeFilmxy( @@ -519,16 +461,6 @@ open class SoraStream : TmdbProvider() { callback ) }, -// { -// invokeXmovies( -// res.title, -// res.year, -// res.season, -// res.episode, -// subtitleCallback, -// callback -// ) -// }, { if (!res.isAnime) invokeFmovies( res.title, @@ -668,52 +600,6 @@ open class SoraStream : TmdbProvider() { callback ) }, - { - if (!res.isAnime) invokeBlackmovies( - blackMoviesAPI, - "BlackMovies", - res.title, - res.year, - res.season, - res.episode, - callback - ) - }, -// { -// invokeRinzrymovies( -// rinzryMoviesAPI, -// "RinzryMovies", -// res.title, -// res.year, -// res.season, -// res.episode, -// callback, -// ) -// }, - { - if (!res.isAnime) invokeCodexmovies( - codexMoviesAPI, - "CodexMovies", - res.title, - res.year, - res.season, - res.episode, - callback, - "Basic Y29kZXg6Y29kZXhjbG91ZA==" - ) - }, - { - if (!res.isAnime) invokeEdithxmovies( - edithxMoviesAPI, - "EdithxMovies", - res.title, - res.year, - res.season, - res.episode, - callback, - "Basic ZWRpdGg6amFydmlz" - ) - }, { invokeDahmerMovies( res.title, @@ -727,28 +613,14 @@ open class SoraStream : TmdbProvider() { invokeGomovies(res.title, res.year, res.season, res.episode, callback) }, // { -// if (!res.isAnime) invokeTgarMovies(res.title, res.year, res.season, res.episode, callback) +// if (!res.isAnime) invokeGdbotMovies( +// res.title, +// res.year, +// res.season, +// res.episode, +// callback +// ) // }, - { - if (!res.isAnime) invokeGdbotMovies( - res.title, - res.year, - res.season, - res.episode, - callback - ) - }, - { - if (!res.isAnime) invokeJmdkhMovies( - jmdkhMovieAPI, - "JmdkhMovies", - res.title, - res.year, - res.season, - res.episode, - callback - ) - }, { if (!res.isAnime) invokeShinobiMovies( shinobiMovieAPI, @@ -760,28 +632,6 @@ open class SoraStream : TmdbProvider() { callback ) }, - { - if (!res.isAnime) invokeRubyMovies( - rubyMovieAPI, - "RubyMovies", - res.title, - res.year, - res.season, - res.episode, - callback - ) - }, - { - if (!res.isAnime) invokeVitoenMovies( - vitoenMovieAPI, - "VitoenMovies", - res.title, - res.year, - res.season, - res.episode, - callback - ) - }, { if (!res.isAnime) invokeAsk4Movies( res.title, @@ -803,15 +653,6 @@ open class SoraStream : TmdbProvider() { callback ) }, - { - if (!res.isAnime) invokeShivamhw( - res.title, - res.year, - res.season, - res.episode, - callback - ) - }, { if (!res.isAnime && res.season == null) invokeCryMovies( res.imdbId,