Possible fix for dropping live playback

This commit is contained in:
Kelvin
2025-11-13 04:05:08 +01:00
parent 4b5ed38175
commit 8cc82e4d16
2 changed files with 24 additions and 2 deletions
@@ -52,6 +52,7 @@ import com.futo.polycentric.core.toBase64Url
import com.futo.platformplayer.polycentric.ModerationsManager import com.futo.platformplayer.polycentric.ModerationsManager
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.File import java.io.File
import java.time.OffsetDateTime
import java.util.* import java.util.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
@@ -181,6 +182,9 @@ class StateApp {
private var _lastMeteredState: Boolean = false; private var _lastMeteredState: Boolean = false;
private var _connectivityManager: ConnectivityManager? = null; private var _connectivityManager: ConnectivityManager? = null;
private var _lastNetworkState: NetworkState = NetworkState.UNKNOWN; private var _lastNetworkState: NetworkState = NetworkState.UNKNOWN;
private var _lastConnectivityChange: OffsetDateTime? = null;
val lastConnectivityChange
get() = _lastConnectivityChange;
//Logging //Logging
private var _fileLogConsumer: FileLogConsumer? = null; private var _fileLogConsumer: FileLogConsumer? = null;
@@ -894,8 +898,11 @@ class StateApp {
val beforeMeteredState = _lastMeteredState; val beforeMeteredState = _lastMeteredState;
_lastNetworkState = getCurrentNetworkState(); _lastNetworkState = getCurrentNetworkState();
_lastMeteredState = isCurrentMetered(); _lastMeteredState = isCurrentMetered();
if(beforeNetworkState != _lastNetworkState || beforeMeteredState != _lastMeteredState) if(beforeNetworkState != _lastNetworkState || beforeMeteredState != _lastMeteredState) {
Logger.i(TAG, "Network capabilities changed (State: ${_lastNetworkState}, Metered: ${_lastMeteredState})"); Logger.i(TAG, "Network capabilities changed (State: ${_lastNetworkState}, Metered: ${_lastMeteredState})");
_lastConnectivityChange = OffsetDateTime.now();
}
} catch(ex: Throwable) { } catch(ex: Throwable) {
Logger.w(TAG, "Failed to update network state", ex); Logger.w(TAG, "Failed to update network state", ex);
} }
@@ -29,6 +29,8 @@ import androidx.media3.exoplayer.dash.manifest.DashManifestParser
import androidx.media3.exoplayer.drm.DefaultDrmSessionManager import androidx.media3.exoplayer.drm.DefaultDrmSessionManager
import androidx.media3.exoplayer.drm.HttpMediaDrmCallback import androidx.media3.exoplayer.drm.HttpMediaDrmCallback
import androidx.media3.exoplayer.hls.HlsMediaSource import androidx.media3.exoplayer.hls.HlsMediaSource
import androidx.media3.exoplayer.hls.playlist.HlsPlaylistTracker
import androidx.media3.exoplayer.source.BehindLiveWindowException
import androidx.media3.exoplayer.source.MediaSource import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.MergingMediaSource import androidx.media3.exoplayer.source.MergingMediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource import androidx.media3.exoplayer.source.ProgressiveMediaSource
@@ -77,6 +79,7 @@ import com.futo.platformplayer.engine.exceptions.ScriptCaptchaRequiredException
import com.futo.platformplayer.engine.exceptions.ScriptReloadRequiredException import com.futo.platformplayer.engine.exceptions.ScriptReloadRequiredException
import com.futo.platformplayer.fragment.mainactivity.main.ChannelFragment import com.futo.platformplayer.fragment.mainactivity.main.ChannelFragment
import com.futo.platformplayer.fragment.mainactivity.main.CreatorSearchResultsFragment import com.futo.platformplayer.fragment.mainactivity.main.CreatorSearchResultsFragment
import com.futo.platformplayer.getNowDiffMiliseconds
import com.futo.platformplayer.helpers.VideoHelper import com.futo.platformplayer.helpers.VideoHelper
import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.logging.Logger
import com.futo.platformplayer.states.StateApp import com.futo.platformplayer.states.StateApp
@@ -1008,7 +1011,19 @@ abstract class FutoVideoPlayerBase : RelativeLayout {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
protected open fun onPlayerError(error: PlaybackException) { protected open fun onPlayerError(error: PlaybackException) {
Logger.i(TAG, "onPlayerError error=$error error.errorCode=${error.errorCode} connectivityLoss"); Logger.i(TAG, "onPlayerError error=$error error.errorCode=${error.errorCode} connectivityLoss, cause=${error.cause}");
if(error is BehindLiveWindowException) {
Logger.e(TAG, "BehindLiveWindowException, " + error.message);
reloadMediaSource(true, true);
return;
}
if(error != null && error.cause is HlsPlaylistTracker.PlaylistStuckException) {
Logger.e(TAG, "PlaylistStuckException");
reloadMediaSource(true, true);
UIDialogs.toast("Live playback error, reloading..");
return;
}
when (error.errorCode) { when (error.errorCode) {
PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, PlaybackException.ERROR_CODE_IO_BAD_HTTP_STATUS -> { PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, PlaybackException.ERROR_CODE_IO_BAD_HTTP_STATUS -> {