From dfca85dea464474b60fecd1aa9fbd5fc329dbb78 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sun, 2 Oct 2022 04:13:39 -0400 Subject: [PATCH 1/6] Fix sonar critical issue with switch fallthrough --- src/components/subtitlesync/subtitlesync.js | 47 ++++++++++----------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index b5842cf884..80da4d7b12 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -144,33 +144,32 @@ class SubtitleSync { } toggle(action) { + if (action && !['hide', 'forceToHide'].includes(action)) { + console.warn('SubtitleSync.toggle called with invalid action', action); + return; + } + if (player && playbackManager.supportSubtitleOffset(player)) { - /* eslint-disable no-fallthrough */ - switch (action) { - case undefined: - // if showing subtitle sync is enabled and if there is an external subtitle stream enabled - if (playbackManager.isShowingSubtitleOffsetEnabled(player) && playbackManager.canHandleOffsetOnCurrentSubtitle(player)) { - // if no subtitle offset is defined or element has focus (offset being defined) - if (!(playbackManager.getPlayerSubtitleOffset(player) || subtitleSyncTextField.hasFocus)) { - // set default offset to '0' = 50% - subtitleSyncSlider.value = '50'; - subtitleSyncTextField.textContent = '0s'; - playbackManager.setSubtitleOffset(0, player); - } - // show subtitle sync - subtitleSyncContainer.classList.remove('hide'); - break; // stop here - } // else continue and hide - case 'hide': - // only break if element has focus - if (subtitleSyncTextField.hasFocus) { - break; + if (!action) { + // if showing subtitle sync is enabled and if there is an external subtitle stream enabled + if (playbackManager.isShowingSubtitleOffsetEnabled(player) && playbackManager.canHandleOffsetOnCurrentSubtitle(player)) { + // if no subtitle offset is defined or element has focus (offset being defined) + if (!(playbackManager.getPlayerSubtitleOffset(player) || subtitleSyncTextField.hasFocus)) { + // set default offset to '0' = 50% + subtitleSyncSlider.value = '50'; + subtitleSyncTextField.textContent = '0s'; + playbackManager.setSubtitleOffset(0, player); } - case 'forceToHide': - subtitleSyncContainer.classList.add('hide'); - break; + // show subtitle sync + subtitleSyncContainer.classList.remove('hide'); + return; + } + } else if (action === 'hide' && subtitleSyncTextField.hasFocus) { + // do not hide if element has focus + return; } - /* eslint-enable no-fallthrough */ + + subtitleSyncContainer.classList.add('hide'); } } } From 857973ec45a65c2c9ba3168a8804f1b5968cb000 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 3 Oct 2022 09:50:00 -0400 Subject: [PATCH 2/6] Fix sonarjs max-switch-cases --- .eslintrc.js | 1 - src/scripts/serverNotifications.js | 5 ----- 2 files changed, 6 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index a3594d87a8..560c417763 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -72,7 +72,6 @@ module.exports = { 'sonarjs/cognitive-complexity': ['warn'], // TODO: Enable the following rules and fix issues - 'sonarjs/max-switch-cases': ['off'], 'sonarjs/no-collapsible-if': ['off'], 'sonarjs/no-duplicate-string': ['off'], 'sonarjs/no-duplicated-branches': ['off'], diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index 73a10bcbde..d165593226 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -123,16 +123,11 @@ function processGeneralCommand(cmd, apiClient) { displayMessage(cmd); break; case 'ToggleOsd': - // todo - break; case 'ToggleContextMenu': - // todo - break; case 'SendKey': // todo break; case 'SendString': - // todo focusManager.sendText(cmd.Arguments.String); break; default: From 272a74e7aacf07714fb67e0301263b293718b54c Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 3 Oct 2022 10:04:40 -0400 Subject: [PATCH 3/6] Fix sonarjs no-gratuitous-expressions --- .eslintrc.js | 1 - src/controllers/dashboard/dashboard.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 560c417763..0594b954e1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -75,7 +75,6 @@ module.exports = { 'sonarjs/no-collapsible-if': ['off'], 'sonarjs/no-duplicate-string': ['off'], 'sonarjs/no-duplicated-branches': ['off'], - 'sonarjs/no-gratuitous-expressions': ['off'], 'sonarjs/no-identical-functions': ['off'], 'sonarjs/no-nested-switch': ['off'], 'sonarjs/no-redundant-jump': ['off'], diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index a6fe46b295..de722c751c 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -458,7 +458,7 @@ import confirm from '../../components/confirm/confirm'; html += ' / '; - if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { + if (nowPlayingItem.RunTimeTicks) { html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks); } else { html += '0:00'; From bdc97c45b8a5a3fd5d62791dd2900e0a6e9591a0 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 3 Oct 2022 10:12:13 -0400 Subject: [PATCH 4/6] Fix sonarjs no-nested-switch --- .eslintrc.js | 1 - src/scripts/imagehelper.js | 74 ++++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 0594b954e1..3bf36a4b3d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -76,7 +76,6 @@ module.exports = { 'sonarjs/no-duplicate-string': ['off'], 'sonarjs/no-duplicated-branches': ['off'], 'sonarjs/no-identical-functions': ['off'], - 'sonarjs/no-nested-switch': ['off'], 'sonarjs/no-redundant-jump': ['off'], 'sonarjs/no-small-switch': ['off'], 'sonarjs/no-unused-collection': ['off'], diff --git a/src/scripts/imagehelper.js b/src/scripts/imagehelper.js index 4fd2c0a0c7..cb76fa7977 100644 --- a/src/scripts/imagehelper.js +++ b/src/scripts/imagehelper.js @@ -1,57 +1,61 @@ +const BASE_DEVICE_IMAGE_URL = 'assets/img/devices/'; + +function getWebDeviceIcon(browser) { + switch (browser) { + case 'Opera': + case 'Opera TV': + case 'Opera Android': + return BASE_DEVICE_IMAGE_URL + 'opera.svg'; + case 'Chrome': + case 'Chrome Android': + return BASE_DEVICE_IMAGE_URL + 'chrome.svg'; + case 'Firefox': + case 'Firefox Android': + return BASE_DEVICE_IMAGE_URL + 'firefox.svg'; + case 'Safari': + case 'Safari iPad': + case 'Safari iPhone': + return BASE_DEVICE_IMAGE_URL + 'safari.svg'; + case 'Edge Chromium': + case 'Edge Chromium Android': + case 'Edge Chromium iPad': + case 'Edge Chromium iPhone': + return BASE_DEVICE_IMAGE_URL + 'edgechromium.svg'; + case 'Edge': + return BASE_DEVICE_IMAGE_URL + 'edge.svg'; + case 'Internet Explorer': + return BASE_DEVICE_IMAGE_URL + 'msie.svg'; + default: + return BASE_DEVICE_IMAGE_URL + 'html5.svg'; + } +} /* eslint-disable indent */ export function getDeviceIcon(device) { - const baseUrl = 'assets/img/devices/'; switch (device.AppName || device.Client) { case 'Samsung Smart TV': - return baseUrl + 'samsung.svg'; + return BASE_DEVICE_IMAGE_URL + 'samsung.svg'; case 'Xbox One': - return baseUrl + 'xbox.svg'; + return BASE_DEVICE_IMAGE_URL + 'xbox.svg'; case 'Sony PS4': - return baseUrl + 'playstation.svg'; + return BASE_DEVICE_IMAGE_URL + 'playstation.svg'; case 'Kodi': case 'Kodi JellyCon': - return baseUrl + 'kodi.svg'; + return BASE_DEVICE_IMAGE_URL + 'kodi.svg'; case 'Jellyfin Android': case 'AndroidTV': case 'Android TV': - return baseUrl + 'android.svg'; + return BASE_DEVICE_IMAGE_URL + 'android.svg'; case 'Jellyfin Mobile (iOS)': case 'Jellyfin Mobile (iPadOS)': case 'Jellyfin iOS': case 'Infuse': - return baseUrl + 'apple.svg'; + return BASE_DEVICE_IMAGE_URL + 'apple.svg'; case 'Jellyfin Web': - switch (device.Name || device.DeviceName) { - case 'Opera': - case 'Opera TV': - case 'Opera Android': - return baseUrl + 'opera.svg'; - case 'Chrome': - case 'Chrome Android': - return baseUrl + 'chrome.svg'; - case 'Firefox': - case 'Firefox Android': - return baseUrl + 'firefox.svg'; - case 'Safari': - case 'Safari iPad': - case 'Safari iPhone': - return baseUrl + 'safari.svg'; - case 'Edge Chromium': - case 'Edge Chromium Android': - case 'Edge Chromium iPad': - case 'Edge Chromium iPhone': - return baseUrl + 'edgechromium.svg'; - case 'Edge': - return baseUrl + 'edge.svg'; - case 'Internet Explorer': - return baseUrl + 'msie.svg'; - default: - return baseUrl + 'html5.svg'; - } + return getWebDeviceIcon(device.Name || device.DeviceName); default: - return baseUrl + 'other.svg'; + return BASE_DEVICE_IMAGE_URL + 'other.svg'; } } From 4669939eebd234433058e2210d000c95bd5d5922 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 3 Oct 2022 10:17:38 -0400 Subject: [PATCH 5/6] Fix sonarjs no-unused-collection --- .eslintrc.js | 1 - src/components/filtermenu/filtermenu.js | 15 ++++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3bf36a4b3d..7f164227f4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -78,7 +78,6 @@ module.exports = { 'sonarjs/no-identical-functions': ['off'], 'sonarjs/no-redundant-jump': ['off'], 'sonarjs/no-small-switch': ['off'], - 'sonarjs/no-unused-collection': ['off'], 'sonarjs/prefer-object-literal': ['off'], 'sonarjs/prefer-single-boolean-return': ['off'] }, diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 6f2378eca3..352794ac6e 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -124,14 +124,15 @@ function saveValues(context, settings, settingsKey) { userSettings.setFilter(settingsKey + '-filter-VideoTypes', videoTypes.join(',')); // Series status - const seriesStatuses = []; - elems = context.querySelectorAll('.chkSeriesStatus'); + // TODO: Add filtering by series status? + // const seriesStatuses = []; + // elems = context.querySelectorAll('.chkSeriesStatus'); - for (let i = 0, length = elems.length; i < length; i++) { - if (elems[i].checked) { - seriesStatuses.push(elems[i].getAttribute('data-filter')); - } - } + // for (let i = 0, length = elems.length; i < length; i++) { + // if (elems[i].checked) { + // seriesStatuses.push(elems[i].getAttribute('data-filter')); + // } + // } // Genres const genres = []; From e3109db671aa6f7b630f7812e887309fab6cc10c Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 09:57:01 -0400 Subject: [PATCH 6/6] Fix series status filter --- src/components/filtermenu/filtermenu.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 352794ac6e..12f535a18d 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -124,15 +124,15 @@ function saveValues(context, settings, settingsKey) { userSettings.setFilter(settingsKey + '-filter-VideoTypes', videoTypes.join(',')); // Series status - // TODO: Add filtering by series status? - // const seriesStatuses = []; - // elems = context.querySelectorAll('.chkSeriesStatus'); + const seriesStatuses = []; + elems = context.querySelectorAll('.chkSeriesStatus'); - // for (let i = 0, length = elems.length; i < length; i++) { - // if (elems[i].checked) { - // seriesStatuses.push(elems[i].getAttribute('data-filter')); - // } - // } + for (let i = 0, length = elems.length; i < length; i++) { + if (elems[i].checked) { + seriesStatuses.push(elems[i].getAttribute('data-filter')); + } + } + userSettings.setFilter(`${settingsKey}-filter-SeriesStatus`, seriesStatuses.join(',')); // Genres const genres = [];