diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json
index feb70b56c7..340f24d719 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.351",
- "_release": "1.4.351",
+ "version": "1.4.354",
+ "_release": "1.4.354",
"_resolution": {
"type": "version",
- "tag": "1.4.351",
- "commit": "0369e11308d178da80ef85d261cc75b84a273f13"
+ "tag": "1.4.354",
+ "commit": "3d8a04970adc76c6197984d6c2e29967cfa6b25e"
},
"_source": "https://github.com/MediaBrowser/emby-webcomponents.git",
"_target": "^1.2.1",
diff --git a/dashboard-ui/bower_components/emby-webcomponents/browser.js b/dashboard-ui/bower_components/emby-webcomponents/browser.js
index 8f4fb0d54d..75131c8aec 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/browser.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/browser.js
@@ -116,6 +116,38 @@
return false;
}
+ var _supportsCssAnimation;
+ function supportsCssAnimation() {
+
+ if (_supportsCssAnimation === true || _supportsCssAnimation === false) {
+ return _supportsCssAnimation;
+ }
+
+ var animation = false,
+ animationstring = 'animation',
+ keyframeprefix = '',
+ domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
+ pfx = '',
+ elm = document.createElement('div');
+
+ if (elm.style.animationName !== undefined) { animation = true; }
+
+ if (animation === false) {
+ for (var i = 0; i < domPrefixes.length; i++) {
+ if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {
+ pfx = domPrefixes[i];
+ animationstring = pfx + 'Animation';
+ keyframeprefix = '-' + pfx.toLowerCase() + '-';
+ animation = true;
+ break;
+ }
+ }
+ }
+
+ _supportsCssAnimation = animation;
+ return _supportsCssAnimation;
+ }
+
var uaMatch = function (ua) {
ua = ua.toLowerCase();
@@ -196,7 +228,6 @@
if (userAgent.toLowerCase().indexOf("playstation 4") !== -1) {
browser.ps4 = true;
- browser.tv = true;
}
if (isMobile(userAgent)) {
@@ -225,6 +256,7 @@
}
browser.keyboard = hasKeyboard(browser);
+ browser.supportsCssAnimation = supportsCssAnimation;
return browser;
});
\ No newline at end of file
diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js
index 9dc002043c..cab9e604d0 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js
@@ -13,6 +13,10 @@
return true;
}
+ if (!browser.supportsCssAnimation()) {
+ return false;
+ }
+
// An indication of an older browser
if (browser.noFlex) {
return false;
diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.js b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.js
index 64e7c19f6c..4733901752 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.js
@@ -73,7 +73,7 @@
this.classList.add('emby-button');
- if (browser.safari || browser.firefox || browser.noFlex) {
+ if (browser.safari || browser.firefox) {
this.classList.add('emby-button-noflex');
}
diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.css b/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.css
index bc8c64198a..da14f584aa 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.css
+++ b/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.css
@@ -83,78 +83,82 @@ _:-ms-input-placeholder, :root .mdl-slider {
transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
}
- .mdl-slider::-moz-range-thumb {
- -moz-appearance: none;
- width: 1em;
- height: 1em;
- box-sizing: border-box;
- border-radius: 50%;
- background-image: none;
- background: #52B54B;
- border: none;
- }
+.slider-no-webkit-thumb::-webkit-slider-thumb {
+ opacity: 0 !important;
+}
- .mdl-slider:active::-webkit-slider-thumb {
- background-image: none;
- background: #52B54B;
- -webkit-transform: scale(1.5);
- transform: scale(1.5);
- }
+.mdl-slider::-moz-range-thumb {
+ -moz-appearance: none;
+ width: 1em;
+ height: 1em;
+ box-sizing: border-box;
+ border-radius: 50%;
+ background-image: none;
+ background: #52B54B;
+ border: none;
+}
- .mdl-slider:active::-moz-range-thumb {
- background-image: none;
- background: #52B54B;
- transform: scale(1.5);
- }
+.mdl-slider:active::-webkit-slider-thumb {
+ background-image: none;
+ background: #52B54B;
+ -webkit-transform: scale(1.5);
+ transform: scale(1.5);
+}
- .mdl-slider:focus::-webkit-slider-thumb {
- box-shadow: 0 0 0 10px rgba(82, 181, 75, 0.26);
- }
+.mdl-slider:active::-moz-range-thumb {
+ background-image: none;
+ background: #52B54B;
+ transform: scale(1.5);
+}
- .mdl-slider:focus::-moz-range-thumb {
- box-shadow: 0 0 0 10px rgba(82, 181, 75, 0.26);
- }
+.mdl-slider:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 10px rgba(82, 181, 75, 0.26);
+}
- .mdl-slider::-ms-thumb {
- width: 16px;
- height: 16px;
- border: none;
- border-radius: 50%;
- background: #52B54B;
- }
+.mdl-slider:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 10px rgba(82, 181, 75, 0.26);
+}
- .mdl-slider[disabled]::-ms-thumb {
- background: gray;
- }
+.mdl-slider::-ms-thumb {
+ width: 16px;
+ height: 16px;
+ border: none;
+ border-radius: 50%;
+ background: #52B54B;
+}
- .mdl-slider:disabled:focus::-webkit-slider-thumb, .mdl-slider:disabled:active::-webkit-slider-thumb, .mdl-slider:disabled::-webkit-slider-thumb {
- -webkit-transform: scale(0.667);
- transform: scale(0.667);
- background: rgba(0,0,0, 0.26);
- }
+.mdl-slider[disabled]::-ms-thumb {
+ background: gray;
+}
- .mdl-slider:disabled:focus::-moz-range-thumb, .mdl-slider:disabled:active::-moz-range-thumb, .mdl-slider:disabled::-moz-range-thumb {
- transform: scale(0.667);
- background: rgba(0,0,0, 0.26);
- }
+.mdl-slider:disabled:focus::-webkit-slider-thumb, .mdl-slider:disabled:active::-webkit-slider-thumb, .mdl-slider:disabled::-webkit-slider-thumb {
+ -webkit-transform: scale(0.667);
+ transform: scale(0.667);
+ background: rgba(0,0,0, 0.26);
+}
- .mdl-slider:disabled + .mdl-slider__background-flex > .mdl-slider__background-lower {
- background-color: #444;
- left: -6px;
- }
+.mdl-slider:disabled:focus::-moz-range-thumb, .mdl-slider:disabled:active::-moz-range-thumb, .mdl-slider:disabled::-moz-range-thumb {
+ transform: scale(0.667);
+ background: rgba(0,0,0, 0.26);
+}
- .mdl-slider:disabled + .mdl-slider__background-flex > .mdl-slider__background-upper {
- left: 6px;
- }
+.mdl-slider:disabled + .mdl-slider__background-flex > .mdl-slider__background-lower {
+ background-color: #444;
+ left: -6px;
+}
- .mdl-slider:disabled::-ms-fill-lower {
- margin-right: 6px;
- background: linear-gradient(to right, transparent, transparent 25px, rgba(30,30,30, 0.7) 25px, rgba(30,30,30, 0.7) 0);
- }
+.mdl-slider:disabled + .mdl-slider__background-flex > .mdl-slider__background-upper {
+ left: 6px;
+}
- .mdl-slider:disabled::-ms-fill-upper {
- margin-left: 6px;
- }
+.mdl-slider:disabled::-ms-fill-lower {
+ margin-right: 6px;
+ background: linear-gradient(to right, transparent, transparent 25px, rgba(30,30,30, 0.7) 25px, rgba(30,30,30, 0.7) 0);
+}
+
+.mdl-slider:disabled::-ms-fill-upper {
+ margin-left: 6px;
+}
.mdl-slider__ie-container {
height: 18px;
diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.js b/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.js
index 152d842d7e..258aaaa128 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.js
@@ -57,6 +57,10 @@
this.classList.add('mdl-slider');
this.classList.add('mdl-js-slider');
+ if (browser.noFlex) {
+ this.classList.add('slider-no-webkit-thumb')
+ }
+
var containerElement = this.parentNode;
containerElement.classList.add('mdl-slider__container');
diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
index 73a7957f69..52efbb2bba 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
+++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
@@ -270,6 +270,7 @@
.programGrid {
padding-bottom: 4px;
+ flex-grow: 1;
}
.timeslotHeader {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js b/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js
index ff33a60cc7..dff7a76577 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js
@@ -9,10 +9,6 @@ define(['browser', 'dom', 'css!./viewcontainer-lite'], function (browser, dom) {
function enableAnimation() {
- if (browser.animate) {
- return true;
- }
-
if (browser.tv) {
return false;
}
@@ -21,7 +17,7 @@ define(['browser', 'dom', 'css!./viewcontainer-lite'], function (browser, dom) {
return false;
}
- return browser.edge && !browser.mobile;
+ return browser.supportsCssAnimation();
}
function loadView(options) {
@@ -102,7 +98,7 @@ define(['browser', 'dom', 'css!./viewcontainer-lite'], function (browser, dom) {
function animate(newAnimatedPage, oldAnimatedPage, transition, isBack) {
- if (enableAnimation() && oldAnimatedPage && newAnimatedPage.animate) {
+ if (enableAnimation() && oldAnimatedPage) {
if (transition === 'slide') {
return slide(newAnimatedPage, oldAnimatedPage, transition, isBack);
} else if (transition === 'fade') {
@@ -262,10 +258,6 @@ define(['browser', 'dom', 'css!./viewcontainer-lite'], function (browser, dom) {
selectedPageIndex = -1;
}
- if (enableAnimation()) {
- require(['webAnimations']);
- }
-
return {
loadView: loadView,
tryRestoreView: tryRestoreView,
diff --git a/dashboard-ui/components/chromecasthelpers.js b/dashboard-ui/components/chromecasthelpers.js
index 0dae48cdf8..def7031de2 100644
--- a/dashboard-ui/components/chromecasthelpers.js
+++ b/dashboard-ui/components/chromecasthelpers.js
@@ -1,4 +1,4 @@
-define([], function () {
+define(['events'], function (events) {
'use strict';
// LinkParser
@@ -42,52 +42,6 @@
+ "(?:\\:(?:[a-z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-f0-9]{2})){1,25})?" // followed by optional password (: + 1-25 normal or url escaped characters)
+ "\\@)";
- var hostnames = "(?:[a-z0-9][a-z0-9\\-]{0,64}\\.)+"; // named host
- var unknownTLDs = "(?:[a-z]{2,})";
-
- // unicode regexp isn't really supported in JS. It can be emulated with XRegExp
- // but that creates a pretty big performance hit that
- // is very noticable on mobile devices. We'll add an option in the future to
- // support them.
- var XRegExp_hostnames = "(?:[\\p{L}0-9][\\p{L}0-9\\-]{0,64}\\.)+"; // named host
- var XRegExp_unknownTLDs = "(?:[\\p{L}]{2,})"; // top level domain
-
- // strings that start with one of these are more likely to be URLs
- var knownSubdomains = "(?:(?:www|ftp)\\.)";
-
- // update from here when needed: https://data.iana.org/TLD/tlds-alpha-by-domain.txt
- var knownTLDs = "(?:"
- + "A[CDEFGILMNOQRSTUWXZ]|ACADEMY|ACCOUNTANTS|ACTOR|AERO|AGENCY|AIRFORCE|ARCHI|ARPA|ASIA|ASSOCIATES|AUDIO|AUTOS|AXA"
- + "|B[ABDEFGHIJMNORSTVWYZ]|BAR|BARGAINS|BAYERN|BEER|BERLIN|BEST|BID|BIKE|BIZ|BLACK|BLACKFRIDAY|BLUE|BOUTIQUE|BUILD|BUILDERS|BUZZ"
- + "|C[ACDFGHIKLMNORUVWXYZ]|CAB|CAMERA|CAMP|CAPITAL|CARDS|CARE|CAREER|CAREERS|CASH|CAT|CATERING|CENTER|CEO|CHEAP|CHRISTMAS|CHURCH|CITIC|CLAIMS|CLEANING|CLINIC|CLOTHING|CLUB|CODES|COFFEE|COLLEGE|COLOGNE|COM|COMMUNITY|COMPANYCOMPUTER|CONDOS|CONSTRUCTION|CONSULTING|CONTRACTORS|COOKING|COOL|COOP|COUNTRY|CREDIT|CREDITCARD|CRUISES"
- + "|D[EJKMOZ]|DANCE|DATING|DEMOCRAT|DENTAL|DESI|DIAMONDS|DIGITAL|DIRECTORY|DISCOUNT|DNP|DOMAINS"
- + "|E[CEGRSTU]|EDU|EDUCATION|EMAIL|ENGINEERING|ENTERPRISES|EQUIPMENT|ESTATE|EUS|EVENTS|EXCHANGE|EXPERT|EXPOSED"
- + "|F[IJKMOR]|FAIL|FARM|FEEDBACK|FINANCE|FINANCIAL|FISH|FISHING|FITNESS|FLIGHTS|FLORIST|FOO|FOUNDATION|FROGANS|FUND|FURNITURE|FUTBOL"
- + "|G[ABDEFGHILMNPQRSTUWY]|GAL|GALLERY|GIFT|GLASS|GLOBO|GMO|GOP|GOV|GRAPHICS|GRATIS|GRIPE|GUIDE|GUITARS|GURU"
- + "|H[KMNRTU]|HAUS|HIPHOP|HOLDINGS|HOLIDAY|HOMES|HORSE|HOUSE"
- + "|I[DELMNOQRST]|IMMOBILIEN|INDUSTRIES|INFO|INK|INSTITUTE|INSURE|INT|INTERNATIONAL|INVESTMENTS"
- + "|J[EMOP]|JETZT|JOBS|JUEGOS"
- + "|K[EGHIMNPRWYZ]|KAUFEN|KIM|KITCHEN|KIWI|KOELN|KRED"
- + "|L[ABCIKRSTUVY]|LAND|LEASE|LIFE|LIGHTING|LIMITED|LIMO|LINK|LOANS|LONDON|LUXE|LUXURY"
- + "|M[ACDEGHKLMNOPQRSTUVWXYZ]|MAISON|MANAGEMENT|MANGO|MARKETING|MEDIA|MEET|MENU|MIAMI|MIL|MOBI|MODA|MOE|MONASH|MOSCOW|MOTORCYCLES|MUSEUM"
- + "|N[ACEFGILOPRUZ]|NAGOYA|NAME|NET|NEUSTAR|NINJA|NYC"
- + "|O[M]|OKINAWA|ONL|ORG"
- + "|P[AEFGHKLMNRSTWY]|PARIS|PARTNERS|PARTS|PHOTO|PHOTOGRAPHY|PHOTOS|PICS|PICTURES|PINK|PLUMBING|POST|PRO|PRODUCTIONS|PROPERTIES|PUB"
- + "|Q[A]|QPON|QUEBEC"
- + "|R[EOSUW]|RECIPES|RED|REISE|REISEN|REN|RENTALS|REPAIR|REPORT|REST|REVIEWS|RICH|RIO|ROCKS|RODEO|RUHR|RYUKYU"
- + "|S[ABCDEGHIJKLMNORTUVXYZ]|SAARLAND|SCHULE|SERVICES|SEXY|SHIKSHA|SHOES|SINGLES|SOCIAL|SOHU|SOLAR|SOLUTIONS|SOY|SUPPLIES|SUPPLY|SUPPORT|SURGERY|SYSTEMS"
- + "|T[CDFGHJKLMNOPRTVWZ]|TATTOO|TAX|TECHNOLOGY|TEL|TIENDA|TIPS|TODAY|TOKYO|TOOLS|TOWN|TOYS|TRADE|TRAINING|TRAVEL"
- + "|U[AGKSYZ]|UNIVERSITY|UNO"
- + "|V[ACEGINU]|VACATIONS|VEGAS|VENTURES|VERSICHERUNG|VIAJES|VILLAS|VISION|VODKA|VOTE|VOTING|VOTO|VOYAGE"
- + "|W[FS]|WANG|WATCH|WEBCAM|WED|WIEN|WIKI|WORKS|WTC|WTF"
- + "|XXX|XYZ"
- + "|Y[ET]|YACHTS|YOKOHAMA"
- + "|Z[AMW]|ZONE"
- // IDN TLDs in both punycode and unicode format
- + "|XN--(?:3BST00M|3DS443G|3E0B707E|45BRJ9C|55QW42G|55QX5D|6FRZ82G|6QQ986B3XL|80ADXHKS|80AO21A|80ASEHDB|80ASWG|90A3AC|C1AVG|CG4BKI|CLCHC0EA0B2G2A9GCD|CZR694B|CZRU2D|D1ACJ3B|FIQ228C5HS|FIQ64B|FIQS8S|FIQZ9S|FPCRJ9C3D|FZC2C9E2C|GECRJ9C|H2BRJ9C|I1B6B1A6A2E|IO0A7I|J1AMH|J6W193G|KPRW13D|KPRY57D|L1ACC|LGBBAT1AD8J|MGB9AWBF|MGBA3A4F16A|MGBAAM7A8H|MGBAB2BD|MGBAYH7GPA|MGBBH1A71E|MGBC0A9AZCG|MGBERP4A5D4AR|MGBX4CD0AB|NGBC5AZD|NQV7F|NQV7FS00EMA|O3CW4H|OGBPF8FL|P1AI|PGBS0DH|Q9JYB4C|RHQV96G|S9BRJ9C|SES554G|UNUP4Y|WGBH1C|WGBL6A|XKC2AL3HYE2A|XKC2DL3A5EE0H|YFRO4I67O|YGBI2AMMX|ZFR164B)"
- + "|\u0627\u0644\u0627\u0631\u062F\u0646|\u4E2D\u570B|\u4E2D\u56FD|\u0627\u0645\u0627\u0631\u0627\u062A|\u9999\u6E2F|\u0627\u06CC\u0631\u0627\u0646|\u0DBD\u0D82\u0D9A\u0DCF|\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8|\u0645\u0635\u0631|\u0642\u0637\u0631|\u0420\u0424|\u0633\u0648\u0631\u064A\u0629|\u53F0\u7063|\u53F0\u6E7E"
- + ")";
-
// IPv6 Regex http://forums.intermapper.com/viewtopic.php?t=452
// by Dartware, LLC is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License
// http://intermapper.com/
@@ -117,45 +71,7 @@
// If we have a recognized protocol at the beginning of the URL, we're
// more relaxed about what we accept, because we assume the user wants
// this to be a URL, and we're not accidentally matching human language
- + protocols
-
- // optional username:password@
- + credentials + "?"
-
- // loose definition of a host name
- // any valid unicode sequence is ok for domain
- // this is our failsafe. If we don't recognize a TLD (because new TLDs are
- // constantly being added) and the host name doesn't start with a common
- // prefix like www, then this should catch anything that begins with a
- // valid protocol (above)
- + hostnames + unknownTLDs
-
- // ============================
- // OR no protocol and a stricter form of a host name, with something that
- // we recognize as a likely URL. This will hopefully keep us from matching
- // typos like.this as a URL.
- + "|(?!" + protocols + ")"
-
- // optional username:password@
- + credentials + "?"
-
- + "(?:"
-
- // ends with known TLD
- + hostnames + knownTLDs
-
- // OR begins with a known common subdomain
- + "|" + knownSubdomains + hostnames + unknownTLDs
-
- // OR contains a slash after the TLD (very likely a URL, unlikely to exist in common language)
- + "|" + hostnames + unknownTLDs + "(?=\\/)" // use a lookahead so we don't pre-match the path below
-
- + ")"
-
- // ============================
- // OR we'll also accept IPv6 and IPv4 addresses, with or without a protocol, since it's highly
- // unlikely that these would appear in normal language without being intended as a URL
- + "|" + protocols + "?"
+ + protocols + "?"
// optional username:password@
+ credentials + "?"
@@ -309,8 +225,8 @@
return null;
}
- Events.on(ConnectionManager, 'localusersignedin', clearCache);
- Events.on(ConnectionManager, 'localusersignedout', clearCache);
+ events.on(ConnectionManager, 'localusersignedin', clearCache);
+ events.on(ConnectionManager, 'localusersignedout', clearCache);
return {
getServerAddress: getServerAddress
diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js
index 77af3ed513..1bd77bb7a6 100644
--- a/dashboard-ui/scripts/itemdetailpage.js
+++ b/dashboard-ui/scripts/itemdetailpage.js
@@ -994,7 +994,7 @@
var context = inferContext(item);
- var href = LibraryBrowser.getHref(item.Studios[i], context);
+ var href = LibraryBrowser.getHref(item.Studios[0], context);
html += ' on ' + item.Studios[0].Name + '';
}
}