2022-10-15 15:26:51 +00:00
package com.hexated
import com.fasterxml.jackson.annotation.JsonProperty
2023-08-21 00:55:21 +00:00
import com.hexated.SoraExtractor.invoke2embed
2023-01-11 01:28:46 +00:00
import com.hexated.SoraExtractor.invokeAnimes
2023-10-03 16:47:31 +00:00
import com.hexated.SoraExtractor.invokeBlackvid
2023-01-04 17:45:21 +00:00
import com.hexated.SoraExtractor.invokeBollyMaza
2022-10-17 08:03:20 +00:00
import com.hexated.SoraExtractor.invokeDbgo
2022-11-02 06:56:24 +00:00
import com.hexated.SoraExtractor.invokeFilmxy
2022-11-07 10:16:02 +00:00
import com.hexated.SoraExtractor.invokeKimcartoon
2022-10-17 05:01:44 +00:00
import com.hexated.SoraExtractor.invokeVidSrc
2022-10-15 15:26:51 +00:00
import com.lagradost.cloudstream3.*
2022-10-27 09:02:40 +00:00
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
2022-10-15 15:26:51 +00:00
import com.lagradost.cloudstream3.metaproviders.TmdbProvider
2023-02-10 17:52:02 +00:00
import com.hexated.SoraExtractor.invokeDahmerMovies
2023-07-31 04:30:48 +00:00
import com.hexated.SoraExtractor.invokeDoomovies
2023-09-21 07:43:38 +00:00
import com.hexated.SoraExtractor.invokeDotmovies
2023-08-20 06:21:50 +00:00
import com.hexated.SoraExtractor.invokeDramaday
2023-05-24 08:29:19 +00:00
import com.hexated.SoraExtractor.invokeDreamfilm
2022-12-07 15:06:48 +00:00
import com.hexated.SoraExtractor.invokeFDMovies
2023-01-11 01:28:46 +00:00
import com.hexated.SoraExtractor.invokeFlixon
2022-12-02 16:50:56 +00:00
import com.hexated.SoraExtractor.invokeGMovies
2023-06-15 23:38:22 +00:00
import com.hexated.SoraExtractor.invokeGoku
2022-12-14 09:35:04 +00:00
import com.hexated.SoraExtractor.invokeKisskh
2022-11-19 04:37:28 +00:00
import com.hexated.SoraExtractor.invokeLing
2022-12-09 08:44:01 +00:00
import com.hexated.SoraExtractor.invokeM4uhd
2022-12-29 02:48:08 +00:00
import com.hexated.SoraExtractor.invokeMoviezAdd
2023-06-24 04:32:21 +00:00
import com.hexated.SoraExtractor.invokeNavy
2023-04-08 14:14:42 +00:00
import com.hexated.SoraExtractor.invokeNinetv
2023-05-19 23:35:52 +00:00
import com.hexated.SoraExtractor.invokeNowTv
2023-01-04 18:04:11 +00:00
import com.hexated.SoraExtractor.invokeRStream
2023-06-22 10:05:28 +00:00
import com.hexated.SoraExtractor.invokeRidomovies
2023-01-21 06:25:04 +00:00
import com.hexated.SoraExtractor.invokeSmashyStream
2023-06-26 05:11:27 +00:00
import com.hexated.SoraExtractor.invokeDumpStream
2023-07-04 09:38:14 +00:00
import com.hexated.SoraExtractor.invokeEmovies
2023-09-15 14:24:05 +00:00
import com.hexated.SoraExtractor.invokeHdmovies4u
2023-07-28 21:41:04 +00:00
import com.hexated.SoraExtractor.invokeMoment
2023-07-26 07:31:20 +00:00
import com.hexated.SoraExtractor.invokeMultimovies
2023-07-27 14:38:45 +00:00
import com.hexated.SoraExtractor.invokeNetmovies
2023-10-14 10:15:09 +00:00
import com.hexated.SoraExtractor.invokeSFMovies
2023-10-08 01:32:01 +00:00
import com.hexated.SoraExtractor.invokeShowflix
2022-12-10 12:25:28 +00:00
import com.hexated.SoraExtractor.invokeTvMovies
2022-11-21 10:27:07 +00:00
import com.hexated.SoraExtractor.invokeUhdmovies
2023-09-13 07:58:52 +00:00
import com.hexated.SoraExtractor.invokeVegamovies
2023-08-18 21:35:24 +00:00
import com.hexated.SoraExtractor.invokeVidsrcto
2023-03-13 10:20:00 +00:00
import com.hexated.SoraExtractor.invokeWatchOnline
2023-02-02 06:51:20 +00:00
import com.hexated.SoraExtractor.invokeWatchsomuch
2023-09-18 07:36:12 +00:00
import com.hexated.SoraExtractor.invokeZshow
2023-08-10 18:40:02 +00:00
import com.lagradost.cloudstream3.LoadResponse.Companion.addImdbId
import com.lagradost.cloudstream3.LoadResponse.Companion.addTMDbId
2022-10-15 15:26:51 +00:00
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.ExtractorLink
import kotlin.math.roundToInt
2022-10-17 04:24:09 +00:00
open class SoraStream : TmdbProvider ( ) {
2022-10-15 15:26:51 +00:00
override var name = " SoraStream "
override val hasMainPage = true
override val instantLinkLoading = true
override val useMetaLoadResponse = true
2023-02-01 17:27:45 +00:00
override val hasQuickSearch = true
2022-10-15 15:26:51 +00:00
override val supportedTypes = setOf (
TvType . Movie ,
TvType . TvSeries ,
TvType . Anime ,
)
/** AUTHOR : Hexated & Sora */
companion object {
2023-03-10 22:22:24 +00:00
/** TOOLS */
2022-10-15 15:26:51 +00:00
private const val tmdbAPI = " https://api.themoviedb.org/3 "
2023-05-14 20:24:49 +00:00
const val gdbot = " https://gdtot.pro "
2023-05-22 15:46:24 +00:00
const val anilistAPI = " https://graphql.anilist.co "
2023-05-29 03:34:57 +00:00
const val malsyncAPI = " https://api.malsync.moe "
2023-08-21 00:55:21 +00:00
const val jikanAPI = " https://api.jikan.moe/v4 "
2022-11-18 11:00:36 +00:00
2023-10-27 12:46:01 +00:00
private const val apiKey = BuildConfig . TMDB _API
2023-01-29 03:29:15 +00:00
2023-03-10 22:22:24 +00:00
/** ALL SOURCES */
2023-08-21 00:55:21 +00:00
const val twoEmbedAPI = " https://www.2embed.cc "
2023-10-27 19:23:05 +00:00
const val vidSrcAPI = " https://vidsrc.me "
2022-10-18 00:20:30 +00:00
const val dbgoAPI = " https://dbgo.fun "
2023-05-24 08:29:19 +00:00
const val dreamfilmAPI = " https://dreamfilmsw.net "
2022-10-29 19:32:17 +00:00
const val noverseAPI = " https://www.nollyverse.com "
2022-11-02 06:56:24 +00:00
const val filmxyAPI = " https://www.filmxy.vip "
2022-11-07 10:16:02 +00:00
const val kimcartoonAPI = " https://kimcartoon.li "
2023-07-23 18:05:02 +00:00
const val aniwatchAPI = " https://aniwatch.to "
2023-05-21 13:20:19 +00:00
const val crunchyrollAPI = " https://beta-api.crunchyroll.com "
2023-04-17 10:01:08 +00:00
const val kissKhAPI = " https://kisskh.co "
2022-11-19 04:37:28 +00:00
const val lingAPI = " https://ling-online.net "
2023-11-12 23:28:49 +00:00
const val uhdmoviesAPI = " https://uhdmovies.zip "
2022-12-02 16:50:56 +00:00
const val gMoviesAPI = " https://gdrivemovies.xyz "
2023-01-19 02:51:04 +00:00
const val fdMoviesAPI = " https://freedrivemovie.lol "
2023-09-10 09:34:33 +00:00
const val m4uhdAPI = " https://ww2.m4ufree.com "
2022-12-10 12:25:28 +00:00
const val tvMoviesAPI = " https://www.tvseriesnmovies.com "
2023-09-19 02:48:36 +00:00
const val moviezAddAPI = " https://ww3.moviezaddiction.click "
const val bollyMazaAPI = " https://ww3.bollymaza.click "
2023-10-11 15:47:03 +00:00
const val rStreamAPI = " https://remotestream.cc "
2023-06-05 09:46:05 +00:00
const val flixonAPI = " https://flixon.lol "
2023-01-21 06:25:04 +00:00
const val smashyStreamAPI = " https://embed.smashystream.com "
2023-02-06 04:55:42 +00:00
const val watchSomuchAPI = " https://watchsomuch.tv " // sub only
2023-09-28 14:05:17 +00:00
const val watchOnlineAPI = " https://lookmovie.foundation "
2023-11-08 21:34:56 +00:00
const val nineTvAPI = " https://moviesapi.club "
2023-05-19 23:35:52 +00:00
const val nowTvAPI = " https://myfilestorage.xyz "
2023-06-15 23:38:22 +00:00
const val gokuAPI = " https://goku.sx "
2023-06-22 10:05:28 +00:00
const val ridomoviesAPI = " https://ridomovies.pw "
2023-06-24 04:32:21 +00:00
const val navyAPI = " https://navy-issue-i-239.site "
2023-07-04 09:38:14 +00:00
const val emoviesAPI = " https://emovies.si "
2023-11-16 11:05:39 +00:00
const val multimoviesAPI = " https://multimovies.live "
2023-09-26 05:45:33 +00:00
const val netmoviesAPI = " https://netmovies.to "
2023-11-12 22:41:54 +00:00
const val momentAPI = " https://izzillent-dickstonyx-i-262.site "
2023-07-31 04:30:48 +00:00
const val doomoviesAPI = " https://doomovies.net "
2023-08-18 21:35:24 +00:00
const val vidsrctoAPI = " https://vidsrc.to "
2023-08-20 06:21:50 +00:00
const val dramadayAPI = " https://dramaday.me "
2023-08-21 00:55:21 +00:00
const val animetoshoAPI = " https://animetosho.org "
2023-11-15 04:18:37 +00:00
const val vegaMoviesAPI = " https://vegamovies.boo "
2023-09-15 14:24:05 +00:00
const val hdmovies4uAPI = " https://hdmovies4u.name "
const val watchflxAPI = " https://watchflx.tv "
2023-11-15 04:18:37 +00:00
const val dotmoviesAPI = " https://dotmovies.yachts "
2023-10-03 16:47:31 +00:00
const val blackvidAPI = " https://prod.api.blackvid.space "
2023-10-08 01:32:01 +00:00
const val showflixAPI = " https://showflix.online "
2023-11-16 11:05:39 +00:00
const val dahmerMoviesAPI = " https://odd-bird-1319.zwuhygoaqe.workers.dev "
2023-04-28 17:25:17 +00:00
2022-10-15 15:26:51 +00:00
fun getType ( t : String ? ) : TvType {
return when ( t ) {
" movie " -> TvType . Movie
else -> TvType . TvSeries
}
}
fun getStatus ( t : String ? ) : ShowStatus {
return when ( t ) {
" Returning Series " -> ShowStatus . Ongoing
else -> ShowStatus . Completed
}
}
2022-10-17 06:32:34 +00:00
2022-10-15 15:26:51 +00:00
}
override val mainPage = mainPageOf (
2023-01-12 01:54:02 +00:00
" $tmdbAPI /trending/all/day?api_key= $apiKey ®ion=US " to " Trending " ,
" $tmdbAPI /movie/popular?api_key= $apiKey ®ion=US " to " Popular Movies " ,
2023-02-19 15:33:51 +00:00
" $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 " ,
2022-12-31 18:58:34 +00:00
" $tmdbAPI /discover/tv?api_key= $apiKey &with_networks=213 " to " Netflix " ,
" $tmdbAPI /discover/tv?api_key= $apiKey &with_networks=1024 " to " Amazon " ,
" $tmdbAPI /discover/tv?api_key= $apiKey &with_networks=2739 " to " Disney+ " ,
" $tmdbAPI /discover/tv?api_key= $apiKey &with_networks=453 " to " Hulu " ,
" $tmdbAPI /discover/tv?api_key= $apiKey &with_networks=2552 " to " Apple TV+ " ,
" $tmdbAPI /discover/tv?api_key= $apiKey &with_networks=49 " to " HBO " ,
2023-02-24 21:32:34 +00:00
" $tmdbAPI /discover/tv?api_key= $apiKey &with_networks=4330 " to " Paramount+ " ,
2023-09-23 03:31:55 +00:00
" $tmdbAPI /discover/tv?api_key= $apiKey &with_networks=3353 " to " Peacock " ,
2023-01-12 01:54:02 +00:00
" $tmdbAPI /movie/top_rated?api_key= $apiKey ®ion=US " to " Top Rated Movies " ,
" $tmdbAPI /tv/top_rated?api_key= $apiKey ®ion=US " to " Top Rated TV Shows " ,
" $tmdbAPI /movie/upcoming?api_key= $apiKey ®ion=US " to " Upcoming Movies " ,
2022-12-31 18:58:34 +00:00
" $tmdbAPI /discover/tv?api_key= $apiKey &with_original_language=ko " to " Korean Shows " ,
2023-11-17 20:16:45 +00:00
" $tmdbAPI /discover/tv?api_key= $apiKey &with_keywords=210024|222243&sort_by=popularity.desc&air_date.lte= ${getDate().today} &air_date.gte= ${getDate().today} " to " Airing Today Anime " ,
" $tmdbAPI /discover/tv?api_key= $apiKey &with_keywords=210024|222243&sort_by=popularity.desc&air_date.lte= ${getDate().nextWeek} &air_date.gte= ${getDate().today} " to " On The Air Anime " ,
2022-12-31 18:58:34 +00:00
" $tmdbAPI /discover/tv?api_key= $apiKey &with_keywords=210024|222243 " to " Anime " ,
" $tmdbAPI /discover/movie?api_key= $apiKey &with_keywords=210024|222243 " to " Anime Movies " ,
2022-10-15 15:26:51 +00:00
)
private fun getImageUrl ( link : String ? ) : String ? {
if ( link == null ) return null
return if ( link . startsWith ( " / " ) ) " https://image.tmdb.org/t/p/w500/ $link " else link
}
2022-11-03 06:36:36 +00:00
private fun getOriImageUrl ( link : String ? ) : String ? {
if ( link == null ) return null
return if ( link . startsWith ( " / " ) ) " https://image.tmdb.org/t/p/original/ $link " else link
}
2022-10-15 15:26:51 +00:00
override suspend fun getMainPage (
page : Int ,
request : MainPageRequest
) : HomePageResponse {
2023-01-04 17:45:21 +00:00
val adultQuery =
2023-02-19 16:31:07 +00:00
if ( settingsForProvider . enableAdult ) " " else " &without_keywords=190370|13059|226161|195669 "
2022-10-15 15:26:51 +00:00
val type = if ( request . data . contains ( " /movie " ) ) " movie " else " tv "
2023-01-01 14:03:35 +00:00
val home = app . get ( " ${request.data} $adultQuery &page= $page " )
2022-10-15 15:26:51 +00:00
. parsedSafe < Results > ( ) ?. results
?. mapNotNull { media ->
media . toSearchResponse ( type )
} ?: throw ErrorLoadingException ( " Invalid Json reponse " )
return newHomePageResponse ( request . name , home )
}
private fun Media . toSearchResponse ( type : String ? = null ) : SearchResponse ? {
return newMovieSearchResponse (
title ?: name ?: originalTitle ?: return null ,
Data ( id = id , type = mediaType ?: type ) . toJson ( ) ,
TvType . Movie ,
) {
this . posterUrl = getImageUrl ( posterPath )
}
}
2023-02-01 17:27:45 +00:00
override suspend fun quickSearch ( query : String ) : List < SearchResponse > ? = search ( query )
2022-12-21 21:49:12 +00:00
override suspend fun search ( query : String ) : List < SearchResponse > ? {
return app . get (
2023-02-01 17:27:45 +00:00
" $tmdbAPI /search/multi?api_key= $apiKey &language=en-US&query= $query &page=1&include_adult= ${settingsForProvider.enableAdult} "
2022-10-15 15:26:51 +00:00
) . parsedSafe < Results > ( ) ?. results ?. mapNotNull { media ->
media . toSearchResponse ( )
2022-11-01 04:37:30 +00:00
}
2022-10-19 21:46:22 +00:00
}
2022-10-15 15:26:51 +00:00
override suspend fun load ( url : String ) : LoadResponse ? {
val data = parseJson < Data > ( url )
2022-11-22 07:43:11 +00:00
val type = getType ( data . type )
2023-05-02 19:45:23 +00:00
val append = " alternative_titles,credits,external_ids,keywords,videos,recommendations "
2022-12-07 15:06:48 +00:00
val resUrl = if ( type == TvType . Movie ) {
2023-05-02 19:45:23 +00:00
" $tmdbAPI /movie/ ${data.id} ?api_key= $apiKey &append_to_response= $append "
2022-11-22 07:43:11 +00:00
} else {
2023-05-02 19:45:23 +00:00
" $tmdbAPI /tv/ ${data.id} ?api_key= $apiKey &append_to_response= $append "
2022-11-22 07:43:11 +00:00
}
2022-12-07 15:06:48 +00:00
val res = app . get ( resUrl ) . parsedSafe < MediaDetail > ( )
?: throw ErrorLoadingException ( " Invalid Json Response " )
2022-10-19 21:46:22 +00:00
2022-11-04 15:54:25 +00:00
val title = res . title ?: res . name ?: return null
2022-11-26 21:25:36 +00:00
val poster = getOriImageUrl ( res . posterPath )
val bgPoster = getOriImageUrl ( res . backdropPath )
2022-11-04 15:54:25 +00:00
val orgTitle = res . originalTitle ?: res . originalName ?: return null
2023-06-22 01:26:45 +00:00
val releaseDate = res . releaseDate ?: res . firstAirDate
val year = releaseDate ?. split ( " - " ) ?. first ( ) ?. toIntOrNull ( )
2022-11-24 06:27:52 +00:00
val rating = res . vote _average . toString ( ) . toRatingInt ( )
2022-11-19 04:37:28 +00:00
val genres = res . genres ?. mapNotNull { it . name }
2023-09-11 04:55:09 +00:00
val isAnime =
genres ?. contains ( " Animation " ) == true && ( res . original _language == " zh " || res . original _language == " ja " )
2023-08-20 06:21:50 +00:00
val isAsian = !is Anime && ( res . original _language == " zh " || res . original _language == " ko " )
2023-09-21 07:43:38 +00:00
val isBollywood = res . production _countries ?. any { it . name == " India " } ?: false
2023-01-01 14:03:35 +00:00
val keywords = res . keywords ?. results ?. mapNotNull { it . name } . orEmpty ( )
. ifEmpty { res . keywords ?. keywords ?. mapNotNull { it . name } }
2022-11-04 15:54:25 +00:00
2022-11-22 07:43:11 +00:00
val actors = res . credits ?. cast ?. mapNotNull { cast ->
2022-10-15 15:26:51 +00:00
ActorData (
Actor (
cast . name ?: cast . originalName ?: return @mapNotNull null ,
getImageUrl ( cast . profilePath )
) ,
2022-11-22 07:43:11 +00:00
roleString = cast . character
2022-10-15 15:26:51 +00:00
)
} ?: return null
2022-12-07 15:06:48 +00:00
val recommendations =
res . recommendations ?. results ?. mapNotNull { media -> media . toSearchResponse ( ) }
2022-10-15 15:26:51 +00:00
2022-11-22 07:43:11 +00:00
val trailer = res . videos ?. results ?. map { " https://www.youtube.com/watch?v= ${it.key} " }
?. randomOrNull ( )
2022-10-27 09:02:40 +00:00
2022-10-15 15:26:51 +00:00
return if ( type == TvType . TvSeries ) {
2023-02-21 20:40:08 +00:00
val lastSeason = res . last _episode _to _air ?. season _number
2022-12-23 12:02:01 +00:00
val episodes = res . seasons ?. mapNotNull { season ->
2022-10-15 15:26:51 +00:00
app . get ( " $tmdbAPI / ${data.type} / ${data.id} /season/ ${season.seasonNumber} ?api_key= $apiKey " )
. parsedSafe < MediaDetailEpisodes > ( ) ?. episodes ?. map { eps ->
2022-12-23 12:02:01 +00:00
Episode (
2022-10-15 15:26:51 +00:00
LinkData (
data . id ,
2022-11-22 07:43:11 +00:00
res . external _ids ?. imdb _id ,
2023-08-30 02:17:46 +00:00
res . external _ids ?. tvdb _id ,
2022-10-15 15:26:51 +00:00
data . type ,
eps . seasonNumber ,
2022-10-27 08:46:19 +00:00
eps . episodeNumber ,
title = title ,
2022-11-04 15:54:25 +00:00
year = season . airDate ?. split ( " - " ) ?. first ( ) ?. toIntOrNull ( ) ,
orgTitle = orgTitle ,
2022-12-07 15:06:48 +00:00
isAnime = isAnime ,
2022-11-21 10:27:07 +00:00
airedYear = year ,
2022-12-14 05:05:18 +00:00
lastSeason = lastSeason ,
epsTitle = eps . name ,
2023-05-22 15:46:24 +00:00
jpTitle = res . alternative _titles ?. results ?. find { it . iso _3166 _1 == " JP " } ?. title ,
date = season . airDate ,
2023-07-07 07:32:57 +00:00
airedDate = res . releaseDate ?: res . firstAirDate ,
2023-08-20 06:21:50 +00:00
isAsian = isAsian ,
2023-09-21 07:43:38 +00:00
isBollywood = isBollywood
2022-10-15 15:26:51 +00:00
) . toJson ( ) ,
2023-07-27 14:38:45 +00:00
name = eps . name + if ( isUpcoming ( eps . airDate ) ) " - [UPCOMING] " else " " ,
2022-10-15 15:26:51 +00:00
season = eps . seasonNumber ,
episode = eps . episodeNumber ,
posterUrl = getImageUrl ( eps . stillPath ) ,
rating = eps . voteAverage ?. times ( 10 ) ?. roundToInt ( ) ,
description = eps . overview
) . apply {
this . addDate ( eps . airDate )
2022-12-23 12:02:01 +00:00
}
2022-10-15 15:26:51 +00:00
}
2022-12-23 12:02:01 +00:00
} ?. flatten ( ) ?: listOf ( )
2022-10-15 15:26:51 +00:00
newTvSeriesLoadResponse (
2022-10-27 08:46:19 +00:00
title ,
2022-10-15 15:26:51 +00:00
url ,
2022-12-29 02:48:08 +00:00
if ( isAnime ) TvType . Anime else TvType . TvSeries ,
2022-10-15 15:26:51 +00:00
episodes
) {
2022-11-19 04:37:28 +00:00
this . posterUrl = poster
2022-11-26 21:25:36 +00:00
this . backgroundPosterUrl = bgPoster
2022-10-30 05:29:18 +00:00
this . year = year
2022-10-15 15:26:51 +00:00
this . plot = res . overview
2023-01-01 14:03:35 +00:00
this . tags = if ( isAnime ) keywords else genres
2022-11-24 06:27:52 +00:00
this . rating = rating
2022-10-15 15:26:51 +00:00
this . showStatus = getStatus ( res . status )
this . recommendations = recommendations
this . actors = actors
2022-10-27 09:02:40 +00:00
addTrailer ( trailer )
2023-08-10 18:40:02 +00:00
addTMDbId ( data . id . toString ( ) )
addImdbId ( res . external _ids ?. imdb _id )
2022-10-15 15:26:51 +00:00
}
} else {
newMovieLoadResponse (
2022-10-27 08:46:19 +00:00
title ,
2022-10-15 15:26:51 +00:00
url ,
TvType . Movie ,
LinkData (
data . id ,
2022-11-22 07:43:11 +00:00
res . external _ids ?. imdb _id ,
2023-08-30 02:17:46 +00:00
res . external _ids ?. tvdb _id ,
2022-10-15 15:26:51 +00:00
data . type ,
2022-10-27 08:46:19 +00:00
title = title ,
2022-10-30 05:29:18 +00:00
year = year ,
2022-11-04 15:54:25 +00:00
orgTitle = orgTitle ,
2022-12-07 15:06:48 +00:00
isAnime = isAnime ,
2023-05-22 15:46:24 +00:00
jpTitle = res . alternative _titles ?. results ?. find { it . iso _3166 _1 == " JP " } ?. title ,
2023-07-07 07:32:57 +00:00
airedDate = res . releaseDate ?: res . firstAirDate ,
2023-08-20 06:21:50 +00:00
isAsian = isAsian ,
2023-09-21 07:43:38 +00:00
isBollywood = isBollywood
2022-10-15 15:26:51 +00:00
) . toJson ( ) ,
) {
2022-11-19 04:37:28 +00:00
this . posterUrl = poster
2022-11-26 21:25:36 +00:00
this . backgroundPosterUrl = bgPoster
2023-06-22 01:26:45 +00:00
this . comingSoon = isUpcoming ( releaseDate )
2022-10-30 05:29:18 +00:00
this . year = year
2022-10-15 15:26:51 +00:00
this . plot = res . overview
2023-02-04 07:44:26 +00:00
this . duration = res . runtime
2023-01-01 14:03:35 +00:00
this . tags = if ( isAnime ) keywords else genres
2022-11-24 06:27:52 +00:00
this . rating = rating
2022-10-15 15:26:51 +00:00
this . recommendations = recommendations
this . actors = actors
2022-10-27 09:02:40 +00:00
addTrailer ( trailer )
2023-08-10 18:40:02 +00:00
addTMDbId ( data . id . toString ( ) )
addImdbId ( res . external _ids ?. imdb _id )
2022-10-15 15:26:51 +00:00
}
}
}
override suspend fun loadLinks (
data : String ,
isCasting : Boolean ,
subtitleCallback : ( SubtitleFile ) -> Unit ,
callback : ( ExtractorLink ) -> Unit
) : Boolean {
val res = parseJson < LinkData > ( data )
2022-10-17 03:47:46 +00:00
argamap (
2023-04-22 10:01:28 +00:00
{
2023-06-26 05:11:27 +00:00
invokeDumpStream (
2023-04-22 10:01:28 +00:00
res . title ,
res . year ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
} ,
2022-10-17 05:02:24 +00:00
{
2023-07-27 14:38:45 +00:00
invokeGoku (
res . title ,
res . year ,
res . season ,
res . lastSeason ,
res . episode ,
subtitleCallback ,
callback
)
2022-10-17 05:02:24 +00:00
} ,
2022-10-17 04:24:09 +00:00
{
2022-10-17 05:01:44 +00:00
invokeVidSrc ( res . id , res . season , res . episode , subtitleCallback , callback )
} ,
2022-10-17 08:03:20 +00:00
{
invokeDbgo ( res . imdbId , res . season , res . episode , subtitleCallback , callback )
2022-10-18 00:20:30 +00:00
} ,
2022-10-19 21:46:22 +00:00
{
2023-02-01 17:27:45 +00:00
if ( res . isAnime ) invokeAnimes (
res . title ,
res . epsTitle ,
2023-05-22 15:46:24 +00:00
res . date ,
res . airedDate ,
2023-02-01 17:27:45 +00:00
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2022-10-27 08:46:19 +00:00
} ,
2023-05-24 08:29:19 +00:00
{
if ( ! res . isAnime ) invokeDreamfilm (
res . title ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
} ,
2023-03-28 03:45:16 +00:00
// {
2023-08-08 21:11:50 +00:00
// invokeNoverse(res.title, res.season, res.episode, callback)
2023-03-28 03:45:16 +00:00
// },
2022-11-10 04:28:02 +00:00
{
2023-04-21 17:05:06 +00:00
if ( ! res . isAnime ) invokeFilmxy (
res . imdbId ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2022-11-10 04:28:02 +00:00
} ,
2022-11-07 10:16:02 +00:00
{
2023-07-27 14:38:45 +00:00
if ( ! res . isAnime ) invokeKimcartoon (
res . title ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2022-11-07 10:16:02 +00:00
} ,
2023-04-17 10:01:08 +00:00
{
2023-08-18 21:35:24 +00:00
if ( ! res . isAnime ) invokeVidsrcto (
res . imdbId ,
2023-04-21 17:05:06 +00:00
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2023-04-17 10:01:08 +00:00
} ,
2022-11-13 20:02:28 +00:00
{
2023-07-27 14:38:45 +00:00
invokeKisskh (
res . title ,
res . season ,
res . episode ,
res . isAnime ,
res . lastSeason ,
subtitleCallback ,
callback
)
2022-11-13 20:02:28 +00:00
} ,
2022-11-19 04:37:28 +00:00
{
2023-09-23 03:28:11 +00:00
if ( ! res . isAnime ) invokeLing (
2022-11-19 04:37:28 +00:00
res . title ,
res . airedYear ?: res . year ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
} ,
2022-11-24 08:35:43 +00:00
{
2022-12-14 05:05:18 +00:00
if ( ! res . isAnime ) invokeUhdmovies (
2022-11-24 08:35:43 +00:00
res . title ,
res . year ,
res . season ,
res . lastSeason ,
res . episode ,
callback
)
} ,
2022-12-09 08:44:01 +00:00
{
2022-12-14 05:05:18 +00:00
if ( ! res . isAnime ) invokeGMovies (
res . title ,
res . year ,
res . season ,
res . episode ,
callback
)
2022-12-09 08:44:01 +00:00
} ,
2022-12-11 03:09:55 +00:00
{
2022-12-14 05:05:18 +00:00
if ( ! res . isAnime ) invokeFDMovies (
res . title ,
res . season ,
res . episode ,
callback
)
2022-12-11 03:09:55 +00:00
} ,
2022-12-09 08:44:01 +00:00
{
2023-09-11 04:55:09 +00:00
if ( ! res . isAnime ) invokeM4uhd (
2022-12-14 05:05:18 +00:00
res . title ,
2023-09-10 09:34:33 +00:00
res . airedYear ?: res . year ,
2022-12-14 05:05:18 +00:00
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2022-12-10 12:25:28 +00:00
} ,
{
2023-09-23 03:28:11 +00:00
if ( ! res . isAnime ) invokeTvMovies ( res . title , res . season , res . episode , callback )
2022-12-10 12:25:28 +00:00
} ,
2022-12-29 02:48:08 +00:00
{
2022-12-30 22:16:30 +00:00
if ( ! res . isAnime ) invokeMoviezAdd (
2023-01-04 17:45:21 +00:00
moviezAddAPI ,
" MoviezAdd " ,
2022-12-29 02:48:08 +00:00
res . title ,
res . year ,
2022-12-30 22:16:30 +00:00
res . season ,
res . episode ,
2022-12-29 02:48:08 +00:00
callback
)
} ,
2023-01-04 17:45:21 +00:00
{
2023-09-21 07:43:38 +00:00
if ( ! res . isAnime && res . isBollywood ) invokeBollyMaza (
2023-01-04 17:45:21 +00:00
bollyMazaAPI ,
" BollyMaza " ,
res . title ,
res . year ,
res . season ,
res . episode ,
callback
)
2023-01-04 18:04:11 +00:00
} ,
{
2023-09-23 03:28:11 +00:00
if ( ! res . isAnime ) invokeRStream ( res . id , res . season , res . episode , callback )
2023-01-11 01:28:46 +00:00
} ,
{
2023-10-14 10:15:09 +00:00
if ( ! res . isAnime ) invokeFlixon (
res . id ,
res . imdbId ,
res . season ,
res . episode ,
callback
)
2023-01-11 01:28:46 +00:00
} ,
2023-01-21 06:25:04 +00:00
{
2023-09-23 03:28:11 +00:00
if ( ! res . isAnime ) invokeSmashyStream (
2023-11-08 21:34:56 +00:00
res . id ,
2023-05-29 18:39:47 +00:00
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2023-01-29 03:29:15 +00:00
} ,
2023-02-02 06:51:20 +00:00
{
2023-09-23 03:28:11 +00:00
if ( ! res . isAnime ) invokeWatchsomuch (
2023-02-02 06:51:20 +00:00
res . imdbId ,
res . season ,
res . episode ,
subtitleCallback
)
} ,
2023-04-08 14:14:42 +00:00
{
2023-04-21 17:05:06 +00:00
if ( ! res . isAnime ) invokeNinetv (
res . id ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2023-04-08 14:14:42 +00:00
} ,
2023-02-06 04:55:42 +00:00
{
2023-08-08 21:11:50 +00:00
invokeDahmerMovies (
2023-02-06 04:55:42 +00:00
res . title ,
res . year ,
res . season ,
res . episode ,
callback
)
} ,
2023-03-13 10:20:00 +00:00
{
invokeWatchOnline (
res . imdbId ,
res . title ,
2023-03-14 17:33:43 +00:00
res . airedYear ?: res . year ,
2023-03-13 10:20:00 +00:00
res . season ,
res . episode ,
2023-03-13 19:13:38 +00:00
subtitleCallback ,
2023-03-13 10:20:00 +00:00
callback
)
} ,
2023-05-19 23:35:52 +00:00
{
2023-11-15 10:35:11 +00:00
if ( ! res . isAnime ) invokeNowTv ( res . id , res . imdbId , res . season , res . episode , callback )
2023-06-22 10:05:28 +00:00
} ,
{
2023-10-14 10:15:09 +00:00
if ( ! res . isAnime && res . season == null ) invokeRidomovies (
2023-10-22 09:52:23 +00:00
res . id ,
res . imdbId ,
2023-10-14 10:15:09 +00:00
callback
)
2023-06-24 04:32:21 +00:00
} ,
{
invokeNavy ( res . imdbId , res . season , res . episode , callback )
} ,
2023-07-28 21:41:04 +00:00
{
invokeMoment ( res . imdbId , res . season , res . episode , callback )
} ,
2023-07-04 09:38:14 +00:00
{
2023-07-27 14:38:45 +00:00
if ( ! res . isAnime ) invokeEmovies (
res . title ,
res . year ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
} ,
2023-09-13 07:58:52 +00:00
{
if ( ! res . isAnime ) invokeVegamovies (
res . title ,
res . year ,
res . season ,
2023-10-10 07:11:17 +00:00
res . lastSeason ,
2023-09-13 07:58:52 +00:00
res . episode ,
subtitleCallback ,
callback
)
} ,
2023-09-21 07:43:38 +00:00
{
if ( ! res . isAnime && res . isBollywood ) invokeDotmovies (
res . title ,
res . year ,
res . season ,
2023-10-10 07:11:17 +00:00
res . lastSeason ,
2023-09-21 07:43:38 +00:00
res . episode ,
subtitleCallback ,
callback
)
} ,
2023-07-07 07:32:57 +00:00
{
2023-07-27 14:38:45 +00:00
invokeMultimovies ( res . title , res . season , res . episode , subtitleCallback , callback )
2023-07-26 07:31:20 +00:00
} ,
{
2023-07-27 14:38:45 +00:00
invokeNetmovies (
res . title ,
res . year ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2023-07-31 04:30:48 +00:00
} ,
{
if ( ! res . isAnime && res . season == null ) invokeDoomovies (
res . title ,
subtitleCallback ,
callback
)
} ,
2023-08-20 06:21:50 +00:00
{
2023-09-11 04:55:09 +00:00
if ( res . isAsian ) invokeDramaday (
2023-08-20 06:21:50 +00:00
res . title ,
res . year ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2023-08-21 00:55:21 +00:00
} ,
{
2023-10-27 10:03:06 +00:00
if ( ! res . isAnime ) invoke2embed ( res . imdbId , res . season , res . episode , subtitleCallback , callback )
2023-08-21 00:55:21 +00:00
} ,
2023-09-15 14:24:05 +00:00
{
if ( ! res . isAnime ) invokeHdmovies4u (
res . title ,
res . imdbId ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
} ,
2023-09-18 07:36:12 +00:00
{
invokeZshow (
res . title ,
res . year ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2023-10-03 16:47:31 +00:00
} ,
{
if ( ! res . isAnime ) invokeBlackvid (
res . id ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
2023-10-08 01:32:01 +00:00
} ,
{
if ( ! res . isAnime ) invokeShowflix (
res . title ,
res . year ,
res . season ,
res . episode ,
subtitleCallback ,
callback
)
} ,
2023-10-14 10:15:09 +00:00
{
if ( ! res . isAnime ) invokeSFMovies (
res . id ,
res . title ,
res . airedYear ?: res . year ,
res . season ,
res . episode ,
callback
)
}
2022-10-27 08:46:19 +00:00
)
2022-10-15 15:26:51 +00:00
return true
}
2023-01-31 06:30:37 +00:00
data class LinkData (
2022-10-15 15:26:51 +00:00
val id : Int ? = null ,
val imdbId : String ? = null ,
2023-08-30 02:17:46 +00:00
val tvdbId : Int ? = null ,
2022-10-15 15:26:51 +00:00
val type : String ? = null ,
val season : Int ? = null ,
val episode : Int ? = null ,
2022-10-19 21:46:22 +00:00
val aniId : String ? = null ,
val animeId : String ? = null ,
2022-10-27 08:46:19 +00:00
val title : String ? = null ,
2022-10-30 05:29:18 +00:00
val year : Int ? = null ,
2022-11-04 15:54:25 +00:00
val orgTitle : String ? = null ,
2022-12-07 15:06:48 +00:00
val isAnime : Boolean = false ,
2022-11-19 04:37:28 +00:00
val airedYear : Int ? = null ,
2022-11-21 10:27:07 +00:00
val lastSeason : Int ? = null ,
2022-12-14 05:05:18 +00:00
val epsTitle : String ? = null ,
2023-05-02 19:45:23 +00:00
val jpTitle : String ? = null ,
2023-05-22 15:46:24 +00:00
val date : String ? = null ,
val airedDate : String ? = null ,
2023-08-20 06:21:50 +00:00
val isAsian : Boolean = false ,
2023-09-21 07:43:38 +00:00
val isBollywood : Boolean = false ,
2022-10-15 15:26:51 +00:00
)
data class Data (
val id : Int ? = null ,
val type : String ? = null ,
2022-10-19 21:46:22 +00:00
val aniId : String ? = null ,
val malId : Int ? = null ,
2022-10-15 15:26:51 +00:00
)
data class Results (
@JsonProperty ( " results " ) val results : ArrayList < Media > ? = arrayListOf ( ) ,
)
data class Media (
@JsonProperty ( " id " ) val id : Int ? = null ,
@JsonProperty ( " name " ) val name : String ? = null ,
@JsonProperty ( " title " ) val title : String ? = null ,
@JsonProperty ( " original_title " ) val originalTitle : String ? = null ,
@JsonProperty ( " media_type " ) val mediaType : String ? = null ,
@JsonProperty ( " poster_path " ) val posterPath : String ? = null ,
)
data class Genres (
@JsonProperty ( " id " ) val id : Int ? = null ,
@JsonProperty ( " name " ) val name : String ? = null ,
)
2023-01-01 14:03:35 +00:00
data class Keywords (
@JsonProperty ( " id " ) val id : Int ? = null ,
@JsonProperty ( " name " ) val name : String ? = null ,
)
data class KeywordResults (
@JsonProperty ( " results " ) val results : ArrayList < Keywords > ? = arrayListOf ( ) ,
@JsonProperty ( " keywords " ) val keywords : ArrayList < Keywords > ? = arrayListOf ( ) ,
)
2022-10-15 15:26:51 +00:00
data class Seasons (
@JsonProperty ( " id " ) val id : Int ? = null ,
@JsonProperty ( " name " ) val name : String ? = null ,
@JsonProperty ( " season_number " ) val seasonNumber : Int ? = null ,
2022-11-04 15:54:25 +00:00
@JsonProperty ( " air_date " ) val airDate : String ? = null ,
2022-10-15 15:26:51 +00:00
)
data class Cast (
@JsonProperty ( " id " ) val id : Int ? = null ,
@JsonProperty ( " name " ) val name : String ? = null ,
@JsonProperty ( " original_name " ) val originalName : String ? = null ,
@JsonProperty ( " character " ) val character : String ? = null ,
@JsonProperty ( " known_for_department " ) val knownForDepartment : String ? = null ,
@JsonProperty ( " profile_path " ) val profilePath : String ? = null ,
)
data class Episodes (
@JsonProperty ( " id " ) val id : Int ? = null ,
@JsonProperty ( " name " ) val name : String ? = null ,
@JsonProperty ( " overview " ) val overview : String ? = null ,
@JsonProperty ( " air_date " ) val airDate : String ? = null ,
@JsonProperty ( " still_path " ) val stillPath : String ? = null ,
@JsonProperty ( " vote_average " ) val voteAverage : Double ? = null ,
@JsonProperty ( " episode_number " ) val episodeNumber : Int ? = null ,
@JsonProperty ( " season_number " ) val seasonNumber : Int ? = null ,
)
data class MediaDetailEpisodes (
@JsonProperty ( " episodes " ) val episodes : ArrayList < Episodes > ? = arrayListOf ( ) ,
)
2022-10-27 09:02:40 +00:00
data class Trailers (
@JsonProperty ( " key " ) val key : String ? = null ,
)
data class ResultsTrailer (
@JsonProperty ( " results " ) val results : ArrayList < Trailers > ? = arrayListOf ( ) ,
)
2023-05-02 19:45:23 +00:00
data class AltTitles (
@JsonProperty ( " iso_3166_1 " ) val iso _3166 _1 : String ? = null ,
@JsonProperty ( " title " ) val title : String ? = null ,
@JsonProperty ( " type " ) val type : String ? = null ,
)
data class ResultsAltTitles (
@JsonProperty ( " results " ) val results : ArrayList < AltTitles > ? = arrayListOf ( ) ,
)
2022-11-22 07:43:11 +00:00
data class ExternalIds (
@JsonProperty ( " imdb_id " ) val imdb _id : String ? = null ,
2023-08-30 02:17:46 +00:00
@JsonProperty ( " tvdb_id " ) val tvdb _id : Int ? = null ,
2022-11-22 07:43:11 +00:00
)
data class Credits (
@JsonProperty ( " cast " ) val cast : ArrayList < Cast > ? = arrayListOf ( ) ,
)
data class ResultsRecommendations (
@JsonProperty ( " results " ) val results : ArrayList < Media > ? = arrayListOf ( ) ,
)
2023-02-21 20:40:08 +00:00
data class LastEpisodeToAir (
@JsonProperty ( " episode_number " ) val episode _number : Int ? = null ,
@JsonProperty ( " season_number " ) val season _number : Int ? = null ,
)
2023-09-21 07:43:38 +00:00
data class ProductionCountries (
@JsonProperty ( " name " ) val name : String ? = null ,
)
2022-10-15 15:26:51 +00:00
data class MediaDetail (
@JsonProperty ( " id " ) val id : Int ? = null ,
@JsonProperty ( " imdb_id " ) val imdbId : String ? = null ,
@JsonProperty ( " title " ) val title : String ? = null ,
@JsonProperty ( " name " ) val name : String ? = null ,
@JsonProperty ( " original_title " ) val originalTitle : String ? = null ,
@JsonProperty ( " original_name " ) val originalName : String ? = null ,
@JsonProperty ( " poster_path " ) val posterPath : String ? = null ,
2022-11-03 06:36:36 +00:00
@JsonProperty ( " backdrop_path " ) val backdropPath : String ? = null ,
2022-10-15 15:26:51 +00:00
@JsonProperty ( " release_date " ) val releaseDate : String ? = null ,
@JsonProperty ( " first_air_date " ) val firstAirDate : String ? = null ,
@JsonProperty ( " overview " ) val overview : String ? = null ,
2023-02-04 07:44:26 +00:00
@JsonProperty ( " runtime " ) val runtime : Int ? = null ,
2022-11-24 06:27:52 +00:00
@JsonProperty ( " vote_average " ) val vote _average : Any ? = null ,
2022-11-19 04:37:28 +00:00
@JsonProperty ( " original_language " ) val original _language : String ? = null ,
2022-10-15 15:26:51 +00:00
@JsonProperty ( " status " ) val status : String ? = null ,
@JsonProperty ( " genres " ) val genres : ArrayList < Genres > ? = arrayListOf ( ) ,
2023-01-01 14:03:35 +00:00
@JsonProperty ( " keywords " ) val keywords : KeywordResults ? = null ,
2023-02-21 20:40:08 +00:00
@JsonProperty ( " last_episode_to_air " ) val last _episode _to _air : LastEpisodeToAir ? = null ,
2022-10-15 15:26:51 +00:00
@JsonProperty ( " seasons " ) val seasons : ArrayList < Seasons > ? = arrayListOf ( ) ,
2022-10-27 09:02:40 +00:00
@JsonProperty ( " videos " ) val videos : ResultsTrailer ? = null ,
2022-11-22 07:43:11 +00:00
@JsonProperty ( " external_ids " ) val external _ids : ExternalIds ? = null ,
@JsonProperty ( " credits " ) val credits : Credits ? = null ,
@JsonProperty ( " recommendations " ) val recommendations : ResultsRecommendations ? = null ,
2023-05-02 19:45:23 +00:00
@JsonProperty ( " alternative_titles " ) val alternative _titles : ResultsAltTitles ? = null ,
2023-09-21 07:43:38 +00:00
@JsonProperty ( " production_countries " ) val production _countries : ArrayList < ProductionCountries > ? = arrayListOf ( ) ,
2022-10-15 15:26:51 +00:00
)
}