diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 71a6eef1..334a826b 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 = 160 +version = 161 android { defaultConfig { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 56063048..e0cf44db 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -2820,6 +2820,80 @@ object SoraExtractor : SoraStream() { } + suspend fun invokeSusflix( + tmdbId: Int? = null, + season: Int? = null, + episode: Int? = null, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit, + ) { + val url = if(season == null) { + "$susflixAPI/view/movie/$tmdbId" + } else { + "$susflixAPI/view/tv/$tmdbId/$season/$episode" + } + + val res = app.get(url,cookies = mapOf( + "session" to "eyJfZnJlc2giOmZhbHNlLCJwaG9uZV9udW1iZXIiOiJzdXNoZXg5OCJ9.ZO6CsA.XUs6Y5gna8ExAUX55-myMi1QpYU" + )).text.substringAfter("response = {").substringBefore("};").replace("\'", "\"") + + val sources = tryParseJson("{$res}") + sources?.qualities?.map { source -> + callback.invoke( + ExtractorLink( + "Susflix", + "Susflix", + source.path ?: return@map, + "$susflixAPI/", + getQualityFromName(source.quality) + ) + ) + } + + sources?.srtfiles?.map { sub -> + subtitleCallback.invoke( + SubtitleFile( + sub.caption ?: return@map, + sub.url ?: return@map, + ) + ) + } + + } + + suspend fun invokeJump1( + tmdbId: Int? = null, + tvdbId: Int? = null, + title: String? = null, + year: Int? = null, + season: Int? = null, + episode: Int? = null, + callback: (ExtractorLink) -> Unit, + ) { + val referer = "https://jump1.net/" + val res = if(season == null) { + val body = """{"filters":[{"type":"slug","args":{"slugs":["${title.createSlug()}-$year"]}}],"sort":"addedRecent","skip":0,"limit":100}""".toRequestBody(RequestBodyTypes.JSON.toMediaTypeOrNull()) + app.post("$jump1API/api/movies", requestBody = body, referer = referer) + } else { + app.get("$jump1API/api/shows/$tvdbId/seasons", referer = referer) + }.text + + val source = if(season == null) { + tryParseJson(res)?.movies?.find { it.id == tmdbId }?.videoId + } else { + val jumpSeason = tryParseJson>(res)?.find { it.seasonNumber == season }?.id + val seasonRes = app.get("$jump1API/api/shows/seasons/${jumpSeason ?: return}/episodes", referer = referer) + tryParseJson>(seasonRes.text)?.find { it.episodeNumber == episode }?.videoId + } + + M3u8Helper.generateM3u8( + "Jump1", + "$jump1API/hls/${source ?: return}/master.m3u8?ts=${APIHolder.unixTimeMS}", + referer + ).forEach(callback) + + } + } diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt index f01fd804..adb05049 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt @@ -88,11 +88,41 @@ data class KisskhDetail( @JsonProperty("episodes") val episodes: ArrayList? = arrayListOf(), ) +data class SusflixSrtfiles( + @JsonProperty("caption") val caption: String? = null, + @JsonProperty("url") val url: String? = null, +) + +data class SusflixQualities( + @JsonProperty("path") val path: String? = null, + @JsonProperty("quality") val quality: String? = null, +) + +data class SusflixSources( + @JsonProperty("Qualities") val qualities: ArrayList? = arrayListOf(), + @JsonProperty("Srtfiles") val srtfiles: ArrayList? = arrayListOf(), +) + data class KisskhResults( @JsonProperty("id") val id: Int?, @JsonProperty("title") val title: String?, ) +data class Jump1Episodes( + @JsonProperty("id") val id: Any? = null, + @JsonProperty("episodeNumber") val episodeNumber: Int? = null, + @JsonProperty("videoId") val videoId: String? = null, +) + +data class Jump1Season( + @JsonProperty("seasonNumber") val seasonNumber: Int? = null, + @JsonProperty("id") val id: String? = null, +) + +data class Jump1Movies( + @JsonProperty("movies") val movies: ArrayList? = arrayListOf(), +) + data class EpisodesFwatayako( @JsonProperty("id") val id: String? = null, @JsonProperty("file") val file: String? = null, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index 4f163d30..5377dd49 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -41,11 +41,13 @@ import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies import com.hexated.SoraExtractor.invokeFourCartoon +import com.hexated.SoraExtractor.invokeJump1 import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokePobmovies import com.hexated.SoraExtractor.invokePrimewire +import com.hexated.SoraExtractor.invokeSusflix import com.hexated.SoraExtractor.invokeTvMovies import com.hexated.SoraExtractor.invokeUhdmovies import com.hexated.SoraExtractor.invokeVidsrcto @@ -132,6 +134,8 @@ open class SoraStream : TmdbProvider() { const val vidsrctoAPI = "https://vidsrc.to" const val dramadayAPI = "https://dramaday.me" const val animetoshoAPI = "https://animetosho.org" + const val susflixAPI = "https://susflix.tv" + const val jump1API = "https://ca.jump1.net" // INDEX SITE const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev" @@ -276,6 +280,7 @@ open class SoraStream : TmdbProvider() { LinkData( data.id, res.external_ids?.imdb_id, + res.external_ids?.tvdb_id, data.type, eps.seasonNumber, eps.episodeNumber, @@ -329,6 +334,7 @@ open class SoraStream : TmdbProvider() { LinkData( data.id, res.external_ids?.imdb_id, + res.external_ids?.tvdb_id, data.type, title = title, year = year, @@ -740,6 +746,20 @@ open class SoraStream : TmdbProvider() { { if(!res.isAnime) invoke2embed(res.imdbId,res.season,res.episode,callback) }, + { + invokeSusflix(res.id,res.season,res.episode,subtitleCallback,callback) + }, + { + if(!res.isAnime) invokeJump1( + res.id, + res.tvdbId, + res.title, + res.year, + res.season, + res.episode, + callback + ) + }, ) return true @@ -748,6 +768,7 @@ open class SoraStream : TmdbProvider() { data class LinkData( val id: Int? = null, val imdbId: String? = null, + val tvdbId: Int? = null, val type: String? = null, val season: Int? = null, val episode: Int? = null, @@ -852,7 +873,7 @@ open class SoraStream : TmdbProvider() { data class ExternalIds( @JsonProperty("imdb_id") val imdb_id: String? = null, - @JsonProperty("tvdb_id") val tvdb_id: String? = null, + @JsonProperty("tvdb_id") val tvdb_id: Int? = null, ) data class Credits( diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt index ebe91e71..239dc682 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -28,10 +28,12 @@ import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies import com.hexated.SoraExtractor.invokeFourCartoon +import com.hexated.SoraExtractor.invokeJump1 import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokePrimewire +import com.hexated.SoraExtractor.invokeSusflix import com.hexated.SoraExtractor.invokeVidSrc import com.hexated.SoraExtractor.invokeVidsrcto import com.hexated.SoraExtractor.invokeWatchOnline @@ -54,6 +56,18 @@ class SoraStreamLite : SoraStream() { val res = AppUtils.parseJson(data) argamap( + { + if(!res.isAnime) invokeJump1(res.id,res.tvdbId,res.title,res.year,res.season,res.episode,callback) + }, + { + invokeSusflix( + res.id, + res.season, + res.episode, + subtitleCallback, + callback + ) + }, { invokeWatchsomuch( res.imdbId, diff --git a/settings.gradle.kts b/settings.gradle.kts index f2497ec2..5df21340 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,7 +2,7 @@ rootProject.name = "CloudstreamPlugins" // This file sets what projects are included. All new projects should get automatically included unless specified in "disabled" variable. -val disabled = listOf("Animixplay") +val disabled = listOf("Animixplay","Kickassanime") File(rootDir, ".").eachDir { dir -> if (!disabled.contains(dir.name) && File(dir, "build.gradle.kts").exists()) {