Skip to content

Commit db154a8

Browse files
authored
Adding IntroDB (#2599)
1 parent 736c637 commit db154a8

1 file changed

Lines changed: 91 additions & 0 deletions

File tree

  • app/src/main/java/com/lagradost/cloudstream3/utils

app/src/main/java/com/lagradost/cloudstream3/utils/AniSkip.kt

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package com.lagradost.cloudstream3.utils
22

33
import android.util.Log
44
import androidx.annotation.StringRes
5+
import com.fasterxml.jackson.annotation.JsonProperty
56
import com.fasterxml.jackson.databind.annotation.JsonSerialize
67
import com.lagradost.cloudstream3.*
8+
import com.lagradost.cloudstream3.LoadResponse.Companion.getImdbId
79
import com.lagradost.cloudstream3.LoadResponse.Companion.getMalId
810
import com.lagradost.cloudstream3.mvvm.logError
911
import 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

Comments
 (0)