Skip to content

Commit 1d17f7a

Browse files
committed
fix(player): resolve PlaybackException due to incorrect "Off" subtitle
1 parent a095e6f commit 1d17f7a

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

core/ui/player/src/main/java/com/flixclusive/core/ui/player/FlixclusivePlayerManager.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import androidx.compose.runtime.mutableStateListOf
1414
import androidx.compose.runtime.mutableStateOf
1515
import androidx.compose.runtime.setValue
1616
import androidx.compose.ui.util.fastAny
17-
import androidx.compose.ui.util.fastMap
17+
import androidx.compose.ui.util.fastMapNotNull
1818
import androidx.media3.common.C
1919
import androidx.media3.common.Format
2020
import androidx.media3.common.MediaItem
@@ -57,6 +57,7 @@ import com.flixclusive.core.ui.player.util.getCacheFactory
5757
import com.flixclusive.core.ui.player.util.getLoadControl
5858
import com.flixclusive.core.ui.player.util.getRenderers
5959
import com.flixclusive.core.ui.player.util.handleError
60+
import com.flixclusive.core.ui.player.util.isOffSubtitle
6061
import com.flixclusive.core.util.exception.safeCall
6162
import com.flixclusive.core.util.log.errorLog
6263
import com.flixclusive.core.util.log.infoLog
@@ -72,6 +73,7 @@ import okhttp3.OkHttpClient
7273
import java.util.Locale
7374
import kotlin.math.max
7475
import kotlin.time.Duration.Companion.seconds
76+
import com.flixclusive.core.locale.R as LocaleR
7577

7678
/** toleranceBeforeUs – The maximum time that the actual position seeked to may precede the
7779
* requested seek position, in microseconds. Must be non-negative. */
@@ -332,8 +334,6 @@ class FlixclusivePlayerManager(
332334
initialPlaybackPosition,
333335
)
334336

335-
mediaItem
336-
337337
prepare()
338338
playWhenReady = this@FlixclusivePlayerManager.playWhenReady
339339
}
@@ -495,10 +495,18 @@ class FlixclusivePlayerManager(
495495
},
496496
).addOffSubtitle(context)
497497

498+
val offSubtitleLabel = context.getString(LocaleR.string.off_subtitles)
499+
498500
// Cloudstream3 logic for unique subtitle names
499501
return sortedSubtitles
500-
.fastMap { subtitle ->
502+
.fastMapNotNull { subtitle ->
503+
if (subtitle.isOffSubtitle(context)) {
504+
availableSubtitles.add(subtitle)
505+
return@fastMapNotNull null
506+
}
507+
501508
val subtitleName = subtitle.language.toUniqueSubtitleLanguage()
509+
availableSubtitles.add(subtitle.copy(language = subtitleName))
502510

503511
val subtitleConfiguration =
504512
SubtitleConfiguration
@@ -507,8 +515,6 @@ class FlixclusivePlayerManager(
507515
.setLanguage(subtitleName)
508516
.build()
509517

510-
availableSubtitles.add(subtitle.copy(language = subtitleName))
511-
512518
val format =
513519
Format
514520
.Builder()
@@ -532,13 +538,15 @@ class FlixclusivePlayerManager(
532538
)
533539
}
534540

541+
val subtitleDataSource = when (subtitle.type) {
542+
SubtitleSource.ONLINE -> okHttpDataSource
543+
else -> localDataSource
544+
}
545+
535546
val factory =
536547
ProgressiveMediaSource
537548
.Factory(
538-
when (subtitle.type) {
539-
SubtitleSource.ONLINE -> okHttpDataSource
540-
else -> localDataSource
541-
},
549+
subtitleDataSource,
542550
extractorFactory,
543551
)
544552

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.flixclusive.core.ui.player.util
2+
3+
import android.content.Context
4+
import com.flixclusive.model.provider.link.Subtitle
5+
import com.flixclusive.model.provider.link.SubtitleSource
6+
import com.flixclusive.core.locale.R as LocaleR
7+
8+
internal fun Subtitle.isOffSubtitle(context: Context): Boolean {
9+
val offSubtitleLabel = context.getString(LocaleR.string.off_subtitles)
10+
return offSubtitleLabel == language && type == SubtitleSource.EMBEDDED && url.isEmpty()
11+
}

0 commit comments

Comments
 (0)