forked from recloudstream/cloudstream
fixed subtitles
This commit is contained in:
parent
0849bffe49
commit
3f1e398ae8
2 changed files with 62 additions and 47 deletions
|
@ -11,8 +11,6 @@ import com.google.android.exoplayer2.extractor.ExtractorsFactory
|
|||
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory
|
||||
import com.google.android.exoplayer2.source.MergingMediaSource
|
||||
import com.google.android.exoplayer2.source.ProgressiveMediaSource
|
||||
import com.google.android.exoplayer2.source.SingleSampleMediaSource
|
||||
import com.google.android.exoplayer2.text.SubtitleDecoderFactory
|
||||
import com.google.android.exoplayer2.text.SubtitleExtractor
|
||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
|
||||
import com.google.android.exoplayer2.trackselection.TrackSelector
|
||||
|
@ -285,7 +283,7 @@ class CS3IPlayer : IPlayer {
|
|||
return DefaultDataSourceFactory(this, USER_AGENT)
|
||||
}
|
||||
|
||||
private fun getSubSources(
|
||||
/*private fun getSubSources(
|
||||
onlineSourceFactory: DataSource.Factory?,
|
||||
offlineSourceFactory: DataSource.Factory?,
|
||||
subHelper: PlayerSubtitleHelper,
|
||||
|
@ -324,7 +322,7 @@ class CS3IPlayer : IPlayer {
|
|||
}
|
||||
println("SUBSRC: ${subSources.size} activeSubtitles : ${activeSubtitles.size} of ${subHelper.getAllSubtitles().size} ")
|
||||
return Pair(subSources, activeSubtitles)
|
||||
}
|
||||
}*/
|
||||
|
||||
private fun getCache(context: Context, cacheSize: Long): SimpleCache? {
|
||||
return try {
|
||||
|
@ -587,33 +585,47 @@ class CS3IPlayer : IPlayer {
|
|||
* https://github.com/google/ExoPlayer/blob/029a2b27cbdc27cf9d51d4a73ebeb503968849f6/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java
|
||||
* */
|
||||
private fun createProgressiveMediaSources(
|
||||
subSources: List<SingleSampleMediaSource>,
|
||||
factory: DataSource.Factory
|
||||
): List<ProgressiveMediaSource> {
|
||||
val extractorFactory = ExtractorsFactory {
|
||||
subSources.map {
|
||||
val currentSub = it.mediaItem.localConfiguration?.subtitleConfigurations?.firstOrNull()
|
||||
subHelper: PlayerSubtitleHelper,
|
||||
offlineSourceFactory: DataSource.Factory?,
|
||||
onlineSourceFactory: DataSource.Factory?,
|
||||
): Pair<List<SubtitleData>, List<ProgressiveMediaSource>> {
|
||||
val activeSubtitles = ArrayList<SubtitleData>()
|
||||
|
||||
return Pair(activeSubtitles, subHelper.getAllSubtitles().mapNotNull { sub ->
|
||||
val format = Format.Builder()
|
||||
.setSampleMimeType(currentSub?.mimeType)
|
||||
.setLanguage(currentSub?.language)
|
||||
.setLabel(currentSub?.label)
|
||||
.setSampleMimeType(sub.mimeType)
|
||||
.setLanguage("_${sub.name}")
|
||||
.setSelectionFlags(C.SELECTION_FLAG_DEFAULT)
|
||||
.build()
|
||||
|
||||
val extractorFactory = ExtractorsFactory {
|
||||
arrayOf(
|
||||
SubtitleExtractor(
|
||||
CustomSubtitleDecoderFactory().createDecoder(format), format
|
||||
)
|
||||
}.toTypedArray()
|
||||
}
|
||||
|
||||
return subSources.mapNotNull {
|
||||
val uri = it.mediaItem.localConfiguration?.subtitleConfigurations?.firstOrNull()?.uri ?: return@mapNotNull null
|
||||
if (uri.toString().isBlank()) return@mapNotNull null
|
||||
|
||||
ProgressiveMediaSource.Factory(factory, extractorFactory)
|
||||
.createMediaSource(
|
||||
MediaItem.fromUri(uri)
|
||||
)
|
||||
}
|
||||
|
||||
val factory = when (sub.origin) {
|
||||
SubtitleOrigin.DOWNLOADED_FILE -> {
|
||||
activeSubtitles.add(sub)
|
||||
offlineSourceFactory
|
||||
}
|
||||
SubtitleOrigin.URL -> {
|
||||
activeSubtitles.add(sub)
|
||||
onlineSourceFactory
|
||||
}
|
||||
SubtitleOrigin.OPEN_SUBTITLES -> {
|
||||
null
|
||||
}
|
||||
} ?: return@mapNotNull null
|
||||
|
||||
return@mapNotNull ProgressiveMediaSource.Factory(factory, extractorFactory)
|
||||
.createMediaSource(
|
||||
MediaItem.fromUri(sub.url)
|
||||
)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
private fun loadOfflinePlayer(context: Context, data: ExtractorUri) {
|
||||
|
@ -623,14 +635,12 @@ class CS3IPlayer : IPlayer {
|
|||
|
||||
val mediaItem = getMediaItem(MimeTypes.VIDEO_MP4, data.uri)
|
||||
val offlineSourceFactory = context.createOfflineSource()
|
||||
val (subSources, activeSubtitles) = getSubSources(
|
||||
offlineSourceFactory,
|
||||
offlineSourceFactory,
|
||||
subtitleHelper
|
||||
)
|
||||
|
||||
val progressiveMediaSources =
|
||||
createProgressiveMediaSources(subSources, offlineSourceFactory)
|
||||
val (activeSubtitles, progressiveMediaSources) = createProgressiveMediaSources(
|
||||
subtitleHelper,
|
||||
offlineSourceFactory,
|
||||
offlineSourceFactory,
|
||||
)
|
||||
|
||||
subtitleHelper.setActiveSubtitles(activeSubtitles.toSet())
|
||||
loadExo(context, mediaItem, progressiveMediaSources)
|
||||
|
@ -666,15 +676,12 @@ class CS3IPlayer : IPlayer {
|
|||
val onlineSourceFactory = createOnlineSource(link)
|
||||
val offlineSourceFactory = context.createOfflineSource()
|
||||
|
||||
val (subSources, activeSubtitles) = getSubSources(
|
||||
onlineSourceFactory,
|
||||
val (activeSubtitles, progressiveMediaSources) = createProgressiveMediaSources(
|
||||
subtitleHelper,
|
||||
offlineSourceFactory,
|
||||
subtitleHelper
|
||||
onlineSourceFactory,
|
||||
)
|
||||
|
||||
val progressiveMediaSources =
|
||||
createProgressiveMediaSources(subSources, onlineSourceFactory)
|
||||
|
||||
subtitleHelper.setActiveSubtitles(activeSubtitles.toSet())
|
||||
|
||||
if (simpleCache == null)
|
||||
|
|
|
@ -2,35 +2,37 @@ package com.lagradost.cloudstream3.ui.player
|
|||
|
||||
import android.util.Log
|
||||
import com.google.android.exoplayer2.Format
|
||||
import com.google.android.exoplayer2.text.*
|
||||
import com.google.android.exoplayer2.text.SubtitleDecoder
|
||||
import com.google.android.exoplayer2.text.SubtitleDecoderFactory
|
||||
import com.google.android.exoplayer2.text.SubtitleInputBuffer
|
||||
import com.google.android.exoplayer2.text.SubtitleOutputBuffer
|
||||
import com.google.android.exoplayer2.text.ssa.SsaDecoder
|
||||
import com.google.android.exoplayer2.text.subrip.SubripDecoder
|
||||
import com.google.android.exoplayer2.text.ttml.TtmlDecoder
|
||||
import com.google.android.exoplayer2.text.webvtt.WebvttDecoder
|
||||
import com.google.android.exoplayer2.util.MimeTypes
|
||||
import okio.ByteString.Companion.toByteString
|
||||
import java.nio.charset.Charset
|
||||
|
||||
|
||||
class CustomDecoder : SubtitleDecoder {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "CustomDecoder"
|
||||
}
|
||||
|
||||
var realDecoder: SimpleSubtitleDecoder? = null
|
||||
var realDecoder: SubtitleDecoder? = null
|
||||
|
||||
override fun getName(): String {
|
||||
return realDecoder?.name ?: this::class.java.name
|
||||
}
|
||||
|
||||
override fun dequeueInputBuffer(): SubtitleInputBuffer {
|
||||
Log.i(TAG, "dequeueInputBuffer")
|
||||
return realDecoder?.dequeueInputBuffer() ?: SubtitleInputBuffer()
|
||||
}
|
||||
|
||||
override fun queueInputBuffer(inputBuffer: SubtitleInputBuffer) {
|
||||
println("STARTTT ${inputBuffer.format?.language}")
|
||||
if (realDecoder == null)
|
||||
Log.i(TAG, "queueInputBuffer")
|
||||
|
||||
if (realDecoder == null) {
|
||||
inputBuffer.data?.let { data ->
|
||||
|
||||
val pos = data.position()
|
||||
|
@ -51,9 +53,15 @@ class CustomDecoder : SubtitleDecoder {
|
|||
str.startsWith("1") -> SubripDecoder()
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
realDecoder?.dequeueInputBuffer().also { println("RETURNED ddddd") }
|
||||
realDecoder?.dequeueInputBuffer()?.let { buff ->
|
||||
buff.data = data
|
||||
realDecoder?.queueInputBuffer(buff)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
realDecoder?.dequeueInputBuffer()
|
||||
}
|
||||
}
|
||||
|
||||
override fun dequeueOutputBuffer(): SubtitleOutputBuffer? {
|
||||
|
|
Loading…
Reference in a new issue