diff --git a/package.json b/package.json index 04e5b8739e..a38cf6c843 100644 --- a/package.json +++ b/package.json @@ -332,6 +332,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/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 7799613400..0afa56faf4 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; @@ -221,6 +222,14 @@ function showActivePlayerMenuInternal(dialogHelper, playerInfo) { html += ''; + if (autocast.supported()) { + html += '
'; + } + html += '
'; html += ''; @@ -237,6 +246,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 +284,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/autocast.js b/src/scripts/autocast.js new file mode 100644 index 0000000000..84e07b32cd --- /dev/null +++ b/src/scripts/autocast.js @@ -0,0 +1,47 @@ +import events from 'events'; +import playbackManager from 'playbackManager'; + +export function supported() { + return typeof(Storage) !== 'undefined'; +} + +export function enable(enabled) { + if (!supported()) return; + + if (enabled) { + const currentPlayerInfo = playbackManager.getPlayerInfo(); + + if (currentPlayerInfo && 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() { + 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 && supported()) { + events.on(apiClient, 'websocketopen', onOpen); +} diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 10e4a3c9c9..422d82fff6 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -52,6 +52,7 @@ import 'flexStyles'; lazyLoadViewMenuBarImages(); bindMenuEvents(); + updateCastIcon(); } function getCurrentApiClient() { @@ -1002,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 868996f602..501f8258de 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); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index c6d225a64c..4eed373b46 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -186,6 +186,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",