From d689d5050de14932d2aa622561a386716ecf23a5 Mon Sep 17 00:00:00 2001 From: LagradOst Date: Sat, 12 Feb 2022 19:18:43 +0100 Subject: [PATCH] fixed subs in player not appearing --- .../cloudstream3/ui/player/CS3IPlayer.kt | 48 ++++++++++++++++--- .../ui/player/CustomSubtitleDecoderFactory.kt | 1 + 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index 879c5300..97744299 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -2,6 +2,7 @@ package com.lagradost.cloudstream3.ui.player import android.content.Context import android.net.Uri +import android.os.Handler import android.os.Looper import android.util.Log import android.widget.FrameLayout @@ -35,7 +36,7 @@ const val TAG = "CS3ExoPlayer" /** Cache */ -class CS3IPlayer() : IPlayer { +class CS3IPlayer : IPlayer { private var isPlaying = false private var exoPlayer: ExoPlayer? = null var cacheSize = 300L * 1024L * 1024L // 300 mb @@ -112,6 +113,24 @@ class CS3IPlayer() : IPlayer { this.prevEpisode = prevEpisode } + // I know, this is not a perfect solution, however it works for fixing subs + private fun reloadSubs() { + exoPlayer?.applicationLooper?.let { + try { + Handler(it).post { + try { + seekTime(1L) + } catch (e : Exception) { + logError(e) + } + } + } catch (e : Exception) { + logError(e) + } + + } + } + fun initSubtitles(subView: SubtitleView?, subHolder: FrameLayout?, style: SaveCaptionStyle?) { subtitleHelper.initSubtitles(subView, subHolder, style) } @@ -178,6 +197,13 @@ class CS3IPlayer() : IPlayer { trackSelector.buildUponParameters() .setPreferredTextLanguage("_$name") ) + + // ugliest code I have written, it seeks 1ms to *update* the subtitles + //exoPlayer?.applicationLooper?.let { + // Handler(it).postDelayed({ + // seekTime(1L) + // }, 1) + //} } SubtitleStatus.NOT_FOUND -> { // not found @@ -261,6 +287,8 @@ class CS3IPlayer() : IPlayer { } companion object { + var requestSubtitleUpdate : (() -> Unit)? = null + private fun createOnlineSource(link: ExtractorLink): DataSource.Factory { // Because Trailers.to seems to fail with http/1.1 the normal one uses. return DefaultHttpDataSource.Factory().apply { @@ -368,6 +396,8 @@ class CS3IPlayer() : IPlayer { return trackSelector } + var currentTextRenderer: TextRenderer? = null + private fun buildExoPlayer( context: Context, mediaItem: MediaItem, @@ -389,11 +419,14 @@ class CS3IPlayer() : IPlayer { textRendererOutput, metadataRendererOutput ).map { - if (it is TextRenderer) TextRenderer( - textRendererOutput, - eventHandler.looper, - CustomSubtitleDecoderFactory() - ) else it + if (it is TextRenderer) { + currentTextRenderer = TextRenderer( + textRendererOutput, + eventHandler.looper, + CustomSubtitleDecoderFactory() + ) + currentTextRenderer!! + } else it }.toTypedArray() } .setTrackSelector(trackSelector ?: getTrackSelector(context)) @@ -505,6 +538,8 @@ class CS3IPlayer() : IPlayer { cacheFactory = cacheFactory ) + requestSubtitleUpdate = ::reloadSubs + playerUpdated?.invoke(exoPlayer) exoPlayer?.prepare() @@ -572,6 +607,7 @@ class CS3IPlayer() : IPlayer { override fun onRenderedFirstFrame() { updatedTime() + if (!hasUsedFirstRender) { // this insures that we only call this once per player load Log.i(TAG, "Rendered first frame") diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CustomSubtitleDecoderFactory.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CustomSubtitleDecoderFactory.kt index 44926080..f75707d8 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CustomSubtitleDecoderFactory.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CustomSubtitleDecoderFactory.kt @@ -121,6 +121,7 @@ class CustomDecoder : SubtitleDecoder { } decoder.queueInputBuffer(buff) } + CS3IPlayer.requestSubtitleUpdate?.invoke() } } }