diff --git a/package.json b/package.json
index 5ca5c1515..1521a1d91 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 000000000..3572f42bb
--- /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 779961340..3fe5be70d 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 04edecf19..7a332a853 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 f14670d82..e8f00080f 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 e39199c56..074d9c95f 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",