From 2b0091eca20f0a8623a50f594c6f3b327d95f16e Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Sun, 19 Jun 2022 14:55:21 +0200 Subject: [PATCH 1/3] Fix stream selection remembering --- src/components/playback/playbackmanager.js | 23 +++++++++++++++---- .../playbackSettings/playbackSettings.js | 6 +++-- .../playbackSettings.template.html | 14 ++++++++--- src/scripts/settings/userSettings.js | 14 ----------- src/strings/en-us.json | 6 +++-- 5 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index ba19510cde..f56620fda0 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2300,7 +2300,7 @@ class PlaybackManager { } } - function autoSetNextTracks(prevSource, mediaSource) { + function autoSetNextTracks(prevSource, mediaSource, audio, subtitle) { try { if (!prevSource) return; @@ -2319,8 +2319,11 @@ class PlaybackManager { return; } - rankStreamType(prevSource.DefaultAudioStreamIndex, prevSource, mediaSource, 'Audio'); - rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaSource, 'Subtitle'); + if (audio) + rankStreamType(prevSource.DefaultAudioStreamIndex, prevSource, mediaSource, 'Audio'); + + if (subtitle) + rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaSource, 'Subtitle'); } catch (e) { console.error(`AutoSet - Caught unexpected error: ${e}`); } @@ -2385,8 +2388,18 @@ class PlaybackManager { playOptions.items = null; return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(function (mediaSource) { - if (userSettings.enableSetUsingLastTracks()) - autoSetNextTracks(prevSource, mediaSource); + const user = apiClient.getCurrentUser(); + if (user.Configuration.RememberAudioSelections) { + if (user.Configuration.RememberSubtitleSelections) + autoSetNextTracks(prevSource, mediaSource, true, true); + else + autoSetNextTracks(prevSource, mediaSource, true, false); + } else { + if (user.Configuration.RememberSubtitleSelections) + autoSetNextTracks(prevSource, mediaSource, false, true); + else + autoSetNextTracks(prevSource, mediaSource, false, false); + } const streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition, player); diff --git a/src/components/playbackSettings/playbackSettings.js b/src/components/playbackSettings/playbackSettings.js index 0de42c6c18..976e8b2f77 100644 --- a/src/components/playbackSettings/playbackSettings.js +++ b/src/components/playbackSettings/playbackSettings.js @@ -180,7 +180,8 @@ import template from './playbackSettings.template.html'; context.querySelector('.chkPreferFmp4HlsContainer').checked = userSettings.preferFmp4HlsContainer(); context.querySelector('.chkEnableCinemaMode').checked = userSettings.enableCinemaMode(); context.querySelector('.chkEnableNextVideoOverlay').checked = userSettings.enableNextVideoInfoOverlay(); - context.querySelector('.chkSetUsingLastTracks').checked = userSettings.enableSetUsingLastTracks(); + context.querySelector('.chkRememberAudioSelections').checked = user.Configuration.RememberAudioSelections || false; + context.querySelector('.chkRememberSubtitleSelections').checked = user.Configuration.RememberSubtitleSelections || false; context.querySelector('.chkExternalVideoPlayer').checked = appSettings.enableSystemExternalPlayers(); setMaxBitrateIntoField(context.querySelector('.selectVideoInNetworkQuality'), true, 'Video'); @@ -222,7 +223,8 @@ import template from './playbackSettings.template.html'; userSettingsInstance.enableCinemaMode(context.querySelector('.chkEnableCinemaMode').checked); userSettingsInstance.enableNextVideoInfoOverlay(context.querySelector('.chkEnableNextVideoOverlay').checked); - userSettingsInstance.enableSetUsingLastTracks(context.querySelector('.chkSetUsingLastTracks').checked); + user.Configuration.RememberAudioSelections = context.querySelector('.chkRememberAudioSelections').checked; + user.Configuration.RememberSubtitleSelections = context.querySelector('.chkRememberSubtitleSelections').checked; userSettingsInstance.chromecastVersion(context.querySelector('.selectChromecastVersion').value); userSettingsInstance.skipForwardLength(context.querySelector('.selectSkipForwardLength').value); userSettingsInstance.skipBackLength(context.querySelector('.selectSkipBackLength').value); diff --git a/src/components/playbackSettings/playbackSettings.template.html b/src/components/playbackSettings/playbackSettings.template.html index 19782334e1..bfc184ea5b 100644 --- a/src/components/playbackSettings/playbackSettings.template.html +++ b/src/components/playbackSettings/playbackSettings.template.html @@ -84,10 +84,18 @@
-
${SetUsingLastTracksHelp}
+
${RememberAudioSelectionsHelp}
+
+ +
+ +
${RememberSubtitleSelectionsHelp}
diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 0a755d1da2..8ee7dd48d4 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -166,19 +166,6 @@ export class UserSettings { return val !== 'false'; } - /** - * Get or set 'SetUsingLastTracks' state. - * @param {boolean|undefined} val - Flag to enable 'SetUsingLastTracks' or undefined. - * @return {boolean} 'SetUsingLastTracks' state. - */ - enableSetUsingLastTracks(val) { - if (val !== undefined) { - return this.set('enableSetUsingLastTracks', val.toString()); - } - - return this.get('enableSetUsingLastTracks', false) !== 'false'; - } - /** * Get or set 'Theme Songs' state. * @param {boolean|undefined} val - Flag to enable 'Theme Songs' or undefined. @@ -570,7 +557,6 @@ export const allowedAudioChannels = currentSettings.allowedAudioChannels.bind(cu export const preferFmp4HlsContainer = currentSettings.preferFmp4HlsContainer.bind(currentSettings); export const enableCinemaMode = currentSettings.enableCinemaMode.bind(currentSettings); export const enableNextVideoInfoOverlay = currentSettings.enableNextVideoInfoOverlay.bind(currentSettings); -export const enableSetUsingLastTracks = currentSettings.enableSetUsingLastTracks.bind(currentSettings); export const enableThemeSongs = currentSettings.enableThemeSongs.bind(currentSettings); export const enableThemeVideos = currentSettings.enableThemeVideos.bind(currentSettings); export const enableFastFadein = currentSettings.enableFastFadein.bind(currentSettings); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 0ee619667c..57aac5a44c 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1353,7 +1353,11 @@ "RefreshQueued": "Refresh queued.", "ReleaseDate": "Release date", "ReleaseGroup": "Release Group", + "RememberAudioSelections": "Set audio track based on previous item", + "RememberAudioSelectionsHelp": "Try to set the audio track to the closest match to the last video.", "RememberMe": "Remember Me", + "RememberSubtitleSelections": "Set subtitle track based on previous item", + "RememberSubtitleSelectionsHelp": "Try to set the subtitle track to the closest match to the last video.", "Remixer": "Remixer", "RemoveFromCollection": "Remove from collection", "RemoveFromPlaylist": "Remove from playlist", @@ -1401,8 +1405,6 @@ "Settings": "Settings", "SettingsSaved": "Settings saved.", "SettingsWarning": "Changing these values may cause instability or connectivity failures. If you experience any problems, we recommend changing them back to default.", - "SetUsingLastTracks": "Set Subtitle/Audio Tracks with Previous Item", - "SetUsingLastTracksHelp": "Try to set the Subtitle/Audio track to the closest match to the last video.", "Share": "Share", "ShowAdvancedSettings": "Show advanced settings", "ShowIndicatorsFor": "Show indicators for:", From 22a77ce54e74d6ba9c49c7f6ce657e9147f400e0 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Sun, 26 Jun 2022 22:27:21 +0200 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/playback/playbackmanager.js | 24 ++++++++-------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index f56620fda0..b5cae622b4 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2275,7 +2275,7 @@ class PlaybackManager { score += 1; if (prevRelIndex == newRelIndex) score += 1; - if (prevStream.Title && prevStream.Title == stream.Title) + if (prevStream.DisplayTitle && prevStream.DisplayTitle == stream.DisplayTitle) score += 2; if (prevStream.Language && prevStream.Language != 'und' && prevStream.Language == stream.Language) score += 2; @@ -2319,11 +2319,13 @@ class PlaybackManager { return; } - if (audio) + if (audio) { rankStreamType(prevSource.DefaultAudioStreamIndex, prevSource, mediaSource, 'Audio'); + } - if (subtitle) + if (subtitle) { rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaSource, 'Subtitle'); + } } catch (e) { console.error(`AutoSet - Caught unexpected error: ${e}`); } @@ -2387,19 +2389,9 @@ class PlaybackManager { // this reference was only needed by sendPlaybackListToPlayer playOptions.items = null; - return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(function (mediaSource) { - const user = apiClient.getCurrentUser(); - if (user.Configuration.RememberAudioSelections) { - if (user.Configuration.RememberSubtitleSelections) - autoSetNextTracks(prevSource, mediaSource, true, true); - else - autoSetNextTracks(prevSource, mediaSource, true, false); - } else { - if (user.Configuration.RememberSubtitleSelections) - autoSetNextTracks(prevSource, mediaSource, false, true); - else - autoSetNextTracks(prevSource, mediaSource, false, false); - } + return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(async (mediaSource) => { + const user = await apiClient.getCurrentUser(); + autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections); const streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition, player); From a792737add0e815258c64cf2b816d78b28dd9d28 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Sun, 26 Jun 2022 23:30:42 +0200 Subject: [PATCH 3/3] Use stream defaults in stream auto selection if previous source had no stream of that kind --- src/components/playback/playbackmanager.js | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index b5cae622b4..8aaaa12aea 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2309,21 +2309,11 @@ class PlaybackManager { return; } - if (typeof prevSource.DefaultAudioStreamIndex != 'number' - || typeof prevSource.DefaultSubtitleStreamIndex != 'number') - return; - - if (typeof mediaSource.DefaultAudioStreamIndex != 'number' - || typeof mediaSource.DefaultSubtitleStreamIndex != 'number') { - console.warn('AutoSet - No stream indexes (but prevSource has them)'); - return; - } - - if (audio) { + if (audio && typeof prevSource.DefaultAudioStreamIndex == 'number') { rankStreamType(prevSource.DefaultAudioStreamIndex, prevSource, mediaSource, 'Audio'); } - if (subtitle) { + if (subtitle && typeof prevSource.DefaultSubtitleStreamIndex == 'number') { rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaSource, 'Subtitle'); } } catch (e) {