diff --git a/.eslintrc.js b/.eslintrc.js index ad65467f98..854a34faaa 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -52,9 +52,10 @@ module.exports = { 'no-trailing-spaces': ['error'], '@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], 'no-void': ['error', { 'allowAsStatement': true }], + 'no-nested-ternary': ['error'], 'one-var': ['error', 'never'], 'padded-blocks': ['error', 'never'], - 'prefer-const': ['error', {'destructuring': 'all'}], + 'prefer-const': ['error', { 'destructuring': 'all' }], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], '@babel/semi': ['error'], 'no-var': ['error'], diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index 7fd4baa5d0..ebd97e55c8 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -121,10 +121,14 @@ import '../elements/emby-itemscontainer/emby-itemscontainer'; } if (!isSingleSection) { - options.Limit = screenWidth >= 1920 ? 10 : screenWidth >= 1440 ? 8 : 6; + options.Limit = 6; if (enableScrollX()) { options.Limit = 20; + } else if (screenWidth >= 1920) { + options.Limit = 10; + } else if (screenWidth >= 1440) { + options.Limit = 8; } } diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 9fa440b1a2..86e154f7b6 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -1,6 +1,5 @@ import escapeHtml from 'escape-html'; import cardBuilder from '../cardbuilder/cardBuilder'; -import dom from '../../scripts/dom'; import layoutManager from '../layoutManager'; import imageLoader from '../images/imageLoader'; import globalize from '../../scripts/globalize'; @@ -401,15 +400,8 @@ import ServerConnections from '../ServerConnections'; function getItemsToResumeFn(mediaType, serverId) { return function () { const apiClient = ServerConnections.getApiClient(serverId); - const screenWidth = dom.getWindowSize().innerWidth; - let limit; - if (enableScrollX()) { - limit = 12; - } else { - limit = screenWidth >= 1920 ? 8 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 9 : 6)); - limit = Math.min(limit, 5); - } + const limit = enableScrollX() ? 12 : 5; const options = { Limit: limit, diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 56fd3705db..34c10ffd33 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -520,7 +520,14 @@ import toast from './toast/toast'; } function play(item, resume, queue, queueNext) { - const method = queue ? (queueNext ? 'queueNext' : 'queue') : 'play'; + let method = 'play'; + if (queue) { + if (queueNext) { + method = 'queueNext'; + } else { + method = 'queue'; + } + } let startPosition = 0; if (resume && item.UserData && item.UserData.PlaybackPositionTicks) { diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index 597d747840..ef67508b95 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -550,7 +550,9 @@ import template from './libraryoptionseditor.template.html'; function getOrderedPlugins(plugins, configuredOrder) { plugins = plugins.slice(0); plugins.sort((a, b) => { - return a = configuredOrder.indexOf(a.Name), b = configuredOrder.indexOf(b.Name), a < b ? -1 : a > b ? 1 : 0; + a = configuredOrder.indexOf(a.Name); + b = configuredOrder.indexOf(b.Name); + return a - b; }); return plugins; } diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index cd634d71cf..9cc6f62810 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1827,12 +1827,18 @@ class PlaybackManager { Limit: UNLIMITED_ITEMS }, queryOptions)); } else if (firstItem.IsFolder) { + let sortBy = null; + if (options.shuffle) { + sortBy = 'Random'; + } else if (firstItem.Type !== 'BoxSet') { + sortBy = 'SortName'; + } promise = getItemsForPlayback(serverId, mergePlaybackQueries({ ParentId: firstItem.Id, Filters: 'IsNotFolder', Recursive: true, // These are pre-sorted - SortBy: options.shuffle ? 'Random' : (['BoxSet'].indexOf(firstItem.Type) === -1 ? 'SortName' : null), + SortBy: sortBy, MediaTypes: 'Audio,Video' }, queryOptions)); } else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) { diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index da71b157cb..53c09e37e5 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -61,7 +61,12 @@ import layoutManager from './layoutManager'; * @return {number} Clamped value. */ function clamp(value, min, max) { - return value <= min ? min : value >= max ? max : value; + if (value <= min) { + return min; + } else if (value >= max) { + return max; + } + return value; } /** diff --git a/src/components/syncPlay/core/Helper.js b/src/components/syncPlay/core/Helper.js index 7ddf5d1891..890f2485fb 100644 --- a/src/components/syncPlay/core/Helper.js +++ b/src/components/syncPlay/core/Helper.js @@ -173,12 +173,18 @@ export function translateItemsForPlayback(apiClient, items, options) { MediaTypes: 'Audio' }); } else if (firstItem.IsFolder) { + let sortBy = null; + if (options.shuffle) { + sortBy = 'Random'; + } else if (firstItem.Type === 'BoxSet') { + sortBy = 'SortName'; + } promise = getItemsForPlayback(apiClient, mergePlaybackQueries({ ParentId: firstItem.Id, Filters: 'IsNotFolder', Recursive: true, // These are pre-sorted. - SortBy: options.shuffle ? 'Random' : (['BoxSet'].indexOf(firstItem.Type) === -1 ? 'SortName' : null), + SortBy: sortBy, MediaTypes: 'Audio,Video' }, queryOptions)); } else if (firstItem.Type === 'Episode' && items.length === 1) { diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index 4b16007706..c000986ae9 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -23,7 +23,13 @@ import '../../../elements/emby-button/emby-button'; tasks = tasks.sort(function(a, b) { a = a.Category + ' ' + a.Name; b = b.Category + ' ' + b.Name; - return a == b ? 0 : a < b ? -1 : 1; + if (a > b) { + return 1; + } else if (a < b) { + return -1; + } else { + return 0; + } }); let currentCategory; diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index 6c88ea5c8e..a4c090bdbe 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -66,7 +66,7 @@ import Dashboard from '../../utils/dashboard'; SortOrder: 'Descending', IncludeItemTypes: 'Movie', Filters: 'IsResumable', - Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3, + Limit: screenWidth >= 1600 ? 5 : 3, Recursive: true, Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', CollapseBoxSetItems: false, @@ -157,10 +157,17 @@ import Dashboard from '../../utils/dashboard'; function loadSuggestions(page, userId) { const screenWidth = dom.getWindowSize().innerWidth; + let itemLimit = 5; + if (screenWidth >= 1600) { + itemLimit = 8; + } else if (screenWidth >= 1200) { + itemLimit = 6; + } + const url = ApiClient.getUrl('Movies/Recommendations', { userId: userId, categoryLimit: 6, - ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5, + ItemLimit: itemLimit, Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', ImageTypeLimit: 1, EnableImageTypes: 'Primary,Backdrop,Banner,Thumb' diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 93d7e1ad87..cdee5ac9db 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -27,6 +27,8 @@ import LibraryMenu from '../../../scripts/libraryMenu'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components/backdrop/backdrop'; /* eslint-disable indent */ + const TICKS_PER_MINUTE = 600000000; + const TICKS_PER_SECOND = 10000000; function getOpenedDialog() { return document.querySelector('.dialogContainer .dialog.opened'); @@ -598,11 +600,16 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components function showComingUpNextIfNeeded(player, currentItem, currentTimeTicks, runtimeTicks) { if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && currentItem.Type === 'Episode' && userSettings.enableNextVideoInfoOverlay()) { - const showAtSecondsLeft = runtimeTicks >= 3e10 ? 40 : runtimeTicks >= 24e9 ? 35 : 30; - const showAtTicks = runtimeTicks - 1e3 * showAtSecondsLeft * 1e4; + let showAtSecondsLeft = 30; + if (runtimeTicks >= 50 * TICKS_PER_MINUTE) { + showAtSecondsLeft = 40; + } else if (runtimeTicks >= 40 * TICKS_PER_MINUTE) { + showAtSecondsLeft = 35; + } + const showAtTicks = runtimeTicks - showAtSecondsLeft * TICKS_PER_SECOND; const timeRemainingTicks = runtimeTicks - currentTimeTicks; - if (currentTimeTicks >= showAtTicks && runtimeTicks >= 6e9 && timeRemainingTicks >= 2e8) { + if (currentTimeTicks >= showAtTicks && runtimeTicks >= (10 * TICKS_PER_MINUTE) && timeRemainingTicks >= (20 * TICKS_PER_SECOND)) { showComingUpNext(player); } } diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index 0a20e96d96..7dd916f6d8 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -98,7 +98,7 @@ import autoFocuser from '../../components/autoFocuser'; SortOrder: 'Descending', IncludeItemTypes: 'Episode', Filters: 'IsResumable', - Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3, + Limit: screenWidth >= 1600 ? 5 : 3, Recursive: true, Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', CollapseBoxSetItems: false, diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index ce91862423..82fb79acb2 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -53,7 +53,12 @@ function disableOneEvent(event) { * @return {Number} */ function within(number, min, max) { - return number < min ? min : number > max ? max : number; + if (number < min) { + return min; + } else if (number > max) { + return max; + } + return number; } // Other global values diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 2d9c2c75e7..d1e91183af 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -288,10 +288,16 @@ import browser from './browser'; } } - return browser.ps4 ? 8000000 : - (browser.xboxOne ? 12000000 : - (browser.edgeUwp ? null : - (browser.tizen && isTizenFhd ? 20000000 : null))); + let bitrate = null; + if (browser.ps4) { + bitrate = 8000000; + } else if (browser.xboxOne) { + bitrate = 12000000; + } else if (browser.tizen && isTizenFhd) { + bitrate = 20000000; + } + + return bitrate; } function getSpeakerCount() { @@ -381,9 +387,7 @@ import browser from './browser'; } /* eslint-disable compat/compat */ - let maxVideoWidth = browser.xboxOne ? - (window.screen ? window.screen.width : null) : - null; + let maxVideoWidth = browser.xboxOne ? window.screen?.width : null; /* eslint-enable compat/compat */ if (options.maxVideoWidth) { diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index b9fe523e41..b77aba42e2 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -793,7 +793,12 @@ import { getParameterByName } from '../utils/url.ts'; } function updateMenuForPageType(isDashboardPage, isLibraryPage) { - const newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3; + let newPageType = 3; + if (isDashboardPage) { + newPageType = 2; + } else if (isLibraryPage) { + newPageType = 1; + } if (currentPageType !== newPageType) { currentPageType = newPageType;