package com.hexated import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.utils.SubtitleHelper const val openSubAPI = "https://opensubtitles-v3.strem.io" const val watchSomuchAPI = "https://watchsomuch.tv" object SubsExtractors { suspend fun invokeOpenSubs( imdbId: String? = null, season: Int? = null, episode: Int? = null, subtitleCallback: (SubtitleFile) -> Unit, ) { val slug = if(season == null) { "movie/$imdbId" } else { "series/$imdbId:$season:$episode" } app.get("${openSubAPI}/subtitles/$slug.json", timeout = 120L).parsedSafe()?.subtitles?.map { sub -> subtitleCallback.invoke( SubtitleFile( SubtitleHelper.fromThreeLettersToLanguage(sub.lang ?: "") ?: sub.lang ?: return@map, sub.url ?: return@map ) ) } } suspend fun invokeWatchsomuch( imdbId: String? = null, season: Int? = null, episode: Int? = null, subtitleCallback: (SubtitleFile) -> Unit, ) { val id = imdbId?.removePrefix("tt") val epsId = app.post( "${watchSomuchAPI}/Watch/ajMovieTorrents.aspx", data = mapOf( "index" to "0", "mid" to "$id", "wsk" to "30fb68aa-1c71-4b8c-b5d4-4ca9222cfb45", "lid" to "", "liu" to "" ), headers = mapOf("X-Requested-With" to "XMLHttpRequest") ).parsedSafe()?.movie?.torrents?.let { eps -> if (season == null) { eps.firstOrNull()?.id } else { eps.find { it.episode == episode && it.season == season }?.id } } ?: return val (seasonSlug, episodeSlug) = getEpisodeSlug(season, episode) val subUrl = if (season == null) { "${watchSomuchAPI}/Watch/ajMovieSubtitles.aspx?mid=$id&tid=$epsId&part=" } else { "${watchSomuchAPI}/Watch/ajMovieSubtitles.aspx?mid=$id&tid=$epsId&part=S${seasonSlug}E${episodeSlug}" } app.get(subUrl).parsedSafe()?.subtitles?.map { sub -> subtitleCallback.invoke( SubtitleFile( sub.label ?: "", fixUrl(sub.url ?: return@map null, watchSomuchAPI) ) ) } } data class OsSubtitles( @JsonProperty("url") val url: String? = null, @JsonProperty("lang") val lang: String? = null, ) data class OsResult( @JsonProperty("subtitles") val subtitles: ArrayList? = arrayListOf(), ) data class WatchsomuchTorrents( @JsonProperty("id") val id: Int? = null, @JsonProperty("movieId") val movieId: Int? = null, @JsonProperty("season") val season: Int? = null, @JsonProperty("episode") val episode: Int? = null, ) data class WatchsomuchMovies( @JsonProperty("torrents") val torrents: ArrayList? = arrayListOf(), ) data class WatchsomuchResponses( @JsonProperty("movie") val movie: WatchsomuchMovies? = null, ) data class WatchsomuchSubtitles( @JsonProperty("url") val url: String? = null, @JsonProperty("label") val label: String? = null, ) data class WatchsomuchSubResponses( @JsonProperty("subtitles") val subtitles: ArrayList? = arrayListOf(), ) }