diff --git a/.eslintrc.js b/.eslintrc.js index 4a3fec9448..8b9a7dea13 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -42,7 +42,8 @@ module.exports = { 'one-var': ["error", "never"], 'quotes': ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": false }], 'semi': ["error"], - 'space-before-blocks': ["error"] + 'space-before-blocks': ["error"], + "space-infix-ops": "error" }, overrides: [ { diff --git a/package.json b/package.json index a88e5342ce..02d0c804d2 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "@babel/plugin-transform-modules-amd": "^7.9.6", "@babel/polyfill": "^7.8.7", "@babel/preset-env": "^7.8.6", - "autoprefixer": "^9.7.6", + "autoprefixer": "^9.8.0", "babel-loader": "^8.0.6", "browser-sync": "^2.26.7", "clean-webpack-plugin": "^3.0.0", @@ -78,7 +78,7 @@ "screenfull": "^5.0.2", "shaka-player": "^2.5.11", "sortablejs": "^1.10.2", - "swiper": "^5.3.7", + "swiper": "^5.4.0", "webcomponents.js": "^0.7.24", "whatwg-fetch": "^3.0.0" }, diff --git a/src/components/images/imageFetcher.js b/src/components/images/imageFetcher.js deleted file mode 100644 index c6882ddb7c..0000000000 --- a/src/components/images/imageFetcher.js +++ /dev/null @@ -1,38 +0,0 @@ -define(['dom'], function (dom) { - 'use strict'; - - function loadImage(elem, url) { - - if (!elem) { - return Promise.reject('elem cannot be null'); - } - - if (elem.tagName !== 'IMG') { - - elem.style.backgroundImage = "url('" + url + "')"; - return Promise.resolve(); - - //return loadImageIntoImg(document.createElement('img'), url).then(function () { - // elem.style.backgroundImage = "url('" + url + "')"; - // return Promise.resolve(); - //}); - - } - return loadImageIntoImg(elem, url); - } - - function loadImageIntoImg(elem, url) { - return new Promise(function (resolve, reject) { - - dom.addEventListener(elem, 'load', resolve, { - once: true - }); - elem.setAttribute('src', url); - }); - } - - return { - loadImage: loadImage - }; - -}); diff --git a/src/components/indicators/indicators.js b/src/components/indicators/indicators.js index 7bc8ddd4ec..604f480f1d 100644 --- a/src/components/indicators/indicators.js +++ b/src/components/indicators/indicators.js @@ -148,7 +148,7 @@ export function getTypeIndicator(item) { }; const icon = iconT[item.Type]; - return icon ? '
' : ''; + return icon ? '
' : ''; } export function getMissingIndicator(item) { diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index b89631f63a..dd67b667e6 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -7,11 +7,13 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob return stream.Type === 'Video'; })[0]; var videoWidth = videoStream ? videoStream.Width : null; + var videoHeight = videoStream ? videoStream.Height : null; var options = qualityoptions.getVideoQualityOptions({ currentMaxBitrate: playbackManager.getMaxStreamingBitrate(player), isAutomaticBitrateEnabled: playbackManager.enableAutomaticBitrateDetection(player), videoWidth: videoWidth, + videoHeight: videoHeight, enableAuto: true }); @@ -91,11 +93,13 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob })[0]; var videoWidth = videoStream ? videoStream.Width : null; + var videoHeight = videoStream ? videoStream.Height : null; var options = qualityoptions.getVideoQualityOptions({ currentMaxBitrate: playbackManager.getMaxStreamingBitrate(player), isAutomaticBitrateEnabled: playbackManager.enableAutomaticBitrateDetection(player), videoWidth: videoWidth, + videoHeight: videoHeight, enableAuto: true }); diff --git a/src/components/qualityOptions.js b/src/components/qualityOptions.js index 5ad69cb790..221e13d4ef 100644 --- a/src/components/qualityOptions.js +++ b/src/components/qualityOptions.js @@ -5,6 +5,13 @@ define(['globalize'], function (globalize) { var maxStreamingBitrate = options.currentMaxBitrate; var videoWidth = options.videoWidth; + var videoHeight = options.videoHeight; + + // If the aspect ratio is less than 16/9 (1.77), set the width as if it were pillarboxed. + // 4:3 1440x1080 -> 1920x1080 + if (videoWidth / videoHeight < 16 / 9) { + videoWidth = videoHeight * (16 / 9); + } var maxAllowedWidth = videoWidth || 4096; //var maxAllowedHeight = videoHeight || 2304; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index a4f25a774c..089915a834 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -140,7 +140,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL } if (item.SeriesName != null) { var seriesName = item.SeriesName; - if (item.SeriesId !=null) { + if (item.SeriesId != null) { context.querySelector('.nowPlayingSerie').innerHTML = '${seriesName}`; } else { context.querySelector('.nowPlayingSerie').innerHTML = seriesName; diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index f7bd41ff8b..3b01cf1ad1 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -92,7 +92,7 @@ import layoutManager from 'layoutManager'; * @return {number} Eased value in range [0, 1]. */ function ease(t) { - return t*(2 - t); // easeOutQuad === ease-out + return t * (2 - t); // easeOutQuad === ease-out } /** @@ -402,8 +402,8 @@ import layoutManager from 'layoutManager'; k = ease(k); - const x = ox + dx*k; - const y = oy + dy*k; + const x = ox + dx * k; + const y = oy + dy * k; builtinScroll(xScroller, x, yScroller, y, false); diff --git a/src/controllers/dashboard/networking.js b/src/controllers/dashboard/networking.js index 9cf638ceee..4ddde7f24c 100644 --- a/src/controllers/dashboard/networking.js +++ b/src/controllers/dashboard/networking.js @@ -9,7 +9,7 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], var validationResult = getValidationAlert(form); if (validationResult) { - alertText(validationResult); + showAlertText(validationResult); return; } @@ -29,35 +29,10 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], config.IsRemoteIPFilterBlacklist = 'blacklist' === form.querySelector('#selectExternalAddressFilterMode').value; config.PublicPort = form.querySelector('#txtPublicPort').value; config.PublicHttpsPort = form.querySelector('#txtPublicHttpsPort').value; - var httpsMode = form.querySelector('#selectHttpsMode').value; - - switch (httpsMode) { - case 'proxy': - config.EnableHttps = true; - config.RequireHttps = false; - config.IsBehindProxy = true; - break; - - case 'required': - config.EnableHttps = true; - config.RequireHttps = true; - config.IsBehindProxy = false; - break; - - case 'enabled': - config.EnableHttps = true; - config.RequireHttps = false; - config.IsBehindProxy = false; - break; - - default: - config.EnableHttps = false; - config.RequireHttps = false; - config.IsBehindProxy = false; - } - - config.HttpsPortNumber = form.querySelector('#txtHttpsPort').value; config.HttpServerPortNumber = form.querySelector('#txtPortNumber').value; + config.HttpsPortNumber = form.querySelector('#txtHttpsPort').value; + config.EnableHttps = form.querySelector('#chkEnableHttps').checked; + config.RequireHttps = form.querySelector('#chkRequireHttps').checked; config.EnableUPnP = enableUpnp; config.BaseUrl = form.querySelector('#txtBaseUrl').value; config.EnableRemoteAccess = form.querySelector('#chkRemoteAccess').checked; @@ -90,23 +65,20 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], } function validateHttps(form) { - var remoteAccess = form.querySelector('#chkRemoteAccess').checked; var certPath = form.querySelector('#txtCertificatePath').value || null; - var httpsMode = form.querySelector('#selectHttpsMode').value; + var httpsEnabled = form.querySelector('#chkEnableHttps').checked; - if (!remoteAccess || ('enabled' !== httpsMode && 'required' !== httpsMode || certPath)) { - return Promise.resolve(); - } - - return new Promise(function (resolve, reject) { - return alertText({ + if (httpsEnabled && !certPath) { + return showAlertText({ title: globalize.translate('TitleHostingSettings'), text: globalize.translate('HttpsRequiresCert') - }).then(reject, reject); - }); + }).then(Promise.reject); + } + + return Promise.resolve(); } - function alertText(options) { + function showAlertText(options) { return new Promise(function (resolve, reject) { require(['alert'], function (alert) { alert(options).then(resolve, reject); @@ -116,7 +88,7 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], function confirmSelections(localAddress, enableUpnp, callback) { if (localAddress || !enableUpnp) { - alertText({ + showAlertText({ title: globalize.translate('TitleHostingSettings'), text: globalize.translate('SettingsWarning') }).then(callback); @@ -135,19 +107,9 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], page.querySelector('#txtExternalAddressFilter').value = (config.RemoteIPFilter || []).join(', '); page.querySelector('#selectExternalAddressFilterMode').value = config.IsRemoteIPFilterBlacklist ? 'blacklist' : 'whitelist'; page.querySelector('#chkRemoteAccess').checked = null == config.EnableRemoteAccess || config.EnableRemoteAccess; - var selectHttpsMode = page.querySelector('#selectHttpsMode'); - - if (config.IsBehindProxy) { - selectHttpsMode.value = 'proxy'; - } else if (config.RequireHttps) { - selectHttpsMode.value = 'required'; - } else if (config.EnableHttps) { - selectHttpsMode.value = 'enabled'; - } else { - selectHttpsMode.value = 'disabled'; - } - page.querySelector('#txtHttpsPort').value = config.HttpsPortNumber; + page.querySelector('#chkEnableHttps').checked = config.EnableHttps; + page.querySelector('#chkRequireHttps').checked = config.RequireHttps; page.querySelector('#txtBaseUrl').value = config.BaseUrl || ''; var txtCertificatePath = page.querySelector('#txtCertificatePath'); txtCertificatePath.value = config.CertificatePath || ''; @@ -163,18 +125,12 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], view.querySelector('.fldExternalAddressFilterMode').classList.remove('hide'); view.querySelector('.fldPublicPort').classList.remove('hide'); view.querySelector('.fldPublicHttpsPort').classList.remove('hide'); - view.querySelector('.fldCertificatePath').classList.remove('hide'); - view.querySelector('.fldCertPassword').classList.remove('hide'); - view.querySelector('.fldHttpsMode').classList.remove('hide'); view.querySelector('.fldEnableUpnp').classList.remove('hide'); } else { view.querySelector('.fldExternalAddressFilter').classList.add('hide'); view.querySelector('.fldExternalAddressFilterMode').classList.add('hide'); view.querySelector('.fldPublicPort').classList.add('hide'); view.querySelector('.fldPublicHttpsPort').classList.add('hide'); - view.querySelector('.fldCertificatePath').classList.add('hide'); - view.querySelector('.fldCertPassword').classList.add('hide'); - view.querySelector('.fldHttpsMode').classList.add('hide'); view.querySelector('.fldEnableUpnp').classList.add('hide'); } }); diff --git a/src/controllers/itemDetails.js b/src/controllers/itemDetails.js index 45342208ea..d9eab0ac4d 100644 --- a/src/controllers/itemDetails.js +++ b/src/controllers/itemDetails.js @@ -803,9 +803,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti } if (editable && url === undefined) { - html += ""; + html += ""; } else if (!editable && url === undefined) { - html += "