Repository navigation
Expand file tree
/
Copy pathEpisodePlaybackSelection.kt
More file actions
88 lines (76 loc) · 2.54 KB
/
Copy pathEpisodePlaybackSelection.kt
File metadata and controls
88 lines (76 loc) · 2.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.lagradost.cloudstream3.ui.player
import com.lagradost.cloudstream3.utils.ExtractorLinkType
internal data class EpisodeSourceSelection(
val source: String?,
val name: String,
val quality: Int?,
val type: ExtractorLinkType?,
)
internal sealed interface EpisodeSubtitleSelection {
data class Selected(
val originalName: String,
val nameSuffix: String,
) : EpisodeSubtitleSelection
data object Disabled : EpisodeSubtitleSelection
}
internal data class EpisodeSubtitleResolution(
val subtitle: SubtitleData?,
val selectionMatched: Boolean,
val subtitlesDisabled: Boolean,
)
internal fun VideoLink.toEpisodeSourceSelection(): EpisodeSourceSelection? {
val link = first
if (link != null) {
return EpisodeSourceSelection(link.source, link.name, link.quality, link.type)
}
val uri = second ?: return null
return EpisodeSourceSelection(null, uri.name, null, null)
}
internal fun findEpisodeSource(
links: List<VideoLink>,
selection: EpisodeSourceSelection?,
): VideoLink? {
return selection?.let { remembered ->
links.firstOrNull { it.toEpisodeSourceSelection() == remembered }
}
}
internal fun createEpisodeSubtitleSelection(
subtitle: SubtitleData?,
subtitlesDisabled: Boolean,
): EpisodeSubtitleSelection? {
return when {
subtitle != null -> EpisodeSubtitleSelection.Selected(
subtitle.originalName,
subtitle.nameSuffix,
)
subtitlesDisabled -> EpisodeSubtitleSelection.Disabled
else -> null
}
}
internal fun findEpisodeSubtitle(
subtitles: Set<SubtitleData>,
selection: EpisodeSubtitleSelection?,
): SubtitleData? {
val remembered = selection as? EpisodeSubtitleSelection.Selected ?: return null
return subtitles.firstOrNull {
it.originalName == remembered.originalName &&
it.nameSuffix == remembered.nameSuffix
}
}
internal fun resolveEpisodeSubtitle(
subtitles: Set<SubtitleData>,
selection: EpisodeSubtitleSelection?,
fallback: () -> SubtitleData?,
): EpisodeSubtitleResolution {
val rememberedSubtitle = findEpisodeSubtitle(subtitles, selection)
val subtitlesDisabled = selection == EpisodeSubtitleSelection.Disabled
return EpisodeSubtitleResolution(
subtitle = when {
subtitlesDisabled -> null
rememberedSubtitle != null -> rememberedSubtitle
else -> fallback()
},
selectionMatched = rememberedSubtitle != null,
subtitlesDisabled = subtitlesDisabled,
)
}