@@ -84,7 +84,9 @@ import com.futo.platformplayer.api.media.models.video.LocalVideoDetails
8484import com.futo.platformplayer.api.media.models.video.SerializedPlatformVideo
8585import com.futo.platformplayer.api.media.platforms.js.JSClient
8686import com.futo.platformplayer.api.media.platforms.js.SourcePluginConfig
87+ import com.futo.platformplayer.api.media.platforms.js.models.sources.IJSDashManifestRawSource
8788import com.futo.platformplayer.api.media.platforms.js.models.JSVideoDetails
89+
8890import com.futo.platformplayer.api.media.platforms.js.models.sources.JSSource
8991import com.futo.platformplayer.api.media.structures.IPager
9092import com.futo.platformplayer.casting.CastConnectionState
@@ -106,6 +108,7 @@ import com.futo.platformplayer.fixHtmlLinks
106108import com.futo.platformplayer.fixHtmlWhitespace
107109import com.futo.platformplayer.getNowDiffSeconds
108110import com.futo.platformplayer.helpers.VideoHelper
111+ import com.futo.platformplayer.helpers.toAudioSource
109112import com.futo.platformplayer.logging.Logger
110113import com.futo.platformplayer.models.Subscription
111114import com.futo.platformplayer.receivers.MediaControlReceiver
@@ -2046,6 +2049,10 @@ class VideoDetailView : ConstraintLayout {
20462049 val videoSource = _lastVideoSource ? : _player .getPreferredVideoSource(video, Settings .instance.playback.getCurrentPreferredQualityPixelCount());
20472050 val audioSource = _lastAudioSource ? : _player .getPreferredAudioSource(video, Settings .instance.playback.getPrimaryLanguage(context));
20482051 val subtitleSource = _lastSubtitleSource ? : (if (Settings .instance.playback.stickySubtitles) _player .getPreferredSubtitleSource(video, _subtitleLanguage ) else null ) ? : (if (video is VideoLocal ) video.subtitlesSources.firstOrNull() else null );
2052+
2053+ _player .setPreferredAudioLanguage(Settings .instance.playback.getPrimaryLanguage(context));
2054+ _player .setPreferredSubtitleLanguage(_subtitleLanguage );
2055+
20492056 Logger .i(TAG , " loadCurrentVideo(videoSource=$videoSource , audioSource=$audioSource , subtitleSource=$subtitleSource , resumePositionMs=$resumePositionMs )" )
20502057
20512058 if (videoSource == null && audioSource == null ) {
@@ -2310,7 +2317,7 @@ class VideoDetailView : ConstraintLayout {
23102317 _overlay_quality_selector ?.selectOption(" audio" , _lastAudioSource );
23112318 _overlay_quality_selector ?.selectOption(" subtitles" , _lastSubtitleSource );
23122319
2313- if (_lastVideoSource is IDashManifestSource || _lastVideoSource is IHLSManifestSource ) {
2320+ if (_lastVideoSource is IDashManifestSource || _lastVideoSource is IHLSManifestSource || _lastVideoSource is IJSDashManifestRawSource ) {
23142321
23152322 val videoTracks =
23162323 _player .exoPlayer?.player?.currentTracks?.groups?.firstOrNull { it.mediaTrackGroup.type == C .TRACK_TYPE_VIDEO }
@@ -2340,6 +2347,22 @@ class VideoDetailView : ConstraintLayout {
23402347 ?.setSubText(" ${_player .exoPlayer?.player?.videoFormat?.width} x${_player .exoPlayer?.player?.videoFormat?.height} " )
23412348 _overlay_quality_selector ?.selectOption(" video" , " auto" )
23422349 }
2350+
2351+ // Audio track selection from manifest
2352+ val audioTracks = _player .exoPlayer?.player?.currentTracks?.groups?.firstOrNull { it.mediaTrackGroup.type == C .TRACK_TYPE_AUDIO }
2353+ if (audioTracks != null ) {
2354+ var audioMenuGroup: SlideUpMenuGroup ? = null
2355+ for (view in _overlay_quality_selector !! .groupItems) {
2356+ if (view is SlideUpMenuGroup && view.groupTag == " audio" ) {
2357+ audioMenuGroup = view
2358+ }
2359+ }
2360+
2361+ val currentAudioTrack = _player .exoPlayer?.player?.audioFormat
2362+ if (currentAudioTrack != null ) {
2363+ _overlay_quality_selector ?.selectOption(" audio" , currentAudioTrack)
2364+ }
2365+ }
23432366 }
23442367
23452368 val currentPlaybackRate = (if (_isCasting ) StateCasting .instance.activeDevice?.speed else _player .getPlaybackRate()) ? : 1.0
@@ -2436,7 +2459,7 @@ class VideoDetailView : ConstraintLayout {
24362459 videoSources = video?.video?.videoSources?.toList();
24372460 audioSources = if (video?.video?.isUnMuxed == true )
24382461 (video.video as VideoUnMuxedSourceDescriptor ).audioSources.toList()
2439- else null
2462+ else video?.video?.videoSources?.map { it.toAudioSource() }
24402463 if (videoLocal != null ) {
24412464 localVideoSources = videoLocal.videoSource.toList();
24422465 localAudioSource = videoLocal.audioSource.toList();
@@ -2504,11 +2527,15 @@ class VideoDetailView : ConstraintLayout {
25042527 ?.filterNotNull()
25052528 ?.toList() ? : listOf () else videoSources?.toList() ? : listOf ()
25062529 val bestAudioContainer = audioSources?.let { VideoHelper .selectBestAudioSource(it, FutoVideoPlayerBase .PREFERED_AUDIO_CONTAINERS )?.container };
2507- val bestAudioSources = if (doDedup) audioSources
2508- ?.filter { it.container == bestAudioContainer }
2509- ?.plus(audioSources.filter { it is IHLSManifestAudioSource || it is IDashManifestSource })
2510- ?.distinct()
2511- ?.toList() ? : listOf () else audioSources?.toList() ? : listOf ();
2530+ val bestAudioSources = if (doDedup && audioSources != null ) {
2531+ val audioLangs = audioSources.map { it.language }.distinct();
2532+ audioLangs.map { lang ->
2533+ VideoHelper .selectBestAudioSource(audioSources.filter { it.language == lang }, FutoVideoPlayerBase .PREFERED_AUDIO_CONTAINERS )
2534+ }.plus(audioSources.filter { it is IHLSManifestAudioSource || it is IDashManifestSource || it is IJSDashManifestRawSource })
2535+ .filterNotNull()
2536+ .distinct()
2537+ .toList()
2538+ } else audioSources?.toList() ? : listOf ();
25122539
25132540 val canSetSpeed = ! _isCasting || StateCasting .instance.activeDevice?.canSetSpeed() == true
25142541 val currentPlaybackRate = if (_isCasting ) StateCasting .instance.activeDevice?.speed else _player .getPlaybackRate()
0 commit comments