diff --git a/dashboard-ui/bower_components/emby-apiclient/.bower.json b/dashboard-ui/bower_components/emby-apiclient/.bower.json
index 0049afb342..9f7932c5f7 100644
--- a/dashboard-ui/bower_components/emby-apiclient/.bower.json
+++ b/dashboard-ui/bower_components/emby-apiclient/.bower.json
@@ -16,12 +16,12 @@
},
"devDependencies": {},
"ignore": [],
- "version": "1.1.90",
- "_release": "1.1.90",
+ "version": "1.1.91",
+ "_release": "1.1.91",
"_resolution": {
"type": "version",
- "tag": "1.1.90",
- "commit": "eb52e55b0f856ac89abcea9a71f475595d718627"
+ "tag": "1.1.91",
+ "commit": "f94b80f14bce6922acf1dbd749a60ad54e4abfd8"
},
"_source": "https://github.com/MediaBrowser/Emby.ApiClient.Javascript.git",
"_target": "^1.1.51",
diff --git a/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js b/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js
index 7733e5f94d..209ca317ee 100644
--- a/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js
+++ b/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js
@@ -1252,11 +1252,9 @@
if (!username) {
return Promise.reject();
- return;
}
if (!password) {
return Promise.reject();
- return;
}
return ajax({
diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json
index b09177f0ca..73b63d29e3 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json
+++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json
@@ -14,12 +14,12 @@
},
"devDependencies": {},
"ignore": [],
- "version": "1.4.313",
- "_release": "1.4.313",
+ "version": "1.4.321",
+ "_release": "1.4.321",
"_resolution": {
"type": "version",
- "tag": "1.4.313",
- "commit": "79c18a7f2b379d8162bdca36b7cf0713bbe43ad8"
+ "tag": "1.4.321",
+ "commit": "fb270e69c8391f62e762ee03d77a7b8a495c5a6f"
},
"_source": "https://github.com/MediaBrowser/emby-webcomponents.git",
"_target": "^1.2.1",
diff --git a/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js b/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js
index defcbdc205..57b19ce5e1 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js
@@ -51,15 +51,21 @@
return;
}
- setTimeout(function () {
-
+ var onAnimationComplete = function () {
+ dom.removeEventListener(backdropImage, 'animationend', onAnimationComplete, {
+ once: true
+ });
if (backdropImage === currentAnimatingElement) {
currentAnimatingElement = null;
}
if (existingBackdropImage && existingBackdropImage.parentNode) {
existingBackdropImage.parentNode.removeChild(existingBackdropImage);
}
- }, 800);
+ };
+
+ dom.addEventListener(backdropImage, 'animationend', onAnimationComplete, {
+ once: true
+ });
internalBackdrop(true);
};
diff --git a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js
index 90a5a1258f..f19ef75e07 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js
@@ -264,7 +264,7 @@ define(['browser'], function (browser) {
// Otherwise with HLS and mp3 audio we're seeing some browsers
// safari is lying
if ((videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/, '') && !browser.safari) || browser.edgeUwp || browser.tizen) {
- if ((options.disableVideoAudioCodecs || []).indexOf('ac3') == -1) {
+ if ((options.disableVideoAudioCodecs || []).indexOf('ac3') === -1) {
videoAudioCodecs.push('ac3');
// This works in edge desktop, but not mobile
diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css
index dc2d025541..c199706649 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css
+++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css
@@ -71,7 +71,7 @@ button {
.cardBox {
padding: 0 !important;
- margin: 0;
+ margin: 2px;
transition: none;
border: 3px solid transparent;
/* Needed in case cardBox is a button */
@@ -91,10 +91,6 @@ button {
transform: scale(1.16, 1.16);
}
-.cardBox-mobile {
- margin: 2px;
-}
-
.card:focus {
position: relative !important;
z-index: 10 !important;
@@ -202,6 +198,11 @@ button {
}
.coveredImage-img {
+ width: 100%;
+ height: 100%;
+}
+
+.coveredImage-noscale-img {
max-height: none;
max-width: none;
}
diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js
index b5d8c93293..d9d226ce62 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js
@@ -2,32 +2,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
function (datetime, imageLoader, connectionManager, itemHelper, mediaInfo, focusManager, indicators, globalize, layoutManager, appHost, dom) {
'use strict';
- // Regular Expressions for parsing tags and attributes
- var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
- // Match everything outside of normal chars and " (quote character)
- NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;
-
- /**
- * Escapes all potentially dangerous characters, so that the
- * resulting string can be safely inserted into attribute or
- * element text.
- * @param value
- * @returns {string} escaped text
- */
- function htmlEncode(value) {
- return value.
- replace(/&/g, '&').
- replace(SURROGATE_PAIR_REGEXP, function (value) {
- var hi = value.charCodeAt(0);
- var low = value.charCodeAt(1);
- return '' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
- }).
- replace(NON_ALPHANUMERIC_REGEXP, function (value) {
- return '' + value.charCodeAt(0) + ';';
- }).
- replace(//g, '>');
- }
+ var devicePixelRatio = window.devicePixelRatio || 1;
function getCardsHtml(items, options) {
@@ -1202,9 +1177,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
var separateCardBox = scalable;
var cardBoxClass = options.cardLayout ? 'cardBox visualCardBox' : 'cardBox';
- if (!layoutManager.tv) {
- cardBoxClass += ' cardBox-mobile';
- } else {
+ if (layoutManager.tv) {
cardBoxClass += ' cardBox-focustransform';
}
@@ -1300,7 +1273,11 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
var imgClass = 'cardImage cardImage-img lazy';
if (coveredImage) {
- imgClass += ' coveredImage-img';
+ if (devicePixelRatio === 1) {
+ imgClass += ' coveredImage-noscale-img';
+ } else {
+ imgClass += ' coveredImage-img';
+ }
}
cardImageContainerOpen += '
';
diff --git a/dashboard-ui/bower_components/emby-webcomponents/collectioneditor/collectioneditor.js b/dashboard-ui/bower_components/emby-webcomponents/collectioneditor/collectioneditor.js
index 73b9c8bd33..599e6e66f4 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/collectioneditor/collectioneditor.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/collectioneditor/collectioneditor.js
@@ -1,4 +1,5 @@
define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'embyRouter', 'globalize', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, connectionManager, embyRouter, globalize) {
+ 'use strict';
var currentServerId;
diff --git a/dashboard-ui/bower_components/emby-webcomponents/datetime.js b/dashboard-ui/bower_components/emby-webcomponents/datetime.js
index 2a8273c8f1..8ec07af932 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/datetime.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/datetime.js
@@ -148,12 +148,47 @@
}
}
- return toLocaleTimeString(date, {
+ if (toLocaleTimeStringSupportsLocales) {
+ return toLocaleTimeString(date, {
- hour: 'numeric',
- minute: '2-digit'
+ hour: 'numeric',
+ minute: '2-digit'
- });
+ });
+ }
+
+ var time = toLocaleTimeString(date);
+
+ var timeLower = time.toLowerCase();
+
+ if (timeLower.indexOf('am') !== -1 || timeLower.indexOf('pm') !== -1) {
+
+ time = timeLower;
+ var hour = date.getHours() % 12;
+ var suffix = date.getHours() > 11 ? 'pm' : 'am';
+ if (!hour) {
+ hour = 12;
+ }
+ var minutes = date.getMinutes();
+
+ if (minutes < 10) {
+ minutes = '0' + minutes;
+ }
+
+ minutes = ':' + minutes;
+ time = hour + minutes + suffix;
+ } else {
+
+ var timeParts = time.split(':');
+
+ // Trim off seconds
+ if (timeParts.length > 2) {
+ timeParts.length -= 1;
+ time = timeParts.join(':');
+ }
+ }
+
+ return time;
}
function isRelativeDay(date, offsetInDays) {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js
index 7c4ca8c98a..d2e00e0a1b 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js
@@ -3,6 +3,24 @@
var globalOnOpenCallback;
+ function enableAnimation() {
+
+ if (browser.animate) {
+ return true;
+ }
+
+ if (browser.edge) {
+ return true;
+ }
+
+ // An indication of an older browser
+ if (browser.noFlex) {
+ return false;
+ }
+
+ return true;
+ }
+
function removeCenterFocus(dlg) {
if (layoutManager.tv) {
@@ -136,10 +154,9 @@
backdropParent.parentNode.insertBefore(backdrop, backdropParent);
dlg.backdrop = backdrop;
- // Doing this immediately causes the opacity to jump immediately without animating
- setTimeout(function () {
- backdrop.classList.add('dialogBackdropOpened');
- }, 0);
+ // trigger reflow or the backdrop will not animate
+ void backdrop.offsetWidth;
+ backdrop.classList.add('dialogBackdropOpened');
dom.addEventListener((dlg.dialogContainer || backdrop), 'click', function (e) {
if (e.target === dlg.dialogContainer) {
@@ -226,27 +243,59 @@
}
};
- setTimeout(onAnimationFinish, dlg.animationConfig.entry.timing.duration);
+ if (enableAnimation()) {
+
+ var onFinish = function () {
+ dom.removeEventListener(dlg, 'animationend', onFinish, {
+ once: true
+ });
+ onAnimationFinish();
+ };
+ dom.addEventListener(dlg, 'animationend', onFinish, {
+ once: true
+ });
+ return;
+ }
+
+ onAnimationFinish();
}
function animateDialogClose(dlg, onAnimationFinish) {
- switch (dlg.animationConfig.exit.name) {
+ if (enableAnimation()) {
- case 'fadeout':
- dlg.style.animation = 'fadeout ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both';
- break;
- case 'scaledown':
- dlg.style.animation = 'scaledown ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both';
- break;
- case 'slidedown':
- dlg.style.animation = 'slidedown ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both';
- break;
- default:
- break;
+ var animated = true;
+ switch (dlg.animationConfig.exit.name) {
+
+ case 'fadeout':
+ dlg.style.animation = 'fadeout ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both';
+ break;
+ case 'scaledown':
+ dlg.style.animation = 'scaledown ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both';
+ break;
+ case 'slidedown':
+ dlg.style.animation = 'slidedown ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both';
+ break;
+ default:
+ animated = false;
+ break;
+ }
+ var onFinish = function () {
+ dom.removeEventListener(dlg, 'animationend', onFinish, {
+ once: true
+ });
+ onAnimationFinish();
+ };
+ dom.addEventListener(dlg, 'animationend', onFinish, {
+ once: true
+ });
+
+ if (animated) {
+ return;
+ }
}
- setTimeout(onAnimationFinish, dlg.animationConfig.exit.timing.duration);
+ onAnimationFinish();
}
function shouldLockDocumentScroll(options) {
@@ -270,15 +319,26 @@
var backdrop = dlg.backdrop;
- if (backdrop) {
- dlg.backdrop = null;
+ if (!backdrop) {
+ return;
+ }
+
+ dlg.backdrop = null;
+
+ var onAnimationFinish = function () {
+ backdrop.parentNode.removeChild(backdrop);
+ };
+
+ if (enableAnimation()) {
backdrop.classList.remove('dialogBackdropOpened');
- setTimeout(function () {
- backdrop.parentNode.removeChild(backdrop);
- }, 300);
+ // this is not firing animatonend
+ setTimeout(onAnimationFinish, 300);
+ return;
}
+
+ onAnimationFinish();
}
function centerFocus(elem, horiz, on) {
@@ -375,19 +435,21 @@
dlg.classList.add('dialog-' + options.size);
}
- switch (dlg.animationConfig.entry.name) {
+ if (enableAnimation()) {
+ switch (dlg.animationConfig.entry.name) {
- case 'fadein':
- dlg.style.animation = 'fadein ' + entryAnimationDuration + 'ms ease-out normal';
- break;
- case 'scaleup':
- dlg.style.animation = 'scaleup ' + entryAnimationDuration + 'ms ease-out normal both';
- break;
- case 'slideup':
- dlg.style.animation = 'slideup ' + entryAnimationDuration + 'ms ease-out normal';
- break;
- default:
- break;
+ case 'fadein':
+ dlg.style.animation = 'fadein ' + entryAnimationDuration + 'ms ease-out normal';
+ break;
+ case 'scaleup':
+ dlg.style.animation = 'scaleup ' + entryAnimationDuration + 'ms ease-out normal both';
+ break;
+ case 'slideup':
+ dlg.style.animation = 'slideup ' + entryAnimationDuration + 'ms ease-out normal';
+ break;
+ default:
+ break;
+ }
}
return dlg;
diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js
index 27ab9d3de2..cef357c8f3 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js
@@ -1,4 +1,5 @@
define(['itemShortcuts', 'connectionManager', 'layoutManager', 'browser', 'dom', 'loading', 'serverNotifications', 'events', 'registerElement'], function (itemShortcuts, connectionManager, layoutManager, browser, dom, loading, serverNotifications, events) {
+ 'use strict';
var ItemsContainerProtoType = Object.create(HTMLDivElement.prototype);
diff --git a/dashboard-ui/bower_components/emby-webcomponents/filedownloader.js b/dashboard-ui/bower_components/emby-webcomponents/filedownloader.js
index d814ed616c..ebd004da68 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/filedownloader.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/filedownloader.js
@@ -1,4 +1,5 @@
define(['multi-download'], function (multiDownload) {
+ 'use strict';
return {
download: function (items) {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreen-doubleclick.js b/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreen-doubleclick.js
index 6cb7b76b5e..762e391633 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreen-doubleclick.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreen-doubleclick.js
@@ -1,4 +1,5 @@
define(['dom', 'fullscreenManager'], function (dom, fullscreenManager) {
+ 'use strict';
dom.addEventListener(window, 'dblclick', function () {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreenmanager.js b/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreenmanager.js
index 5e3a54d914..18a4eb7b12 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreenmanager.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/fullscreen/fullscreenmanager.js
@@ -1,4 +1,5 @@
define([], function () {
+ 'use strict';
function fullscreenManager() {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
index d5f388ee0b..f8477c2345 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
+++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
@@ -317,8 +317,9 @@
padding: 0 .5em 0;
overflow: hidden;
text-overflow: ellipsis;
- display: flex;
align-items: center;
+ /* Need block here or the ellipsis overflow is lost */
+ display: block;
}
.programIcon {
@@ -335,6 +336,20 @@
margin-left: .25em;
}
+.programTextIcon {
+ font-weight: bold;
+ color: rgb(30,30,30);
+ font-size: .9em;
+ background: #555;
+ padding: .18em .32em;
+ border-radius: .25em;
+ margin-right: .35em;
+}
+
+.programTextIcon-tv {
+ font-size: .7em;
+}
+
.guideChannelNumber {
padding-left: 1em;
max-width: 30%;
diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js
index 390a695d54..25bd342899 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js
@@ -378,7 +378,7 @@
return '';
}
- function getChannelProgramsHtml(context, date, channel, programs, options) {
+ function getChannelProgramsHtml(context, date, channel, programs, options, index) {
var html = '';
@@ -482,7 +482,7 @@
timerAttributes += ' data-seriestimerid="' + program.SeriesTimerId + '"';
}
- html += '