@@ -2,8 +2,10 @@ package com.lagradost.cloudstream3.utils
22
33import android.util.Log
44import androidx.annotation.StringRes
5+ import com.fasterxml.jackson.annotation.JsonProperty
56import com.fasterxml.jackson.databind.annotation.JsonSerialize
67import com.lagradost.cloudstream3.*
8+ import com.lagradost.cloudstream3.LoadResponse.Companion.getImdbId
79import com.lagradost.cloudstream3.LoadResponse.Companion.getMalId
810import com.lagradost.cloudstream3.mvvm.logError
911import com.lagradost.cloudstream3.ui.result.ResultEpisode
@@ -86,7 +88,57 @@ object EpisodeSkip {
8688 out .addAll(list)
8789 }
8890 }
91+ } else if (data.type == TvType .TvSeries || data.type == TvType .AsianDrama ) {
92+ val season = episode.season
93+ val imdbId = data.getImdbId()
94+
95+ if (season != null && imdbId != null ) {
96+ val result = IntroDbSkip .getResult(
97+ imdbId,
98+ season,
99+ episode.episode
100+ )
101+
102+ result?.let { res ->
103+ listOfNotNull(
104+ res.intro?.let {
105+ val start = it.startMs ? : return @let null
106+ val end = it.endMs ? : return @let null
107+ SkipStamp (
108+ type = SkipType .Opening ,
109+ skipToNextEpisode = hasNextEpisode &&
110+ shouldSkipToNextEpisode(end, episodeDurationMs),
111+ startMs = start,
112+ endMs = end
113+ )
114+ },
115+ res.recap?.let {
116+ val start = it.startMs ? : return @let null
117+ val end = it.endMs ? : return @let null
118+ SkipStamp (
119+ type = SkipType .Recap ,
120+ skipToNextEpisode = hasNextEpisode &&
121+ shouldSkipToNextEpisode(end, episodeDurationMs),
122+ startMs = start,
123+ endMs = end
124+ )
125+ },
126+ res.outro?.let {
127+ val start = it.startMs ? : return @let null
128+ val end = it.endMs ? : return @let null
129+ SkipStamp (
130+ type = SkipType .Credits ,
131+ skipToNextEpisode = hasNextEpisode &&
132+ shouldSkipToNextEpisode(end, episodeDurationMs),
133+ startMs = start,
134+ endMs = end
135+ )
136+ }
137+ ).let { out .addAll(it) }
138+ }
139+ }
89140 }
141+
90142 if (out .isNotEmpty())
91143 cachedStamps[episode.id] = out
92144 return out
@@ -136,4 +188,43 @@ object AniSkip {
136188 @JsonSerialize val startTime : Double ,
137189 @JsonSerialize val endTime : Double
138190 )
191+ }
192+
193+ object IntroDbSkip {
194+ private const val TAG = " IntroDb"
195+
196+ suspend fun getResult (
197+ imdbId : String ,
198+ season : Int ,
199+ episode : Int ,
200+ ): IntroDbResponse ? {
201+ return try {
202+ val url =
203+ " https://api.introdb.app/segments?imdb_id=$imdbId &season=$season &episode=$episode "
204+ app.get(url).parsed<IntroDbResponse >()
205+ } catch (t: Throwable ) {
206+ Log .i(TAG , " error = ${t.message} " )
207+ logError(t)
208+ null
209+ }
210+ }
211+
212+ data class IntroDbResponse (
213+ @JsonProperty(" imdb_id" ) val imdbId : String? ,
214+ val season : Int? ,
215+ val episode : Int? ,
216+ val intro : Segment ? ,
217+ val recap : Segment ? ,
218+ val outro : Segment ? ,
219+ )
220+
221+ data class Segment (
222+ @JsonProperty(" start_sec" ) val startSec : Double? ,
223+ @JsonProperty(" end_sec" ) val endSec : Double? ,
224+ @JsonProperty(" start_ms" ) val startMs : Long? ,
225+ @JsonProperty(" end_ms" ) val endMs : Long? ,
226+ val confidence : Double? ,
227+ @JsonProperty(" submission_count" ) val submissionCount : Int? ,
228+ @JsonProperty(" updated_at" ) val updatedAt : String? ,
229+ )
139230}
0 commit comments