From eef729e7f653038ef396777f6e144cc927d9b70c Mon Sep 17 00:00:00 2001 From: hexated Date: Sun, 19 Feb 2023 21:49:44 +0700 Subject: [PATCH 1/7] sora: added TgarMovies --- SoraStream/build.gradle.kts | 2 +- .../main/kotlin/com/hexated/SoraExtractor.kt | 68 +++++++++++++++++++ .../src/main/kotlin/com/hexated/SoraStream.kt | 5 ++ .../src/main/kotlin/com/hexated/SoraUtils.kt | 20 ++++-- 4 files changed, 87 insertions(+), 8 deletions(-) diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 45c59574..2c173f9d 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 91 +version = 92 cloudstream { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index d8237b52..57626c49 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -2349,6 +2349,56 @@ 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 (dotSlug, spaceSlug, slashSlug) = getTitleSlug(title) + val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) + + val files = app.get("$tgarMovieAPI/search?name=$query&page=1").parsedSafe()?.results?.filter { media -> + (if (season == null) { + media.name?.contains("$year") == true + } else { + media.name?.contains(Regex("(?i)S${seasonSlug}.?E${episodeSlug}")) == true + }) && media.name?.contains( + Regex("(?i)(2160p|1080p)") + ) == true && (media.mime_type in mimeType) && (media.name.replace( + "-", + "." + ).contains( + "$dotSlug", + true + ) || media.name.replace( + "-", + " " + ).contains("$spaceSlug", true) || media.name.replace( + "-", + "_" + ).contains("$slashSlug", true)) + } + + files?.map { file -> + val size = "%.2f GB".format(bytesToGigaBytes(file.size?.toDouble() ?: return@map null)) + val quality = getIndexQuality(file.name) + val tags = getIndexQualityTags(file.name) + callback.invoke( + ExtractorLink( + "TgarMovies $tags [$size]", + "TgarMovies $tags [$size]", + "https://api.southkoreacdn.workers.dev/telegram/${file._id}", + "https://tgarchive.eu.org/", + quality, + ) + ) + } + + } + suspend fun invokeDahmerMovies( title: String? = null, year: Int? = null, @@ -2492,6 +2542,12 @@ class Sblongvu : StreamSB() { override var mainUrl = "https://sblongvu.com" } +data class TitleSlug( + val dotSlug: String? = null, + val spaceSlug: String? = null, + val slashSlug: String? = null, +) + data class FDMovieIFrame( val link: String, val quality: String, @@ -2763,4 +2819,16 @@ data class IndexData( 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: String? = null, + @JsonProperty("file_unique_id") val file_unique_id: String? = null, + @JsonProperty("mime_type") val mime_type: String? = null, +) + +data class TgarData( + @JsonProperty("results") val results: ArrayList? = arrayListOf(), ) \ 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 b2744272..67250a68 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -43,6 +43,7 @@ import com.hexated.SoraExtractor.invokeRStream import com.hexated.SoraExtractor.invokeRinzrymovies import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeSoraStream +import com.hexated.SoraExtractor.invokeTgarMovies import com.hexated.SoraExtractor.invokeTvMovies import com.hexated.SoraExtractor.invokeUhdmovies import com.hexated.SoraExtractor.invokeWatchsomuch @@ -125,6 +126,7 @@ open class SoraStream : TmdbProvider() { const val papaonMovies1API = "https://m.papaonwork.workers.dev/0:" const val papaonMovies2API = "https://m.papaonwork.workers.dev/1:" const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev" + const val tgarMovieAPI = "https://api.telegram.d1.zindex.eu.org" fun getType(t: String?): TvType { return when (t) { @@ -715,6 +717,9 @@ open class SoraStream : TmdbProvider() { { invokeGomovies(res.title, res.year, res.season, res.episode, callback) }, + { + invokeTgarMovies(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 685489b1..e3d5ec14 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt @@ -61,6 +61,12 @@ val untrimmedIndex = arrayOf( "EdithxMovies", ) +val mimeType = arrayOf( + "video/x-matroska", + "video/mp4", + "video/x-msvideo" +) + data class FilmxyCookies( val phpsessid: String? = null, val wLog: String? = null, @@ -637,8 +643,13 @@ fun getEpisodeSlug( } } -fun getTitleSlug(title: String? = null): Pair { - return title.createSlug()?.replace("-", ".") to title.createSlug()?.replace("-", " ") +fun getTitleSlug(title: String? = null): TitleSlug { + val slug = title.createSlug() + return TitleSlug( + slug?.replace("-", "."), + slug?.replace("-", " "), + slug?.replace("-", "_"), + ) } fun getIndexQuery( @@ -665,11 +676,6 @@ fun searchIndex( ): List? { val (dotSlug, spaceSlug) = getTitleSlug(title) val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) - val mimeType = arrayOf( - "video/x-matroska", - "video/mp4", - "video/x-msvideo" - ) val files = tryParseJson(response)?.data?.files?.filter { media -> (if (season == null) { media.name?.contains("$year") == true From 053443bff34a9bb42b6e14a1e2bd553e002d6548 Mon Sep 17 00:00:00 2001 From: hexated Date: Sun, 19 Feb 2023 22:33:51 +0700 Subject: [PATCH 2/7] sora: updated home --- SoraStream/src/main/kotlin/com/hexated/SoraStream.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 67250a68..73d3463e 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -151,8 +151,8 @@ open class SoraStream : TmdbProvider() { override val mainPage = mainPageOf( "$tmdbAPI/trending/all/day?api_key=$apiKey®ion=US" to "Trending", "$tmdbAPI/movie/popular?api_key=$apiKey®ion=US" to "Popular Movies", - "$tmdbAPI/tv/popular?api_key=$apiKey®ion=US" to "Popular TV Shows", - "$tmdbAPI/tv/airing_today?api_key=$apiKey®ion=US" to "Airing Today TV Shows", + "$tmdbAPI/tv/popular?api_key=$apiKey®ion=US&with_original_language=en" to "Popular TV Shows", + "$tmdbAPI/tv/airing_today?api_key=$apiKey®ion=US&with_original_language=en" to "Airing Today TV Shows", // "$tmdbAPI/tv/on_the_air?api_key=$apiKey®ion=US" to "On The Air TV Shows", "$tmdbAPI/discover/tv?api_key=$apiKey&with_networks=213" to "Netflix", "$tmdbAPI/discover/tv?api_key=$apiKey&with_networks=1024" to "Amazon", From 4f427b35b7c1c8b1a955b13448d0fe33b0d38e91 Mon Sep 17 00:00:00 2001 From: hexated Date: Sun, 19 Feb 2023 22:52:59 +0700 Subject: [PATCH 3/7] small fix --- SoraStream/src/main/kotlin/com/hexated/SoraStream.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 73d3463e..6c22f3ff 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -185,7 +185,7 @@ open class SoraStream : TmdbProvider() { request: MainPageRequest ): HomePageResponse { val adultQuery = - if (settingsForProvider.enableAdult) "" else "&without_keywords=190370|13059|226161|195669" + if (settingsForProvider.enableAdult) "" else "&without_keywords=190370|13059|226161|195669|190370" val type = if (request.data.contains("/movie")) "movie" else "tv" val home = app.get("${request.data}$adultQuery&page=$page") .parsedSafe()?.results From 38507526c0613d87caf07d817961aa0bf8ebb65a Mon Sep 17 00:00:00 2001 From: hexated Date: Sun, 19 Feb 2023 23:31:07 +0700 Subject: [PATCH 4/7] small fix again --- SoraStream/build.gradle.kts | 2 +- SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt | 8 ++++++-- SoraStream/src/main/kotlin/com/hexated/SoraStream.kt | 6 +++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 2c173f9d..8d6cbb4a 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 92 +version = 93 cloudstream { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 57626c49..95a6bc5c 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -2360,7 +2360,11 @@ object SoraExtractor : SoraStream() { val (dotSlug, spaceSlug, slashSlug) = getTitleSlug(title) val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) - val files = app.get("$tgarMovieAPI/search?name=$query&page=1").parsedSafe()?.results?.filter { media -> + val files = app.get( + "https://api.telegram.d1.zindex.eu.org/search?name=$query&page=1", + referer = tgarMovieAPI, + timeout = 120L + ).parsedSafe()?.results?.filter { media -> (if (season == null) { media.name?.contains("$year") == true } else { @@ -2391,7 +2395,7 @@ object SoraExtractor : SoraStream() { "TgarMovies $tags [$size]", "TgarMovies $tags [$size]", "https://api.southkoreacdn.workers.dev/telegram/${file._id}", - "https://tgarchive.eu.org/", + "$tgarMovieAPI/", quality, ) ) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 6c22f3ff..4415aa1a 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -126,7 +126,7 @@ open class SoraStream : TmdbProvider() { const val papaonMovies1API = "https://m.papaonwork.workers.dev/0:" const val papaonMovies2API = "https://m.papaonwork.workers.dev/1:" const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev" - const val tgarMovieAPI = "https://api.telegram.d1.zindex.eu.org" + const val tgarMovieAPI = "https://tgarchive.eu.org" fun getType(t: String?): TvType { return when (t) { @@ -185,7 +185,7 @@ open class SoraStream : TmdbProvider() { request: MainPageRequest ): HomePageResponse { val adultQuery = - if (settingsForProvider.enableAdult) "" else "&without_keywords=190370|13059|226161|195669|190370" + if (settingsForProvider.enableAdult) "" else "&without_keywords=190370|13059|226161|195669" val type = if (request.data.contains("/movie")) "movie" else "tv" val home = app.get("${request.data}$adultQuery&page=$page") .parsedSafe()?.results @@ -718,7 +718,7 @@ open class SoraStream : TmdbProvider() { invokeGomovies(res.title, res.year, res.season, res.episode, callback) }, { - invokeTgarMovies(res.title, res.year, res.season, res.episode, callback) + if (!res.isAnime) invokeTgarMovies(res.title, res.year, res.season, res.episode, callback) }, ) From 7b7c4ac8aabdc3c48e4d2d5e05011a4bd2d8af67 Mon Sep 17 00:00:00 2001 From: hexated Date: Mon, 20 Feb 2023 00:05:12 +0700 Subject: [PATCH 5/7] down --- SoraStream/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 8d6cbb4a..2c173f9d 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 93 +version = 92 cloudstream { From e1afefdb5627bf4bf3f66b301758768de54f5a22 Mon Sep 17 00:00:00 2001 From: hexated Date: Mon, 20 Feb 2023 02:57:29 +0700 Subject: [PATCH 6/7] sora: added jmdkhMovie --- SoraStream/build.gradle.kts | 2 +- .../main/kotlin/com/hexated/SoraExtractor.kt | 23 +++++++++++++++++-- .../src/main/kotlin/com/hexated/SoraStream.kt | 13 +++++++++++ .../src/main/kotlin/com/hexated/SoraUtils.kt | 14 ++++++++--- 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 2c173f9d..8d6cbb4a 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 92 +version = 93 cloudstream { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 95a6bc5c..8c787bdf 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -2249,6 +2249,26 @@ object SoraExtractor : SoraStream() { ) } + 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, + ) + } + private suspend fun invokeIndex( apiUrl: String, api: String, @@ -2361,9 +2381,8 @@ object SoraExtractor : SoraStream() { val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) val files = app.get( - "https://api.telegram.d1.zindex.eu.org/search?name=$query&page=1", + "https://api.telegram.d1.zindex.eu.org/search?name=${encode(query)}&page=1", referer = tgarMovieAPI, - timeout = 120L ).parsedSafe()?.results?.filter { media -> (if (season == null) { media.name?.contains("$year") == true diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 4415aa1a..fd767e9d 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -30,6 +30,7 @@ import com.hexated.SoraExtractor.invokeFlixon import com.hexated.SoraExtractor.invokeFwatayako import com.hexated.SoraExtractor.invokeGMovies import com.hexated.SoraExtractor.invokeGomovies +import com.hexated.SoraExtractor.invokeJmdkhMovies import com.hexated.SoraExtractor.invokeJsmovies import com.hexated.SoraExtractor.invokeKisskh import com.hexated.SoraExtractor.invokeLing @@ -127,6 +128,7 @@ open class SoraStream : TmdbProvider() { const val papaonMovies2API = "https://m.papaonwork.workers.dev/1:" const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev" const val tgarMovieAPI = "https://tgarchive.eu.org" + const val jmdkhMovieAPI = "https://tg.jmdkh.eu.org/0:" fun getType(t: String?): TvType { return when (t) { @@ -720,6 +722,17 @@ open class SoraStream : TmdbProvider() { { if (!res.isAnime) invokeTgarMovies(res.title, res.year, res.season, res.episode, callback) }, + { + if (!res.isAnime) invokeJmdkhMovies( + jmdkhMovieAPI, + "JmdkhMovies", + 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 e3d5ec14..1202ac0d 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt @@ -24,6 +24,7 @@ import okhttp3.RequestBody.Companion.toRequestBody import org.jsoup.nodes.Document import java.net.URI import java.net.URL +import java.net.URLEncoder import java.security.MessageDigest import java.security.SecureRandom import java.util.* @@ -44,6 +45,7 @@ val encodedIndex = arrayOf( "XtremeMovies", "PapaonMovies[1]", "PapaonMovies[2]", + "JmdkhMovies", ) val lockedIndex = arrayOf( @@ -52,7 +54,8 @@ val lockedIndex = arrayOf( ) val mkvIndex = arrayOf( - "EdithxMovies" + "EdithxMovies", + "JmdkhMovies", ) val untrimmedIndex = arrayOf( @@ -674,7 +677,7 @@ fun searchIndex( response: String, isTrimmed: Boolean = true, ): List? { - val (dotSlug, spaceSlug) = getTitleSlug(title) + val (dotSlug, spaceSlug, slashSlug) = getTitleSlug(title) val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) val files = tryParseJson(response)?.data?.files?.filter { media -> (if (season == null) { @@ -692,7 +695,10 @@ fun searchIndex( ) || media.name.replace( "-", " " - ).contains("$spaceSlug", true)) + ).contains("$spaceSlug", true) || media.name.replace( + "-", + "_" + ).contains("$slashSlug", true)) }?.distinctBy { it.name }?.sortedByDescending { it.size?.toLongOrNull() ?: 0 } ?: return null return if (isTrimmed) { @@ -844,6 +850,8 @@ fun getBaseUrl(url: String): String { } } +fun encode(input: String): String? = URLEncoder.encode(input, "utf-8") + fun decryptStreamUrl(data: String): String { fun getTrash(arr: List, item: Int): List { From 223695f55af48124d88b1b71387128bbabcb292a Mon Sep 17 00:00:00 2001 From: hexated Date: Mon, 20 Feb 2023 03:34:56 +0700 Subject: [PATCH 7/7] fixed Smashy again --- SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 8c787bdf..ff13dfd5 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -1904,7 +1904,7 @@ object SoraExtractor : SoraStream() { "$smashyStreamAPI/playere.php?imdb=$imdbId&season=$season&episode=$episode" } - app.get(url).document.select("div#_default-servers a.server").map { + app.get(url, referer = "https://smashystream.com/").document.select("div#_default-servers a.server").map { it.attr("data-id") to it.text() }.apmap { when {