From 1677f754d06b7db0e6eb09bc99d972412f5da013 Mon Sep 17 00:00:00 2001 From: hexated Date: Tue, 14 Mar 2023 04:23:30 +0700 Subject: [PATCH] sora: fix missing show in WatchOnline --- .../main/kotlin/com/hexated/SoraExtractor.kt | 36 ++++++++++++++----- .../src/main/kotlin/com/hexated/SoraStream.kt | 2 +- .../main/kotlin/com/hexated/SoraStreamLite.kt | 2 +- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index f9368228..e2def0eb 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -2713,28 +2713,37 @@ object SoraExtractor : SoraStream() { suspend fun invokeWatchOnline( imdbId: String? = null, + tmdbId: Int? = null, title: String? = null, - year: Int? = null, season: Int? = null, episode: Int? = null, subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit, ) { - val slug = title.createSlug() - val id = imdbId?.removePrefix("tt") val url = if (season == null) { - "$watchOnlineAPI/movies/view/$id-$slug-$year" + "$watchOnlineAPI/api/v1/movies?filters[q]=$title" } else { - "$watchOnlineAPI/shows/view/$id-$slug-$year" + "$watchOnlineAPI/api/v1/shows?filters[q]=$title" } - val res = app.get(url).document + val baseUrl = if(season == null) { + "$watchOnlineAPI/movies/view" + } else { + "$watchOnlineAPI/shows/view" + } + + val mediaId = app.get(url).parsedSafe()?.items?.find { + it.imdb_id == imdbId || it.tmdb_id == tmdbId || it.imdb_id == imdbId?.removePrefix("tt") + }?.slug + + val detailRes = app.get(fixUrl(mediaId ?: return, baseUrl)).document val episodeId = if (season == null) { - res.selectFirst("div.movie__buttons-items a")?.attr("data-watch-list-media-id") + detailRes.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") + detailRes.select("ul[data-season-episodes=$season] li").find { + it.select("div.episodes__number").text().equals("Episode $episode", true) + }?.attr("data-id-episode") } ?: return val videoUrl = if (season == null) { @@ -3154,6 +3163,15 @@ data class BiliBiliSourcesResponse( @JsonProperty("subtitles") val subtitles: ArrayList? = arrayListOf(), ) +data class WatchOnlineItems( + @JsonProperty("slug") val slug: String? = null, + @JsonProperty("tmdb_id") val tmdb_id: Int? = null, + @JsonProperty("imdb_id") val imdb_id: String? = null, +) + +data class WatchOnlineSearch( + @JsonProperty("items") val items: ArrayList? = arrayListOf(), +) data class WatchOnlineResponse( @JsonProperty("streams") val streams: HashMap? = null, @JsonProperty("subtitles") val subtitles: Any? = null, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index b070da1b..31b7f58e 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -792,8 +792,8 @@ open class SoraStream : TmdbProvider() { { invokeWatchOnline( res.imdbId, + res.id, res.title, - res.airedYear ?: res.year, res.season, res.episode, subtitleCallback, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt index 9bb802e2..0a70625d 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -226,8 +226,8 @@ class SoraStreamLite : SoraStream() { { invokeWatchOnline( res.imdbId, + res.id, res.title, - res.airedYear ?: res.year, res.season, res.episode, subtitleCallback,