diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json
index 6de88d166a..5ed545b059 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.451",
- "_release": "1.4.451",
+ "version": "1.4.453",
+ "_release": "1.4.453",
"_resolution": {
"type": "version",
- "tag": "1.4.451",
- "commit": "521e1c545a373b8768307a3d895bf1544fcbefa5"
+ "tag": "1.4.453",
+ "commit": "26b21ef107f8d0042c200bb825b85492beeafe80"
},
"_source": "https://github.com/MediaBrowser/emby-webcomponents.git",
"_target": "^1.2.1",
diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
index 2961efdcfc..5661c64d9e 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
+++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
@@ -14,7 +14,7 @@
.guideHeaderDateSelection {
font-size: 86%;
- padding: .4em 0 .2em;
+ padding: .4em 0;
}
.guideHeaderTimeslots {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js
index bbf99d7930..83cbff09b9 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js
@@ -527,12 +527,12 @@
else if (program.IsSeries && program.IsRepeat && options.showRepeatIndicator) {
indicatorHtml = '' + globalize.translate('sharedcomponents#Repeat') + '';
}
- if (indicatorHtml || program.EpisodeTitle) {
+ if (indicatorHtml || (program.EpisodeTitle && options.showEpisodeTitle)) {
html += '
';
html += indicatorHtml || '';
- if (program.EpisodeTitle) {
+ if (program.EpisodeTitle && options.showEpisodeTitle) {
html += '' + program.EpisodeTitle + '';
}
html += '
';
@@ -578,7 +578,8 @@
showLiveIndicator: allowIndicators && userSettings.get('guide-indicator-live') !== 'false',
showPremiereIndicator: allowIndicators && userSettings.get('guide-indicator-premiere') !== 'false',
showNewIndicator: allowIndicators && userSettings.get('guide-indicator-new') === 'true',
- showRepeatIndicator: allowIndicators && userSettings.get('guide-indicator-repeat') === 'true'
+ showRepeatIndicator: allowIndicators && userSettings.get('guide-indicator-repeat') === 'true',
+ showEpisodeTitle: layoutManager.tv ? false : true
};
for (var i = 0, length = channels.length; i < length; i++) {
@@ -625,7 +626,7 @@
html += '' + channel.Number + '
';
- if (!hasChannelImage) {
+ if (!hasChannelImage && channel.Name) {
html += '' + channel.Name + '
';
}
diff --git a/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/plugin.js b/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/plugin.js
index cd71e70e68..8584db557b 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/plugin.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/plugin.js
@@ -227,7 +227,7 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
break;
case Hls.ErrorTypes.MEDIA_ERROR:
console.log("fatal media error encountered, try to recover");
- hls.recoverMediaError();
+ handleMediaError();
break;
default:
// cannot recover
@@ -280,6 +280,36 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
}
}
+ var recoverDecodingErrorDate, recoverSwapAudioCodecDate;
+
+ function handleMediaError() {
+
+ if (!hlsPlayer) {
+ return;
+ }
+
+ var now = Date.now();
+
+ if (window.performance && window.performance.now) {
+ now = performance.now();
+ }
+
+ if (!recoverDecodingErrorDate || (now - recoverDecodingErrorDate) > 3000) {
+ recoverDecodingErrorDate = now;
+ console.log('try to recover media Error ...');
+ hlsPlayer.recoverMediaError();
+ } else {
+ if (!recoverSwapAudioCodecDate || (now - recoverSwapAudioCodecDate) > 3000) {
+ recoverSwapAudioCodecDate = now;
+ console.log('try to swap Audio Codec and recover media Error ...');
+ hlsPlayer.swapAudioCodec();
+ hlsPlayer.recoverMediaError();
+ } else {
+ console.error('cannot recover, last media error recovery failed ...');
+ }
+ }
+ }
+
function applySrc(elem, src) {
if (window.Windows) {
@@ -306,7 +336,10 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
// Chrome now returns a promise
return promise.catch(function (e) {
- if ((e.name || '').toLowerCase() === 'notallowederror') {
+ var errorName = (e.name || '').toLowerCase();
+ // safari uses aborterror
+ if (errorName === 'notallowederror' ||
+ errorName === 'aborterror') {
// swallow this error because the user can still click the play button on the video element
return Promise.resolve();
}
@@ -646,10 +679,8 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
function onError() {
- destroyCustomTrack(this);
- var errorCode = this.error ? this.error.code : '';
- errorCode = (errorCode || '').toString();
- console.log('Media element error code: ' + errorCode);
+ var errorCode = this.error ? (this.error.code || 0) : 0;
+ console.log('Media element error code: ' + errorCode.toString());
var type;
@@ -664,12 +695,15 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
break;
case 3:
// MEDIA_ERR_DECODE
- break;
+ handleMediaError();
+ return;
case 4:
// MEDIA_ERR_SRC_NOT_SUPPORTED
break;
}
+ destroyCustomTrack(this);
+
//events.trigger(self, 'error', [
//{
// type: type
@@ -708,7 +742,7 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
// simple playback should use the native support
if (mediaSource.RunTimeTicks) {
//if (!browser.edge) {
- return false;
+ return false;
//}
}
diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js
index cbd3c90af4..10491ca813 100644
--- a/dashboard-ui/scripts/site.js
+++ b/dashboard-ui/scripts/site.js
@@ -1185,13 +1185,13 @@ var AppInfo = {};
if (Dashboard.isRunningInCordova()) {
paths.sharingMenu = "cordova/sharingwidget";
- paths.wakeonlan = "cordova/wakeonlan";
} else {
- paths.wakeonlan = apiClientBowerPath + "/wakeonlan";
define("sharingMenu", [embyWebComponentsBowerPath + "/sharing/sharingmenu"], returnFirstDependency);
}
+ paths.wakeonlan = apiClientBowerPath + "/wakeonlan";
+
define("libjass", [bowerPath + "/libjass/libjass.min", "css!" + bowerPath + "/libjass/libjass"], returnFirstDependency);
if (window.IntersectionObserver) {
@@ -1278,7 +1278,7 @@ var AppInfo = {};
// hack for an android test before browserInfo is loaded
if (Dashboard.isRunningInCordova() && window.MainActivity) {
- define("shell", ["cordova/android/shell"], returnFirstDependency);
+ define("shell", ["cordova/shell"], returnFirstDependency);
} else {
define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency);
}
@@ -1293,7 +1293,7 @@ var AppInfo = {};
// hack for an android test before browserInfo is loaded
if (Dashboard.isRunningInCordova() && window.MainActivity) {
- paths.appStorage = "cordova/android/appstorage";
+ paths.appStorage = "cordova/appstorage";
paths.filesystem = 'cordova/filesystem';
} else {
paths.appStorage = getAppStorage(apiClientBowerPath);
@@ -1559,12 +1559,8 @@ var AppInfo = {};
var apiClientBowerPath = bowerPath + "/emby-apiclient";
var embyWebComponentsBowerPath = bowerPath + '/emby-webcomponents';
- if (Dashboard.isRunningInCordova()) {
- if (window.MainActivity && window.MainActivity.getAndroidBuildVersion() >= 24) {
- define("actionsheet", ["webActionSheet"], returnFirstDependency);
- } else {
- define("actionsheet", ["cordova/actionsheet"], returnFirstDependency);
- }
+ if (Dashboard.isRunningInCordova() && browser.safari) {
+ define("actionsheet", ["cordova/actionsheet"], returnFirstDependency);
} else {
define("actionsheet", ["webActionSheet"], returnFirstDependency);
}
@@ -1618,7 +1614,7 @@ var AppInfo = {};
define("multi-download", [embyWebComponentsBowerPath + '/multidownload'], returnFirstDependency);
if (Dashboard.isRunningInCordova() && browser.android) {
- define("fileDownloader", ['cordova/android/filedownloader'], returnFirstDependency);
+ define("fileDownloader", ['cordova/filedownloader'], returnFirstDependency);
define("localassetmanager", ["cordova/localassetmanager"], returnFirstDependency);
} else {
define("fileDownloader", [embyWebComponentsBowerPath + '/filedownloader'], returnFirstDependency);
@@ -1635,12 +1631,10 @@ var AppInfo = {};
if (Dashboard.isRunningInCordova() && browserInfo.android) {
window.VlcAudio = true;
- define("audiorenderer", ["cordova/android/vlcplayer"]);
- define("videorenderer", ["cordova/android/vlcplayer"]);
}
if (Dashboard.isRunningInCordova() && browserInfo.android) {
- define("localsync", ["cordova/android/localsync"], returnFirstDependency);
+ define("localsync", ["cordova/localsync"], returnFirstDependency);
}
else {
define("localsync", ["scripts/localsync"], returnFirstDependency);
@@ -2664,7 +2658,7 @@ var AppInfo = {};
deps.push('registrationServices');
if (browserInfo.android) {
- deps.push('cordova/android/androidcredentials');
+ deps.push('cordova/androidcredentials');
}
}
@@ -2697,8 +2691,8 @@ var AppInfo = {};
if (Dashboard.isRunningInCordova()) {
if (browserInfo.android) {
- postInitDependencies.push('cordova/android/mediasession');
- postInitDependencies.push('cordova/android/chromecast');
+ postInitDependencies.push('cordova/mediasession');
+ postInitDependencies.push('cordova/chromecast');
} else if (browserInfo.safari) {
diff --git a/dashboard-ui/videoosd.html b/dashboard-ui/videoosd.html
index 0c3d9fd9dd..cbb1bf5b2b 100644
--- a/dashboard-ui/videoosd.html
+++ b/dashboard-ui/videoosd.html
@@ -155,15 +155,19 @@
position: fixed;
}
- @media all and (max-width:600px) {
+ @media all and (max-width:480px) {
.osdPoster {
display: none !important;
}
+ }
+ @media all and (max-width:540px) {
.videoOsdBottom .paper-icon-button-light {
margin: 0;
}
+ }
+ @media all and (max-width:600px) {
.videoOsdBottom .volumeButtons {
display: none !important;
}