From e9caf5e336bd2830d5ebc66853d6a55b057c8aea Mon Sep 17 00:00:00 2001 From: Ian Walton Date: Mon, 7 Sep 2020 12:54:12 -0400 Subject: [PATCH 1/4] Add auto-cast feature. --- package.json | 1 + src/components/autocast.js | 49 +++++++++++++++++++ .../playback/playerSelectionMenu.js | 21 ++++++++ src/scripts/libraryMenu.js | 8 +++ src/scripts/site.js | 1 + src/strings/en-us.json | 1 + 6 files changed, 81 insertions(+) create mode 100644 src/components/autocast.js diff --git a/package.json b/package.json index 5ca5c15151..1521a1d918 100644 --- a/package.json +++ b/package.json @@ -177,6 +177,7 @@ "src/components/remotecontrol/remotecontrol.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", + "src/components/autocast.js", "src/plugins/experimentalWarnings/plugin.js", "src/plugins/sessionPlayer/plugin.js", "src/plugins/htmlAudioPlayer/plugin.js", diff --git a/src/components/autocast.js b/src/components/autocast.js new file mode 100644 index 0000000000..3572f42bb2 --- /dev/null +++ b/src/components/autocast.js @@ -0,0 +1,49 @@ +import events from 'events'; +import playbackManager from 'playbackManager'; + +export function supported() { + return typeof(Storage) !== 'undefined'; +} + +export function enable(isEnabled) { + if (!supported()) return; + + if (isEnabled) { + const currentPlayerInfo = playbackManager.getPlayerInfo(); + + if (currentPlayerInfo && currentPlayerInfo.id && currentPlayerInfo.id) { + localStorage.setItem('autocastPlayerId', currentPlayerInfo.id); + } + } else { + localStorage.removeItem('autocastPlayerId'); + } +} + +export function isEnabled() { + if (!supported()) return false; + + const playerId = localStorage.getItem('autocastPlayerId'); + const currentPlayerInfo = playbackManager.getPlayerInfo(); + + return (currentPlayerInfo && playerId && currentPlayerInfo.id === playerId); +} + +function onOpen() { + if (!supported()) return; + + const playerId = localStorage.getItem('autocastPlayerId'); + + playbackManager.getTargets().then(function (targets) { + for (var i = 0; i < targets.length; i++) { + if (targets[i].id == playerId) { + playbackManager.trySetActivePlayer(targets[i].playerName, targets[i]); + break; + } + } + }); +} + +const apiClient = window.connectionManager.currentApiClient(); +if (apiClient) { + events.on(apiClient, 'websocketopen', onOpen); +} diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 7799613400..3fe5be70d8 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -6,6 +6,7 @@ import playbackManager from 'playbackManager'; import appRouter from 'appRouter'; import globalize from 'globalize'; import appHost from 'apphost'; +import * as autocast from 'autocast'; function mirrorItem(info, player) { var item = info.item; @@ -219,6 +220,16 @@ function showActivePlayerMenuInternal(dialogHelper, playerInfo) { html += ''; } + html += '
'; + + if (autocast.supported()) { + html += ''; + } + html += '
'; html += '
'; @@ -237,6 +248,12 @@ function showActivePlayerMenuInternal(dialogHelper, playerInfo) { chkMirror.addEventListener('change', onMirrorChange); } + var chkAutoCast = dlg.querySelector('.chkAutoCast'); + + if (chkAutoCast) { + chkAutoCast.addEventListener('change', onAutoCastChange); + } + var destination = ''; var btnRemoteControl = dlg.querySelector('.btnRemoteControl'); @@ -269,6 +286,10 @@ function onMirrorChange() { playbackManager.enableDisplayMirroring(this.checked); } +function onAutoCastChange() { + autocast.enable(this.checked); +} + document.addEventListener('viewshow', function (e) { var state = e.detail.state || {}; var item = state.item; diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 04edecf198..7a332a853c 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -52,6 +52,7 @@ import 'flexStyles'; lazyLoadViewMenuBarImages(); bindMenuEvents(); + updateCastIcon(); } function getCurrentApiClient() { @@ -910,6 +911,12 @@ import 'flexStyles'; } } + function ensureHeader() { + return new Promise(function (resolve) { + window.connectionManager.user(getCurrentApiClient()).then(updateUserInHeader).then(resolve); + }); + } + let currentPageType; pageClassOn('pagebeforeshow', 'page', function (e) { if (!this.classList.contains('withTabs')) { @@ -996,6 +1003,7 @@ import 'flexStyles'; }; window.LibraryMenu = LibraryMenu; + renderHeader(); export default LibraryMenu; diff --git a/src/scripts/site.js b/src/scripts/site.js index f14670d82d..e8f00080f1 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -591,6 +591,7 @@ function initClient() { define('metadataEditor', [componentsPath + '/metadataEditor/metadataEditor'], returnFirstDependency); define('personEditor', [componentsPath + '/metadataEditor/personEditor'], returnFirstDependency); define('playerSelectionMenu', [componentsPath + '/playback/playerSelectionMenu'], returnFirstDependency); + define('autocast', [componentsPath + '/autocast'], returnFirstDependency); define('playerSettingsMenu', [componentsPath + '/playback/playersettingsmenu'], returnFirstDependency); define('playMethodHelper', [componentsPath + '/playback/playmethodhelper'], returnFirstDependency); define('brightnessOsd', [componentsPath + '/playback/brightnessosd'], returnFirstDependency); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index e39199c56f..074d9c95f1 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -183,6 +183,7 @@ "EditImages": "Edit images", "EditMetadata": "Edit metadata", "EditSubtitles": "Edit subtitles", + "EnableAutoCast": "Set as Default", "EnableBackdropsHelp": "Display backdrops in the background of some pages while browsing the library.", "EnableCinemaMode": "Cinema mode", "EnableColorCodedBackgrounds": "Color coded backgrounds", From c8c8be39cda9258bebb0adf18a72062cee70d003 Mon Sep 17 00:00:00 2001 From: Ian Walton Date: Mon, 7 Sep 2020 13:10:38 -0400 Subject: [PATCH 2/4] Appease SonarCloud. --- src/components/autocast.js | 4 ++-- src/components/playback/playerSelectionMenu.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/autocast.js b/src/components/autocast.js index 3572f42bb2..4d191a62da 100644 --- a/src/components/autocast.js +++ b/src/components/autocast.js @@ -5,10 +5,10 @@ export function supported() { return typeof(Storage) !== 'undefined'; } -export function enable(isEnabled) { +export function enable(enabled) { if (!supported()) return; - if (isEnabled) { + if (enabled) { const currentPlayerInfo = playbackManager.getPlayerInfo(); if (currentPlayerInfo && currentPlayerInfo.id && currentPlayerInfo.id) { diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 3fe5be70d8..dcf36dd9b4 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -224,8 +224,8 @@ function showActivePlayerMenuInternal(dialogHelper, playerInfo) { if (autocast.supported()) { html += ''; } From f5311864bcd35248bf79ffe489ffeecd089ddc4e Mon Sep 17 00:00:00 2001 From: Ian Walton Date: Tue, 15 Sep 2020 17:30:38 -0400 Subject: [PATCH 3/4] Move from components to scripts. --- package.json | 2 +- src/{components => scripts}/autocast.js | 0 src/scripts/site.js | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/{components => scripts}/autocast.js (100%) diff --git a/package.json b/package.json index 1521a1d918..af3dfef045 100644 --- a/package.json +++ b/package.json @@ -177,7 +177,6 @@ "src/components/remotecontrol/remotecontrol.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", - "src/components/autocast.js", "src/plugins/experimentalWarnings/plugin.js", "src/plugins/sessionPlayer/plugin.js", "src/plugins/htmlAudioPlayer/plugin.js", @@ -330,6 +329,7 @@ "src/plugins/youtubePlayer/plugin.js", "src/scripts/alphanumericshortcuts.js", "src/scripts/autoBackdrops.js", + "src/scripts/autocast.js", "src/scripts/browser.js", "src/scripts/clientUtils.js", "src/scripts/datetime.js", diff --git a/src/components/autocast.js b/src/scripts/autocast.js similarity index 100% rename from src/components/autocast.js rename to src/scripts/autocast.js diff --git a/src/scripts/site.js b/src/scripts/site.js index e8f00080f1..c64ce43004 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -581,6 +581,7 @@ function initClient() { define('webSettings', [scriptsPath + '/settings/webSettings'], returnFirstDependency); define('appSettings', [scriptsPath + '/settings/appSettings'], returnFirstDependency); define('userSettings', [scriptsPath + '/settings/userSettings'], returnFirstDependency); + define('autocast', [scriptsPath + '/autocast'], returnFirstDependency); define('mediaSession', [componentsPath + '/playback/mediasession'], returnFirstDependency); define('actionsheet', [componentsPath + '/actionSheet/actionSheet'], returnFirstDependency); @@ -591,7 +592,6 @@ function initClient() { define('metadataEditor', [componentsPath + '/metadataEditor/metadataEditor'], returnFirstDependency); define('personEditor', [componentsPath + '/metadataEditor/personEditor'], returnFirstDependency); define('playerSelectionMenu', [componentsPath + '/playback/playerSelectionMenu'], returnFirstDependency); - define('autocast', [componentsPath + '/autocast'], returnFirstDependency); define('playerSettingsMenu', [componentsPath + '/playback/playersettingsmenu'], returnFirstDependency); define('playMethodHelper', [componentsPath + '/playback/playmethodhelper'], returnFirstDependency); define('brightnessOsd', [componentsPath + '/playback/brightnessosd'], returnFirstDependency); From ecad2e4bda6427bc15bb1a0115b5a2b11801d6c9 Mon Sep 17 00:00:00 2001 From: Ian Walton Date: Tue, 22 Sep 2020 07:34:46 -0400 Subject: [PATCH 4/4] Fix PR issues. --- src/components/playback/playerSelectionMenu.js | 8 +++----- src/scripts/autocast.js | 6 ++---- src/scripts/libraryMenu.js | 6 ------ 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index dcf36dd9b4..0afa56faf4 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -220,18 +220,16 @@ function showActivePlayerMenuInternal(dialogHelper, playerInfo) { html += ''; } - html += '
'; + html += '
'; if (autocast.supported()) { - html += '