mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
sora: added WatchOnline
This commit is contained in:
parent
1a6eac901f
commit
83ecd64efe
4 changed files with 76 additions and 1 deletions
|
@ -1,5 +1,5 @@
|
||||||
// use an integer for version numbers
|
// use an integer for version numbers
|
||||||
version = 103
|
version = 104
|
||||||
|
|
||||||
|
|
||||||
cloudstream {
|
cloudstream {
|
||||||
|
|
|
@ -2772,6 +2772,54 @@ object SoraExtractor : SoraStream() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO add subtitle
|
||||||
|
suspend fun invokeWatchOnline(
|
||||||
|
imdbId: String? = null,
|
||||||
|
title: String? = null,
|
||||||
|
year: Int? = null,
|
||||||
|
season: Int? = null,
|
||||||
|
episode: Int? = null,
|
||||||
|
callback: (ExtractorLink) -> Unit,
|
||||||
|
) {
|
||||||
|
val slug = title.createSlug()
|
||||||
|
val id = imdbId?.removePrefix("tt")
|
||||||
|
val url = if (season == null) {
|
||||||
|
"$watchOnlineAPI/movies/view/$id-$slug-$year"
|
||||||
|
} else {
|
||||||
|
"$watchOnlineAPI/shows/view/$id-$slug-$year"
|
||||||
|
}
|
||||||
|
|
||||||
|
val res = app.get(url).document
|
||||||
|
|
||||||
|
val episodeId = if (season == null) {
|
||||||
|
res.selectFirst("div.movie__buttons-items a")?.attr("data-watch-list-media-id")
|
||||||
|
} else {
|
||||||
|
res.selectFirst("ul[data-season-episodes=$season] li[data-episode=$episode]")
|
||||||
|
?.attr("data-id-episode")
|
||||||
|
} ?: return
|
||||||
|
|
||||||
|
val videoUrl = if (season == null) {
|
||||||
|
"$watchOnlineAPI/api/v1/security/movie-access?id_movie=$episodeId"
|
||||||
|
} else {
|
||||||
|
"$watchOnlineAPI/api/v1/security/episode-access?id=$episodeId"
|
||||||
|
}
|
||||||
|
|
||||||
|
app.get(videoUrl, referer = url)
|
||||||
|
.parsedSafe<WatchOnlineResponse>()?.streams?.mapKeys { source ->
|
||||||
|
callback.invoke(
|
||||||
|
ExtractorLink(
|
||||||
|
"WatchOnline",
|
||||||
|
"WatchOnline",
|
||||||
|
source.value,
|
||||||
|
"$watchOnlineAPI/",
|
||||||
|
getQualityFromName(source.key),
|
||||||
|
true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3161,4 +3209,8 @@ data class BiliBiliSources(
|
||||||
data class BiliBiliSourcesResponse(
|
data class BiliBiliSourcesResponse(
|
||||||
@JsonProperty("sources") val sources: ArrayList<BiliBiliSources>? = arrayListOf(),
|
@JsonProperty("sources") val sources: ArrayList<BiliBiliSources>? = arrayListOf(),
|
||||||
@JsonProperty("subtitles") val subtitles: ArrayList<BiliBiliSubtitles>? = arrayListOf(),
|
@JsonProperty("subtitles") val subtitles: ArrayList<BiliBiliSubtitles>? = arrayListOf(),
|
||||||
|
)
|
||||||
|
|
||||||
|
data class WatchOnlineResponse(
|
||||||
|
@JsonProperty("streams") val streams: HashMap<String, String>? = null,
|
||||||
)
|
)
|
|
@ -50,6 +50,7 @@ import com.hexated.SoraExtractor.invokeTgarMovies
|
||||||
import com.hexated.SoraExtractor.invokeTvMovies
|
import com.hexated.SoraExtractor.invokeTvMovies
|
||||||
import com.hexated.SoraExtractor.invokeUhdmovies
|
import com.hexated.SoraExtractor.invokeUhdmovies
|
||||||
import com.hexated.SoraExtractor.invokeVitoenMovies
|
import com.hexated.SoraExtractor.invokeVitoenMovies
|
||||||
|
import com.hexated.SoraExtractor.invokeWatchOnline
|
||||||
import com.hexated.SoraExtractor.invokeWatchsomuch
|
import com.hexated.SoraExtractor.invokeWatchsomuch
|
||||||
import com.lagradost.cloudstream3.extractors.VidSrcExtractor
|
import com.lagradost.cloudstream3.extractors.VidSrcExtractor
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
||||||
|
@ -120,6 +121,7 @@ open class SoraStream : TmdbProvider() {
|
||||||
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.mx"
|
const val ask4MoviesAPI = "https://ask4movie.mx"
|
||||||
const val biliBiliAPI = "https://api-vn.kaguya.app/server"
|
const val biliBiliAPI = "https://api-vn.kaguya.app/server"
|
||||||
|
const val watchOnlineAPI = "https://watchonline.ag"
|
||||||
// INDEX SITE
|
// INDEX SITE
|
||||||
const val baymoviesAPI = "https://opengatewayindex.pages.dev" // dead
|
const val baymoviesAPI = "https://opengatewayindex.pages.dev" // dead
|
||||||
const val chillmovies0API = "https://chill.aicirou.workers.dev/0:" // dead
|
const val chillmovies0API = "https://chill.aicirou.workers.dev/0:" // dead
|
||||||
|
@ -787,6 +789,16 @@ open class SoraStream : TmdbProvider() {
|
||||||
{
|
{
|
||||||
if (!res.isAnime) invokeAsk4Movies(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
if (!res.isAnime) invokeAsk4Movies(res.title, res.year, res.season, res.episode, subtitleCallback, callback)
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
invokeWatchOnline(
|
||||||
|
res.imdbId,
|
||||||
|
res.title,
|
||||||
|
res.airedYear ?: res.year,
|
||||||
|
res.season,
|
||||||
|
res.episode,
|
||||||
|
callback
|
||||||
|
)
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -24,6 +24,7 @@ import com.hexated.SoraExtractor.invokeSoraStreamLite
|
||||||
import com.hexated.SoraExtractor.invokeTwoEmbed
|
import com.hexated.SoraExtractor.invokeTwoEmbed
|
||||||
import com.hexated.SoraExtractor.invokeUniqueStream
|
import com.hexated.SoraExtractor.invokeUniqueStream
|
||||||
import com.hexated.SoraExtractor.invokeVidSrc
|
import com.hexated.SoraExtractor.invokeVidSrc
|
||||||
|
import com.hexated.SoraExtractor.invokeWatchOnline
|
||||||
import com.hexated.SoraExtractor.invokeWatchsomuch
|
import com.hexated.SoraExtractor.invokeWatchsomuch
|
||||||
import com.hexated.SoraExtractor.invokeXmovies
|
import com.hexated.SoraExtractor.invokeXmovies
|
||||||
import com.lagradost.cloudstream3.SubtitleFile
|
import com.lagradost.cloudstream3.SubtitleFile
|
||||||
|
@ -222,6 +223,16 @@ class SoraStreamLite : SoraStream() {
|
||||||
callback
|
callback
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
invokeWatchOnline(
|
||||||
|
res.imdbId,
|
||||||
|
res.title,
|
||||||
|
res.airedYear ?: res.year,
|
||||||
|
res.season,
|
||||||
|
res.episode,
|
||||||
|
callback
|
||||||
|
)
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
Loading…
Reference in a new issue