From 05ed1e188ea60c59a8f25b24ea8ff6e5a82aa3d6 Mon Sep 17 00:00:00 2001 From: Kelvin Date: Tue, 16 Jul 2024 20:18:46 +0200 Subject: [PATCH] Logging and refs --- .../platformplayer/helpers/VideoHelper.kt | 6 ++--- .../views/video/FutoVideoPlayerBase.kt | 22 ++++++++++++++++++- .../video/datasources/JSHttpDataSource.java | 3 +++ app/src/stable/assets/sources/bilibili | 2 +- app/src/stable/assets/sources/spotify | 2 +- app/src/stable/assets/sources/youtube | 2 +- app/src/unstable/assets/sources/bilibili | 2 +- app/src/unstable/assets/sources/spotify | 2 +- app/src/unstable/assets/sources/youtube | 2 +- 9 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/helpers/VideoHelper.kt b/app/src/main/java/com/futo/platformplayer/helpers/VideoHelper.kt index df4cf4eb..c1b89bd3 100644 --- a/app/src/main/java/com/futo/platformplayer/helpers/VideoHelper.kt +++ b/app/src/main/java/com/futo/platformplayer/helpers/VideoHelper.kt @@ -127,7 +127,7 @@ class VideoHelper { } @OptIn(UnstableApi::class) - fun convertItagSourceToChunkedDashSource(videoSource: JSVideoUrlRangeSource) : MediaSource { + fun convertItagSourceToChunkedDashSource(videoSource: JSVideoUrlRangeSource) : Pair { val urlToUse = videoSource.getVideoUrl(); val manifestConfig = ProgressiveDashManifestCreator.fromVideoProgressiveStreamingUrl(urlToUse, videoSource.duration * 1000, @@ -145,10 +145,10 @@ class VideoHelper { ); val manifest = DashManifestParser().parse(Uri.parse(""), manifestConfig.byteInputStream()); - return DashMediaSource.Factory(ResolvingDataSource.Factory(videoSource.getHttpDataSourceFactory(), ResolvingDataSource.Resolver { dataSpec -> + return Pair(DashMediaSource.Factory(ResolvingDataSource.Factory(videoSource.getHttpDataSourceFactory(), ResolvingDataSource.Resolver { dataSpec -> Logger.v("PLAYBACK", "Video REQ Range [" + dataSpec.position + "-" + (dataSpec.position + dataSpec.length) + "](" + dataSpec.length + ")", null); return@Resolver dataSpec; - })).createMediaSource(manifest, MediaItem.Builder().setUri(Uri.parse(videoSource.getVideoUrl())).build()) + })).createMediaSource(manifest, MediaItem.Builder().setUri(Uri.parse(videoSource.getVideoUrl())).build()), manifestConfig); } fun getMediaMetadata(media: IPlatformVideoDetails): MediaMetadata { 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 519ab6ec..6889d911 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 @@ -14,6 +14,7 @@ import androidx.media3.common.text.CueGroup import androidx.media3.common.util.UnstableApi import androidx.media3.datasource.DefaultDataSource import androidx.media3.datasource.DefaultHttpDataSource +import androidx.media3.datasource.HttpDataSource import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.dash.DashMediaSource import androidx.media3.exoplayer.drm.DefaultDrmSessionManagerProvider @@ -26,6 +27,7 @@ import androidx.media3.exoplayer.trackselection.DefaultTrackSelector import com.futo.platformplayer.Settings import com.futo.platformplayer.api.media.models.chapters.IChapter import com.futo.platformplayer.api.media.models.streams.VideoMuxedSourceDescriptor +import com.futo.platformplayer.api.media.models.streams.sources.AudioUrlSource import com.futo.platformplayer.api.media.models.streams.sources.IAudioSource import com.futo.platformplayer.api.media.models.streams.sources.IAudioUrlSource import com.futo.platformplayer.api.media.models.streams.sources.IAudioUrlWidevineSource @@ -36,17 +38,21 @@ import com.futo.platformplayer.api.media.models.streams.sources.IVideoSource import com.futo.platformplayer.api.media.models.streams.sources.IVideoUrlSource import com.futo.platformplayer.api.media.models.streams.sources.LocalAudioSource import com.futo.platformplayer.api.media.models.streams.sources.LocalVideoSource +import com.futo.platformplayer.api.media.models.streams.sources.VideoUrlSource import com.futo.platformplayer.api.media.models.subtitles.ISubtitleSource import com.futo.platformplayer.api.media.models.video.IPlatformVideoDetails import com.futo.platformplayer.api.media.platforms.js.models.sources.JSAudioUrlRangeSource import com.futo.platformplayer.api.media.platforms.js.models.sources.JSHLSManifestAudioSource import com.futo.platformplayer.api.media.platforms.js.models.sources.JSSource import com.futo.platformplayer.api.media.platforms.js.models.sources.JSVideoUrlRangeSource +import com.futo.platformplayer.api.media.platforms.js.models.sources.JSVideoUrlSource import com.futo.platformplayer.constructs.Event1 +import com.futo.platformplayer.engine.dev.V8RemoteObject import com.futo.platformplayer.helpers.VideoHelper import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.states.StateApp import com.futo.platformplayer.video.PlayerManager +import com.google.gson.Gson import getHttpDataSourceFactory import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -68,6 +74,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout { private set; private var _lastVideoMediaSource: MediaSource? = null; + private var _lastGeneratedDash: String? = null; private var _lastAudioMediaSource: MediaSource? = null; private var _lastSubtitleMediaSource: MediaSource? = null; private var _shouldPlaybackRestartOnConnectivity: Boolean = false; @@ -375,6 +382,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout { private fun swapSourceInternal(videoSource: IVideoSource?) { + _lastGeneratedDash = null; when(videoSource) { is LocalVideoSource -> swapVideoSourceLocal(videoSource); is JSVideoUrlRangeSource -> swapVideoSourceUrlRange(videoSource); @@ -415,7 +423,9 @@ abstract class FutoVideoPlayerBase : RelativeLayout { if(videoSource.hasItag) { //Temporary workaround for Youtube try { - _lastVideoMediaSource = VideoHelper.convertItagSourceToChunkedDashSource(videoSource); + val results = VideoHelper.convertItagSourceToChunkedDashSource(videoSource); + _lastGeneratedDash = results.second; + _lastVideoMediaSource = results.first; return; } //If it fails to create the dash workaround, fallback to standard progressive @@ -635,6 +645,16 @@ abstract class FutoVideoPlayerBase : RelativeLayout { when (error.errorCode) { PlaybackException.ERROR_CODE_IO_BAD_HTTP_STATUS -> { + if(error.cause is HttpDataSource.InvalidResponseCodeException) { + val cause = error.cause as HttpDataSource.InvalidResponseCodeException + + Logger.v(TAG, null) { + "ERROR BAD HTTP ${cause.responseCode},\n" + + "Video Source: ${V8RemoteObject.gsonStandard.toJson(lastVideoSource)}\n" + + "Audio Source: ${V8RemoteObject.gsonStandard.toJson(lastAudioSource)}\n" + + "Dash: ${_lastGeneratedDash}" + }; + } onDatasourceError.emit(error); } //PlaybackException.ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED, diff --git a/app/src/main/java/com/futo/platformplayer/views/video/datasources/JSHttpDataSource.java b/app/src/main/java/com/futo/platformplayer/views/video/datasources/JSHttpDataSource.java index 4c99ccb9..bfd3d3e3 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/datasources/JSHttpDataSource.java +++ b/app/src/main/java/com/futo/platformplayer/views/video/datasources/JSHttpDataSource.java @@ -25,6 +25,7 @@ import androidx.media3.datasource.HttpDataSource; import androidx.media3.datasource.HttpUtil; import androidx.media3.datasource.TransferListener; +import com.futo.platformplayer.logging.Logger; import com.google.common.base.Predicate; import com.google.common.collect.ForwardingMap; import com.google.common.collect.ImmutableMap; @@ -582,6 +583,8 @@ public class JSHttpDataSource extends BaseDataSource implements HttpDataSource { requestHeaders = result.getHeaders(); } + Logger.Companion.v("JSHttpDataSource", "DataSource REQ: " + requestUrl, null); + HttpURLConnection connection = openConnection(new URL(requestUrl)); connection.setConnectTimeout(connectTimeoutMillis); connection.setReadTimeout(readTimeoutMillis); diff --git a/app/src/stable/assets/sources/bilibili b/app/src/stable/assets/sources/bilibili index b518be4d..2c279cb1 160000 --- a/app/src/stable/assets/sources/bilibili +++ b/app/src/stable/assets/sources/bilibili @@ -1 +1 @@ -Subproject commit b518be4dd5e162e67e9ca64e09be3fe574fccdb7 +Subproject commit 2c279cb123686d841bd663d1f6cf3464a582cf97 diff --git a/app/src/stable/assets/sources/spotify b/app/src/stable/assets/sources/spotify index 4e826dcb..c7000814 160000 --- a/app/src/stable/assets/sources/spotify +++ b/app/src/stable/assets/sources/spotify @@ -1 +1 @@ -Subproject commit 4e826dcb6a237313e32ec81b0e973a4f69c429c3 +Subproject commit c700081466038ee4782610feaa05cd4d34d024d8 diff --git a/app/src/stable/assets/sources/youtube b/app/src/stable/assets/sources/youtube index d2a903d5..546d8623 160000 --- a/app/src/stable/assets/sources/youtube +++ b/app/src/stable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit d2a903d5dd2d5d4b44c444aed61e014e5e63de93 +Subproject commit 546d862342b10398d0737f0f2163691b611af8f2 diff --git a/app/src/unstable/assets/sources/bilibili b/app/src/unstable/assets/sources/bilibili index b518be4d..2c279cb1 160000 --- a/app/src/unstable/assets/sources/bilibili +++ b/app/src/unstable/assets/sources/bilibili @@ -1 +1 @@ -Subproject commit b518be4dd5e162e67e9ca64e09be3fe574fccdb7 +Subproject commit 2c279cb123686d841bd663d1f6cf3464a582cf97 diff --git a/app/src/unstable/assets/sources/spotify b/app/src/unstable/assets/sources/spotify index 4e826dcb..c7000814 160000 --- a/app/src/unstable/assets/sources/spotify +++ b/app/src/unstable/assets/sources/spotify @@ -1 +1 @@ -Subproject commit 4e826dcb6a237313e32ec81b0e973a4f69c429c3 +Subproject commit c700081466038ee4782610feaa05cd4d34d024d8 diff --git a/app/src/unstable/assets/sources/youtube b/app/src/unstable/assets/sources/youtube index d2a903d5..546d8623 160000 --- a/app/src/unstable/assets/sources/youtube +++ b/app/src/unstable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit d2a903d5dd2d5d4b44c444aed61e014e5e63de93 +Subproject commit 546d862342b10398d0737f0f2163691b611af8f2