diff --git a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt index 4116a682..b6295092 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt @@ -52,6 +52,7 @@ import com.futo.polycentric.core.toBase64Url import com.futo.platformplayer.polycentric.ModerationsManager import kotlinx.coroutines.* import java.io.File +import java.time.OffsetDateTime import java.util.* import java.util.concurrent.TimeUnit import kotlin.system.measureTimeMillis @@ -181,6 +182,9 @@ class StateApp { private var _lastMeteredState: Boolean = false; private var _connectivityManager: ConnectivityManager? = null; private var _lastNetworkState: NetworkState = NetworkState.UNKNOWN; + private var _lastConnectivityChange: OffsetDateTime? = null; + val lastConnectivityChange + get() = _lastConnectivityChange; //Logging private var _fileLogConsumer: FileLogConsumer? = null; @@ -894,8 +898,11 @@ class StateApp { val beforeMeteredState = _lastMeteredState; _lastNetworkState = getCurrentNetworkState(); _lastMeteredState = isCurrentMetered(); - if(beforeNetworkState != _lastNetworkState || beforeMeteredState != _lastMeteredState) + if(beforeNetworkState != _lastNetworkState || beforeMeteredState != _lastMeteredState) { Logger.i(TAG, "Network capabilities changed (State: ${_lastNetworkState}, Metered: ${_lastMeteredState})"); + _lastConnectivityChange = OffsetDateTime.now(); + } + } catch(ex: Throwable) { Logger.w(TAG, "Failed to update network state", ex); } diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt index fae32226..846471f1 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt @@ -29,6 +29,8 @@ import androidx.media3.exoplayer.dash.manifest.DashManifestParser import androidx.media3.exoplayer.drm.DefaultDrmSessionManager import androidx.media3.exoplayer.drm.HttpMediaDrmCallback 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.MergingMediaSource 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.fragment.mainactivity.main.ChannelFragment import com.futo.platformplayer.fragment.mainactivity.main.CreatorSearchResultsFragment +import com.futo.platformplayer.getNowDiffMiliseconds import com.futo.platformplayer.helpers.VideoHelper import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.states.StateApp @@ -1008,7 +1011,19 @@ abstract class FutoVideoPlayerBase : RelativeLayout { @Suppress("DEPRECATION") 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) { PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, PlaybackException.ERROR_CODE_IO_BAD_HTTP_STATUS -> {