diff --git a/.eslintrc.yml b/.eslintrc.yml
index 943b958ecd..4110862a11 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -1,3 +1,4 @@
env:
+ es6: true
browser: true
amd: true
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 2b7a71134d..0dd6a53512 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -20,6 +20,7 @@
- [TtheCreator](https://github.com/Tthecreator)
- [RazeLighter777](https://github.com/RazeLighter777)
- [LogicalPhallacy](https://github.com/LogicalPhallacy)
+ - [thornbill](https://github.com/thornbill)
- [redSpoutnik](https://github.com/redSpoutnik)
# Emby Contributors
diff --git a/src/addserver.html b/src/addserver.html
index f87e889502..a5c67ddcee 100644
--- a/src/addserver.html
+++ b/src/addserver.html
@@ -3,7 +3,7 @@
';
- //if (itemHelper.canEdit({ Policy: { IsAdministrator: true } }, item)) {
-
- // //require(['emby-playstatebutton']);
- // html += '
';
- //}
-
var userData = item.UserData || {};
if (itemHelper.canMarkPlayed(item)) {
diff --git a/src/components/chromecast/chromecasthelpers.js b/src/components/chromecast/chromecasthelpers.js
index c86233207d..0beba824c0 100644
--- a/src/components/chromecast/chromecasthelpers.js
+++ b/src/components/chromecast/chromecasthelpers.js
@@ -187,8 +187,13 @@ define(['events'], function (events) {
return apiClient.getEndpointInfo().then(function (endpoint) {
if (endpoint.IsInNetwork) {
return apiClient.getPublicSystemInfo().then(function (info) {
- addToCache(serverAddress, info.LocalAddress);
- return info.LocalAddress;
+ var localAddress = info.LocalAddress
+ if (!localAddress) {
+ console.log("No valid local address returned, defaulting to external one")
+ localAddress = serverAddress;
+ }
+ addToCache(serverAddress, localAddress);
+ return localAddress;
});
} else {
addToCache(serverAddress, serverAddress);
diff --git a/src/components/chromecast/chromecastplayer.js b/src/components/chromecast/chromecastplayer.js
index d276bb4de2..9b382aeecf 100644
--- a/src/components/chromecast/chromecastplayer.js
+++ b/src/components/chromecast/chromecastplayer.js
@@ -220,7 +220,9 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.session = null;
this.deviceState = DEVICE_STATE.IDLE;
this.castPlayerState = PLAYER_STATE.IDLE;
-
+ document.removeEventListener("volumeupbutton", onVolumeUpKeyDown, false);
+ document.removeEventListener("volumedownbutton", onVolumeDownKeyDown, false);
+
//console.log('sessionUpdateListener: setting currentMediaSession to null');
this.currentMediaSession = null;
@@ -258,6 +260,9 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.session.addMediaListener(this.sessionMediaListener.bind(this));
this.session.addUpdateListener(this.sessionUpdateListener.bind(this));
+ document.addEventListener("volumeupbutton", onVolumeUpKeyDown, false);
+ document.addEventListener("volumedownbutton", onVolumeDownKeyDown, false);
+
events.trigger(this, 'connect');
this.sendMessage({
@@ -266,6 +271,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
});
};
+ function onVolumeUpKeyDown() {
+ playbackManager.volumeUp();
+ }
+
+ function onVolumeDownKeyDown() {
+ playbackManager.volumeDown();
+ }
+
/**
* session update listener
*/
@@ -305,6 +318,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
//console.log(message);
this.deviceState = DEVICE_STATE.IDLE;
this.castPlayerState = PLAYER_STATE.IDLE;
+ document.removeEventListener("volumeupbutton", onVolumeUpKeyDown, false);
+ document.removeEventListener("volumedownbutton", onVolumeDownKeyDown, false);
//console.log('onStopAppSuccess: setting currentMediaSession to null');
this.currentMediaSession = null;
@@ -574,8 +589,15 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
events.trigger(instance, "playbackstop", [state]);
+ var state = instance.lastPlayerData.PlayState || {};
+ var volume = state.VolumeLevel || 0.5;
+ var mute = state.IsMuted || false;
+
// Reset this so the next query doesn't make it appear like content is playing.
instance.lastPlayerData = {};
+ instance.lastPlayerData.PlayState = {};
+ instance.lastPlayerData.PlayState.VolumeLevel = volume;
+ instance.lastPlayerData.PlayState.IsMuted = mute;
});
events.on(instance._castPlayer, "playbackprogress", function (e, data) {
@@ -780,11 +802,16 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
};
ChromecastPlayer.prototype.volumeDown = function () {
+ var vol = this._castPlayer.session.receiver.volume.level;
+ if (vol == null)
+ {
+ vol = 0.5;
+ }
+ vol -= 0.05;
+ vol = Math.max(vol, 0);
+
+ this._castPlayer.session.setReceiverVolumeLevel(vol);
- this._castPlayer.sendMessage({
- options: {},
- command: 'VolumeDown'
- });
};
ChromecastPlayer.prototype.endSession = function () {
@@ -799,24 +826,24 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
};
ChromecastPlayer.prototype.volumeUp = function () {
+ var vol = this._castPlayer.session.receiver.volume.level;
+ if (vol == null)
+ {
+ vol = 0.5;
+ }
+ vol += 0.05;
+ vol = Math.min(vol, 1);
- this._castPlayer.sendMessage({
- options: {},
- command: 'VolumeUp'
- });
+ this._castPlayer.session.setReceiverVolumeLevel(vol);
};
ChromecastPlayer.prototype.setVolume = function (vol) {
vol = Math.min(vol, 100);
vol = Math.max(vol, 0);
-
- this._castPlayer.sendMessage({
- options: {
- volume: vol
- },
- command: 'SetVolume'
- });
+ vol = vol / 100;
+
+ this._castPlayer.session.setReceiverVolumeLevel(vol);
};
ChromecastPlayer.prototype.unpause = function () {
diff --git a/src/components/displaysettings/displaysettings.js b/src/components/displaysettings/displaysettings.js
index 680c6b634b..fea7d9bd3e 100644
--- a/src/components/displaysettings/displaysettings.js
+++ b/src/components/displaysettings/displaysettings.js
@@ -2,25 +2,19 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
"use strict";
function fillThemes(select, isDashboard) {
-
select.innerHTML = skinManager.getThemes().map(function (t) {
-
var value = t.id;
-
if (t.isDefault && !isDashboard) {
value = '';
- }
- else if (t.isDefaultServerDashboard && isDashboard) {
+ } else if (t.isDefaultServerDashboard && isDashboard) {
value = '';
}
return '
' + t.name + ' ';
-
}).join('');
}
function loadScreensavers(context, userSettings) {
-
var selectScreensaver = context.querySelector('.selectScreensaver');
var options = pluginManager.ofType('screensaver').map(function (plugin) {
return {
diff --git a/src/components/emby-slider/emby-slider.css b/src/components/emby-slider/emby-slider.css
index 179270e22f..4a04571414 100644
--- a/src/components/emby-slider/emby-slider.css
+++ b/src/components/emby-slider/emby-slider.css
@@ -158,8 +158,6 @@ _:-ms-input-placeholder {
}
.mdl-slider-background-flex-container {
- padding-left: 10px;
- padding-right: 10px;
width: 100%;
box-sizing: border-box;
margin-top: -.05em;
diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js
index fa7b5aee16..e50bc1c532 100644
--- a/src/components/favoriteitems.js
+++ b/src/components/favoriteitems.js
@@ -111,7 +111,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad
var html = "";
if (result.Items.length) {
if (html += '
', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) {
- html += '
', html += '', html += globalize.translate(section.name), html += " ", html += ' ', html += " "
+ html += '
', html += '', html += globalize.translate(section.name), html += " ", html += ' ', html += " "
} else html += '
' + globalize.translate(section.name) + " ";
if (html += "
", enableScrollX()) {
var scrollXClass = "scrollX hiddenScrollX";
diff --git a/src/components/globalize.js b/src/components/globalize.js
index 32b6412a42..aa3a2ef0f9 100644
--- a/src/components/globalize.js
+++ b/src/components/globalize.js
@@ -127,12 +127,17 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana
function loadStrings(options) {
var locale = getCurrentLocale();
+ var promises = [];
+ var optionsName;
if (typeof options === 'string') {
- return ensureTranslation(allTranslations[options], locale);
+ optionsName = options;
} else {
+ optionsName = options.name;
register(options);
- return ensureTranslation(allTranslations[options.name], locale);
}
+ promises.push(ensureTranslation(allTranslations[optionsName], locale));
+ promises.push(ensureTranslation(allTranslations[optionsName], fallbackCulture));
+ return Promise.all(promises);
}
var cacheParam = new Date().getTime();
diff --git a/src/components/homescreensettings/homescreensettings.template.html b/src/components/homescreensettings/homescreensettings.template.html
index 6295af0dfa..2cb1dcbe14 100644
--- a/src/components/homescreensettings/homescreensettings.template.html
+++ b/src/components/homescreensettings/homescreensettings.template.html
@@ -1,10 +1,6 @@