From 49f1f1fae3d8615f696eda6a91a4e41d5f56e1fd Mon Sep 17 00:00:00 2001 From: Viperinius Date: Sun, 26 Jun 2022 01:10:20 +0200 Subject: [PATCH 01/80] Add chapter markings to video player timeline. These labels show the start of each chapter when interacting with the slider the same way that activates the slider bubble. They follow the same color scheme as the slider (watched chapters turn blue). Inspired by https://features.jellyfin.org/posts/397/chapter-markers-in-timeline --- src/controllers/playback/video/index.html | 1 + src/controllers/playback/video/index.js | 22 ++++++ src/elements/emby-slider/emby-slider.js | 94 +++++++++++++++++++++-- src/elements/emby-slider/emby-slider.scss | 20 +++++ 4 files changed, 130 insertions(+), 7 deletions(-) diff --git a/src/controllers/playback/video/index.html b/src/controllers/playback/video/index.html index c76a1714ae..278b1d4d4a 100644 --- a/src/controllers/playback/video/index.html +++ b/src/controllers/playback/video/index.html @@ -21,6 +21,7 @@
+
diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index d5da82b740..baaec52ff2 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1574,6 +1574,28 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components return '

' + datetime.getDisplayRunningTime(ticks) + '

'; }; + nowPlayingPositionSlider.getChapterFractions = function () { + showOsd(); + + const item = currentItem; + + if (item && item.Chapters && item.Chapters.length) { + const chapterFractions = []; + const runtimeDuration = item.RunTimeTicks; + + for (let i = 0, length = item.Chapters.length; i < length; i++) { + const currentChapter = item.Chapters[i]; + + const fraction = currentChapter.StartPositionTicks / runtimeDuration; + chapterFractions.push(fraction); + } + + return chapterFractions; + } + + return []; + }; + view.querySelector('.btnPreviousTrack').addEventListener('click', function () { playbackManager.previousTrack(currentPlayer); }); diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 0bb20270e6..04aa7c4778 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -102,6 +102,13 @@ import '../emby-input/emby-input'; fraction *= 100; backgroundLower.style.width = fraction + '%'; } + + if (range.chapterMarkContainerElement) { + if (!range.triedChapterMarksAdd) { + addChapterMarks(range); + } + updateChapterMarks(range, value); + } }); } @@ -130,6 +137,57 @@ import '../emby-input/emby-input'; }); } + function setChapterMark(range, valueChapterMark, chapterMark, valueProgress) { + requestAnimationFrame(function () { + const bubbleTrackRect = range.sliderBubbleTrack.getBoundingClientRect(); + const chapterMarkRect = chapterMark.getBoundingClientRect(); + + if (!bubbleTrackRect.width || !chapterMarkRect.width) { + // width is not set, most probably because the OSD is currently hidden + return; + } + + let chapterMarkPos = (bubbleTrackRect.width * valueChapterMark / 100) - chapterMarkRect.width / 2; + chapterMarkPos = Math.min(Math.max(chapterMarkPos, - chapterMarkRect.width / 2), bubbleTrackRect.width - chapterMarkRect.width / 2); + + chapterMark.style.left = chapterMarkPos + 'px'; + + if (valueProgress >= valueChapterMark) { + chapterMark.classList.remove('unwatched'); + chapterMark.classList.add('watched'); + } else { + chapterMark.classList.add('unwatched'); + chapterMark.classList.remove('watched'); + } + }); + } + + function updateChapterMarks(range, currentValue) { + if (range.chapterFractions && range.chapterFractions.length && range.chapterMarkElements && range.chapterMarkElements.length) { + for (let i = 0, length = range.chapterMarkElements.length; i < length; i++) { + if (range.chapterFractions.length > i) { + setChapterMark(range, mapFractionToValue(range, range.chapterFractions[i]), range.chapterMarkElements[i], currentValue); + } + } + } + } + + function addChapterMarks(range) { + range.chapterFractions = []; + if (range.getChapterFractions) { + range.chapterFractions = range.getChapterFractions(); + } + + const htmlToInsert = ''; + + range.chapterFractions.forEach(() => { + range.chapterMarkContainerElement.insertAdjacentHTML('beforeend', htmlToInsert); + }); + + range.chapterMarkElements = range.chapterMarkContainerElement.querySelectorAll('.sliderChapterMark'); + range.triedChapterMarksAdd = true; + } + EmbySliderPrototype.attachedCallback = function () { if (this.getAttribute('data-embyslider') === 'true') { return; @@ -187,7 +245,13 @@ import '../emby-input/emby-input'; this.backgroundUpper = containerElement.querySelector('.mdl-slider-background-upper'); const sliderBubble = containerElement.querySelector('.sliderBubble'); - let hasHideClass = sliderBubble.classList.contains('hide'); + let hasHideClassBubble = sliderBubble.classList.contains('hide'); + + this.chapterMarkContainerElement = containerElement.querySelector('.sliderChapterMarkContainer'); + let hasHideClassChapterMarkContainer = false; + if (this.chapterMarkContainerElement) { + hasHideClassChapterMarkContainer = this.chapterMarkContainerElement.classList.contains('hide'); + } dom.addEventListener(this, 'input', function () { this.dragging = true; @@ -199,9 +263,14 @@ import '../emby-input/emby-input'; const bubbleValue = mapValueToFraction(this, this.value) * 100; updateBubble(this, bubbleValue, sliderBubble); - if (hasHideClass) { + if (hasHideClassBubble) { sliderBubble.classList.remove('hide'); - hasHideClass = false; + hasHideClassBubble = false; + } + + if (hasHideClassChapterMarkContainer) { + this.chapterMarkContainerElement.classList.remove('hide'); + hasHideClassChapterMarkContainer = false; } }, { passive: true @@ -215,7 +284,10 @@ import '../emby-input/emby-input'; } sliderBubble.classList.add('hide'); - hasHideClass = true; + hasHideClassBubble = true; + + this.chapterMarkContainerElement.classList.add('hide'); + hasHideClassChapterMarkContainer = true; }, { passive: true }); @@ -227,9 +299,14 @@ import '../emby-input/emby-input'; updateBubble(this, bubbleValue, sliderBubble); - if (hasHideClass) { + if (hasHideClassBubble) { sliderBubble.classList.remove('hide'); - hasHideClass = false; + hasHideClassBubble = false; + } + + if (hasHideClassChapterMarkContainer) { + this.chapterMarkContainerElement.classList.remove('hide'); + hasHideClassChapterMarkContainer = false; } } }, { @@ -239,7 +316,10 @@ import '../emby-input/emby-input'; /* eslint-disable-next-line compat/compat */ dom.addEventListener(this, (window.PointerEvent ? 'pointerleave' : 'mouseleave'), function () { sliderBubble.classList.add('hide'); - hasHideClass = true; + hasHideClassBubble = true; + + this.chapterMarkContainerElement.classList.add('hide'); + hasHideClassChapterMarkContainer = true; }, { passive: true }); diff --git a/src/elements/emby-slider/emby-slider.scss b/src/elements/emby-slider/emby-slider.scss index f7503d4fd5..cd07533efd 100644 --- a/src/elements/emby-slider/emby-slider.scss +++ b/src/elements/emby-slider/emby-slider.scss @@ -245,3 +245,23 @@ display: block; margin-bottom: 0.25em; } + +.sliderChapterMarkContainer { + position: absolute; + left: 0; + right: 0; + margin: 0 0.54em; /* half of slider thumb size */ +} + +.sliderChapterMark { + position: absolute; + transform: translate3d(0, -100%, 0) rotate(90deg); +} + +.sliderChapterMark.unwatched { + color: rgba(255, 255, 255, 0.3); +} + +.sliderChapterMark.watched { + color: #00a4dc; +} From c0b092e208976d43154aa16b0eef403d1a4deef0 Mon Sep 17 00:00:00 2001 From: Viperinius Date: Sun, 3 Jul 2022 16:59:01 +0200 Subject: [PATCH 02/80] Set chapter mark icon via CSS instead of class. Allows easier customisation of what icon should be displayed. --- src/elements/emby-slider/emby-slider.js | 2 +- src/elements/emby-slider/emby-slider.scss | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 04aa7c4778..8af342deb9 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -178,7 +178,7 @@ import '../emby-input/emby-input'; range.chapterFractions = range.getChapterFractions(); } - const htmlToInsert = ''; + const htmlToInsert = ''; range.chapterFractions.forEach(() => { range.chapterMarkContainerElement.insertAdjacentHTML('beforeend', htmlToInsert); diff --git a/src/elements/emby-slider/emby-slider.scss b/src/elements/emby-slider/emby-slider.scss index cd07533efd..3e3538c066 100644 --- a/src/elements/emby-slider/emby-slider.scss +++ b/src/elements/emby-slider/emby-slider.scss @@ -258,6 +258,11 @@ transform: translate3d(0, -100%, 0) rotate(90deg); } +.sliderChapterMark::before { + font-family: 'Material Icons'; + content: "\e892"; +} + .sliderChapterMark.unwatched { color: rgba(255, 255, 255, 0.3); } From cf22dd04177bc98c30fd79e04e73a11536ea50aa Mon Sep 17 00:00:00 2001 From: Viperinius Date: Sun, 3 Jul 2022 17:25:05 +0200 Subject: [PATCH 03/80] Add name to CONTRIBUTORS --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a5bc99e1aa..5cfa2a4786 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -52,6 +52,7 @@ - [MinecraftPlaye](https://github.com/MinecraftPlaye) - [Matthew Jones](https://github.com/matthew-jones-uk) - [taku0](https://github.com/taku0) + - [Viperinius](https://github.com/Viperinius) # Emby Contributors From 20a1c34ea896bf4103e1dd092f709a838243882a Mon Sep 17 00:00:00 2001 From: Viperinius Date: Sun, 3 Jul 2022 18:04:48 +0200 Subject: [PATCH 04/80] Add generic font family to chapter mark --- src/elements/emby-slider/emby-slider.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elements/emby-slider/emby-slider.scss b/src/elements/emby-slider/emby-slider.scss index 3e3538c066..1cff4cb16b 100644 --- a/src/elements/emby-slider/emby-slider.scss +++ b/src/elements/emby-slider/emby-slider.scss @@ -259,7 +259,7 @@ } .sliderChapterMark::before { - font-family: 'Material Icons'; + font-family: 'Material Icons', sans-serif; content: "\e892"; } From b78d6439b0022032f6be2e31e1bbb943a98aed94 Mon Sep 17 00:00:00 2001 From: Viperinius Date: Mon, 4 Jul 2022 22:07:34 +0200 Subject: [PATCH 05/80] Change chapter mark classes to include name info. In order to use different icons depending on the chapter name, the name is provided as a class with the prefix scm-. --- src/controllers/playback/video/index.js | 8 +++++--- src/elements/emby-slider/emby-slider.js | 18 +++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index baaec52ff2..379369c64b 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1574,12 +1574,13 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components return '

' + datetime.getDisplayRunningTime(ticks) + '

'; }; - nowPlayingPositionSlider.getChapterFractions = function () { + nowPlayingPositionSlider.getChapterNamesAndFractions = function () { showOsd(); const item = currentItem; if (item && item.Chapters && item.Chapters.length) { + const chapterNames = []; const chapterFractions = []; const runtimeDuration = item.RunTimeTicks; @@ -1588,12 +1589,13 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components const fraction = currentChapter.StartPositionTicks / runtimeDuration; chapterFractions.push(fraction); + chapterNames.push(currentChapter.Name); } - return chapterFractions; + return [chapterNames, chapterFractions]; } - return []; + return [[], []]; }; view.querySelector('.btnPreviousTrack').addEventListener('click', function () { diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 8af342deb9..3ade526569 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -173,15 +173,23 @@ import '../emby-input/emby-input'; } function addChapterMarks(range) { + range.chapterNames = []; range.chapterFractions = []; - if (range.getChapterFractions) { - range.chapterFractions = range.getChapterFractions(); + if (range.getChapterNamesAndFractions) { + [range.chapterNames, range.chapterFractions] = range.getChapterNamesAndFractions(); } - const htmlToInsert = ''; + function htmlToInsert(chapterName) { + let classChapterName = ''; + if (typeof chapterName === 'string' && chapterName.length) { + // limit the class length in case the name contains half a novel + classChapterName = `scm-${chapterName.substring(0, 100).toLowerCase().replace(' ', '-')}`; + } + return ``; + } - range.chapterFractions.forEach(() => { - range.chapterMarkContainerElement.insertAdjacentHTML('beforeend', htmlToInsert); + range.chapterNames.forEach(chapterName => { + range.chapterMarkContainerElement.insertAdjacentHTML('beforeend', htmlToInsert(chapterName || '')); }); range.chapterMarkElements = range.chapterMarkContainerElement.querySelectorAll('.sliderChapterMark'); From ba2c365ac9a5ea97f5851829c92106ffce468f3f Mon Sep 17 00:00:00 2001 From: Viperinius Date: Tue, 5 Jul 2022 16:31:48 +0200 Subject: [PATCH 06/80] Use object to return multiple info instead of array. --- src/controllers/playback/video/index.js | 15 ++++++++------- src/elements/emby-slider/emby-slider.js | 15 +++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 379369c64b..277f2483f5 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1577,25 +1577,26 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components nowPlayingPositionSlider.getChapterNamesAndFractions = function () { showOsd(); + const markers = []; + const item = currentItem; if (item && item.Chapters && item.Chapters.length) { - const chapterNames = []; - const chapterFractions = []; const runtimeDuration = item.RunTimeTicks; for (let i = 0, length = item.Chapters.length; i < length; i++) { const currentChapter = item.Chapters[i]; const fraction = currentChapter.StartPositionTicks / runtimeDuration; - chapterFractions.push(fraction); - chapterNames.push(currentChapter.Name); - } - return [chapterNames, chapterFractions]; + markers.push({ + name: currentChapter.Name, + progress: fraction + }); + } } - return [[], []]; + return markers; }; view.querySelector('.btnPreviousTrack').addEventListener('click', function () { diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 3ade526569..812a846202 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -163,20 +163,19 @@ import '../emby-input/emby-input'; } function updateChapterMarks(range, currentValue) { - if (range.chapterFractions && range.chapterFractions.length && range.chapterMarkElements && range.chapterMarkElements.length) { + if (range.chapterInfo && range.chapterInfo.length && range.chapterMarkElements && range.chapterMarkElements.length) { for (let i = 0, length = range.chapterMarkElements.length; i < length; i++) { - if (range.chapterFractions.length > i) { - setChapterMark(range, mapFractionToValue(range, range.chapterFractions[i]), range.chapterMarkElements[i], currentValue); + if (range.chapterInfo.length > i) { + setChapterMark(range, mapFractionToValue(range, range.chapterInfo[i].progress), range.chapterMarkElements[i], currentValue); } } } } function addChapterMarks(range) { - range.chapterNames = []; - range.chapterFractions = []; + range.chapterInfo = []; if (range.getChapterNamesAndFractions) { - [range.chapterNames, range.chapterFractions] = range.getChapterNamesAndFractions(); + range.chapterInfo = range.getChapterNamesAndFractions(); } function htmlToInsert(chapterName) { @@ -188,8 +187,8 @@ import '../emby-input/emby-input'; return ``; } - range.chapterNames.forEach(chapterName => { - range.chapterMarkContainerElement.insertAdjacentHTML('beforeend', htmlToInsert(chapterName || '')); + range.chapterInfo.forEach(chapter => { + range.chapterMarkContainerElement.insertAdjacentHTML('beforeend', htmlToInsert(chapter.name || '')); }); range.chapterMarkElements = range.chapterMarkContainerElement.querySelectorAll('.sliderChapterMark'); From 04072523ca8c50849bad499dff1b57cffe76ab30 Mon Sep 17 00:00:00 2001 From: Viperinius Date: Tue, 5 Jul 2022 17:11:58 +0200 Subject: [PATCH 07/80] Update function and class names as suggested. More generic name without the inclusion of "chapters" allows potential reuse in the future. --- src/controllers/playback/video/index.html | 2 +- src/controllers/playback/video/index.js | 4 +- src/elements/emby-slider/emby-slider.js | 102 ++++++++++++---------- src/elements/emby-slider/emby-slider.scss | 10 +-- 4 files changed, 63 insertions(+), 55 deletions(-) diff --git a/src/controllers/playback/video/index.html b/src/controllers/playback/video/index.html index 278b1d4d4a..14498039d9 100644 --- a/src/controllers/playback/video/index.html +++ b/src/controllers/playback/video/index.html @@ -21,7 +21,7 @@
-
+
diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 277f2483f5..7aff936ee4 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1574,13 +1574,14 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components return '

' + datetime.getDisplayRunningTime(ticks) + '

'; }; - nowPlayingPositionSlider.getChapterNamesAndFractions = function () { + nowPlayingPositionSlider.getMarkerInfo = function () { showOsd(); const markers = []; const item = currentItem; + // use markers based on chapters if (item && item.Chapters && item.Chapters.length) { const runtimeDuration = item.RunTimeTicks; @@ -1590,6 +1591,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components const fraction = currentChapter.StartPositionTicks / runtimeDuration; markers.push({ + className: 'chapterMarker', name: currentChapter.Name, progress: fraction }); diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 812a846202..a20ce33b21 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -103,11 +103,11 @@ import '../emby-input/emby-input'; backgroundLower.style.width = fraction + '%'; } - if (range.chapterMarkContainerElement) { - if (!range.triedChapterMarksAdd) { - addChapterMarks(range); + if (range.markerContainerElement) { + if (!range.triedAddingMarkers) { + addMarkers(range); } - updateChapterMarks(range, value); + updateMarkers(range, value); } }); } @@ -137,62 +137,68 @@ import '../emby-input/emby-input'; }); } - function setChapterMark(range, valueChapterMark, chapterMark, valueProgress) { + function setMarker(range, valueMarker, marker, valueProgress) { requestAnimationFrame(function () { const bubbleTrackRect = range.sliderBubbleTrack.getBoundingClientRect(); - const chapterMarkRect = chapterMark.getBoundingClientRect(); + const markerRect = marker.getBoundingClientRect(); - if (!bubbleTrackRect.width || !chapterMarkRect.width) { + if (!bubbleTrackRect.width || !markerRect.width) { // width is not set, most probably because the OSD is currently hidden return; } - let chapterMarkPos = (bubbleTrackRect.width * valueChapterMark / 100) - chapterMarkRect.width / 2; - chapterMarkPos = Math.min(Math.max(chapterMarkPos, - chapterMarkRect.width / 2), bubbleTrackRect.width - chapterMarkRect.width / 2); + let markerPos = (bubbleTrackRect.width * valueMarker / 100) - markerRect.width / 2; + markerPos = Math.min(Math.max(markerPos, - markerRect.width / 2), bubbleTrackRect.width - markerRect.width / 2); - chapterMark.style.left = chapterMarkPos + 'px'; + marker.style.left = markerPos + 'px'; - if (valueProgress >= valueChapterMark) { - chapterMark.classList.remove('unwatched'); - chapterMark.classList.add('watched'); + if (valueProgress >= valueMarker) { + marker.classList.remove('unwatched'); + marker.classList.add('watched'); } else { - chapterMark.classList.add('unwatched'); - chapterMark.classList.remove('watched'); + marker.classList.add('unwatched'); + marker.classList.remove('watched'); } }); } - function updateChapterMarks(range, currentValue) { - if (range.chapterInfo && range.chapterInfo.length && range.chapterMarkElements && range.chapterMarkElements.length) { - for (let i = 0, length = range.chapterMarkElements.length; i < length; i++) { - if (range.chapterInfo.length > i) { - setChapterMark(range, mapFractionToValue(range, range.chapterInfo[i].progress), range.chapterMarkElements[i], currentValue); + function updateMarkers(range, currentValue) { + if (range.markerInfo && range.markerInfo.length && range.markerElements && range.markerElements.length) { + for (let i = 0, length = range.markerElements.length; i < length; i++) { + if (range.markerInfo.length > i) { + setMarker(range, mapFractionToValue(range, range.markerInfo[i].progress), range.markerElements[i], currentValue); } } } } - function addChapterMarks(range) { - range.chapterInfo = []; - if (range.getChapterNamesAndFractions) { - range.chapterInfo = range.getChapterNamesAndFractions(); + function addMarkers(range) { + range.markerInfo = []; + if (range.getMarkerInfo) { + range.markerInfo = range.getMarkerInfo(); } - function htmlToInsert(chapterName) { - let classChapterName = ''; - if (typeof chapterName === 'string' && chapterName.length) { - // limit the class length in case the name contains half a novel - classChapterName = `scm-${chapterName.substring(0, 100).toLowerCase().replace(' ', '-')}`; + function htmlToInsert(markerInfo) { + let markerTypeSpecificClasses = ''; + + if (markerInfo.className === 'chapterMarker') { + markerTypeSpecificClasses = markerInfo.className; + + if (typeof markerInfo.name === 'string' && markerInfo.name.length) { + // limit the class length in case the name contains half a novel + markerTypeSpecificClasses = `${markerInfo.className} marker-${markerInfo.name.substring(0, 100).toLowerCase().replace(' ', '-')}`; + } } - return ``; + + return ``; } - range.chapterInfo.forEach(chapter => { - range.chapterMarkContainerElement.insertAdjacentHTML('beforeend', htmlToInsert(chapter.name || '')); + range.markerInfo.forEach(info => { + range.markerContainerElement.insertAdjacentHTML('beforeend', htmlToInsert(info)); }); - range.chapterMarkElements = range.chapterMarkContainerElement.querySelectorAll('.sliderChapterMark'); - range.triedChapterMarksAdd = true; + range.markerElements = range.markerContainerElement.querySelectorAll('.sliderMarker'); + range.triedAddingMarkers = true; } EmbySliderPrototype.attachedCallback = function () { @@ -254,10 +260,10 @@ import '../emby-input/emby-input'; let hasHideClassBubble = sliderBubble.classList.contains('hide'); - this.chapterMarkContainerElement = containerElement.querySelector('.sliderChapterMarkContainer'); - let hasHideClassChapterMarkContainer = false; - if (this.chapterMarkContainerElement) { - hasHideClassChapterMarkContainer = this.chapterMarkContainerElement.classList.contains('hide'); + this.markerContainerElement = containerElement.querySelector('.sliderMarkerContainer'); + let hasHideClassMarkerContainer = false; + if (this.markerContainerElement) { + hasHideClassMarkerContainer = this.markerContainerElement.classList.contains('hide'); } dom.addEventListener(this, 'input', function () { @@ -275,9 +281,9 @@ import '../emby-input/emby-input'; hasHideClassBubble = false; } - if (hasHideClassChapterMarkContainer) { - this.chapterMarkContainerElement.classList.remove('hide'); - hasHideClassChapterMarkContainer = false; + if (hasHideClassMarkerContainer) { + this.markerContainerElement.classList.remove('hide'); + hasHideClassMarkerContainer = false; } }, { passive: true @@ -293,8 +299,8 @@ import '../emby-input/emby-input'; sliderBubble.classList.add('hide'); hasHideClassBubble = true; - this.chapterMarkContainerElement.classList.add('hide'); - hasHideClassChapterMarkContainer = true; + this.markerContainerElement.classList.add('hide'); + hasHideClassMarkerContainer = true; }, { passive: true }); @@ -311,9 +317,9 @@ import '../emby-input/emby-input'; hasHideClassBubble = false; } - if (hasHideClassChapterMarkContainer) { - this.chapterMarkContainerElement.classList.remove('hide'); - hasHideClassChapterMarkContainer = false; + if (hasHideClassMarkerContainer) { + this.markerContainerElement.classList.remove('hide'); + hasHideClassMarkerContainer = false; } } }, { @@ -325,8 +331,8 @@ import '../emby-input/emby-input'; sliderBubble.classList.add('hide'); hasHideClassBubble = true; - this.chapterMarkContainerElement.classList.add('hide'); - hasHideClassChapterMarkContainer = true; + this.markerContainerElement.classList.add('hide'); + hasHideClassMarkerContainer = true; }, { passive: true }); diff --git a/src/elements/emby-slider/emby-slider.scss b/src/elements/emby-slider/emby-slider.scss index 1cff4cb16b..4ff35dc789 100644 --- a/src/elements/emby-slider/emby-slider.scss +++ b/src/elements/emby-slider/emby-slider.scss @@ -246,27 +246,27 @@ margin-bottom: 0.25em; } -.sliderChapterMarkContainer { +.sliderMarkerContainer { position: absolute; left: 0; right: 0; margin: 0 0.54em; /* half of slider thumb size */ } -.sliderChapterMark { +.sliderMarker { position: absolute; transform: translate3d(0, -100%, 0) rotate(90deg); } -.sliderChapterMark::before { +.sliderMarker.chapterMarker::before { font-family: 'Material Icons', sans-serif; content: "\e892"; } -.sliderChapterMark.unwatched { +.sliderMarker.unwatched { color: rgba(255, 255, 255, 0.3); } -.sliderChapterMark.watched { +.sliderMarker.watched { color: #00a4dc; } From 3aff30055dcf63604ccb26449b3a874ad66f55ad Mon Sep 17 00:00:00 2001 From: Viperinius Date: Tue, 5 Jul 2022 17:15:23 +0200 Subject: [PATCH 08/80] Remove explicit call to show the OSD. --- src/controllers/playback/video/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 7aff936ee4..f5abc652b9 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1575,8 +1575,6 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components }; nowPlayingPositionSlider.getMarkerInfo = function () { - showOsd(); - const markers = []; const item = currentItem; From 324990aad007f2d94f04d6b46436d18a387a7cd6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 18:26:49 +0000 Subject: [PATCH 09/80] Update dependency source-map-loader to v4 --- package-lock.json | 38 +++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9fbc4cb44..2d8a56a46d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,7 +95,7 @@ "postcss-scss": "4.0.5", "sass": "1.55.0", "sass-loader": "13.0.2", - "source-map-loader": "3.0.1", + "source-map-loader": "4.0.0", "style-loader": "3.3.1", "stylelint": "14.12.1", "stylelint-config-rational-order": "0.1.2", @@ -3429,9 +3429,9 @@ "devOptional": true }, "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "node_modules/accepts": { @@ -13669,24 +13669,24 @@ } }, "node_modules/source-map-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", - "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", + "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", "dev": true, "dependencies": { - "abab": "^2.0.5", + "abab": "^2.0.6", "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.72.1" } }, "node_modules/source-map-resolve": { @@ -20848,9 +20848,9 @@ "devOptional": true }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "accepts": { @@ -28389,14 +28389,14 @@ "dev": true }, "source-map-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", - "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", + "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", "dev": true, "requires": { - "abab": "^2.0.5", + "abab": "^2.0.6", "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.2" } }, "source-map-resolve": { diff --git a/package.json b/package.json index 1e671c85de..08658c5537 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "postcss-scss": "4.0.5", "sass": "1.55.0", "sass-loader": "13.0.2", - "source-map-loader": "3.0.1", + "source-map-loader": "4.0.0", "style-loader": "3.3.1", "stylelint": "14.12.1", "stylelint-config-rational-order": "0.1.2", From d9bb55a2a9ffc71b677b5cc9bdd90018560d7bef Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sat, 1 Oct 2022 02:39:12 -0400 Subject: [PATCH 10/80] Move SyncPlay initialization to plugin --- .../syncPlay/core/players/PlayerFactory.js | 4 +- src/config.json | 3 +- src/index.jsx | 31 +----------- src/plugins/syncPlay/plugin.ts | 49 +++++++++++++++++++ 4 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 src/plugins/syncPlay/plugin.ts diff --git a/src/components/syncPlay/core/players/PlayerFactory.js b/src/components/syncPlay/core/players/PlayerFactory.js index 1de9aa5126..ab4170c9e7 100644 --- a/src/components/syncPlay/core/players/PlayerFactory.js +++ b/src/components/syncPlay/core/players/PlayerFactory.js @@ -16,7 +16,7 @@ class PlayerFactory { /** * Registers a wrapper to the list of players that can be managed. - * @param {GenericPlayer} wrapperClass The wrapper to register. + * @param {typeof GenericPlayer} wrapperClass The wrapper to register. */ registerWrapper(wrapperClass) { console.debug('SyncPlay WrapperFactory registerWrapper:', wrapperClass.type); @@ -25,7 +25,7 @@ class PlayerFactory { /** * Sets the default player wrapper. - * @param {GenericPlayer} wrapperClass The wrapper. + * @param {typeof GenericPlayer} wrapperClass The wrapper. */ setDefaultWrapper(wrapperClass) { console.debug('SyncPlay WrapperFactory setDefaultWrapper:', wrapperClass.type); diff --git a/src/config.json b/src/config.json index 5b24006a48..3d80b1efec 100644 --- a/src/config.json +++ b/src/config.json @@ -44,6 +44,7 @@ "pdfPlayer/plugin", "logoScreensaver/plugin", "sessionPlayer/plugin", - "chromecastPlayer/plugin" + "chromecastPlayer/plugin", + "syncPlay/plugin" ] } diff --git a/src/index.jsx b/src/index.jsx index 7ca4b92a24..e177a281e1 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -35,11 +35,6 @@ import './legacy/domParserTextHtml'; import './legacy/focusPreventScroll'; import './legacy/htmlMediaElement'; import './legacy/vendorStyles'; -import SyncPlay from './components/syncPlay/core'; -import { playbackManager } from './components/playback/playbackmanager'; -import SyncPlayNoActivePlayer from './components/syncPlay/ui/players/NoActivePlayer'; -import SyncPlayHtmlVideoPlayer from './components/syncPlay/ui/players/HtmlVideoPlayer'; -import SyncPlayHtmlAudioPlayer from './components/syncPlay/ui/players/HtmlAudioPlayer'; import { currentSettings } from './scripts/settings/userSettings'; import taskButton from './scripts/taskbutton'; import { HistoryRouter } from './components/HistoryRouter.tsx'; @@ -102,10 +97,7 @@ function onGlobalizeInit() { import('./assets/css/librarybrowser.scss'); - loadPlugins().then(function () { - initSyncPlay(); - onAppReady(); - }); + loadPlugins().then(onAppReady); } function loadPlugins() { @@ -137,27 +129,6 @@ function loadPlugins() { }); } -function initSyncPlay() { - // Register player wrappers. - SyncPlay.PlayerFactory.setDefaultWrapper(SyncPlayNoActivePlayer); - SyncPlay.PlayerFactory.registerWrapper(SyncPlayHtmlVideoPlayer); - SyncPlay.PlayerFactory.registerWrapper(SyncPlayHtmlAudioPlayer); - - // Listen for player changes. - Events.on(playbackManager, 'playerchange', (event, newPlayer, newTarget, oldPlayer) => { - SyncPlay.Manager.onPlayerChange(newPlayer, newTarget, oldPlayer); - }); - - // Start SyncPlay. - const apiClient = ServerConnections.currentApiClient(); - if (apiClient) SyncPlay.Manager.init(apiClient); - - // FIXME: Multiple apiClients? - Events.on(ServerConnections, 'apiclientcreated', (e, newApiClient) => SyncPlay.Manager.init(newApiClient)); - Events.on(ServerConnections, 'localusersignedin', () => SyncPlay.Manager.updateApiClient(ServerConnections.currentApiClient())); - Events.on(ServerConnections, 'localusersignedout', () => SyncPlay.Manager.updateApiClient(ServerConnections.currentApiClient())); -} - async function onAppReady() { console.debug('begin onAppReady'); diff --git a/src/plugins/syncPlay/plugin.ts b/src/plugins/syncPlay/plugin.ts new file mode 100644 index 0000000000..f4cd78a3c5 --- /dev/null +++ b/src/plugins/syncPlay/plugin.ts @@ -0,0 +1,49 @@ +import { Events } from 'jellyfin-apiclient'; + +import { playbackManager } from '../../components/playback/playbackmanager'; +import ServerConnections from '../../components/ServerConnections'; +import SyncPlay from '../../components/syncPlay/core'; +import SyncPlayNoActivePlayer from '../../components/syncPlay/ui/players/NoActivePlayer'; +import SyncPlayHtmlVideoPlayer from '../../components/syncPlay/ui/players/HtmlVideoPlayer'; +import SyncPlayHtmlAudioPlayer from '../../components/syncPlay/ui/players/HtmlAudioPlayer'; + +class SyncPlayPlugin { + name: string; + id: string; + type: string; + priority: number; + + constructor() { + this.name = 'SyncPlay Plugin'; + this.id = 'syncplay'; + // NOTE: This should probably be a "mediaplayer" so the playback manager can handle playback logic, but + // SyncPlay needs refactored so it does not have an independent playback manager. + this.type = 'syncplay'; + this.priority = 1; + + this.init(); + } + + init() { + // Register player wrappers. + SyncPlay.PlayerFactory.setDefaultWrapper(SyncPlayNoActivePlayer); + SyncPlay.PlayerFactory.registerWrapper(SyncPlayHtmlVideoPlayer); + SyncPlay.PlayerFactory.registerWrapper(SyncPlayHtmlAudioPlayer); + + // Listen for player changes. + Events.on(playbackManager, 'playerchange', (_, newPlayer) => { + SyncPlay.Manager.onPlayerChange(newPlayer); + }); + + // Start SyncPlay. + const apiClient = ServerConnections.currentApiClient(); + if (apiClient) SyncPlay.Manager.init(apiClient); + + // FIXME: Multiple apiClients? + Events.on(ServerConnections, 'apiclientcreated', (_, newApiClient) => SyncPlay.Manager.init(newApiClient)); + Events.on(ServerConnections, 'localusersignedin', () => SyncPlay.Manager.updateApiClient(ServerConnections.currentApiClient())); + Events.on(ServerConnections, 'localusersignedout', () => SyncPlay.Manager.updateApiClient(ServerConnections.currentApiClient())); + } +} + +export default SyncPlayPlugin; From 496508ee4d4a9791387a28367d37bcebd84bc49a Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sat, 1 Oct 2022 02:57:30 -0400 Subject: [PATCH 11/80] Move SyncPlay code to plugin directory --- src/components/playerstats/playerstats.js | 2 +- src/components/playlisteditor/playlisteditor.js | 2 +- src/controllers/playback/video/index.js | 2 +- .../syncPlay/core/Controller.js | 0 src/{components => plugins}/syncPlay/core/Helper.js | 0 src/{components => plugins}/syncPlay/core/Manager.js | 2 +- .../syncPlay/core/PlaybackCore.js | 0 .../syncPlay/core/QueueCore.js | 2 +- .../syncPlay/core/Settings.js | 0 src/{components => plugins}/syncPlay/core/index.js | 0 .../syncPlay/core/players/GenericPlayer.js | 0 .../syncPlay/core/players/PlayerFactory.js | 0 .../syncPlay/core/timeSync/TimeSync.js | 0 .../syncPlay/core/timeSync/TimeSyncCore.js | 0 .../syncPlay/core/timeSync/TimeSyncServer.js | 0 src/plugins/syncPlay/plugin.ts | 8 ++++---- .../syncPlay/ui/groupSelectionMenu.js | 8 ++++---- .../syncPlay/ui/groupSelectionMenu.scss | 0 .../syncPlay/ui/playbackPermissionManager.js | 2 +- .../syncPlay/ui/players/HtmlAudioPlayer.js | 0 .../syncPlay/ui/players/HtmlVideoPlayer.js | 0 .../syncPlay/ui/players/NoActivePlayer.js | 2 +- .../syncPlay/ui/players/QueueManager.js | 0 .../syncPlay/ui/settings/SettingsEditor.js | 12 ++++++------ .../syncPlay/ui/settings/editor.html | 0 src/scripts/libraryMenu.js | 2 +- src/scripts/serverNotifications.js | 2 +- 27 files changed, 23 insertions(+), 23 deletions(-) rename src/{components => plugins}/syncPlay/core/Controller.js (100%) rename src/{components => plugins}/syncPlay/core/Helper.js (100%) rename src/{components => plugins}/syncPlay/core/Manager.js (99%) rename src/{components => plugins}/syncPlay/core/PlaybackCore.js (100%) rename src/{components => plugins}/syncPlay/core/QueueCore.js (99%) rename src/{components => plugins}/syncPlay/core/Settings.js (100%) rename src/{components => plugins}/syncPlay/core/index.js (100%) rename src/{components => plugins}/syncPlay/core/players/GenericPlayer.js (100%) rename src/{components => plugins}/syncPlay/core/players/PlayerFactory.js (100%) rename src/{components => plugins}/syncPlay/core/timeSync/TimeSync.js (100%) rename src/{components => plugins}/syncPlay/core/timeSync/TimeSyncCore.js (100%) rename src/{components => plugins}/syncPlay/core/timeSync/TimeSyncServer.js (100%) rename src/{components => plugins}/syncPlay/ui/groupSelectionMenu.js (96%) rename src/{components => plugins}/syncPlay/ui/groupSelectionMenu.scss (100%) rename src/{components => plugins}/syncPlay/ui/playbackPermissionManager.js (96%) rename src/{components => plugins}/syncPlay/ui/players/HtmlAudioPlayer.js (100%) rename src/{components => plugins}/syncPlay/ui/players/HtmlVideoPlayer.js (100%) rename src/{components => plugins}/syncPlay/ui/players/NoActivePlayer.js (99%) rename src/{components => plugins}/syncPlay/ui/players/QueueManager.js (100%) rename src/{components => plugins}/syncPlay/ui/settings/SettingsEditor.js (93%) rename src/{components => plugins}/syncPlay/ui/settings/editor.html (100%) diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js index df15dac19d..225b0650c7 100644 --- a/src/components/playerstats/playerstats.js +++ b/src/components/playerstats/playerstats.js @@ -4,7 +4,7 @@ import globalize from '../../scripts/globalize'; import layoutManager from '../layoutManager'; import { playbackManager } from '../playback/playbackmanager'; import playMethodHelper from '../playback/playmethodhelper'; -import SyncPlay from '../../components/syncPlay/core'; +import SyncPlay from '../../plugins/syncPlay/core'; import './playerstats.scss'; import ServerConnections from '../ServerConnections'; diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index 440685fd9c..70ae0644d1 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -4,7 +4,7 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import layoutManager from '../layoutManager'; import { playbackManager } from '../playback/playbackmanager'; -import SyncPlay from '../../components/syncPlay/core'; +import SyncPlay from '../../plugins/syncPlay/core'; import * as userSettings from '../../scripts/settings/userSettings'; import { appRouter } from '../appRouter'; import globalize from '../../scripts/globalize'; diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index d5da82b740..a51bff1d50 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1,6 +1,6 @@ import escapeHtml from 'escape-html'; import { playbackManager } from '../../../components/playback/playbackmanager'; -import SyncPlay from '../../../components/syncPlay/core'; +import SyncPlay from '../../../plugins/syncPlay/core'; import browser from '../../../scripts/browser'; import dom from '../../../scripts/dom'; import inputManager from '../../../scripts/inputManager'; diff --git a/src/components/syncPlay/core/Controller.js b/src/plugins/syncPlay/core/Controller.js similarity index 100% rename from src/components/syncPlay/core/Controller.js rename to src/plugins/syncPlay/core/Controller.js diff --git a/src/components/syncPlay/core/Helper.js b/src/plugins/syncPlay/core/Helper.js similarity index 100% rename from src/components/syncPlay/core/Helper.js rename to src/plugins/syncPlay/core/Helper.js diff --git a/src/components/syncPlay/core/Manager.js b/src/plugins/syncPlay/core/Manager.js similarity index 99% rename from src/components/syncPlay/core/Manager.js rename to src/plugins/syncPlay/core/Manager.js index 16640c1df2..c41fe14fb7 100644 --- a/src/components/syncPlay/core/Manager.js +++ b/src/plugins/syncPlay/core/Manager.js @@ -9,7 +9,7 @@ import TimeSyncCore from './timeSync/TimeSyncCore'; import PlaybackCore from './PlaybackCore'; import QueueCore from './QueueCore'; import Controller from './Controller'; -import toast from '../../toast/toast'; +import toast from '../../../components/toast/toast'; import globalize from '../../../scripts/globalize'; /** diff --git a/src/components/syncPlay/core/PlaybackCore.js b/src/plugins/syncPlay/core/PlaybackCore.js similarity index 100% rename from src/components/syncPlay/core/PlaybackCore.js rename to src/plugins/syncPlay/core/PlaybackCore.js diff --git a/src/components/syncPlay/core/QueueCore.js b/src/plugins/syncPlay/core/QueueCore.js similarity index 99% rename from src/components/syncPlay/core/QueueCore.js rename to src/plugins/syncPlay/core/QueueCore.js index 81feac0aca..cdf1d56a1e 100644 --- a/src/components/syncPlay/core/QueueCore.js +++ b/src/plugins/syncPlay/core/QueueCore.js @@ -4,7 +4,7 @@ */ import globalize from '../../../scripts/globalize'; -import toast from '../../toast/toast'; +import toast from '../../../components/toast/toast'; import * as Helper from './Helper'; /** diff --git a/src/components/syncPlay/core/Settings.js b/src/plugins/syncPlay/core/Settings.js similarity index 100% rename from src/components/syncPlay/core/Settings.js rename to src/plugins/syncPlay/core/Settings.js diff --git a/src/components/syncPlay/core/index.js b/src/plugins/syncPlay/core/index.js similarity index 100% rename from src/components/syncPlay/core/index.js rename to src/plugins/syncPlay/core/index.js diff --git a/src/components/syncPlay/core/players/GenericPlayer.js b/src/plugins/syncPlay/core/players/GenericPlayer.js similarity index 100% rename from src/components/syncPlay/core/players/GenericPlayer.js rename to src/plugins/syncPlay/core/players/GenericPlayer.js diff --git a/src/components/syncPlay/core/players/PlayerFactory.js b/src/plugins/syncPlay/core/players/PlayerFactory.js similarity index 100% rename from src/components/syncPlay/core/players/PlayerFactory.js rename to src/plugins/syncPlay/core/players/PlayerFactory.js diff --git a/src/components/syncPlay/core/timeSync/TimeSync.js b/src/plugins/syncPlay/core/timeSync/TimeSync.js similarity index 100% rename from src/components/syncPlay/core/timeSync/TimeSync.js rename to src/plugins/syncPlay/core/timeSync/TimeSync.js diff --git a/src/components/syncPlay/core/timeSync/TimeSyncCore.js b/src/plugins/syncPlay/core/timeSync/TimeSyncCore.js similarity index 100% rename from src/components/syncPlay/core/timeSync/TimeSyncCore.js rename to src/plugins/syncPlay/core/timeSync/TimeSyncCore.js diff --git a/src/components/syncPlay/core/timeSync/TimeSyncServer.js b/src/plugins/syncPlay/core/timeSync/TimeSyncServer.js similarity index 100% rename from src/components/syncPlay/core/timeSync/TimeSyncServer.js rename to src/plugins/syncPlay/core/timeSync/TimeSyncServer.js diff --git a/src/plugins/syncPlay/plugin.ts b/src/plugins/syncPlay/plugin.ts index f4cd78a3c5..e1b7c29cd6 100644 --- a/src/plugins/syncPlay/plugin.ts +++ b/src/plugins/syncPlay/plugin.ts @@ -2,10 +2,10 @@ import { Events } from 'jellyfin-apiclient'; import { playbackManager } from '../../components/playback/playbackmanager'; import ServerConnections from '../../components/ServerConnections'; -import SyncPlay from '../../components/syncPlay/core'; -import SyncPlayNoActivePlayer from '../../components/syncPlay/ui/players/NoActivePlayer'; -import SyncPlayHtmlVideoPlayer from '../../components/syncPlay/ui/players/HtmlVideoPlayer'; -import SyncPlayHtmlAudioPlayer from '../../components/syncPlay/ui/players/HtmlAudioPlayer'; +import SyncPlay from './core'; +import SyncPlayNoActivePlayer from './ui/players/NoActivePlayer'; +import SyncPlayHtmlVideoPlayer from './ui/players/HtmlVideoPlayer'; +import SyncPlayHtmlAudioPlayer from './ui/players/HtmlAudioPlayer'; class SyncPlayPlugin { name: string; diff --git a/src/components/syncPlay/ui/groupSelectionMenu.js b/src/plugins/syncPlay/ui/groupSelectionMenu.js similarity index 96% rename from src/components/syncPlay/ui/groupSelectionMenu.js rename to src/plugins/syncPlay/ui/groupSelectionMenu.js index 807899773f..106ee8e42d 100644 --- a/src/components/syncPlay/ui/groupSelectionMenu.js +++ b/src/plugins/syncPlay/ui/groupSelectionMenu.js @@ -1,12 +1,12 @@ import { Events } from 'jellyfin-apiclient'; import SyncPlay from '../core'; import SyncPlaySettingsEditor from './settings/SettingsEditor'; -import loading from '../../loading/loading'; -import toast from '../../toast/toast'; -import actionsheet from '../../actionSheet/actionSheet'; +import loading from '../../../components/loading/loading'; +import toast from '../../../components/toast/toast'; +import actionsheet from '../../../components/actionSheet/actionSheet'; import globalize from '../../../scripts/globalize'; import playbackPermissionManager from './playbackPermissionManager'; -import ServerConnections from '../../ServerConnections'; +import ServerConnections from '../../../components/ServerConnections'; import './groupSelectionMenu.scss'; /** diff --git a/src/components/syncPlay/ui/groupSelectionMenu.scss b/src/plugins/syncPlay/ui/groupSelectionMenu.scss similarity index 100% rename from src/components/syncPlay/ui/groupSelectionMenu.scss rename to src/plugins/syncPlay/ui/groupSelectionMenu.scss diff --git a/src/components/syncPlay/ui/playbackPermissionManager.js b/src/plugins/syncPlay/ui/playbackPermissionManager.js similarity index 96% rename from src/components/syncPlay/ui/playbackPermissionManager.js rename to src/plugins/syncPlay/ui/playbackPermissionManager.js index 2a70d7370a..816b57bca9 100644 --- a/src/components/syncPlay/ui/playbackPermissionManager.js +++ b/src/plugins/syncPlay/ui/playbackPermissionManager.js @@ -1,4 +1,4 @@ -import { appHost } from '../../apphost'; +import { appHost } from '../../../components/apphost'; /** * Creates an audio element that plays a silent sound. diff --git a/src/components/syncPlay/ui/players/HtmlAudioPlayer.js b/src/plugins/syncPlay/ui/players/HtmlAudioPlayer.js similarity index 100% rename from src/components/syncPlay/ui/players/HtmlAudioPlayer.js rename to src/plugins/syncPlay/ui/players/HtmlAudioPlayer.js diff --git a/src/components/syncPlay/ui/players/HtmlVideoPlayer.js b/src/plugins/syncPlay/ui/players/HtmlVideoPlayer.js similarity index 100% rename from src/components/syncPlay/ui/players/HtmlVideoPlayer.js rename to src/plugins/syncPlay/ui/players/HtmlVideoPlayer.js diff --git a/src/components/syncPlay/ui/players/NoActivePlayer.js b/src/plugins/syncPlay/ui/players/NoActivePlayer.js similarity index 99% rename from src/components/syncPlay/ui/players/NoActivePlayer.js rename to src/plugins/syncPlay/ui/players/NoActivePlayer.js index 699d31517b..c5f528938d 100644 --- a/src/components/syncPlay/ui/players/NoActivePlayer.js +++ b/src/plugins/syncPlay/ui/players/NoActivePlayer.js @@ -3,7 +3,7 @@ * @module components/syncPlay/ui/players/NoActivePlayer */ -import { playbackManager } from '../../../playback/playbackmanager'; +import { playbackManager } from '../../../../components/playback/playbackmanager'; import SyncPlay from '../../core'; import QueueManager from './QueueManager'; diff --git a/src/components/syncPlay/ui/players/QueueManager.js b/src/plugins/syncPlay/ui/players/QueueManager.js similarity index 100% rename from src/components/syncPlay/ui/players/QueueManager.js rename to src/plugins/syncPlay/ui/players/QueueManager.js diff --git a/src/components/syncPlay/ui/settings/SettingsEditor.js b/src/plugins/syncPlay/ui/settings/SettingsEditor.js similarity index 93% rename from src/components/syncPlay/ui/settings/SettingsEditor.js rename to src/plugins/syncPlay/ui/settings/SettingsEditor.js index 3f90725145..ede7e267a3 100644 --- a/src/components/syncPlay/ui/settings/SettingsEditor.js +++ b/src/plugins/syncPlay/ui/settings/SettingsEditor.js @@ -6,10 +6,10 @@ import { Events } from 'jellyfin-apiclient'; import SyncPlay from '../../core'; import { setSetting } from '../../core/Settings'; -import dialogHelper from '../../../dialogHelper/dialogHelper'; -import layoutManager from '../../../layoutManager'; -import loading from '../../../loading/loading'; -import toast from '../../../toast/toast'; +import dialogHelper from '../../../../components/dialogHelper/dialogHelper'; +import layoutManager from '../../../../components/layoutManager'; +import loading from '../../../../components/loading/loading'; +import toast from '../../../../components/toast/toast'; import globalize from '../../../../scripts/globalize'; import 'material-design-icons-iconfont'; @@ -18,8 +18,8 @@ import '../../../../elements/emby-select/emby-select'; import '../../../../elements/emby-button/emby-button'; import '../../../../elements/emby-button/paper-icon-button-light'; import '../../../../elements/emby-checkbox/emby-checkbox'; -import '../../../listview/listview.scss'; -import '../../../formdialog.scss'; +import '../../../../components/listview/listview.scss'; +import '../../../../components/formdialog.scss'; function centerFocus(elem, horiz, on) { import('../../../../scripts/scrollHelper').then((scrollHelper) => { diff --git a/src/components/syncPlay/ui/settings/editor.html b/src/plugins/syncPlay/ui/settings/editor.html similarity index 100% rename from src/components/syncPlay/ui/settings/editor.html rename to src/plugins/syncPlay/ui/settings/editor.html diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 81f819f809..5cf5be305d 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -9,7 +9,7 @@ import viewManager from '../components/viewManager/viewManager'; import { appRouter } from '../components/appRouter'; import { appHost } from '../components/apphost'; import { playbackManager } from '../components/playback/playbackmanager'; -import groupSelectionMenu from '../components/syncPlay/ui/groupSelectionMenu'; +import groupSelectionMenu from '../plugins/syncPlay/ui/groupSelectionMenu'; import browser from './browser'; import globalize from './globalize'; import imageHelper from './imagehelper'; diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index 73a10bcbde..e8b58ce0fe 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -1,5 +1,5 @@ import { playbackManager } from '../components/playback/playbackmanager'; -import SyncPlay from '../components/syncPlay/core'; +import SyncPlay from '../plugins/syncPlay/core'; import { Events } from 'jellyfin-apiclient'; import inputManager from '../scripts/inputManager'; import focusManager from '../components/focusManager'; From 9aea7e39279cdb6c00b6f6a131d997e3a149d4fb Mon Sep 17 00:00:00 2001 From: Viperinius Date: Sat, 1 Oct 2022 16:09:25 +0200 Subject: [PATCH 12/80] Update getMarkerInfo syntax as suggested --- src/controllers/playback/video/index.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index f5abc652b9..efad883f20 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1580,20 +1580,14 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components const item = currentItem; // use markers based on chapters - if (item && item.Chapters && item.Chapters.length) { - const runtimeDuration = item.RunTimeTicks; - - for (let i = 0, length = item.Chapters.length; i < length; i++) { - const currentChapter = item.Chapters[i]; - - const fraction = currentChapter.StartPositionTicks / runtimeDuration; - + if (item?.Chapters?.length) { + item.Chapters.forEach(currentChapter => { markers.push({ className: 'chapterMarker', name: currentChapter.Name, - progress: fraction + progress: currentChapter.StartPositionTicks / item.RunTimeTicks }); - } + }); } return markers; From b43c9e0137ba0183a4cc8d32bbd2afd8c51c76fb Mon Sep 17 00:00:00 2001 From: Viperinius Date: Sat, 1 Oct 2022 20:09:23 +0200 Subject: [PATCH 13/80] Change slider marker for chapters appearance. Now, the markers are displayed as ticks instead of icons above the slider --- src/elements/emby-slider/emby-slider.scss | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/elements/emby-slider/emby-slider.scss b/src/elements/emby-slider/emby-slider.scss index 4ff35dc789..eb9ab75c4a 100644 --- a/src/elements/emby-slider/emby-slider.scss +++ b/src/elements/emby-slider/emby-slider.scss @@ -255,18 +255,15 @@ .sliderMarker { position: absolute; - transform: translate3d(0, -100%, 0) rotate(90deg); -} - -.sliderMarker.chapterMarker::before { - font-family: 'Material Icons', sans-serif; - content: "\e892"; + width: 2px; + height: 0.5em; + transform: translate3d(0, 25%, 0); } .sliderMarker.unwatched { - color: rgba(255, 255, 255, 0.3); + background-color: rgba(255, 255, 255, 0.3); } .sliderMarker.watched { - color: #00a4dc; + background-color: #00a4dc; } From 3a07d34884faedad8f392bf23c877c7dc399a2a0 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sun, 2 Oct 2022 03:55:35 -0400 Subject: [PATCH 14/80] Add check that SyncPlay plugin is enabled --- src/scripts/libraryMenu.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 5cf5be305d..ce1918e196 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -9,6 +9,7 @@ import viewManager from '../components/viewManager/viewManager'; import { appRouter } from '../components/appRouter'; import { appHost } from '../components/apphost'; import { playbackManager } from '../components/playback/playbackmanager'; +import { pluginManager } from '../components/pluginManager'; import groupSelectionMenu from '../plugins/syncPlay/ui/groupSelectionMenu'; import browser from './browser'; import globalize from './globalize'; @@ -154,8 +155,14 @@ import '../assets/css/flexstyles.scss'; const policy = user.Policy ? user.Policy : user.localUser.Policy; - const apiClient = getCurrentApiClient(); - if (headerSyncButton && policy?.SyncPlayAccess !== 'None' && apiClient.isMinServerVersion('10.6.0')) { + if ( + // Button is present + headerSyncButton + // SyncPlay plugin is loaded + && pluginManager.plugins.filter(plugin => plugin.id === 'syncplay').length > 0 + // SyncPlay enabled for user + && policy?.SyncPlayAccess !== 'None' + ) { headerSyncButton.classList.remove('hide'); } } else { From dfca85dea464474b60fecd1aa9fbd5fc329dbb78 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sun, 2 Oct 2022 04:13:39 -0400 Subject: [PATCH 15/80] 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 16/80] 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 17/80] 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 18/80] 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 19/80] 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 1f4e65822bc6a05a079abb5283aa20ef63b295dd Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 3 Oct 2022 14:22:02 -0400 Subject: [PATCH 20/80] Fix sonarjs no-collapsible-if --- .eslintrc.js | 1 - src/components/appRouter.js | 24 ++- src/components/cardbuilder/cardBuilder.js | 68 ++++---- .../cardbuilder/chaptercardbuilder.js | 6 +- src/components/focusManager.js | 9 +- src/components/itemContextMenu.js | 149 ++++++++---------- src/components/itemHelper.js | 67 +++----- src/components/itemsrefresher.js | 10 +- src/components/listview/listview.js | 58 +++---- src/components/mediainfo/mediainfo.js | 55 ++++--- src/components/nowPlayingBar/nowPlayingBar.js | 8 +- src/components/playback/playbackmanager.js | 66 +++----- .../playback/playerSelectionMenu.js | 14 +- .../recordingcreator/recordingbutton.js | 6 +- .../recordingcreator/recordingfields.js | 25 +-- src/components/slideshow/slideshow.js | 8 +- .../subtitleeditor/subtitleeditor.js | 6 +- src/controllers/dashboard/dashboard.js | 12 +- src/elements/emby-input/emby-input.js | 10 +- .../emby-itemscontainer.js | 20 +-- src/elements/emby-slider/emby-slider.js | 6 +- src/elements/emby-tabs/emby-tabs.js | 6 +- src/index.jsx | 8 +- src/libraries/navdrawer/navdrawer.js | 54 +++---- src/libraries/scroller.js | 18 +-- src/plugins/chromecastPlayer/plugin.js | 8 +- src/plugins/htmlVideoPlayer/plugin.js | 33 ++-- src/plugins/sessionPlayer/plugin.js | 8 +- src/plugins/youtubePlayer/plugin.js | 6 +- src/scripts/browser.js | 8 +- src/scripts/browserDeviceProfile.js | 10 +- src/scripts/libraryBrowser.js | 6 +- src/scripts/mouseManager.js | 10 +- 33 files changed, 330 insertions(+), 473 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index a3594d87a8..3e01786246 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -73,7 +73,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'], 'sonarjs/no-gratuitous-expressions': ['off'], diff --git a/src/components/appRouter.js b/src/components/appRouter.js index f2bc0e27b0..9bfdc85707 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -87,12 +87,10 @@ class AppRouter { path = path.replace(this.baseUrl(), ''); - if (this.currentRouteInfo && this.currentRouteInfo.path === path) { - // can't use this with home right now due to the back menu - if (this.currentRouteInfo.route.type !== 'home') { - loading.hide(); - return Promise.resolve(); - } + // can't use this with home right now due to the back menu + if (this.currentRouteInfo?.path === path && this.currentRouteInfo.route.type !== 'home') { + loading.hide(); + return Promise.resolve(); } this.promiseShow = new Promise((resolve) => { @@ -351,15 +349,13 @@ class AppRouter { onRequestFail(_e, data) { const apiClient = this; - if (data.status === 403) { - if (data.errorCode === 'ParentalControl') { - const isCurrentAllowed = appRouter.currentRouteInfo ? (appRouter.currentRouteInfo.route.anonymous || appRouter.currentRouteInfo.route.startup) : true; + if (data.status === 403 && data.errorCode === 'ParentalControl') { + const isCurrentAllowed = appRouter.currentRouteInfo ? (appRouter.currentRouteInfo.route.anonymous || appRouter.currentRouteInfo.route.startup) : true; - // Bounce to the login screen, but not if a password entry fails, obviously - if (!isCurrentAllowed) { - appRouter.showForcedLogoutMessage(globalize.translate('AccessRestrictedTryAgainLater')); - appRouter.showLocalLogin(apiClient.serverId()); - } + // Bounce to the login screen, but not if a password entry fails, obviously + if (!isCurrentAllowed) { + appRouter.showForcedLogoutMessage(globalize.translate('AccessRestrictedTryAgainLater')); + appRouter.showLocalLogin(apiClient.serverId()); } } } diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index b5f85c9a57..ebdc250d7a 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -790,10 +790,8 @@ import { appRouter } from '../appRouter'; const showOtherText = isOuterFooter ? !overlayText : overlayText; - if (isOuterFooter && options.cardLayout && layoutManager.mobile) { - if (options.cardFooterAside !== 'none') { - html += ``; - } + if (isOuterFooter && options.cardLayout && layoutManager.mobile && options.cardFooterAside !== 'none') { + html += ``; } const cssClass = options.centerText ? 'cardText cardTextCentered' : 'cardText'; @@ -803,33 +801,31 @@ import { appRouter } from '../appRouter'; const parentTitleUnderneath = item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'MusicVideo'; let titleAdded; - if (showOtherText) { - if ((options.showParentTitle || options.showParentTitleOrTitle) && !parentTitleUnderneath) { - if (isOuterFooter && item.Type === 'Episode' && item.SeriesName) { - if (item.SeriesId) { - lines.push(getTextActionButton({ - Id: item.SeriesId, - ServerId: serverId, - Name: item.SeriesName, - Type: 'Series', - IsFolder: true - })); - } else { - lines.push(escapeHtml(item.SeriesName)); + if (showOtherText && (options.showParentTitle || options.showParentTitleOrTitle) && !parentTitleUnderneath) { + if (isOuterFooter && item.Type === 'Episode' && item.SeriesName) { + if (item.SeriesId) { + lines.push(getTextActionButton({ + Id: item.SeriesId, + ServerId: serverId, + Name: item.SeriesName, + Type: 'Series', + IsFolder: true + })); + } else { + lines.push(escapeHtml(item.SeriesName)); + } + } else { + if (isUsingLiveTvNaming(item)) { + lines.push(escapeHtml(item.Name)); + + if (!item.EpisodeTitle && !item.IndexNumber) { + titleAdded = true; } } else { - if (isUsingLiveTvNaming(item)) { - lines.push(escapeHtml(item.Name)); + const parentTitle = item.SeriesName || item.Series || item.Album || item.AlbumArtist || ''; - if (!item.EpisodeTitle && !item.IndexNumber) { - titleAdded = true; - } - } else { - const parentTitle = item.SeriesName || item.Series || item.Album || item.AlbumArtist || ''; - - if (parentTitle || showTitle) { - lines.push(escapeHtml(parentTitle)); - } + if (parentTitle || showTitle) { + lines.push(escapeHtml(parentTitle)); } } } @@ -986,10 +982,8 @@ import { appRouter } from '../appRouter'; } } - if (options.showPersonRoleOrType) { - if (item.Role) { - lines.push(globalize.translate('PersonRole', escapeHtml(item.Role))); - } + if (options.showPersonRoleOrType && item.Role) { + lines.push(globalize.translate('PersonRole', escapeHtml(item.Role))); } } @@ -1009,13 +1003,11 @@ import { appRouter } from '../appRouter'; html += progressHtml; } - if (html) { - if (!isOuterFooter || logoUrl || options.cardLayout) { - html = '
' + html; + if (html && (!isOuterFooter || logoUrl || options.cardLayout)) { + html = '
' + html; - //cardFooter - html += '
'; - } + //cardFooter + html += '
'; } return html; diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index da8de34f9a..f479fb4c88 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -34,10 +34,8 @@ import ServerConnections from '../ServerConnections'; let shape = (options.backdropShape || 'backdrop'); - if (videoStream.Width && videoStream.Height) { - if ((videoStream.Width / videoStream.Height) <= 1.2) { - shape = (options.squareShape || 'square'); - } + if (videoStream.Width && videoStream.Height && (videoStream.Width / videoStream.Height) <= 1.2) { + shape = (options.squareShape || 'square'); } className += ` ${shape}Card`; diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 0b0ae06211..740ff7c07d 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -384,10 +384,11 @@ import scrollManager from './scrollManager'; // See if there's a focusable container, and if so, send the focus command to that if (activeElement) { const nearestElementFocusableParent = dom.parentWithClass(nearestElement, 'focusable'); - if (nearestElementFocusableParent && nearestElementFocusableParent !== nearestElement) { - if (focusableContainer !== nearestElementFocusableParent) { - nearestElement = nearestElementFocusableParent; - } + if (nearestElementFocusableParent + && nearestElementFocusableParent !== nearestElement + && focusableContainer !== nearestElementFocusableParent + ) { + nearestElement = nearestElementFocusableParent; } } focus(nearestElement); diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 34c10ffd33..6974f609ef 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -72,26 +72,25 @@ import toast from './toast/toast'; } } - if (item.IsFolder || item.Type === 'MusicArtist' || item.Type === 'MusicGenre') { - if (item.CollectionType !== 'livetv') { - if (options.shuffle !== false) { - commands.push({ - name: globalize.translate('Shuffle'), - id: 'shuffle', - icon: 'shuffle' - }); - } - } + if ((item.IsFolder || item.Type === 'MusicArtist' || item.Type === 'MusicGenre') + && item.CollectionType !== 'livetv' + && options.shuffle !== false + ) { + commands.push({ + name: globalize.translate('Shuffle'), + id: 'shuffle', + icon: 'shuffle' + }); } - if (item.MediaType === 'Audio' || item.Type === 'MusicAlbum' || item.Type === 'MusicArtist' || item.Type === 'MusicGenre') { - if (options.instantMix !== false && !itemHelper.isLocalItem(item)) { - commands.push({ - name: globalize.translate('InstantMix'), - id: 'instantmix', - icon: 'explore' - }); - } + if ((item.MediaType === 'Audio' || item.Type === 'MusicAlbum' || item.Type === 'MusicArtist' || item.Type === 'MusicGenre') + && options.instantMix !== false && !itemHelper.isLocalItem(item) + ) { + commands.push({ + name: globalize.translate('InstantMix'), + id: 'instantmix', + icon: 'explore' + }); } if (commands.length) { @@ -180,57 +179,49 @@ import toast from './toast/toast'; } const canEdit = itemHelper.canEdit(user, item); - if (canEdit) { - if (options.edit !== false && item.Type !== 'SeriesTimer') { - const text = (item.Type === 'Timer' || item.Type === 'SeriesTimer') ? globalize.translate('Edit') : globalize.translate('EditMetadata'); - commands.push({ - name: text, - id: 'edit', - icon: 'edit' - }); - } + if (canEdit && options.edit !== false && item.Type !== 'SeriesTimer') { + const text = (item.Type === 'Timer' || item.Type === 'SeriesTimer') ? globalize.translate('Edit') : globalize.translate('EditMetadata'); + commands.push({ + name: text, + id: 'edit', + icon: 'edit' + }); } - if (itemHelper.canEditImages(user, item)) { - if (options.editImages !== false) { - commands.push({ - name: globalize.translate('EditImages'), - id: 'editimages', - icon: 'image' - }); - } + if (itemHelper.canEditImages(user, item) && options.editImages !== false) { + commands.push({ + name: globalize.translate('EditImages'), + id: 'editimages', + icon: 'image' + }); } - if (canEdit) { - if (item.MediaType === 'Video' && item.Type !== 'TvChannel' && item.Type !== 'Program' && item.LocationType !== 'Virtual' && !(item.Type === 'Recording' && item.Status !== 'Completed')) { - if (options.editSubtitles !== false) { - commands.push({ - name: globalize.translate('EditSubtitles'), - id: 'editsubtitles', - icon: 'closed_caption' - }); - } - } + if (canEdit && item.MediaType === 'Video' && item.Type !== 'TvChannel' && item.Type !== 'Program' + && item.LocationType !== 'Virtual' + && !(item.Type === 'Recording' && item.Status !== 'Completed') + && options.editSubtitles !== false + ) { + commands.push({ + name: globalize.translate('EditSubtitles'), + id: 'editsubtitles', + icon: 'closed_caption' + }); } - if (options.identify !== false) { - if (itemHelper.canIdentify(user, item)) { - commands.push({ - name: globalize.translate('Identify'), - id: 'identify', - icon: 'edit' - }); - } + if (options.identify !== false && itemHelper.canIdentify(user, item)) { + commands.push({ + name: globalize.translate('Identify'), + id: 'identify', + icon: 'edit' + }); } - if (item.MediaSources) { - if (options.moremediainfo !== false) { - commands.push({ - name: globalize.translate('MoreMediaInfo'), - id: 'moremediainfo', - icon: 'info' - }); - } + if (item.MediaSources && options.moremediainfo !== false) { + commands.push({ + name: globalize.translate('MoreMediaInfo'), + id: 'moremediainfo', + icon: 'info' + }); } if (item.Type === 'Program' && options.record !== false) { @@ -240,11 +231,7 @@ import toast from './toast/toast'; id: 'record', icon: 'fiber_manual_record' }); - } - } - - if (item.Type === 'Program' && options.record !== false) { - if (!item.TimerId) { + } else { commands.push({ name: globalize.translate('Record'), id: 'record', @@ -277,26 +264,20 @@ import toast from './toast/toast'; }); } - if (!restrictOptions) { - if (options.share === true) { - if (itemHelper.canShare(item, user)) { - commands.push({ - name: globalize.translate('Share'), - id: 'share', - icon: 'share' - }); - } - } + if (!restrictOptions && options.share === true && itemHelper.canShare(item, user)) { + commands.push({ + name: globalize.translate('Share'), + id: 'share', + icon: 'share' + }); } - if (options.sync !== false) { - if (itemHelper.canSync(user, item)) { - commands.push({ - name: globalize.translate('Sync'), - id: 'sync', - icon: 'sync' - }); - } + if (options.sync !== false && itemHelper.canSync(user, item)) { + commands.push({ + name: globalize.translate('Sync'), + id: 'sync', + icon: 'sync' + }); } if (options.openAlbum !== false && item.AlbumId && item.MediaType !== 'Photo') { diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index 6773a6c79f..2a181d3424 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -48,10 +48,8 @@ export function getDisplayName(item, options = {}) { export function supportsAddingToCollection(item) { const invalidTypes = ['Genre', 'MusicGenre', 'Studio', 'UserView', 'CollectionFolder', 'Audio', 'Program', 'Timer', 'SeriesTimer']; - if (item.Type === 'Recording') { - if (item.Status !== 'Completed') { - return false; - } + if (item.Type === 'Recording' && item.Status !== 'Completed') { + return false; } return !item.CollectionType && invalidTypes.indexOf(item.Type) === -1 && item.MediaType !== 'Photo' && !isLocalItem(item); @@ -74,10 +72,8 @@ export function supportsAddingToPlaylist(item) { return false; } - if (item.Type === 'Recording') { - if (item.Status !== 'Completed') { - return false; - } + if (item.Type === 'Recording' && item.Status !== 'Completed') { + return false; } if (isLocalItem(item)) { @@ -109,10 +105,8 @@ export function canEdit(user, item) { return false; } - if (item.Type === 'Recording') { - if (item.Status !== 'Completed') { - return false; - } + if (item.Type === 'Recording' && item.Status !== 'Completed') { + return false; } if (isLocalItem(item)) { @@ -133,23 +127,17 @@ export function isLocalItem(item) { export function canIdentify (user, item) { const itemType = item.Type; - if (itemType === 'Movie' || - itemType === 'Trailer' || - itemType === 'Series' || - itemType === 'BoxSet' || - itemType === 'Person' || - itemType === 'Book' || - itemType === 'MusicAlbum' || - itemType === 'MusicArtist' || - itemType === 'MusicVideo') { - if (user.Policy.IsAdministrator) { - if (!isLocalItem(item)) { - return true; - } - } - } - - return false; + return (itemType === 'Movie' + || itemType === 'Trailer' + || itemType === 'Series' + || itemType === 'BoxSet' + || itemType === 'Person' + || itemType === 'Book' + || itemType === 'MusicAlbum' + || itemType === 'MusicArtist' + || itemType === 'MusicVideo') + && user.Policy.IsAdministrator + && !isLocalItem(item); } export function canEditImages (user, item) { @@ -167,10 +155,8 @@ export function canEditImages (user, item) { return false; } - if (item.Type === 'Recording') { - if (item.Status !== 'Completed') { - return false; - } + if (item.Type === 'Recording' && item.Status !== 'Completed') { + return false; } return itemType !== 'Timer' && itemType !== 'SeriesTimer' && canEdit(user, item) && !isLocalItem(item); @@ -201,10 +187,8 @@ export function canShare (item, user) { if (item.Type === 'SeriesTimer') { return false; } - if (item.Type === 'Recording') { - if (item.Status !== 'Completed') { - return false; - } + if (item.Type === 'Recording' && item.Status !== 'Completed') { + return false; } if (isLocalItem(item)) { return false; @@ -301,11 +285,10 @@ export function canRefreshMetadata (item, user) { return false; } - if (item.Type !== 'Timer' && item.Type !== 'SeriesTimer' && item.Type !== 'Program' && item.Type !== 'TvChannel' && !(item.Type === 'Recording' && item.Status !== 'Completed')) { - if (!isLocalItem(item)) { - return true; - } - } + return item.Type !== 'Timer' && item.Type !== 'SeriesTimer' && item.Type !== 'Program' + && item.Type !== 'TvChannel' + && !(item.Type === 'Recording' && item.Status !== 'Completed') + && !isLocalItem(item); } return false; diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js index 5a5d93e15d..2799a00b1a 100644 --- a/src/components/itemsrefresher.js +++ b/src/components/itemsrefresher.js @@ -94,16 +94,14 @@ function onPlaybackStopped(e, stopInfo) { const state = stopInfo.state; const eventsToMonitor = getEventsToMonitor(instance); - if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Video') { + if (state.NowPlayingItem?.MediaType === 'Video') { if (eventsToMonitor.indexOf('videoplayback') !== -1) { instance.notifyRefreshNeeded(true); return; } - } else if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Audio') { - if (eventsToMonitor.indexOf('audioplayback') !== -1) { - instance.notifyRefreshNeeded(true); - return; - } + } else if (state.NowPlayingItem?.MediaType === 'Audio' && eventsToMonitor.indexOf('audioplayback') !== -1) { + instance.notifyRefreshNeeded(true); + return; } } diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js index ee75656367..eeb2946ec0 100644 --- a/src/components/listview/listview.js +++ b/src/components/listview/listview.js @@ -328,10 +328,8 @@ import ServerConnections from '../ServerConnections'; textlines.push(datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate))); } - if (options.showChannel) { - if (item.ChannelName) { - textlines.push(item.ChannelName); - } + if (options.showChannel && item.ChannelName) { + textlines.push(item.ChannelName); } let parentTitle = null; @@ -370,10 +368,8 @@ import ServerConnections from '../ServerConnections'; } if (item.IsFolder) { - if (options.artist !== false) { - if (item.AlbumArtist && item.Type === 'MusicAlbum') { + if (options.artist !== false && item.AlbumArtist && item.Type === 'MusicAlbum') { textlines.push(item.AlbumArtist); - } } } else { if (options.artist) { @@ -386,10 +382,8 @@ import ServerConnections from '../ServerConnections'; } } - if (item.Type === 'TvChannel') { - if (item.CurrentProgram) { - textlines.push(itemHelper.getDisplayName(item.CurrentProgram)); - } + if (item.Type === 'TvChannel' && item.CurrentProgram) { + textlines.push(itemHelper.getDisplayName(item.CurrentProgram)); } cssClass = 'listItemBody'; @@ -405,19 +399,17 @@ import ServerConnections from '../ServerConnections'; html += getTextLinesHtml(textlines, isLargeStyle); - if (options.mediaInfo !== false) { - if (!enableSideMediaInfo) { - const mediaInfoClass = 'secondary listItemMediaInfo listItemBodyText'; + if (options.mediaInfo !== false && !enableSideMediaInfo) { + const mediaInfoClass = 'secondary listItemMediaInfo listItemBodyText'; - html += `
`; - html += mediaInfo.getPrimaryMediaInfoHtml(item, { - episodeTitle: false, - originalAirDate: false, - subtitles: false + html += `
`; + html += mediaInfo.getPrimaryMediaInfoHtml(item, { + episodeTitle: false, + originalAirDate: false, + subtitles: false - }); - html += '
'; - } + }); + html += '
'; } if (enableOverview && item.Overview) { @@ -428,20 +420,18 @@ import ServerConnections from '../ServerConnections'; html += '
'; - if (options.mediaInfo !== false) { - if (enableSideMediaInfo) { - html += '
'; - html += mediaInfo.getPrimaryMediaInfoHtml(item, { + if (options.mediaInfo !== false && enableSideMediaInfo) { + html += '
'; + html += mediaInfo.getPrimaryMediaInfoHtml(item, { - year: false, - container: false, - episodeTitle: false, - criticRating: false, - endsAt: false + year: false, + container: false, + episodeTitle: false, + criticRating: false, + endsAt: false - }); - html += '
'; - } + }); + html += '
'; } if (!options.recordButton && (item.Type === 'Timer' || item.Type === 'Program')) { diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index f21bc8f666..6f7876fcf1 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -129,17 +129,18 @@ import '../../elements/emby-button/emby-button'; } } - if ((item.Type === 'Episode' || item.MediaType === 'Photo') && options.originalAirDate !== false) { - if (item.PremiereDate) { - try { - //don't modify date to locale if episode. Only Dates (not times) are stored, or editable in the edit metadata dialog - date = datetime.parseISO8601Date(item.PremiereDate, item.Type !== 'Episode'); + if ((item.Type === 'Episode' || item.MediaType === 'Photo') + && options.originalAirDate !== false + && item.PremiereDate + ) { + try { + //don't modify date to locale if episode. Only Dates (not times) are stored, or editable in the edit metadata dialog + date = datetime.parseISO8601Date(item.PremiereDate, item.Type !== 'Episode'); - text = datetime.toLocaleDateString(date); - miscInfo.push(text); - } catch (e) { - console.error('error parsing date:', item.PremiereDate); - } + text = datetime.toLocaleDateString(date); + miscInfo.push(text); + } catch (e) { + console.error('error parsing date:', item.PremiereDate); } } @@ -239,17 +240,17 @@ import '../../elements/emby-button/emby-button'; } } - if (options.year !== false) { - if (item.Type !== 'Series' && item.Type !== 'Episode' && item.Type !== 'Person' && item.MediaType !== 'Photo' && item.Type !== 'Program' && item.Type !== 'Season') { - if (item.ProductionYear) { - miscInfo.push(item.ProductionYear); - } else if (item.PremiereDate) { - try { - text = datetime.parseISO8601Date(item.PremiereDate).getFullYear(); - miscInfo.push(text); - } catch (e) { - console.error('error parsing date:', item.PremiereDate); - } + if (options.year !== false && item.Type !== 'Series' && item.Type !== 'Episode' && item.Type !== 'Person' + && item.MediaType !== 'Photo' && item.Type !== 'Program' && item.Type !== 'Season' + ) { + if (item.ProductionYear) { + miscInfo.push(item.ProductionYear); + } else if (item.PremiereDate) { + try { + text = datetime.parseISO8601Date(item.PremiereDate).getFullYear(); + miscInfo.push(text); + } catch (e) { + console.error('error parsing date:', item.PremiereDate); } } } @@ -314,14 +315,12 @@ import '../../elements/emby-button/emby-button'; } export function getEndsAt(item) { - if (item.MediaType === 'Video' && item.RunTimeTicks) { - if (!item.StartDate) { - let endDate = new Date().getTime() + (item.RunTimeTicks / 10000); - endDate = new Date(endDate); + if (item.MediaType === 'Video' && item.RunTimeTicks && !item.StartDate) { + let endDate = new Date().getTime() + (item.RunTimeTicks / 10000); + endDate = new Date(endDate); - const displayTime = datetime.getDisplayTime(endDate); - return globalize.translate('EndsAtValue', displayTime); - } + const displayTime = datetime.getDisplayTime(endDate); + return globalize.translate('EndsAtValue', displayTime); } return null; diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index ddf0544727..b39c8bff00 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -444,12 +444,10 @@ import { appRouter } from '../appRouter'; options = options || {}; options.type = options.type || 'Primary'; - if (options.type === 'Primary') { - if (item.SeriesPrimaryImageTag) { - options.tag = item.SeriesPrimaryImageTag; + if (options.type === 'Primary' && item.SeriesPrimaryImageTag) { + options.tag = item.SeriesPrimaryImageTag; - return ServerConnections.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); - } + return ServerConnections.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } if (options.type === 'Thumb') { diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 5d0f371f7d..1cbd99950a 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -44,10 +44,8 @@ function triggerPlayerChange(playbackManagerInstance, newPlayer, newTarget, prev return; } - if (newTarget && previousTargetInfo) { - if (newTarget.id === previousTargetInfo.id) { - return; - } + if (newTarget && previousTargetInfo && newTarget.id === previousTargetInfo.id) { + return; } Events.trigger(playbackManagerInstance, 'playerchange', [newPlayer, newTarget, previousPlayer]); @@ -501,10 +499,10 @@ function getPlaybackInfo(player, } // lastly, enforce player overrides for special situations - if (query.EnableDirectStream !== false) { - if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) { - query.EnableDirectStream = false; - } + if (query.EnableDirectStream !== false + && player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item) + ) { + query.EnableDirectStream = false; } if (player.getDirectPlayProtocols) { @@ -569,10 +567,10 @@ function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, ma } // lastly, enforce player overrides for special situations - if (query.EnableDirectStream !== false) { - if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) { - query.EnableDirectStream = false; - } + if (query.EnableDirectStream !== false + && player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item) + ) { + query.EnableDirectStream = false; } return apiClient.ajax({ @@ -963,10 +961,8 @@ class PlaybackManager { self.isPlaying = function (player) { player = player || self._currentPlayer; - if (player) { - if (player.isPlaying) { - return player.isPlaying(); - } + if (player?.isPlaying) { + return player.isPlaying(); } return player != null && player.currentSrc() != null; @@ -975,10 +971,8 @@ class PlaybackManager { self.isPlayingMediaType = function (mediaType, player) { player = player || self._currentPlayer; - if (player) { - if (player.isPlaying) { - return player.isPlaying(mediaType); - } + if (player?.isPlaying) { + return player.isPlaying(mediaType); } if (self.isPlaying(player)) { @@ -1027,10 +1021,8 @@ class PlaybackManager { return true; } - if (item.LocationType === 'Virtual') { - if (itemType !== 'Program') { - return false; - } + if (item.LocationType === 'Virtual' && itemType !== 'Program') { + return false; } if (itemType === 'Program') { @@ -3300,10 +3292,10 @@ class PlaybackManager { reportPlayback(self, state, player, reportPlaylist, serverId, 'reportPlaybackProgress', progressEventName); } - if (streamInfo && streamInfo.liveStreamId) { - if (new Date().getTime() - (streamInfo.lastMediaInfoQuery || 0) >= 600000) { - getLiveStreamMediaInfo(player, streamInfo, self.currentMediaSource(player), streamInfo.liveStreamId, serverId); - } + if (streamInfo?.liveStreamId + && (new Date().getTime() - (streamInfo.lastMediaInfoQuery || 0) >= 600000) + ) { + getLiveStreamMediaInfo(player, streamInfo, self.currentMediaSource(player), streamInfo.liveStreamId, serverId); } } } @@ -3568,10 +3560,8 @@ class PlaybackManager { } getBufferedRanges(player = this._currentPlayer) { - if (player) { - if (player.getBufferedRanges) { - return player.getBufferedRanges(); - } + if (player?.getBufferedRanges) { + return player.getBufferedRanges(); } return []; @@ -3842,19 +3832,15 @@ class PlaybackManager { removeActivePlayer(name) { const playerInfo = this.getPlayerInfo(); - if (playerInfo) { - if (playerInfo.name === name) { - this.setDefaultPlayerActive(); - } + if (playerInfo?.name === name) { + this.setDefaultPlayerActive(); } } removeActiveTarget(id) { const playerInfo = this.getPlayerInfo(); - if (playerInfo) { - if (playerInfo.id === id) { - this.setDefaultPlayerActive(); - } + if (playerInfo?.id === id) { + this.setDefaultPlayerActive(); } } diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index f7eea17be1..9cbe2e5ac0 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -29,10 +29,8 @@ function mirrorIfEnabled(info) { if (info && playbackManager.enableDisplayMirroring()) { const getPlayerInfo = playbackManager.getPlayerInfo(); - if (getPlayerInfo) { - if (!getPlayerInfo.isLocalPlayer && getPlayerInfo.supportedCommands.indexOf('DisplayContent') !== -1) { - mirrorItem(info, playbackManager.getCurrentPlayer()); - } + if (getPlayerInfo && !getPlayerInfo.isLocalPlayer && getPlayerInfo.supportedCommands.indexOf('DisplayContent') !== -1) { + mirrorItem(info, playbackManager.getCurrentPlayer()); } } } @@ -85,11 +83,9 @@ function getIcon(target) { export function show(button) { const currentPlayerInfo = playbackManager.getPlayerInfo(); - if (currentPlayerInfo) { - if (!currentPlayerInfo.isLocalPlayer) { - showActivePlayerMenu(currentPlayerInfo); - return; - } + if (currentPlayerInfo && !currentPlayerInfo.isLocalPlayer) { + showActivePlayerMenu(currentPlayerInfo); + return; } const currentPlayerId = currentPlayerInfo ? currentPlayerInfo.id : null; diff --git a/src/components/recordingcreator/recordingbutton.js b/src/components/recordingcreator/recordingbutton.js index a05a44b2e5..f2d5376ea0 100644 --- a/src/components/recordingcreator/recordingbutton.js +++ b/src/components/recordingcreator/recordingbutton.js @@ -106,10 +106,8 @@ function getIndicatorIcon(item) { return 'fiber_manual_record'; } - if (item.SeriesTimerId) { - if (status !== 'Cancelled') { - return 'fiber_smart_record'; - } + if (item.SeriesTimerId && status !== 'Cancelled') { + return 'fiber_smart_record'; } return 'fiber_manual_record'; diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index 179b472bc3..ffc43b4bb4 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -63,15 +63,10 @@ function onTimerChangedExternally(e, apiClient, data) { const options = this.options; let refresh = false; - if (data.Id) { - if (this.TimerId === data.Id) { - refresh = true; - } - } - if (data.ProgramId && options) { - if (options.programId === data.ProgramId) { - refresh = true; - } + if (data.Id && this.TimerId === data.Id) { + refresh = true; + } else if (data.ProgramId && options && options.programId === data.ProgramId) { + refresh = true; } if (refresh) { @@ -83,15 +78,11 @@ function onSeriesTimerChangedExternally(e, apiClient, data) { const options = this.options; let refresh = false; - if (data.Id) { - if (this.SeriesTimerId === data.Id) { - refresh = true; - } + if (data.Id && this.SeriesTimerId === data.Id) { + refresh = true; } - if (data.ProgramId && options) { - if (options.programId === data.ProgramId) { - refresh = true; - } + if (data.ProgramId && options && options.programId === data.ProgramId) { + refresh = true; } if (refresh) { diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 1dd5751129..1112a57c32 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -46,11 +46,9 @@ function getImageUrl(item, options, apiClient) { return apiClient.getScaledImageUrl(item.Id, options); } - if (options.type === 'Primary') { - if (item.AlbumId && item.AlbumPrimaryImageTag) { - options.tag = item.AlbumPrimaryImageTag; - return apiClient.getScaledImageUrl(item.AlbumId, options); - } + if (options.type === 'Primary' && item.AlbumId && item.AlbumPrimaryImageTag) { + options.tag = item.AlbumPrimaryImageTag; + return apiClient.getScaledImageUrl(item.AlbumId, options); } return null; diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index ead71f9cee..35d4943c58 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -114,10 +114,8 @@ function fillSubtitleList(context, item) { itemHtml += ''; itemHtml += '
'; - if (!layoutManager.tv) { - if (s.Path) { - itemHtml += ''; - } + if (!layoutManager.tv && s.Path) { + itemHtml += ''; } itemHtml += ''; diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index a6fe46b295..1f260f6d76 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -800,13 +800,11 @@ import confirm from '../../components/confirm/confirm'; }); } - if (ApiClient.isMinServerVersion('3.4.1.25')) { - if (!page.serverActivityLog) { - page.serverActivityLog = new ActivityLog({ - serverId: ApiClient.serverId(), - element: page.querySelector('.serverActivityItems') - }); - } + if (!page.serverActivityLog) { + page.serverActivityLog = new ActivityLog({ + serverId: ApiClient.serverId(), + element: page.querySelector('.serverActivityItems') + }); } refreshActiveRecordings(view, apiClient); diff --git a/src/elements/emby-input/emby-input.js b/src/elements/emby-input/emby-input.js index f9ea23f2ea..f62bcbf345 100644 --- a/src/elements/emby-input/emby-input.js +++ b/src/elements/emby-input/emby-input.js @@ -85,13 +85,9 @@ import 'webcomponents.js/webcomponents-lite'; passive: true }); - if (browser.orsay) { - if (this === document.activeElement) { - //Make sure the IME pops up if this is the first/default element on the page - if (document.attachIME) { - document.attachIME(this); - } - } + //Make sure the IME pops up if this is the first/default element on the page + if (browser.orsay && this === document.activeElement && document.attachIME) { + document.attachIME(this); } }; diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index 37edb8224c..4752613ddd 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -21,10 +21,8 @@ import Sortable from 'sortablejs'; const itemsContainer = this; const multiSelect = itemsContainer.multiSelect; - if (multiSelect) { - if (multiSelect.onContainerClick.call(itemsContainer, e) === false) { - return; - } + if (multiSelect?.onContainerClick.call(itemsContainer, e) === false) { + return; } itemShortcuts.onClick.call(itemsContainer, e); @@ -259,11 +257,9 @@ import Sortable from 'sortablejs'; itemsContainer.notifyRefreshNeeded(true); return; } - } else if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Audio') { - if (eventsToMonitor.indexOf('audioplayback') !== -1) { - itemsContainer.notifyRefreshNeeded(true); - return; - } + } else if (state.NowPlayingItem?.MediaType === 'Audio' && eventsToMonitor.indexOf('audioplayback') !== -1) { + itemsContainer.notifyRefreshNeeded(true); + return; } } @@ -298,10 +294,8 @@ import Sortable from 'sortablejs'; } } - if (layoutManager.desktop || layoutManager.mobile) { - if (this.getAttribute('data-multiselect') !== 'false') { - this.enableMultiSelect(true); - } + if (layoutManager.desktop || layoutManager.mobile && this.getAttribute('data-multiselect') !== 'false') { + this.enableMultiSelect(true); } if (layoutManager.tv) { diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 0bb20270e6..04a8c94cf3 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -443,10 +443,8 @@ import '../emby-input/emby-input'; } for (const range of ranges) { - if (position != null) { - if (position >= range.end) { - continue; - } + if (position != null && position >= range.end) { + continue; } setRange(elem, range.start, range.end); diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js index ce1fcee05d..723cb7e8fe 100644 --- a/src/elements/emby-tabs/emby-tabs.js +++ b/src/elements/emby-tabs/emby-tabs.js @@ -272,10 +272,8 @@ import '../../assets/css/scrollstyles.scss'; let sibling = elem[method]; while (sibling) { - if (sibling.classList.contains(buttonClass)) { - if (!sibling.classList.contains('hide')) { - return sibling; - } + if (sibling.classList.contains(buttonClass) && !sibling.classList.contains('hide')) { + return sibling; } sibling = sibling[method]; diff --git a/src/index.jsx b/src/index.jsx index 7ca4b92a24..466aa0faa3 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -84,10 +84,10 @@ function init() { } function onGlobalizeInit() { - if (window.appMode === 'android') { - if (window.location.href.toString().toLowerCase().indexOf('start=backgroundsync') !== -1) { - return onAppReady(); - } + if (window.appMode === 'android' + && window.location.href.toString().toLowerCase().indexOf('start=backgroundsync') !== -1 + ) { + return onAppReady(); } document.title = globalize.translateHtml(document.title, 'core'); diff --git a/src/libraries/navdrawer/navdrawer.js b/src/libraries/navdrawer/navdrawer.js index 8b786ea5fe..a152c1c203 100644 --- a/src/libraries/navdrawer/navdrawer.js +++ b/src/libraries/navdrawer/navdrawer.js @@ -289,34 +289,32 @@ class NavDrawer { setEdgeSwipeEnabled(enabled) { const options = this.options; - if (!options.disableEdgeSwipe) { - if (browser.touch) { - if (enabled) { - if (!this._edgeSwipeEnabled) { - this._edgeSwipeEnabled = true; - dom.addEventListener(this.edgeContainer, 'touchstart', this.onEdgeTouchStart, { - passive: true - }); - dom.addEventListener(this.edgeContainer, 'touchend', this.onEdgeTouchEnd, { - passive: true - }); - dom.addEventListener(this.edgeContainer, 'touchcancel', this.onEdgeTouchEnd, { - passive: true - }); - } - } else { - if (this._edgeSwipeEnabled) { - this._edgeSwipeEnabled = false; - dom.removeEventListener(this.edgeContainer, 'touchstart', this.onEdgeTouchStart, { - passive: true - }); - dom.removeEventListener(this.edgeContainer, 'touchend', this.onEdgeTouchEnd, { - passive: true - }); - dom.removeEventListener(this.edgeContainer, 'touchcancel', this.onEdgeTouchEnd, { - passive: true - }); - } + if (!options.disableEdgeSwipe && browser.touch) { + if (enabled) { + if (!this._edgeSwipeEnabled) { + this._edgeSwipeEnabled = true; + dom.addEventListener(this.edgeContainer, 'touchstart', this.onEdgeTouchStart, { + passive: true + }); + dom.addEventListener(this.edgeContainer, 'touchend', this.onEdgeTouchEnd, { + passive: true + }); + dom.addEventListener(this.edgeContainer, 'touchcancel', this.onEdgeTouchEnd, { + passive: true + }); + } + } else { + if (this._edgeSwipeEnabled) { + this._edgeSwipeEnabled = false; + dom.removeEventListener(this.edgeContainer, 'touchstart', this.onEdgeTouchStart, { + passive: true + }); + dom.removeEventListener(this.edgeContainer, 'touchend', this.onEdgeTouchEnd, { + passive: true + }); + dom.removeEventListener(this.edgeContainer, 'touchcancel', this.onEdgeTouchEnd, { + passive: true + }); } } } diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index 82fb79acb2..26b4a8370b 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -279,10 +279,8 @@ const scrollerFactory = function (frame, options) { const now = new Date().getTime(); - if (o.autoImmediate) { - if (!immediate && (now - (lastAnimate || 0)) <= 50) { - immediate = true; - } + if (o.autoImmediate && !immediate && (now - (lastAnimate || 0)) <= 50) { + immediate = true; } if (!immediate && o.skipSlideToWhenVisible && fullItemPos && fullItemPos.isVisible) { @@ -787,15 +785,13 @@ const scrollerFactory = function (frame, options) { passive: true }); } - } else if (o.horizontal) { + } else if (o.horizontal && o.mouseWheel) { // Don't bind to mouse events with vertical scroll since the mouse wheel can handle this natively - if (o.mouseWheel) { - // Scrolling navigation - dom.addEventListener(scrollSource, wheelEvent, scrollHandler, { - passive: true - }); - } + // Scrolling navigation + dom.addEventListener(scrollSource, wheelEvent, scrollHandler, { + passive: true + }); } dom.addEventListener(frame, 'click', onFrameClick, { diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index 947426ec26..aeced81b8b 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -452,11 +452,9 @@ function normalizeImages(state) { if (state && state.NowPlayingItem) { const item = state.NowPlayingItem; - if (!item.ImageTags || !item.ImageTags.Primary) { - if (item.PrimaryImageTag) { - item.ImageTags = item.ImageTags || {}; - item.ImageTags.Primary = item.PrimaryImageTag; - } + if ((!item.ImageTags || !item.ImageTags.Primary) && item.PrimaryImageTag) { + item.ImageTags = item.ImageTags || {}; + item.ImageTags.Primary = item.PrimaryImageTag; } if (item.BackdropImageTag && item.BackdropItemId === item.Id) { item.BackdropImageTags = [item.BackdropImageTag]; diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index d3a893e1dd..d7ae7f7841 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -67,16 +67,12 @@ function tryRemoveElement(elem) { } function enableNativeTrackSupport(currentSrc, track) { - if (track) { - if (track.DeliveryMethod === 'Embed') { - return true; - } + if (track?.DeliveryMethod === 'Embed') { + return true; } - if (browser.firefox) { - if ((currentSrc || '').toLowerCase().includes('.m3u8')) { - return false; - } + if (browser.firefox && (currentSrc || '').toLowerCase().includes('.m3u8')) { + return false; } if (browser.ps4) { @@ -92,11 +88,9 @@ function tryRemoveElement(elem) { return false; } - if (browser.iOS) { + if (browser.iOS && (browser.iosVersion || 10) < 10) { // works in the browser but not the native app - if ((browser.iosVersion || 10) < 10) { - return false; - } + return false; } if (track) { @@ -1500,10 +1494,11 @@ function tryRemoveElement(elem) { || document.pictureInPictureEnabled ) { list.push('PictureInPicture'); - } else if (window.Windows) { - if (Windows.UI.ViewManagement.ApplicationView.getForCurrentView().isViewModeSupported(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay)) { + } else if (window.Windows + && Windows.UI.ViewManagement.ApplicationView.getForCurrentView() + .isViewModeSupported(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay) + ) { list.push('PictureInPicture'); - } } if (browser.safari || browser.iOS || browser.iPad) { @@ -1564,13 +1559,7 @@ function tryRemoveElement(elem) { } const video = this.#mediaElement; - if (video) { - if (video.audioTracks) { - return true; - } - } - - return false; + return !!video?.audioTracks; } static onPictureInPictureError(err) { diff --git a/src/plugins/sessionPlayer/plugin.js b/src/plugins/sessionPlayer/plugin.js index 6997dc1732..50c6dae8a6 100644 --- a/src/plugins/sessionPlayer/plugin.js +++ b/src/plugins/sessionPlayer/plugin.js @@ -159,11 +159,9 @@ function normalizeImages(state, apiClient) { if (state && state.NowPlayingItem) { const item = state.NowPlayingItem; - if (!item.ImageTags || !item.ImageTags.Primary) { - if (item.PrimaryImageTag) { - item.ImageTags = item.ImageTags || {}; - item.ImageTags.Primary = item.PrimaryImageTag; - } + if (!item.ImageTags || !item.ImageTags.Primary && item.PrimaryImageTag) { + item.ImageTags = item.ImageTags || {}; + item.ImageTags.Primary = item.PrimaryImageTag; } if (item.BackdropImageTag && item.BackdropItemId === item.Id) { item.BackdropImageTags = [item.BackdropImageTag]; diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index 96d23c2f37..788dbfcfb1 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -333,10 +333,8 @@ class YoutubePlayer { setVolume(val) { const currentYoutubePlayer = this.currentYoutubePlayer; - if (currentYoutubePlayer) { - if (val != null) { - currentYoutubePlayer.setVolume(val); - } + if (currentYoutubePlayer && val != null) { + currentYoutubePlayer.setVolume(val); } } getVolume() { diff --git a/src/scripts/browser.js b/src/scripts/browser.js index b340a403f3..15e5cf6627 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -324,11 +324,9 @@ if (browser.mobile || browser.tv) { browser.slow = true; } -if (typeof document !== 'undefined') { - /* eslint-disable-next-line compat/compat */ - if (('ontouchstart' in window) || (navigator.maxTouchPoints > 0)) { - browser.touch = true; - } +/* eslint-disable-next-line compat/compat */ +if (typeof document !== 'undefined' && ('ontouchstart' in window) || (navigator.maxTouchPoints > 0)) { + browser.touch = true; } browser.keyboard = hasKeyboard(browser); diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 5c3b0b8ca8..9ac3c2b7eb 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -822,12 +822,12 @@ import browser from './browser'; maxH264Level = 52; } - if (browser.tizen || - videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) { + if ((browser.tizen || + videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) // These tests are passing in safari, but playback is failing - if (!browser.safari && !browser.iOS && !browser.web0s && !browser.edge && !browser.mobile) { - h264Profiles += '|high 10'; - } + && !browser.safari && !browser.iOS && !browser.web0s && !browser.edge && !browser.mobile + ) { + h264Profiles += '|high 10'; } let maxHevcLevel = 120; diff --git a/src/scripts/libraryBrowser.js b/src/scripts/libraryBrowser.js index 426b53eb45..b9fe249bd4 100644 --- a/src/scripts/libraryBrowser.js +++ b/src/scripts/libraryBrowser.js @@ -68,10 +68,8 @@ export function showLayoutMenu (button, currentLayout, views) { cancelable: false })); - if (!dispatchEvent) { - if (window.$) { - $(button).trigger('layoutchange', [id]); - } + if (!dispatchEvent && window.$) { + $(button).trigger('layoutchange', [id]); } } }); diff --git a/src/scripts/mouseManager.js b/src/scripts/mouseManager.js index 1ad3389c04..b00850a022 100644 --- a/src/scripts/mouseManager.js +++ b/src/scripts/mouseManager.js @@ -88,12 +88,10 @@ import dom from '../scripts/dom'; function onPointerEnter(e) { const pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'); - if (pointerType === 'mouse') { - if (!isMouseIdle) { - const parent = focusManager.focusableParent(e.target); - if (parent) { - focusManager.focus(parent); - } + if (pointerType === 'mouse' && !isMouseIdle) { + const parent = focusManager.focusableParent(e.target); + if (parent) { + focusManager.focus(parent); } } } From 17a77bd9dd60a2303e5072d41a6c2fdea9f99f09 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 20:00:06 +0000 Subject: [PATCH 21/80] Update Linters to v5.38.1 --- package-lock.json | 164 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index b20ae7206b..a2633a4a5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,8 +66,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.50", "@types/react-dom": "17.0.17", - "@typescript-eslint/eslint-plugin": "5.38.0", - "@typescript-eslint/parser": "5.38.0", + "@typescript-eslint/eslint-plugin": "5.38.1", + "@typescript-eslint/parser": "5.38.1", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.12", "babel-loader": "8.2.5", @@ -2972,14 +2972,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", - "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz", + "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/type-utils": "5.38.0", - "@typescript-eslint/utils": "5.38.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/type-utils": "5.38.1", + "@typescript-eslint/utils": "5.38.1", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -3019,14 +3019,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", - "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.1.tgz", + "integrity": "sha512-LDqxZBVFFQnQRz9rUZJhLmox+Ep5kdUmLatLQnCRR6523YV+XhRjfYzStQ4MheFA8kMAfUlclHSbu+RKdRwQKw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/typescript-estree": "5.38.1", "debug": "^4.3.4" }, "engines": { @@ -3046,13 +3046,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", - "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", + "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0" + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3063,13 +3063,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", - "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz", + "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.38.0", - "@typescript-eslint/utils": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/utils": "5.38.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3090,9 +3090,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", - "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", + "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3103,13 +3103,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", - "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", + "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3174,15 +3174,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", - "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz", + "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/typescript-estree": "5.38.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -3198,12 +3198,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", - "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", + "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/types": "5.38.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -20589,14 +20589,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", - "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz", + "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/type-utils": "5.38.0", - "@typescript-eslint/utils": "5.38.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/type-utils": "5.38.1", + "@typescript-eslint/utils": "5.38.1", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -20616,53 +20616,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", - "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.1.tgz", + "integrity": "sha512-LDqxZBVFFQnQRz9rUZJhLmox+Ep5kdUmLatLQnCRR6523YV+XhRjfYzStQ4MheFA8kMAfUlclHSbu+RKdRwQKw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/typescript-estree": "5.38.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", - "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", + "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0" + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1" } }, "@typescript-eslint/type-utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", - "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz", + "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.38.0", - "@typescript-eslint/utils": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/utils": "5.38.1", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", - "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", + "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", - "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", + "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -20702,26 +20702,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", - "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz", + "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/typescript-estree": "5.38.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", - "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", + "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/types": "5.38.1", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { diff --git a/package.json b/package.json index 319aca2c94..fb50784f9f 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.50", "@types/react-dom": "17.0.17", - "@typescript-eslint/eslint-plugin": "5.38.0", - "@typescript-eslint/parser": "5.38.0", + "@typescript-eslint/eslint-plugin": "5.38.1", + "@typescript-eslint/parser": "5.38.1", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.12", "babel-loader": "8.2.5", From 35cf9660a27dd70c536a8c0740c9b60c42dd32c2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Oct 2022 10:08:29 +0000 Subject: [PATCH 22/80] Update actions/checkout action to v3.1.0 --- .github/workflows/commands.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/commands.yml b/.github/workflows/commands.yml index 12effcdfc9..d1d061417c 100644 --- a/.github/workflows/commands.yml +++ b/.github/workflows/commands.yml @@ -18,7 +18,7 @@ jobs: comment-id: ${{ github.event.comment.id }} reactions: '+1' - name: Checkout the latest code - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3.0.2 + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3.1.0 with: token: ${{ secrets.JF_BOT_TOKEN }} fetch-depth: 0 From c3de6898bc52bfb46288e210640da7b3c84b2489 Mon Sep 17 00:00:00 2001 From: Az Za Date: Tue, 4 Oct 2022 09:22:10 +0000 Subject: [PATCH 23/80] Translated using Weblate (Turkish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/ --- src/strings/tr.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/strings/tr.json b/src/strings/tr.json index 1afaa97347..7b1262c88e 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -914,7 +914,7 @@ "QuickConnectActivationSuccessful": "Başarıyla etkinleştirildi", "QuickConnect": "Hızlı Bağlantı", "LabelQuickConnectCode": "Hızlı Bağlantı kodu:", - "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Bu ayarlar, bu cihaz tarafından başlatılan herhangi bir Chromecast oynatma için de geçerlidir.", + "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Bu ayarlar, bu cihaz tarafından başlatılan herhangi bir ChromeCast oynatma için de geçerlidir.", "StopPlayback": "Oynatmayı durdur", "SyncPlayAccessHelp": "SyncPlay özelliği, oynatmayı diğer cihazlarla senkronize etmeyi sağlar. Bu kullanıcının SyncPlay sahip olduğu erişim düzeyini seçin.", "TitlePlayback": "Oynatma", @@ -1670,5 +1670,8 @@ "RememberSubtitleSelectionsHelp": "Altyazı dilini, son videoya en yakın eşleşmeye göre ayarlamayı dene.", "RememberAudioSelectionsHelp": "Ses dilini, son videoya en yakın eşleşmeye göre ayarlamayı dene.", "RememberAudioSelections": "Ses dilini önceki öğeye göre ayarla", - "RememberSubtitleSelections": "Altyazı dilini önceki öğeye göre ayarla" + "RememberSubtitleSelections": "Altyazı dilini önceki öğeye göre ayarla", + "TabContainers": "Barındırıcılar", + "OptionDateShowAdded": "Dizi Eklenme Tarihi", + "OptionDateEpisodeAdded": "Bölüm Eklenme Tarihi" } From aa2fd79e74ced347583660b0325794bcdc2b1a7a Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Mon, 3 Oct 2022 16:47:17 +0300 Subject: [PATCH 24/80] fix dialog closing flow --- src/components/dialogHelper/dialogHelper.js | 37 +++++++++++++------ src/components/playback/playersettingsmenu.js | 1 - 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index 80b269fed5..130a1742cb 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -57,6 +57,7 @@ import '../../assets/css/scrollstyles.scss'; if ((shouldClose || !isOpened(dlg)) && unlisten) { unlisten(); + unlisten = null; } if (shouldClose) { @@ -64,6 +65,22 @@ import '../../assets/css/scrollstyles.scss'; } } + function finishClose() { + if (unlisten) { + unlisten(); + unlisten = null; + } + + dlg.dispatchEvent(new CustomEvent('close', { + bubbles: false, + cancelable: false + })); + + resolve({ + element: dlg + }); + } + function onBackCommand(e) { if (e.detail.command === 'back') { e.preventDefault(); @@ -79,6 +96,7 @@ import '../../assets/css/scrollstyles.scss'; if (unlisten) { unlisten(); + unlisten = null; } removeBackdrop(dlg); @@ -92,9 +110,13 @@ import '../../assets/css/scrollstyles.scss'; const state = history.location.state || {}; if (state.dialogs?.length > 0) { if (state.dialogs[state.dialogs.length - 1] === hash) { + unlisten = history.listen(finishClose); history.back(); } else if (state.dialogs.includes(hash)) { console.warn('[dialogHelper] dialog "%s" was closed, but is not the last dialog opened', hash); + + unlisten = history.listen(finishClose); + // Remove the closed dialog hash from the history state history.replace( `${history.location.pathname}${history.location.search}`, @@ -123,18 +145,9 @@ import '../../assets/css/scrollstyles.scss'; } } - //resolve(); - // if we just called history.back(), then use a timeout to allow the history events to fire first - setTimeout(() => { - dlg.dispatchEvent(new CustomEvent('close', { - bubbles: false, - cancelable: false - })); - - resolve({ - element: dlg - }); - }, 1); + if (!unlisten) { + finishClose(); + } } dlg.addEventListener('_close', onDialogClosed); diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index efeef4f354..c7f8f5a6da 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -238,7 +238,6 @@ function showWithUser(options, player, user) { return actionsheet.show({ items: menuItems, - resolveOnClick: true, positionTo: options.positionTo }).then(function (id) { return handleSelectedOption(id, options, player); From e3109db671aa6f7b630f7812e887309fab6cc10c Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 09:57:01 -0400 Subject: [PATCH 25/80] 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 = []; From a5e0fddb009b60d958820a788fe395166ba62c2d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Oct 2022 14:18:43 +0000 Subject: [PATCH 26/80] Update actions/checkout digest to 93ea575 --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/lint.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index e9ce3a6197..63da9f2395 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -19,7 +19,7 @@ jobs: language: [ 'javascript' ] steps: - name: Checkout repository - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3 - name: Initialize CodeQL uses: github/codeql-action/init@e0e5ded33cabb451ae0a9768fc7b0410bad9ad44 # tag=v2 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 20111001c6..ecb50723fa 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3 - name: Setup node environment uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # tag=v3.5.0 @@ -48,7 +48,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3 - name: Setup node environment uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # tag=v3.5.0 @@ -86,7 +86,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3 - name: Setup node environment uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # tag=v3.5.0 From bef05ba117ae214de3ff3836de0828297d9a7ef8 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 13:32:55 -0400 Subject: [PATCH 27/80] Add no-useless-constructor eslint rule and fix issues --- .eslintrc.js | 7 ++++++- src/plugins/syncPlay/core/timeSync/TimeSyncServer.js | 4 ---- src/plugins/syncPlay/ui/players/HtmlAudioPlayer.js | 4 ---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 562b457bf7..f1886f7957 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -56,6 +56,7 @@ module.exports = { 'no-sequences': ['error', { 'allowInParentheses': false }], 'no-trailing-spaces': ['error'], '@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], + 'no-useless-constructor': ['error'], 'no-void': ['error', { 'allowAsStatement': true }], 'no-nested-ternary': ['error'], 'one-var': ['error', 'never'], @@ -256,7 +257,11 @@ module.exports = { 'plugin:react/recommended', 'plugin:react-hooks/recommended', 'plugin:jsx-a11y/recommended' - ] + ], + rules: { + 'no-useless-constructor': ['off'], + '@typescript-eslint/no-useless-constructor': ['error'] + } } ] }; diff --git a/src/plugins/syncPlay/core/timeSync/TimeSyncServer.js b/src/plugins/syncPlay/core/timeSync/TimeSyncServer.js index 734763c07d..4cb9fdd307 100644 --- a/src/plugins/syncPlay/core/timeSync/TimeSyncServer.js +++ b/src/plugins/syncPlay/core/timeSync/TimeSyncServer.js @@ -9,10 +9,6 @@ import TimeSync from './TimeSync'; * Class that manages time syncing with server. */ class TimeSyncServer extends TimeSync { - constructor(syncPlayManager) { - super(syncPlayManager); - } - /** * Makes a ping request to the server. */ diff --git a/src/plugins/syncPlay/ui/players/HtmlAudioPlayer.js b/src/plugins/syncPlay/ui/players/HtmlAudioPlayer.js index 89929eb688..c0b5a3bf6b 100644 --- a/src/plugins/syncPlay/ui/players/HtmlAudioPlayer.js +++ b/src/plugins/syncPlay/ui/players/HtmlAudioPlayer.js @@ -10,10 +10,6 @@ import HtmlVideoPlayer from './HtmlVideoPlayer'; */ class HtmlAudioPlayer extends HtmlVideoPlayer { static type = 'htmlaudioplayer'; - - constructor(player, syncPlayManager) { - super(player, syncPlayManager); - } } export default HtmlAudioPlayer; From f4cd29ac1704a4192a58a26ba1760c5dad9f67d1 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 14:24:24 -0400 Subject: [PATCH 28/80] Add no-return-assign eslint rule and fix issues --- .eslintrc.js | 1 + src/components/channelMapper/channelMapper.js | 6 ++++-- src/components/tunerPicker.js | 6 ++++-- src/components/viewManager/viewManager.js | 6 +++--- src/controllers/dashboard/apikeys.js | 3 ++- src/controllers/dashboard/dlna/profile.js | 3 ++- src/controllers/dashboard/plugins/available/index.js | 3 ++- src/controllers/livetvstatus.js | 3 ++- src/scripts/libraryBrowser.js | 3 ++- 9 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 562b457bf7..c2de8f6c69 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -52,6 +52,7 @@ module.exports = { 'no-multi-spaces': ['error'], 'no-multiple-empty-lines': ['error', { 'max': 1 }], 'no-restricted-globals': ['error'].concat(restrictedGlobals), + 'no-return-assign': ['error'], 'no-return-await': ['error'], 'no-sequences': ['error', { 'allowInParentheses': false }], 'no-trailing-spaces': ['error'], diff --git a/src/components/channelMapper/channelMapper.js b/src/components/channelMapper/channelMapper.js index be9ff841ce..840f8bfd59 100644 --- a/src/components/channelMapper/channelMapper.js +++ b/src/components/channelMapper/channelMapper.js @@ -87,7 +87,8 @@ export default class channelMapper { html += ''; html += ''; html += ``; - return html += ''; + html += ''; + return html; } function getEditorHtml() { @@ -100,7 +101,8 @@ export default class channelMapper { html += ''; html += ''; html += ''; - return html += ''; + html += ''; + return html; } function initEditor(dlg, options) { diff --git a/src/components/tunerPicker.js b/src/components/tunerPicker.js index d31d3b5f6a..b73337182b 100644 --- a/src/components/tunerPicker.js +++ b/src/components/tunerPicker.js @@ -26,7 +26,8 @@ function getEditorHtml() { html += '
'; html += '
'; html += ''; - return html += ''; + html += ''; + return html; } function getDeviceHtml(device) { @@ -61,7 +62,8 @@ function getDeviceHtml(device) { html += ''; html += ''; html += ''; - return html += ''; + html += ''; + return html; } function getTunerName(providerId) { diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index 48c708d2a0..03138797c9 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -103,9 +103,9 @@ function getViewEventDetail(view, {state, url, options = {}}, isRestored) { const searchParams = new URLSearchParams(url.substring(index + 1)); const params = {}; - searchParams.forEach((value, key) => - params[key] = value - ); + searchParams.forEach((value, key) => { + params[key] = value; + }); return { detail: { diff --git a/src/controllers/dashboard/apikeys.js b/src/controllers/dashboard/apikeys.js index 300bdeb09f..9eec8503c5 100644 --- a/src/controllers/dashboard/apikeys.js +++ b/src/controllers/dashboard/apikeys.js @@ -37,7 +37,8 @@ import { pageIdOn } from '../../utils/dashboard'; const date = datetime.parseISO8601Date(item.DateCreated, true); html += datetime.toLocaleDateString(date) + ' ' + datetime.getDisplayTime(date); html += ''; - return html += ''; + html += ''; + return html; }).join(''); page.querySelector('.resultBody').innerHTML = rows; loading.hide(); diff --git a/src/controllers/dashboard/dlna/profile.js b/src/controllers/dashboard/dlna/profile.js index 133faa2c8a..3f5d6c365e 100644 --- a/src/controllers/dashboard/dlna/profile.js +++ b/src/controllers/dashboard/dlna/profile.js @@ -149,7 +149,8 @@ import { getParameterByName } from '../../../utils/url.ts'; li += '

' + escapeHtml(h.Name + ' = ' + (h.Value || '')) + '

'; li += ''; li += ''; - return li += ''; + li += ''; + return li; }).join('') + ''; const elem = $('.xmlDocumentAttributeList', page).html(html).trigger('create'); $('.btnDeleteXmlAttribute', elem).on('click', function () { diff --git a/src/controllers/dashboard/plugins/available/index.js b/src/controllers/dashboard/plugins/available/index.js index 02ad0bac1a..b10518bc74 100644 --- a/src/controllers/dashboard/plugins/available/index.js +++ b/src/controllers/dashboard/plugins/available/index.js @@ -129,7 +129,8 @@ function getPluginHtml(plugin, options, installedPlugins) { html += ''; html += ''; html += ''; - return html += ''; + html += ''; + return html; } function getTabs() { diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js index 1de366a023..d07b50c048 100644 --- a/src/controllers/livetvstatus.js +++ b/src/controllers/livetvstatus.js @@ -49,7 +49,8 @@ function getDeviceHtml(device) { html += ''; html += ''; html += ''; - return html += ''; + html += ''; + return html; } function renderDevices(page, devices) { diff --git a/src/scripts/libraryBrowser.js b/src/scripts/libraryBrowser.js index b9fe249bd4..9cb54a8c4d 100644 --- a/src/scripts/libraryBrowser.js +++ b/src/scripts/libraryBrowser.js @@ -115,7 +115,8 @@ export function getQueryPagingHtml (options) { html += ''; } - return html += ''; + html += ''; + return html; } export function showSortMenu (options) { From 7a2fbebeb3a50694dde690e14430d20741aca284 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Oct 2022 19:25:33 +0000 Subject: [PATCH 29/80] Update Babel to v7.19.3 --- package-lock.json | 60 +++++++++++++++++++++++------------------------ package.json | 4 ++-- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index a2633a4a5f..cecad1fa81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,13 +53,13 @@ "workbox-precaching": "6.5.4" }, "devDependencies": { - "@babel/core": "7.19.1", + "@babel/core": "7.19.3", "@babel/eslint-parser": "7.19.1", "@babel/eslint-plugin": "7.19.1", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-private-methods": "7.18.6", "@babel/plugin-transform-modules-umd": "7.18.6", - "@babel/preset-env": "7.19.1", + "@babel/preset-env": "7.19.3", "@babel/preset-react": "7.18.6", "@babel/preset-typescript": "7.18.6", "@types/escape-html": "1.0.2", @@ -178,21 +178,21 @@ } }, "node_modules/@babel/core": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", - "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.1", + "@babel/parser": "^7.19.3", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1709,13 +1709,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", - "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz", + "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.1", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/compat-data": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", @@ -1783,7 +1783,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -18585,21 +18585,21 @@ "dev": true }, "@babel/core": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", - "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-module-transforms": "^7.19.0", "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.1", + "@babel/parser": "^7.19.3", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -19603,13 +19603,13 @@ } }, "@babel/preset-env": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", - "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz", + "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.1", - "@babel/helper-compilation-targets": "^7.19.1", + "@babel/compat-data": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", @@ -19677,7 +19677,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.0", + "@babel/types": "^7.19.3", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", diff --git a/package.json b/package.json index fb50784f9f..ffed0b85d3 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,13 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "7.19.1", + "@babel/core": "7.19.3", "@babel/eslint-parser": "7.19.1", "@babel/eslint-plugin": "7.19.1", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-private-methods": "7.18.6", "@babel/plugin-transform-modules-umd": "7.18.6", - "@babel/preset-env": "7.19.1", + "@babel/preset-env": "7.19.3", "@babel/preset-react": "7.18.6", "@babel/preset-typescript": "7.18.6", "@types/escape-html": "1.0.2", From 31c80604635d00d7a9e56e2d2d422987e0bd645a Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 16:06:59 -0400 Subject: [PATCH 30/80] Add eslint warning for no-warning-comments --- .eslintrc.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 7bf51c7a58..40b200f689 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -51,6 +51,7 @@ module.exports = { 'no-floating-decimal': ['error'], 'no-multi-spaces': ['error'], 'no-multiple-empty-lines': ['error', { 'max': 1 }], + 'no-nested-ternary': ['error'], 'no-restricted-globals': ['error'].concat(restrictedGlobals), 'no-return-assign': ['error'], 'no-return-await': ['error'], @@ -58,14 +59,14 @@ module.exports = { 'no-trailing-spaces': ['error'], '@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], 'no-useless-constructor': ['error'], + 'no-var': ['error'], 'no-void': ['error', { 'allowAsStatement': true }], - 'no-nested-ternary': ['error'], + 'no-warning-comments': ['warn', { 'terms': ['fixme', 'hack', 'xxx'] }], 'one-var': ['error', 'never'], 'padded-blocks': ['error', 'never'], 'prefer-const': ['error', { 'destructuring': 'all' }], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], '@babel/semi': ['error'], - 'no-var': ['error'], 'space-before-blocks': ['error'], 'space-infix-ops': 'error', 'yoda': 'error', From 9cb03ba4e5165c2e93266f0dac5c0e382dcec936 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 16:10:57 -0400 Subject: [PATCH 31/80] Fix assignment in switch expression issues --- src/components/tunerPicker.js | 2 +- src/components/tvproviders/schedulesdirect.js | 2 +- src/components/tvproviders/xmltv.js | 2 +- src/controllers/livetvstatus.js | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/tunerPicker.js b/src/components/tunerPicker.js index b73337182b..68c6644092 100644 --- a/src/components/tunerPicker.js +++ b/src/components/tunerPicker.js @@ -67,7 +67,7 @@ function getDeviceHtml(device) { } function getTunerName(providerId) { - switch (providerId = providerId.toLowerCase()) { + switch (providerId.toLowerCase()) { case 'm3u': return 'M3U'; diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js index 239831ad8a..509c8145a3 100644 --- a/src/components/tvproviders/schedulesdirect.js +++ b/src/components/tvproviders/schedulesdirect.js @@ -202,7 +202,7 @@ export default function (page, providerId, options) { } function getTunerName(providerId) { - switch (providerId = providerId.toLowerCase()) { + switch (providerId.toLowerCase()) { case 'm3u': return 'M3U Playlist'; case 'hdhomerun': diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index 9d5312e4dc..5a4e44db6d 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -106,7 +106,7 @@ export default function (page, providerId, options) { } function getTunerName(providerId) { - switch (providerId = providerId.toLowerCase()) { + switch (providerId.toLowerCase()) { case 'm3u': return 'M3U Playlist'; case 'hdhomerun': diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js index d07b50c048..d771464b1d 100644 --- a/src/controllers/livetvstatus.js +++ b/src/controllers/livetvstatus.js @@ -192,7 +192,7 @@ function deleteProvider(page, id) { } function getTunerName(providerId) { - switch (providerId = providerId.toLowerCase()) { + switch (providerId.toLowerCase()) { case 'm3u': return 'M3U'; case 'hdhomerun': @@ -207,7 +207,7 @@ function getTunerName(providerId) { } function getProviderName(providerId) { - switch (providerId = providerId.toLowerCase()) { + switch (providerId.toLowerCase()) { case 'schedulesdirect': return 'Schedules Direct'; case 'xmltv': @@ -218,7 +218,7 @@ function getProviderName(providerId) { } function getProviderConfigurationUrl(providerId) { - switch (providerId = providerId.toLowerCase()) { + switch (providerId.toLowerCase()) { case 'xmltv': return '#/livetvguideprovider.html?type=xmltv'; case 'schedulesdirect': From 3417d56bf3755d172e3d5e931b990d8e370272e0 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 16:16:54 -0400 Subject: [PATCH 32/80] Fix weird ternary statements that sonar flags --- src/components/cardbuilder/cardBuilder.js | 3 ++- src/libraries/scroller.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index ebdc250d7a..c22e6a2b3f 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -390,7 +390,8 @@ import { appRouter } from '../appRouter'; } else if (options.indexBy === 'ProductionYear') { newIndexValue = item.ProductionYear; } else if (options.indexBy === 'CommunityRating') { - newIndexValue = item.CommunityRating ? (Math.floor(item.CommunityRating) + (item.CommunityRating % 1 >= 0.5 ? 0.5 : 0)) + '+' : null; + const roundedRatingDecimal = item.CommunityRating % 1 >= 0.5 ? 0.5 : 0; + newIndexValue = item.CommunityRating ? (Math.floor(item.CommunityRating) + roundedRatingDecimal) + '+' : null; } if (newIndexValue !== currentIndexValue) { diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index 26b4a8370b..49b84e734d 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -459,7 +459,8 @@ const scrollerFactory = function (frame, options) { */ function dragHandler(event) { dragging.released = event.type === 'mouseup' || event.type === 'touchend'; - const pointer = dragging.touch ? event[dragging.released ? 'changedTouches' : 'touches'][0] : event; + const eventName = dragging.released ? 'changedTouches' : 'touches'; + const pointer = dragging.touch ? event[eventName][0] : event; dragging.pathX = pointer.pageX - dragging.initX; dragging.pathY = pointer.pageY - dragging.initY; dragging.path = Math.sqrt(Math.pow(dragging.pathX, 2) + Math.pow(dragging.pathY, 2)); From f20a0e447cc94ee81b0f5b85ef4621d2f604c043 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 16:27:11 -0400 Subject: [PATCH 33/80] Fix redundant assignment issue from sonar --- src/components/playback/playbackmanager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 1cbd99950a..4259354d81 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2478,8 +2478,8 @@ class PlaybackManager { playMethod = 'DirectPlay'; } else if (mediaSource.StreamUrl) { // Only used for audio - playMethod = 'Transcode'; mediaUrl = mediaSource.StreamUrl; + // Use the default playMethod value of Transcode } else if (mediaSource.SupportsDirectPlay || mediaSource.SupportsDirectStream) { directOptions = { Static: true, From 0b76f38f1e96a6c28ecd9fdf44cbba57efe8ca9a Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 16:47:08 -0400 Subject: [PATCH 34/80] Fix misleading array mutation issue from sonar --- src/scripts/dom.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scripts/dom.js b/src/scripts/dom.js index 8cc3e7d036..e336088c87 100644 --- a/src/scripts/dom.js +++ b/src/scripts/dom.js @@ -183,9 +183,9 @@ width = height * (16.0 / 9.0); } - return standardWidths.sort(function (a, b) { - return Math.abs(width - a) - Math.abs(width - b); - })[0]; + standardWidths.sort((a, b) => Math.abs(width - a) - Math.abs(width - b)); + + return standardWidths[0]; } /** From 368d24503c820bd6587602e5cfdb0c44b41cc4f9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Oct 2022 21:03:29 +0000 Subject: [PATCH 35/80] Update dependency typescript to v4.8.4 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7685291e4..909f41fd7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ "stylelint-order": "5.0.0", "stylelint-scss": "4.3.0", "ts-loader": "9.4.1", - "typescript": "4.8.3", + "typescript": "4.8.4", "webpack": "5.74.0", "webpack-cli": "4.10.0", "webpack-dev-server": "4.11.1", @@ -17287,9 +17287,9 @@ } }, "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -31280,9 +31280,9 @@ } }, "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true }, "unbox-primitive": { diff --git a/package.json b/package.json index dd5299adf6..87f04d5466 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "stylelint-order": "5.0.0", "stylelint-scss": "4.3.0", "ts-loader": "9.4.1", - "typescript": "4.8.3", + "typescript": "4.8.4", "webpack": "5.74.0", "webpack-cli": "4.10.0", "webpack-dev-server": "4.11.1", From 63b455f42a634bd7e60601e0ae54cf976ba5ec0b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Oct 2022 10:33:30 +0000 Subject: [PATCH 36/80] Update actions/checkout digest to 2541b12 --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/lint.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 63da9f2395..e9ce3a6197 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -19,7 +19,7 @@ jobs: language: [ 'javascript' ] steps: - name: Checkout repository - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 - name: Initialize CodeQL uses: github/codeql-action/init@e0e5ded33cabb451ae0a9768fc7b0410bad9ad44 # tag=v2 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ecb50723fa..20111001c6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 - name: Setup node environment uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # tag=v3.5.0 @@ -48,7 +48,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 - name: Setup node environment uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # tag=v3.5.0 @@ -86,7 +86,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # tag=v3 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 - name: Setup node environment uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # tag=v3.5.0 From 41cf70fa3b7340c732d01396608eca9ddcc854ce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Oct 2022 10:34:05 +0000 Subject: [PATCH 37/80] Update dependency blurhash to v2.0.2 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 75dae6dddf..6f964568e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@fontsource/noto-sans-tc": "4.5.11", "@jellyfin/libass-wasm": "4.1.1", "@jellyfin/sdk": "0.7.0", - "blurhash": "2.0.0", + "blurhash": "2.0.2", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", "core-js": "3.25.3", @@ -4026,9 +4026,9 @@ } }, "node_modules/blurhash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.0.tgz", - "integrity": "sha512-fdEZnyJZ5E5s9neCfZUMSMkKfMtdKz1fG53t/iYvMjUFUsDnyZ1YnRRayKBK/B8cilNwe5gaIrPF8QlLrukEZQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.2.tgz", + "integrity": "sha512-aYWeITmNkjtnR6X7wNgoIJ198qJc3w5yaIwLa7yxsV7/BMnWDWWgugBNvImSCcWNdVHhpNFIJgEb5jzhV4rkHA==" }, "node_modules/body-parser": { "version": "1.20.0", @@ -21358,9 +21358,9 @@ "dev": true }, "blurhash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.0.tgz", - "integrity": "sha512-fdEZnyJZ5E5s9neCfZUMSMkKfMtdKz1fG53t/iYvMjUFUsDnyZ1YnRRayKBK/B8cilNwe5gaIrPF8QlLrukEZQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.2.tgz", + "integrity": "sha512-aYWeITmNkjtnR6X7wNgoIJ198qJc3w5yaIwLa7yxsV7/BMnWDWWgugBNvImSCcWNdVHhpNFIJgEb5jzhV4rkHA==" }, "body-parser": { "version": "1.20.0", diff --git a/package.json b/package.json index 1ce7c3f09d..9a91b61a92 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@fontsource/noto-sans-tc": "4.5.11", "@jellyfin/libass-wasm": "4.1.1", "@jellyfin/sdk": "0.7.0", - "blurhash": "2.0.0", + "blurhash": "2.0.2", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", "core-js": "3.25.3", From 8e08d1fa5880f717a8d42767b00d3bc2cbeff178 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Oct 2022 12:05:12 +0000 Subject: [PATCH 38/80] Update dependency stylelint to v14.13.0 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 75dae6dddf..22cfdc6b75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,7 +98,7 @@ "sass-loader": "13.0.2", "source-map-loader": "4.0.0", "style-loader": "3.3.1", - "stylelint": "14.12.1", + "stylelint": "14.13.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "5.0.0", @@ -14187,9 +14187,9 @@ } }, "node_modules/stylelint": { - "version": "14.12.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.12.1.tgz", - "integrity": "sha512-ZEM4TuksChMBfuPadQsHUkbOoRySAT9QMfDvvYxdAchOJl0p+csTMBXOu6ORAAxKhwBmxqJiep8V88bXfNs3EQ==", + "version": "14.13.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.13.0.tgz", + "integrity": "sha512-NJSAdloiAB/jgVJKxMR90mWlctvmeBFGFVUvyKngi9+j/qPSJ5ZB+u8jOmGbLTnS7OHrII9NFGehPRyar8U5vg==", "dev": true, "dependencies": { "@csstools/selector-specificity": "^2.0.2", @@ -28868,9 +28868,9 @@ } }, "stylelint": { - "version": "14.12.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.12.1.tgz", - "integrity": "sha512-ZEM4TuksChMBfuPadQsHUkbOoRySAT9QMfDvvYxdAchOJl0p+csTMBXOu6ORAAxKhwBmxqJiep8V88bXfNs3EQ==", + "version": "14.13.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.13.0.tgz", + "integrity": "sha512-NJSAdloiAB/jgVJKxMR90mWlctvmeBFGFVUvyKngi9+j/qPSJ5ZB+u8jOmGbLTnS7OHrII9NFGehPRyar8U5vg==", "dev": true, "requires": { "@csstools/selector-specificity": "^2.0.2", diff --git a/package.json b/package.json index 1ce7c3f09d..49a9fcc889 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "sass-loader": "13.0.2", "source-map-loader": "4.0.0", "style-loader": "3.3.1", - "stylelint": "14.12.1", + "stylelint": "14.13.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "5.0.0", From ca81ce8eeefd8dd57d3ca25c20b4425bd5cba2f4 Mon Sep 17 00:00:00 2001 From: Diogo Aguiar Date: Wed, 5 Oct 2022 10:55:03 +0000 Subject: [PATCH 39/80] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 89c1604485..ed7298ea29 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -934,7 +934,7 @@ "AllLibraries": "Todas as bibliotecas", "AllLanguages": "Todos os idiomas", "AllEpisodes": "Todos os episódios", - "AllComplexFormats": "Todos os formatos complexos (ASS, SSA, VOBSUB, PGS, SUB, IDX, etc.)", + "AllComplexFormats": "Todos os formatos complexos (ASS, SSA, VobSub, PGS, SUB, IDX, etc.)", "AllChannels": "Todos os canais", "All": "Todos", "Alerts": "Alertas", From c4bd4d0a0547084ef1e3fdc251b7d1b067deea90 Mon Sep 17 00:00:00 2001 From: Viperinius Date: Wed, 5 Oct 2022 17:49:34 +0200 Subject: [PATCH 40/80] Keep chapter markers visible whenever the OSD is shown. (Does not require hovering over the slider anymore.) --- src/controllers/playback/video/index.html | 2 +- src/elements/emby-slider/emby-slider.js | 20 -------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/controllers/playback/video/index.html b/src/controllers/playback/video/index.html index 14498039d9..3f9dfbef1a 100644 --- a/src/controllers/playback/video/index.html +++ b/src/controllers/playback/video/index.html @@ -21,7 +21,7 @@
-
+
diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index a20ce33b21..c4e233165c 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -261,10 +261,6 @@ import '../emby-input/emby-input'; let hasHideClassBubble = sliderBubble.classList.contains('hide'); this.markerContainerElement = containerElement.querySelector('.sliderMarkerContainer'); - let hasHideClassMarkerContainer = false; - if (this.markerContainerElement) { - hasHideClassMarkerContainer = this.markerContainerElement.classList.contains('hide'); - } dom.addEventListener(this, 'input', function () { this.dragging = true; @@ -280,11 +276,6 @@ import '../emby-input/emby-input'; sliderBubble.classList.remove('hide'); hasHideClassBubble = false; } - - if (hasHideClassMarkerContainer) { - this.markerContainerElement.classList.remove('hide'); - hasHideClassMarkerContainer = false; - } }, { passive: true }); @@ -298,9 +289,6 @@ import '../emby-input/emby-input'; sliderBubble.classList.add('hide'); hasHideClassBubble = true; - - this.markerContainerElement.classList.add('hide'); - hasHideClassMarkerContainer = true; }, { passive: true }); @@ -316,11 +304,6 @@ import '../emby-input/emby-input'; sliderBubble.classList.remove('hide'); hasHideClassBubble = false; } - - if (hasHideClassMarkerContainer) { - this.markerContainerElement.classList.remove('hide'); - hasHideClassMarkerContainer = false; - } } }, { passive: true @@ -330,9 +313,6 @@ import '../emby-input/emby-input'; dom.addEventListener(this, (window.PointerEvent ? 'pointerleave' : 'mouseleave'), function () { sliderBubble.classList.add('hide'); hasHideClassBubble = true; - - this.markerContainerElement.classList.add('hide'); - hasHideClassMarkerContainer = true; }, { passive: true }); From 554cd1210c9a9f9bfa6d6cc8992b5d254d420703 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 4 Oct 2022 17:31:48 -0400 Subject: [PATCH 41/80] Fix sonarjs no-duplicated-branches --- .eslintrc.js | 1 - src/components/cardbuilder/cardBuilder.js | 2 ++ src/components/itemsrefresher.js | 7 +++--- .../recordingcreator/recordingfields.js | 23 +++++-------------- .../emby-itemscontainer.js | 6 ++--- .../emby-ratingbutton/emby-ratingbutton.js | 12 ---------- src/plugins/htmlVideoPlayer/plugin.js | 9 ++++---- src/scripts/browserDeviceProfile.js | 15 +++--------- 8 files changed, 21 insertions(+), 54 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 40b200f689..ec1cd17c41 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -76,7 +76,6 @@ module.exports = { 'sonarjs/cognitive-complexity': ['warn'], // TODO: Enable the following rules and fix issues 'sonarjs/no-duplicate-string': ['off'], - 'sonarjs/no-duplicated-branches': ['off'], 'sonarjs/no-identical-functions': ['off'], 'sonarjs/no-redundant-jump': ['off'], 'sonarjs/no-small-switch': ['off'], diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index c22e6a2b3f..5bc6bf88ad 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -513,6 +513,7 @@ import { appRouter } from '../appRouter'; let imgType = null; let itemId = null; + /* eslint-disable sonarjs/no-duplicated-branches */ if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) { imgType = 'Thumb'; imgTag = item.ImageTags.Thumb; @@ -609,6 +610,7 @@ import { appRouter } from '../appRouter'; imgTag = item.ParentBackdropImageTags[0]; itemId = item.ParentBackdropItemId; } + /* eslint-enable sonarjs/no-duplicated-branches */ if (!itemId) { itemId = item.Id; diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js index 2799a00b1a..a2c57dee1d 100644 --- a/src/components/itemsrefresher.js +++ b/src/components/itemsrefresher.js @@ -4,13 +4,12 @@ import { Events } from 'jellyfin-apiclient'; function onUserDataChanged() { const instance = this; - const eventsToMonitor = getEventsToMonitor(instance); // TODO: Check user data change reason? - if (eventsToMonitor.indexOf('markfavorite') !== -1) { - instance.notifyRefreshNeeded(); - } else if (eventsToMonitor.indexOf('markplayed') !== -1) { + if (eventsToMonitor.indexOf('markfavorite') !== -1 + || eventsToMonitor.indexOf('markplayed') !== -1 + ) { instance.notifyRefreshNeeded(); } } diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index ffc43b4bb4..64d58e9045 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -61,31 +61,20 @@ function fetchData(instance) { function onTimerChangedExternally(e, apiClient, data) { const options = this.options; - let refresh = false; - if (data.Id && this.TimerId === data.Id) { - refresh = true; - } else if (data.ProgramId && options && options.programId === data.ProgramId) { - refresh = true; - } - - if (refresh) { + if ((data.Id && this.TimerId === data.Id) + || (data.ProgramId && options && options.programId === data.ProgramId) + ) { this.refresh(); } } function onSeriesTimerChangedExternally(e, apiClient, data) { const options = this.options; - let refresh = false; - if (data.Id && this.SeriesTimerId === data.Id) { - refresh = true; - } - if (data.ProgramId && options && options.programId === data.ProgramId) { - refresh = true; - } - - if (refresh) { + if ((data.Id && this.SeriesTimerId === data.Id) + || (data.ProgramId && options && options.programId === data.ProgramId) + ) { this.refresh(); } } diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index 4752613ddd..da9592ca19 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -153,9 +153,9 @@ import Sortable from 'sortablejs'; const eventsToMonitor = getEventsToMonitor(itemsContainer); // TODO: Check user data change reason? - if (eventsToMonitor.indexOf('markfavorite') !== -1) { - itemsContainer.notifyRefreshNeeded(); - } else if (eventsToMonitor.indexOf('markplayed') !== -1) { + if (eventsToMonitor.indexOf('markfavorite') !== -1 + || eventsToMonitor.indexOf('markplayed') !== -1 + ) { itemsContainer.notifyRefreshNeeded(); } } diff --git a/src/elements/emby-ratingbutton/emby-ratingbutton.js b/src/elements/emby-ratingbutton/emby-ratingbutton.js index dea35f36f3..91233cef42 100644 --- a/src/elements/emby-ratingbutton/emby-ratingbutton.js +++ b/src/elements/emby-ratingbutton/emby-ratingbutton.js @@ -63,18 +63,6 @@ import ServerConnections from '../../components/ServerConnections'; } button.classList.add('ratingbutton-withrating'); - } else if (likes) { - if (icon) { - icon.classList.add('favorite'); - icon.classList.remove('ratingbutton-icon-withrating'); - } - button.classList.remove('ratingbutton-withrating'); - } else if (likes === false) { - if (icon) { - icon.classList.add('favorite'); - icon.classList.remove('ratingbutton-icon-withrating'); - } - button.classList.remove('ratingbutton-withrating'); } else { if (icon) { icon.classList.add('favorite'); diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index d7ae7f7841..40a2c1c06b 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1490,15 +1490,14 @@ function tryRemoveElement(elem) { if ( // Check non-standard Safari PiP support typeof video.webkitSupportsPresentationMode === 'function' && video.webkitSupportsPresentationMode('picture-in-picture') && typeof video.webkitSetPresentationMode === 'function' + // Check non-standard Windows PiP support + || (window.Windows + && Windows.UI.ViewManagement.ApplicationView.getForCurrentView() + .isViewModeSupported(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay)) // Check standard PiP support || document.pictureInPictureEnabled ) { list.push('PictureInPicture'); - } else if (window.Windows - && Windows.UI.ViewManagement.ApplicationView.getForCurrentView() - .isViewModeSupported(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay) - ) { - list.push('PictureInPicture'); } if (browser.safari || browser.iOS || browser.iPad) { diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 9ac3c2b7eb..4ea95a09da 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -110,7 +110,7 @@ import browser from './browser'; function canPlayAudioFormat(format) { let typeString; - if (format === 'flac') { + if (format === 'flac' || format === 'asf') { if (browser.tizen || browser.web0s || browser.edgeUwp) { return true; } @@ -118,10 +118,6 @@ import browser from './browser'; if (browser.tizen || browser.edgeUwp) { return true; } - } else if (format === 'asf') { - if (browser.tizen || browser.web0s || browser.edgeUwp) { - return true; - } } else if (format === 'opus') { if (browser.web0s) { // canPlayType lies about OPUS support @@ -171,9 +167,7 @@ import browser from './browser'; } function testCanPlayAv1(videoTestElement) { - if (browser.tizenVersion >= 5.5) { - return true; - } else if (browser.web0sVersion >= 5) { + if (browser.tizenVersion >= 5.5 || browser.web0sVersion >= 5) { return true; } @@ -199,6 +193,7 @@ import browser from './browser'; switch (container) { case 'asf': + case 'wmv': supported = browser.tizen || browser.web0s || browser.edgeUwp; videoAudioCodecs = []; break; @@ -241,10 +236,6 @@ import browser from './browser'; videoCodecs.push('mpeg2video'); } break; - case 'wmv': - supported = browser.tizen || browser.web0s || browser.edgeUwp; - videoAudioCodecs = []; - break; case 'ts': supported = testCanPlayTs(); videoCodecs.push('h264'); From 4972f50a06eedb5efffab0b8c505fe6c37620a59 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 5 Oct 2022 15:31:15 -0400 Subject: [PATCH 42/80] Fix sonarjs no-identical-functions --- .eslintrc.js | 1 - src/components/dialogHelper/dialogHelper.js | 34 ++++++++++----------- src/components/itemsrefresher.js | 31 ++++--------------- src/controllers/dashboard/dashboard.js | 17 +++-------- src/controllers/playback/video/index.js | 19 +++--------- src/plugins/htmlAudioPlayer/plugin.js | 5 +-- src/plugins/htmlVideoPlayer/plugin.js | 5 +-- src/scripts/editorsidebar.js | 27 ++++++++-------- 8 files changed, 45 insertions(+), 94 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index ec1cd17c41..0f94de8ed9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -76,7 +76,6 @@ module.exports = { 'sonarjs/cognitive-complexity': ['warn'], // TODO: Enable the following rules and fix issues 'sonarjs/no-duplicate-string': ['off'], - 'sonarjs/no-identical-functions': ['off'], 'sonarjs/no-redundant-jump': ['off'], 'sonarjs/no-small-switch': ['off'], 'sonarjs/prefer-object-literal': ['off'], diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index 130a1742cb..9c1ecec625 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -275,6 +275,11 @@ import '../../assets/css/scrollstyles.scss'; } } + const getAnimationEndHandler = (dlg, callback) => function handler() { + dom.removeEventListener(dlg, dom.whichAnimationEvent(), handler, { once: true }); + callback(); + }; + function animateDialogOpen(dlg) { const onAnimationFinish = () => { focusManager.pushScope(dlg); @@ -290,15 +295,11 @@ import '../../assets/css/scrollstyles.scss'; }; if (enableAnimation()) { - const onFinish = () => { - dom.removeEventListener(dlg, dom.whichAnimationEvent(), onFinish, { - once: true - }); - onAnimationFinish(); - }; - dom.addEventListener(dlg, dom.whichAnimationEvent(), onFinish, { - once: true - }); + dom.addEventListener( + dlg, + dom.whichAnimationEvent(), + getAnimationEndHandler(dlg, onAnimationFinish), + { once: true }); return; } @@ -324,15 +325,12 @@ import '../../assets/css/scrollstyles.scss'; animated = false; break; } - const onFinish = () => { - dom.removeEventListener(dlg, dom.whichAnimationEvent(), onFinish, { - once: true - }); - onAnimationFinish(); - }; - dom.addEventListener(dlg, dom.whichAnimationEvent(), onFinish, { - once: true - }); + + dom.addEventListener( + dlg, + dom.whichAnimationEvent(), + getAnimationEndHandler(dlg, onAnimationFinish), + { once: true }); if (animated) { return; diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js index a2c57dee1d..8b71d9c926 100644 --- a/src/components/itemsrefresher.js +++ b/src/components/itemsrefresher.js @@ -24,37 +24,18 @@ function getEventsToMonitor(instance) { return []; } -function onTimerCreated() { +function notifyTimerRefresh() { const instance = this; if (getEventsToMonitor(instance).indexOf('timers') !== -1) { instance.notifyRefreshNeeded(); - return; } } -function onSeriesTimerCreated() { +function notifySeriesTimerRefresh() { const instance = this; if (getEventsToMonitor(instance).indexOf('seriestimers') !== -1) { instance.notifyRefreshNeeded(); - return; - } -} - -function onTimerCancelled() { - const instance = this; - - if (getEventsToMonitor(instance).indexOf('timers') !== -1) { - instance.notifyRefreshNeeded(); - return; - } -} - -function onSeriesTimerCancelled() { - const instance = this; - if (getEventsToMonitor(instance).indexOf('seriestimers') !== -1) { - instance.notifyRefreshNeeded(); - return; } } @@ -125,10 +106,10 @@ class ItemsRefresher { this.options = options || {}; addNotificationEvent(this, 'UserDataChanged', onUserDataChanged); - addNotificationEvent(this, 'TimerCreated', onTimerCreated); - addNotificationEvent(this, 'SeriesTimerCreated', onSeriesTimerCreated); - addNotificationEvent(this, 'TimerCancelled', onTimerCancelled); - addNotificationEvent(this, 'SeriesTimerCancelled', onSeriesTimerCancelled); + addNotificationEvent(this, 'TimerCreated', notifyTimerRefresh); + addNotificationEvent(this, 'SeriesTimerCreated', notifySeriesTimerRefresh); + addNotificationEvent(this, 'TimerCancelled', notifyTimerRefresh); + addNotificationEvent(this, 'SeriesTimerCancelled', notifySeriesTimerRefresh); addNotificationEvent(this, 'LibraryChanged', onLibraryChanged); addNotificationEvent(this, 'playbackstop', onPlaybackStopped, playbackManager); } diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index f700595c37..7d9b9536c2 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -747,14 +747,7 @@ import confirm from '../../components/confirm/confirm'; console.debug('onServerRestarting not implemented', evt, apiClient); } - function onPackageInstalling(evt, apiClient) { - if (apiClient.serverId() === serverId) { - pollForInfo(view, apiClient); - reloadSystemInfo(view, apiClient); - } - } - - function onPackageInstallationCompleted(evt, apiClient) { + function onPackageInstall(_, apiClient) { if (apiClient.serverId() === serverId) { pollForInfo(view, apiClient); reloadSystemInfo(view, apiClient); @@ -786,8 +779,8 @@ import confirm from '../../components/confirm/confirm'; Events.on(serverNotifications, 'RestartRequired', onRestartRequired); Events.on(serverNotifications, 'ServerShuttingDown', onServerShuttingDown); Events.on(serverNotifications, 'ServerRestarting', onServerRestarting); - Events.on(serverNotifications, 'PackageInstalling', onPackageInstalling); - Events.on(serverNotifications, 'PackageInstallationCompleted', onPackageInstallationCompleted); + Events.on(serverNotifications, 'PackageInstalling', onPackageInstall); + Events.on(serverNotifications, 'PackageInstallationCompleted', onPackageInstall); Events.on(serverNotifications, 'Sessions', onSessionsUpdate); Events.on(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate); DashboardPage.lastAppUpdateCheck = null; @@ -824,8 +817,8 @@ import confirm from '../../components/confirm/confirm'; Events.off(serverNotifications, 'RestartRequired', onRestartRequired); Events.off(serverNotifications, 'ServerShuttingDown', onServerShuttingDown); Events.off(serverNotifications, 'ServerRestarting', onServerRestarting); - Events.off(serverNotifications, 'PackageInstalling', onPackageInstalling); - Events.off(serverNotifications, 'PackageInstallationCompleted', onPackageInstallationCompleted); + Events.off(serverNotifications, 'PackageInstalling', onPackageInstall); + Events.off(serverNotifications, 'PackageInstallationCompleted', onPackageInstall); Events.off(serverNotifications, 'Sessions', onSessionsUpdate); Events.off(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate); diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index a51bff1d50..a1ce0297cf 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1204,17 +1204,6 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components resetIdle(); } - function onWindowTouchStart(e) { - clickedElement = e.target; - mouseIsDown = true; - resetIdle(); - } - - function onWindowTouchEnd() { - mouseIsDown = false; - resetIdle(); - } - function onWindowDragEnd() { // mousedown -> dragstart -> dragend !!! no mouseup :( mouseIsDown = false; @@ -1370,12 +1359,12 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components capture: true, passive: true }); - dom.addEventListener(window, 'touchstart', onWindowTouchStart, { + dom.addEventListener(window, 'touchstart', onWindowMouseDown, { capture: true, passive: true }); ['touchend', 'touchcancel'].forEach((event) => { - dom.addEventListener(window, event, onWindowTouchEnd, { + dom.addEventListener(window, event, onWindowMouseUp, { capture: true, passive: true }); @@ -1411,12 +1400,12 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components capture: true, passive: true }); - dom.removeEventListener(window, 'touchstart', onWindowTouchStart, { + dom.removeEventListener(window, 'touchstart', onWindowMouseDown, { capture: true, passive: true }); ['touchend', 'touchcancel'].forEach((event) => { - dom.removeEventListener(window, event, onWindowTouchEnd, { + dom.removeEventListener(window, event, onWindowMouseUp, { capture: true, passive: true }); diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index 440bb4c3d0..4d31e52cae 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -417,10 +417,7 @@ class HtmlAudioPlayer { // This is a retry after error resume() { - const mediaElement = this._mediaElement; - if (mediaElement) { - mediaElement.play(); - } + this.unpause(); } unpause() { diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 40a2c1c06b..1611684890 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1690,10 +1690,7 @@ function tryRemoveElement(elem) { // This is a retry after error resume() { - const mediaElement = this.#mediaElement; - if (mediaElement) { - mediaElement.play(); - } + this.unpause(); } unpause() { diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index ca0db05034..10a474798c 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -215,19 +215,7 @@ import { getParameterByName } from '../utils/url.ts'; } } - function onNodeOpen(event, data) { - const page = $(this).parents('.page')[0]; - const node = data.node; - if (node.children) { - loadNodesToLoad(page, node); - } - if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { - node.li_attr.loadedFromServer = true; - $.jstree.reference('.libraryTree', page).load_node(node.id, loadNodeCallback); - } - } - - function onNodeLoad(event, data) { + function onNodeOpen(_, data) { const page = $(this).parents('.page')[0]; const node = data.node; if (node.children) { @@ -254,7 +242,13 @@ import { getParameterByName } from '../utils/url.ts'; variant: 'large' } } - }).off('select_node.jstree', onNodeSelect).on('select_node.jstree', onNodeSelect).off('open_node.jstree', onNodeOpen).on('open_node.jstree', onNodeOpen).off('load_node.jstree', onNodeLoad).on('load_node.jstree', onNodeLoad); + }) + .off('select_node.jstree', onNodeSelect) + .on('select_node.jstree', onNodeSelect) + .off('open_node.jstree', onNodeOpen) + .on('open_node.jstree', onNodeOpen) + .off('load_node.jstree', onNodeOpen) + .on('load_node.jstree', onNodeOpen); } function loadNodesToLoad(page, node) { @@ -327,7 +321,10 @@ import { getParameterByName } from '../utils/url.ts'; }); }).on('pagebeforehide', '.metadataEditorPage', function () { const page = this; - $('.libraryTree', page).off('select_node.jstree', onNodeSelect).off('open_node.jstree', onNodeOpen).off('load_node.jstree', onNodeLoad); + $('.libraryTree', page) + .off('select_node.jstree', onNodeSelect) + .off('open_node.jstree', onNodeOpen) + .off('load_node.jstree', onNodeOpen); }); let itemId; window.MetadataEditor = { From 79280169cec2ac033c7f5715123421d7d38e7648 Mon Sep 17 00:00:00 2001 From: cvium Date: Thu, 6 Oct 2022 09:37:32 +0200 Subject: [PATCH 43/80] chore: add Basque display language option --- src/components/displaySettings/displaySettings.template.html | 1 + src/index.jsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/displaySettings/displaySettings.template.html b/src/components/displaySettings/displaySettings.template.html index d55d04ce2c..29b1620914 100644 --- a/src/components/displaySettings/displaySettings.template.html +++ b/src/components/displaySettings/displaySettings.template.html @@ -26,6 +26,7 @@ + diff --git a/src/index.jsx b/src/index.jsx index 81f3bcf43e..c15297288e 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -41,7 +41,7 @@ import { HistoryRouter } from './components/HistoryRouter.tsx'; import AppRoutes from './routes/index.tsx'; function loadCoreDictionary() { - const languages = ['af', 'ar', 'be-by', 'bg-bg', 'bn_bd', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en-gb', 'en-us', 'eo', 'es', 'es-419', 'es-ar', 'es_do', 'es-mx', 'et', 'fa', 'fi', 'fil', 'fr', 'fr-ca', 'gl', 'gsw', 'he', 'hi-in', 'hr', 'hu', 'id', 'it', 'ja', 'kk', 'ko', 'lt-lt', 'lv', 'mr', 'ms', 'nb', 'nl', 'nn', 'pl', 'pr', 'pt', 'pt-br', 'pt-pt', 'ro', 'ru', 'sk', 'sl-si', 'sq', 'sv', 'ta', 'th', 'tr', 'uk', 'ur_pk', 'vi', 'zh-cn', 'zh-hk', 'zh-tw']; + const languages = ['af', 'ar', 'be-by', 'bg-bg', 'bn_bd', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en-gb', 'en-us', 'eo', 'es', 'es-419', 'es-ar', 'es_do', 'es-mx', 'et', 'eu', 'fa', 'fi', 'fil', 'fr', 'fr-ca', 'gl', 'gsw', 'he', 'hi-in', 'hr', 'hu', 'id', 'it', 'ja', 'kk', 'ko', 'lt-lt', 'lv', 'mr', 'ms', 'nb', 'nl', 'nn', 'pl', 'pr', 'pt', 'pt-br', 'pt-pt', 'ro', 'ru', 'sk', 'sl-si', 'sq', 'sv', 'ta', 'th', 'tr', 'uk', 'ur_pk', 'vi', 'zh-cn', 'zh-hk', 'zh-tw']; const translations = languages.map(function (language) { return { lang: language, From ce96ebead7eebd0783ffcab3d8031f5a9130e50f Mon Sep 17 00:00:00 2001 From: YusanTayir <208060627@qq.com> Date: Thu, 6 Oct 2022 06:54:05 +0000 Subject: [PATCH 44/80] Translated using Weblate (Uyghur) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ug/ --- src/strings/ug.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/strings/ug.json b/src/strings/ug.json index d9bab4f51d..9fc7f78320 100644 --- a/src/strings/ug.json +++ b/src/strings/ug.json @@ -13,5 +13,16 @@ "Favorites": "ساقلىغۇچ", "AddedOnValue": "{0} ى قوشۇلدى", "Add": "قوشۇش", - "AccessRestrictedTryAgainLater": "نۆۋەتتە زىيارىتىڭىز چەكلىمىگە ئۇچرىدى. سەل تۇرۇپ قايتا سىناڭ." + "AccessRestrictedTryAgainLater": "نۆۋەتتە زىيارىتىڭىز چەكلىمىگە ئۇچرىدى. سەل تۇرۇپ قايتا سىناڭ.", + "ValueSpecialEpisodeName": "خاسلىق - {0}", + "Sync": "ماس قەدەمدەش", + "Songs": "ناخشىلار", + "Shows": "پروگراممىلار", + "Playlists": "قويۇش تىزىملىكى", + "Photos": "رەسىملەر", + "MusicVideos": "سىنلىق مۇزىكا", + "Movies": "فىلىملەر", + "HeaderContinueWatching": "داۋاملىق كۆرۈش", + "HeaderAlbumArtists": "پىلاستىنكا سەنئەتكارلىرى", + "Genres": "ئۇسلۇبلار" } From 75c5d64eded113dd926c401377f352fd4e86403b Mon Sep 17 00:00:00 2001 From: Claus Vium Date: Thu, 6 Oct 2022 10:07:06 +0200 Subject: [PATCH 45/80] Update dfnshelper.js --- src/scripts/dfnshelper.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index e184f1035f..b32a6817ae 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -1,4 +1,4 @@ -import { af, arDZ, be, bg, bn, ca, cs, cy, da, de, el, enGB, enUS, eo, es, et, faIR, fi, fr, frCA, gl, he, hi, hr, hu, id, is, it, ja, kk, ko, lt, lv, ms, nb, +import { af, arDZ, be, bg, bn, ca, cs, cy, da, de, el, enGB, enUS, eo, es, et, eu, faIR, fi, fr, frCA, gl, he, hi, hr, hu, id, is, it, ja, kk, ko, lt, lv, ms, nb, nl, nn, pl, ptBR, pt, ro, ru, sk, sl, sv, ta, th, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale'; import globalize from './globalize'; @@ -22,6 +22,7 @@ const dateLocales = (locale) => ({ 'es-do': es, 'es-mx': es, 'et': et, + 'eu': eu, 'fa': faIR, 'fi': fi, 'fr': fr, From fc1e88b6354b713f74af400a02d51e1ba65b0d34 Mon Sep 17 00:00:00 2001 From: YusanTayir <208060627@qq.com> Date: Thu, 6 Oct 2022 10:10:55 +0000 Subject: [PATCH 46/80] Translated using Weblate (Uyghur) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ug/ --- src/strings/ug.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/ug.json b/src/strings/ug.json index 9fc7f78320..576f2271c2 100644 --- a/src/strings/ug.json +++ b/src/strings/ug.json @@ -24,5 +24,6 @@ "Movies": "فىلىملەر", "HeaderContinueWatching": "داۋاملىق كۆرۈش", "HeaderAlbumArtists": "پىلاستىنكا سەنئەتكارلىرى", - "Genres": "ئۇسلۇبلار" + "Genres": "ئۇسلۇبلار", + "Small": "كىچىك" } From 596ee47c89f0c8e99397a232ac93e887821f58d8 Mon Sep 17 00:00:00 2001 From: Viperinius Date: Thu, 6 Oct 2022 16:58:22 +0200 Subject: [PATCH 47/80] Rename some things as suggested. --- src/elements/emby-slider/emby-slider.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index c4e233165c..452019f4ea 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -178,7 +178,7 @@ import '../emby-input/emby-input'; range.markerInfo = range.getMarkerInfo(); } - function htmlToInsert(markerInfo) { + function getMarkerHtml(markerInfo) { let markerTypeSpecificClasses = ''; if (markerInfo.className === 'chapterMarker') { @@ -194,7 +194,7 @@ import '../emby-input/emby-input'; } range.markerInfo.forEach(info => { - range.markerContainerElement.insertAdjacentHTML('beforeend', htmlToInsert(info)); + range.markerContainerElement.insertAdjacentHTML('beforeend', getMarkerHtml(info)); }); range.markerElements = range.markerContainerElement.querySelectorAll('.sliderMarker'); @@ -258,7 +258,7 @@ import '../emby-input/emby-input'; this.backgroundUpper = containerElement.querySelector('.mdl-slider-background-upper'); const sliderBubble = containerElement.querySelector('.sliderBubble'); - let hasHideClassBubble = sliderBubble.classList.contains('hide'); + let hasHideBubbleClass = sliderBubble.classList.contains('hide'); this.markerContainerElement = containerElement.querySelector('.sliderMarkerContainer'); @@ -272,9 +272,9 @@ import '../emby-input/emby-input'; const bubbleValue = mapValueToFraction(this, this.value) * 100; updateBubble(this, bubbleValue, sliderBubble); - if (hasHideClassBubble) { + if (hasHideBubbleClass) { sliderBubble.classList.remove('hide'); - hasHideClassBubble = false; + hasHideBubbleClass = false; } }, { passive: true @@ -288,7 +288,7 @@ import '../emby-input/emby-input'; } sliderBubble.classList.add('hide'); - hasHideClassBubble = true; + hasHideBubbleClass = true; }, { passive: true }); @@ -300,9 +300,9 @@ import '../emby-input/emby-input'; updateBubble(this, bubbleValue, sliderBubble); - if (hasHideClassBubble) { + if (hasHideBubbleClass) { sliderBubble.classList.remove('hide'); - hasHideClassBubble = false; + hasHideBubbleClass = false; } } }, { @@ -312,7 +312,7 @@ import '../emby-input/emby-input'; /* eslint-disable-next-line compat/compat */ dom.addEventListener(this, (window.PointerEvent ? 'pointerleave' : 'mouseleave'), function () { sliderBubble.classList.add('hide'); - hasHideClassBubble = true; + hasHideBubbleClass = true; }, { passive: true }); From 899f61a51d9ada386ce392f3704641c299143bdd Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 6 Oct 2022 17:06:49 -0400 Subject: [PATCH 48/80] Backport pull request #4005 from jellyfin/release-10.8.z Fix locale with suffix Original-merge: b14d76a3d40ca35ea5d8f68c8241c397e1792f50 Merged-by: Bill Thornton Backported-by: Bill Thornton --- src/components/dashboard/users/UserCardBox.tsx | 4 ++-- src/controllers/dashboard/dashboard.js | 4 ++-- src/controllers/dashboard/devices/devices.js | 4 +++- .../dashboard/scheduledtasks/scheduledtasks.js | 4 ++-- src/scripts/dfnshelper.js | 9 +++++++-- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/components/dashboard/users/UserCardBox.tsx b/src/components/dashboard/users/UserCardBox.tsx index adc7401805..05379be5bc 100644 --- a/src/components/dashboard/users/UserCardBox.tsx +++ b/src/components/dashboard/users/UserCardBox.tsx @@ -1,7 +1,7 @@ import type { UserDto } from '@jellyfin/sdk/lib/generated-client'; import React, { FunctionComponent } from 'react'; import { formatDistanceToNow } from 'date-fns'; -import { localeWithSuffix } from '../../../scripts/dfnshelper'; +import { getLocaleWithSuffix } from '../../../scripts/dfnshelper'; import globalize from '../../../scripts/globalize'; import cardBuilder from '../../cardbuilder/cardBuilder'; import IconButtonElement from '../../../elements/IconButtonElement'; @@ -23,7 +23,7 @@ type IProps = { const getLastSeenText = (lastActivityDate?: string | null) => { if (lastActivityDate) { - return globalize.translate('LastSeen', formatDistanceToNow(Date.parse(lastActivityDate), localeWithSuffix)); + return globalize.translate('LastSeen', formatDistanceToNow(Date.parse(lastActivityDate), getLocaleWithSuffix())); } return ''; diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 7d9b9536c2..ef4baa8be3 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -6,7 +6,7 @@ import serverNotifications from '../../scripts/serverNotifications'; import dom from '../../scripts/dom'; import globalize from '../../scripts/globalize'; import { formatDistanceToNow } from 'date-fns'; -import { localeWithSuffix } from '../../scripts/dfnshelper'; +import { getLocaleWithSuffix } from '../../scripts/dfnshelper'; import loading from '../../components/loading/loading'; import playMethodHelper from '../../components/playback/playmethodhelper'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; @@ -477,7 +477,7 @@ import confirm from '../../components/confirm/confirm'; // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences if (!nowPlayingItem) { return { - html: globalize.translate('LastSeen', formatDistanceToNow(Date.parse(session.LastActivityDate), localeWithSuffix)), + html: globalize.translate('LastSeen', formatDistanceToNow(Date.parse(session.LastActivityDate), getLocaleWithSuffix())), image: imgUrl }; } diff --git a/src/controllers/dashboard/devices/devices.js b/src/controllers/dashboard/devices/devices.js index 100fb1ff57..7fe0b8d062 100644 --- a/src/controllers/dashboard/devices/devices.js +++ b/src/controllers/dashboard/devices/devices.js @@ -5,7 +5,7 @@ import dom from '../../../scripts/dom'; import globalize from '../../../scripts/globalize'; import imageHelper from '../../../scripts/imagehelper'; import { formatDistanceToNow } from 'date-fns'; -import { localeWithSuffix } from '../../../scripts/dfnshelper'; +import { getLocaleWithSuffix } from '../../../scripts/dfnshelper'; import '../../../elements/emby-button/emby-button'; import '../../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../../components/cardbuilder/card.scss'; @@ -91,6 +91,8 @@ import confirm from '../../../components/confirm/confirm'; } function load(page, devices) { + const localeWithSuffix = getLocaleWithSuffix(); + let html = ''; html += devices.map(function (device) { let deviceHtml = ''; diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index c000986ae9..b11a561f59 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -4,7 +4,7 @@ import { Events } from 'jellyfin-apiclient'; import globalize from '../../../scripts/globalize'; import serverNotifications from '../../../scripts/serverNotifications'; import { formatDistance, formatDistanceToNow } from 'date-fns'; -import { getLocale, localeWithSuffix } from '../../../scripts/dfnshelper'; +import { getLocale, getLocaleWithSuffix } from '../../../scripts/dfnshelper'; import '../../../components/listview/listview.scss'; import '../../../elements/emby-button/emby-button'; @@ -83,7 +83,7 @@ import '../../../elements/emby-button/emby-button'; if (task.LastExecutionResult) { const endtime = Date.parse(task.LastExecutionResult.EndTimeUtc); const starttime = Date.parse(task.LastExecutionResult.StartTimeUtc); - html += globalize.translate('LabelScheduledTaskLastRan', formatDistanceToNow(endtime, localeWithSuffix), + html += globalize.translate('LabelScheduledTaskLastRan', formatDistanceToNow(endtime, getLocaleWithSuffix()), formatDistance(starttime, endtime, { locale: getLocale() })); if (task.LastExecutionResult.Status === 'Failed') { html += " (" + globalize.translate('LabelFailed') + ')'; diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index b32a6817ae..8e3a2516e0 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -68,9 +68,14 @@ export function getLocale() { return dateLocales(globalize.getCurrentLocale()) || dateLocales(globalize.getCurrentLocale().replace(/-.*/, '')) || enUS; } -export const localeWithSuffix = { addSuffix: true, locale: getLocale() }; +export function getLocaleWithSuffix() { + return { + addSuffix: true, + locale: getLocale() + }; +} export default { getLocale: getLocale, - localeWithSuffix: localeWithSuffix + getLocaleWithSuffix }; From 1f1ba5983c904ed9bdb7518065636fc90953cd01 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Oct 2022 01:15:52 +0000 Subject: [PATCH 49/80] Update github/codeql-action digest to 8075783 --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index e9ce3a6197..235a6221a3 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,11 +21,11 @@ jobs: - name: Checkout repository uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 - name: Initialize CodeQL - uses: github/codeql-action/init@e0e5ded33cabb451ae0a9768fc7b0410bad9ad44 # tag=v2 + uses: github/codeql-action/init@807578363a7869ca324a79039e6db9c843e0e100 # tag=v2 with: languages: ${{ matrix.language }} queries: +security-extended - name: Autobuild - uses: github/codeql-action/autobuild@e0e5ded33cabb451ae0a9768fc7b0410bad9ad44 # tag=v2 + uses: github/codeql-action/autobuild@807578363a7869ca324a79039e6db9c843e0e100 # tag=v2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@e0e5ded33cabb451ae0a9768fc7b0410bad9ad44 # tag=v2 + uses: github/codeql-action/analyze@807578363a7869ca324a79039e6db9c843e0e100 # tag=v2 From 5f8ebebfc507f46b616e29415077c12b33d7893c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Oct 2022 12:06:27 +0000 Subject: [PATCH 50/80] Update actions/stale action to v6.0.1 --- .github/workflows/repo-stale.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/repo-stale.yaml b/.github/workflows/repo-stale.yaml index 3eb1fd92a2..e332619eee 100644 --- a/.github/workflows/repo-stale.yaml +++ b/.github/workflows/repo-stale.yaml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest if: ${{ contains(github.repository, 'jellyfin/') }} steps: - - uses: actions/stale@3de2653986ebd134983c79fe2be5d45cc3d9f4e1 # tag=v6.0.0 + - uses: actions/stale@5ebf00ea0e4c1561e9b43a292ed34424fb1d4578 # tag=v6.0.1 with: repo-token: ${{ secrets.JF_BOT_TOKEN }} days-before-stale: 120 From d05e16850cf64650def3bfbdbf6593715eca6d57 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Oct 2022 12:06:58 +0000 Subject: [PATCH 51/80] Update dependency postcss to v8.4.17 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index fa0c0764cc..1dd8266667 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,7 +90,7 @@ "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", - "postcss": "8.4.16", + "postcss": "8.4.17", "postcss-loader": "7.0.1", "postcss-preset-env": "7.8.2", "postcss-scss": "4.0.5", @@ -10735,9 +10735,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", + "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", "dev": true, "funding": [ { @@ -26379,9 +26379,9 @@ "dev": true }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", + "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", "dev": true, "requires": { "nanoid": "^3.3.4", diff --git a/package.json b/package.json index be702bf4e9..7633aec286 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", "mini-css-extract-plugin": "2.6.1", - "postcss": "8.4.16", + "postcss": "8.4.17", "postcss-loader": "7.0.1", "postcss-preset-env": "7.8.2", "postcss-scss": "4.0.5", From 2348f815c64060db05b4eb135c1285d80ff38d0f Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Fri, 7 Oct 2022 15:37:01 +0300 Subject: [PATCH 52/80] Remove resizeObserver Leftover from 0cb54feb539ef4e7e7192b1fc92fdb5de24b4815 --- src/plugins/htmlVideoPlayer/plugin.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 1611684890..677f2c38f7 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -273,10 +273,6 @@ function tryRemoveElement(elem) { * @type {any | undefined} */ #lastProfile; - /** - * @type {MutationObserver | IntersectionObserver | undefined} (Unclear observer typing) - */ - #resizeObserver; constructor() { if (browser.edgeUwp) { @@ -963,11 +959,6 @@ function tryRemoveElement(elem) { * @private */ destroyCustomTrack(videoElement) { - if (this.#resizeObserver) { - this.#resizeObserver.disconnect(); - this.#resizeObserver = null; - } - if (this.#videoSubtitlesElem) { const subtitlesContainer = this.#videoSubtitlesElem.parentNode; if (subtitlesContainer) { From 4644649741dd275c9468c2f0d3654df7d266bb59 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 8 Oct 2022 04:33:10 +0000 Subject: [PATCH 53/80] Update dependency marked to v4.1.1 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1dd8266667..47f33ac603 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "jstree": "3.3.12", "libarchive.js": "1.3.0", "lodash-es": "4.17.21", - "marked": "4.1.0", + "marked": "4.1.1", "material-design-icons-iconfont": "6.7.0", "native-promise-only": "0.8.1", "pdfjs-dist": "2.16.105", @@ -9622,9 +9622,9 @@ "dev": true }, "node_modules/marked": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz", - "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", "bin": { "marked": "bin/marked.js" }, @@ -25546,9 +25546,9 @@ "dev": true }, "marked": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz", - "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==" }, "marks-pane": { "version": "1.0.9", diff --git a/package.json b/package.json index 7633aec286..80ada804cc 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "jstree": "3.3.12", "libarchive.js": "1.3.0", "lodash-es": "4.17.21", - "marked": "4.1.0", + "marked": "4.1.1", "material-design-icons-iconfont": "6.7.0", "native-promise-only": "0.8.1", "pdfjs-dist": "2.16.105", From 8d7bae4d1d531f1c7a7ab6f1c771b4743afa51f8 Mon Sep 17 00:00:00 2001 From: YusanTayir <208060627@qq.com> Date: Sat, 8 Oct 2022 02:55:06 +0000 Subject: [PATCH 54/80] Translated using Weblate (Uyghur) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ug/ --- src/strings/ug.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ug.json b/src/strings/ug.json index 576f2271c2..c2126a764e 100644 --- a/src/strings/ug.json +++ b/src/strings/ug.json @@ -2,7 +2,7 @@ "Album": "البم", "Actor": "ئاكتيور", "Absolute": "مۇتلەق", - "ButtonCast": "ميڊيا کي ڊوائس ۾ ڪاسٽ ڪريو", + "ButtonCast": "ئۈسكۈنىگە يوللاش", "Channels": "قانال", "Books": "كىتاب", "Artists": "سەنئەتكار", From 5e4eca6ae90512e69432b35ddaa930f2091f16a3 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sat, 8 Oct 2022 02:50:20 -0400 Subject: [PATCH 55/80] Fix sonarjs no-redundant-jump --- .eslintrc.js | 1 - src/components/libraryoptionseditor/libraryoptionseditor.js | 1 - src/components/playback/playerSelectionMenu.js | 1 - src/components/recordingcreator/recordingcreator.js | 1 - src/controllers/itemDetails/index.js | 1 - src/controllers/list.js | 2 -- src/controllers/session/forgotPassword/index.js | 1 - src/elements/emby-itemscontainer/emby-itemscontainer.js | 1 - src/plugins/syncPlay/core/QueueCore.js | 1 - 9 files changed, 10 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 0f94de8ed9..abc2cf37a1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -76,7 +76,6 @@ module.exports = { 'sonarjs/cognitive-complexity': ['warn'], // TODO: Enable the following rules and fix issues 'sonarjs/no-duplicate-string': ['off'], - 'sonarjs/no-redundant-jump': ['off'], 'sonarjs/no-small-switch': ['off'], 'sonarjs/prefer-object-literal': ['off'], 'sonarjs/prefer-single-boolean-return': ['off'] diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index 2d67f04f0f..00cac68136 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -382,7 +382,6 @@ import template from './libraryoptionseditor.template.html'; return setContentType(parent, contentType).then(function() { libraryOptions && setLibraryOptions(parent, libraryOptions); bindEvents(parent); - return; }); }); } diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 9cbe2e5ac0..94c3c4b439 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -295,7 +295,6 @@ document.addEventListener('viewshow', function (e) { mirrorIfEnabled({ item: item }); - return; } }); diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js index 4387b2e09b..6720a43475 100644 --- a/src/components/recordingcreator/recordingcreator.js +++ b/src/components/recordingcreator/recordingcreator.js @@ -129,7 +129,6 @@ function executeCloseAction(action, programId, serverId) { serverId: serverId }); }); - return; } } diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 5482c4d479..a740e450f9 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -170,7 +170,6 @@ function renderSeriesTimerEditor(page, item, apiClient, user) { page.querySelector('.seriesTimerScheduleSection').classList.add('hide'); hideAll(page, 'btnCancelSeriesTimer'); - return; } function renderTrackSelections(page, instance, item, forceReload) { diff --git a/src/controllers/list.js b/src/controllers/list.js index 4c9e97ca48..09d398451f 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -720,8 +720,6 @@ class ItemsView { if (params.type === 'Video') { return globalize.translate('Videos'); } - - return; } function play() { diff --git a/src/controllers/session/forgotPassword/index.js b/src/controllers/session/forgotPassword/index.js index 208e54d063..87a0498bf0 100644 --- a/src/controllers/session/forgotPassword/index.js +++ b/src/controllers/session/forgotPassword/index.js @@ -35,7 +35,6 @@ import Dashboard from '../../../utils/dashboard'; Dashboard.navigate('forgotpasswordpin.html'); } }); - return; } } diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index da9592ca19..b6d0f147b7 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -190,7 +190,6 @@ import Sortable from 'sortablejs'; const itemsContainer = this; if (getEventsToMonitor(itemsContainer).indexOf('seriestimers') !== -1) { itemsContainer.notifyRefreshNeeded(); - return; } } diff --git a/src/plugins/syncPlay/core/QueueCore.js b/src/plugins/syncPlay/core/QueueCore.js index cdf1d56a1e..f1a435106e 100644 --- a/src/plugins/syncPlay/core/QueueCore.js +++ b/src/plugins/syncPlay/core/QueueCore.js @@ -193,7 +193,6 @@ class QueueCore { } this.manager.haltGroupPlayback(apiClient); - return; }); } From 76ed503c8120362df6810c5554cbe5ab54122433 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sat, 8 Oct 2022 03:18:30 -0400 Subject: [PATCH 56/80] Fix sonarjs no-small-switch --- .eslintrc.js | 1 - src/components/htmlMediaHelper.js | 33 ++++++++----------- .../subtitleeditor/subtitleeditor.js | 8 ++--- src/controllers/livetv/livetvrecordings.js | 6 ++-- src/controllers/movies/moviesrecommended.js | 7 ++-- src/controllers/music/musicrecommended.js | 7 ++-- src/controllers/shows/tvrecommended.js | 7 ++-- src/plugins/comicsPlayer/plugin.js | 6 ++-- 8 files changed, 29 insertions(+), 46 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 0f94de8ed9..99321b951e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -77,7 +77,6 @@ module.exports = { // TODO: Enable the following rules and fix issues 'sonarjs/no-duplicate-string': ['off'], 'sonarjs/no-redundant-jump': ['off'], - 'sonarjs/no-small-switch': ['off'], 'sonarjs/prefer-object-literal': ['off'], 'sonarjs/prefer-single-boolean-return': ['off'] }, diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 3bb29ca912..4078cbddc0 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -273,28 +273,23 @@ import { Events } from 'jellyfin-apiclient'; hls.on(Hls.Events.ERROR, function (event, data) { console.error('HLS Error: Type: ' + data.type + ' Details: ' + (data.details || '') + ' Fatal: ' + (data.fatal || false)); - switch (data.type) { - case Hls.ErrorTypes.NETWORK_ERROR: - // try to recover network error - if (data.response && data.response.code && data.response.code >= 400) { - console.debug('hls.js response error code: ' + data.response.code); + // try to recover network error + if (data.type === Hls.ErrorTypes.NETWORK_ERROR + && data.response?.code && data.response.code >= 400 + ) { + console.debug('hls.js response error code: ' + data.response.code); - // Trigger failure differently depending on whether this is prior to start of playback, or after - hls.destroy(); + // Trigger failure differently depending on whether this is prior to start of playback, or after + hls.destroy(); - if (reject) { - reject('servererror'); - reject = null; - } else { - onErrorInternal(instance, 'servererror'); - } + if (reject) { + reject('servererror'); + reject = null; + } else { + onErrorInternal(instance, 'servererror'); + } - return; - } - - break; - default: - break; + return; } if (data.fatal) { diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 35d4943c58..1aa6d57fc6 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -334,12 +334,8 @@ function showDownloadOptions(button, context, subtitleId) { positionTo: button }).then(function (id) { - switch (id) { - case 'download': - downloadRemoteSubtitles(context, subtitleId); - break; - default: - break; + if (id === 'download') { + downloadRemoteSubtitles(context, subtitleId); } }); }); diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js index 2ce939907d..73afca81d7 100644 --- a/src/controllers/livetv/livetvrecordings.js +++ b/src/controllers/livetv/livetvrecordings.js @@ -66,11 +66,9 @@ function renderRecordingFolders(context, promise) { function onMoreClick() { const type = this.getAttribute('data-type'); - const serverId = ApiClient.serverId(); - switch (type) { - case 'latest': - Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId); + if (type === 'latest') { + Dashboard.navigate('list.html?type=Recordings&serverId=' + ApiClient.serverId()); } } diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index a4c090bdbe..dc605ca45a 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -374,10 +374,9 @@ import Dashboard from '../../utils/dashboard'; } function onInputCommand(e) { - switch (e.detail.command) { - case 'search': - e.preventDefault(); - Dashboard.navigate('search.html?collectionType=movies&parentId=' + params.topParentId); + if (e.detail.command === 'search') { + e.preventDefault(); + Dashboard.navigate('search.html?collectionType=movies&parentId=' + params.topParentId); } } diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index d04d4bde52..7682a1241c 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -348,10 +348,9 @@ import Dashboard from '../../utils/dashboard'; } function onInputCommand(e) { - switch (e.detail.command) { - case 'search': - e.preventDefault(); - Dashboard.navigate('search.html?collectionType=music&parentId=' + params.topParentId); + if (e.detail.command === 'search') { + e.preventDefault(); + Dashboard.navigate('search.html?collectionType=music&parentId=' + params.topParentId); } } diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index 7dd916f6d8..671ddd12bc 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -333,10 +333,9 @@ import autoFocuser from '../../components/autoFocuser'; } function onInputCommand(e) { - switch (e.detail.command) { - case 'search': - e.preventDefault(); - Dashboard.navigate('search.html?collectionType=tv&parentId=' + params.topParentId); + if (e.detail.command === 'search') { + e.preventDefault(); + Dashboard.navigate('search.html?collectionType=tv&parentId=' + params.topParentId); } } diff --git a/src/plugins/comicsPlayer/plugin.js b/src/plugins/comicsPlayer/plugin.js index 57772d8de5..2d72abaa0b 100644 --- a/src/plugins/comicsPlayer/plugin.js +++ b/src/plugins/comicsPlayer/plugin.js @@ -172,10 +172,8 @@ export class ComicsPlayer { onWindowKeyUp(e) { const key = keyboardnavigation.getKeyName(e); - switch (key) { - case 'Escape': - this.stop(); - break; + if (key === 'Escape') { + this.stop(); } } From ec730269b37aaeb1aa58291903e8b26b31005808 Mon Sep 17 00:00:00 2001 From: hoanghuy309 Date: Sat, 8 Oct 2022 08:26:32 +0000 Subject: [PATCH 57/80] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index 4b3e69f6ad..ae96ca1c46 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1668,5 +1668,8 @@ "Trailer": "", "TypeOptionPluralVideo": "Videos", "ButtonSpace": "Cách", - "ButtonBackspace": "Xóa" + "ButtonBackspace": "Xóa", + "OptionDateEpisodeAdded": "Ngày Thêm Tập", + "IgnoreDtsHelp": "Việc tắt tùy chọn này có thể giải quyết một số vấn đề, ví dụ: thiếu âm thanh trên các kênh có luồng âm thanh và video riêng biệt.", + "IgnoreDts": "Bỏ qua DTS (dấu thời gian giải mã)" } From ac399777aa33d9e7d5f7f8b335e829ec64b64929 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Sat, 8 Oct 2022 12:18:00 +0000 Subject: [PATCH 58/80] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index 22f643e25c..3a3ffe10a9 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1672,5 +1672,9 @@ "RememberSubtitleSelections": "تعيين مسار الترجمة على أساس البند السابق", "RememberAudioSelectionsHelp": "حاول ضبط المسار الصوتي على أقرب تطابق للفيديو الأخير.", "RememberAudioSelections": "تعيين مسار الصوت على أساس البند السابق", - "LabelMaxVideoResolution": "الحد الأقصى المسموح به لقرار تحويل ترميز الفيديو" + "LabelMaxVideoResolution": "الحد الأقصى المسموح به لقرار تحويل ترميز الفيديو", + "OptionDateShowAdded": "تاريخ اضافة العرض", + "OptionDateEpisodeAdded": "تاريخ اضافة الحلقة", + "IgnoreDtsHelp": "قد يؤدي تعطيل هذا الخيار إلى حل بعض المشكلات ، على سبيل المثال فقدان الصوت على القنوات التي تحتوي على دفق صوت وفيديو منفصل.", + "IgnoreDts": "تجاهل DTS (الطابع الزمني لفك التشفير)" } From 7226173c81f66bfdc7e863202302241cdce11b32 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Sat, 8 Oct 2022 12:20:36 +0000 Subject: [PATCH 59/80] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index a05d5e3d71..5b721ee886 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1675,5 +1675,9 @@ "RememberSubtitleSelections": "Set subtitle track based on previous item", "RememberAudioSelectionsHelp": "Try to set the audio track to the closest match to the last video.", "RememberAudioSelections": "Set audio track based on previous item", - "LabelMaxVideoResolution": "Maximum Allowed Video Transcoding Resolution" + "LabelMaxVideoResolution": "Maximum Allowed Video Transcoding Resolution", + "OptionDateShowAdded": "Date Show Added", + "OptionDateEpisodeAdded": "Date Episode Added", + "IgnoreDtsHelp": "Disabling this option may resolve some issues, e.g. missing audio on channels with separate audio and video streams.", + "IgnoreDts": "Ignore DTS (decoding timestamp)" } From 9368e95133f1e69baab13bc2f6e69402c3ad495e Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Sat, 8 Oct 2022 12:19:56 +0000 Subject: [PATCH 60/80] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 85fe0a38c5..41fdac284c 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1676,5 +1676,8 @@ "RememberSubtitleSelections": "Définir la piste de sous-titre en fonction de l'élément précédent", "RememberAudioSelectionsHelp": "Choisir la piste audio la plus proche de la dernière vidéo.", "RememberAudioSelections": "Définir la piste audio en fonction de l'élément précédent", - "IgnoreDtsHelp": "Désactiver cette option pourrait résoudre certains problèmes, comme par exemple l'audio manquant sur des pistes ayant des flux audios et vidéos séparés." + "IgnoreDtsHelp": "La désactivation de cette option peut résoudre certains problèmes, par ex. audio manquant sur les canaux avec des flux audio et vidéo séparés.", + "OptionDateShowAdded": "Date d'ajout de la série", + "OptionDateEpisodeAdded": "Date d'ajout de l'épisode", + "IgnoreDts": "Ignorer DTS (horodatage de décodage)" } From f860db701efba57aec1f0dc727049d65a4b5bfaa Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Sat, 8 Oct 2022 11:43:41 +0000 Subject: [PATCH 61/80] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index 649edb3e49..9fee841ca4 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1675,5 +1675,9 @@ "RememberSubtitleSelections": "Nastaviť titulky podľa predchádzajúcej položky", "RememberAudioSelectionsHelp": "Pokúsi sa nastaviť zvukovú stopu tak, aby sa čo najviac zhodovala s posledným videom.", "RememberAudioSelections": "Nastaviť zvukovú stopu podľa predchádzajúcej položky", - "LabelMaxVideoResolution": "Maximálne dovolené rozlíšenie videa pre prekódovanie" + "LabelMaxVideoResolution": "Maximálne dovolené rozlíšenie videa pre prekódovanie", + "OptionDateShowAdded": "Dátum pridania seriálu", + "OptionDateEpisodeAdded": "Dátum pridania epizódy", + "IgnoreDtsHelp": "Vypnutím sa môžu vyriešiť niektoré problémy, napr. chýbajúci zvuk pri kanáloch so samostatnými zvukovými a video streamami.", + "IgnoreDts": "Ignorovať DTS (dekódovacia časová pečiatka)" } From 82db69c378709fde8b71aed6189c5a69eac2bebf Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Fri, 7 Oct 2022 14:39:16 +0300 Subject: [PATCH 62/80] Fix legacy browser support Add @remix-run/router to babel-loader. --- webpack.common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.common.js b/webpack.common.js index fddcfe66a2..b7c3ad6f47 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -121,7 +121,7 @@ const config = { }, { test: /\.(js|jsx)$/, - exclude: /node_modules[\\/](?!@uupaa[\\/]dynamic-import-polyfill|blurhash|date-fns|epubjs|flv.js|libarchive.js|marked|react-router|screenfull)/, + exclude: /node_modules[\\/](?!@uupaa[\\/]dynamic-import-polyfill|@remix-run[\\/]router|blurhash|date-fns|epubjs|flv.js|libarchive.js|marked|react-router|screenfull)/, use: [{ loader: 'babel-loader', options: { From 2c31a55b08917640f0f1be05c2a3fb828465daed Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Fri, 7 Oct 2022 15:14:30 +0300 Subject: [PATCH 63/80] Fix CSS fallback Turn off `mergeLonghand` because it combines `padding-*`, breaking fallback styles. --- cssnano.config.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 cssnano.config.js diff --git a/cssnano.config.js b/cssnano.config.js new file mode 100644 index 0000000000..376b8f011b --- /dev/null +++ b/cssnano.config.js @@ -0,0 +1,10 @@ +module.exports = { + preset: [ + 'default', + // Turn off `mergeLonghand` because it combines `padding-*` and `margin-*`, + // breaking fallback styles. + // https://github.com/cssnano/cssnano/issues/1163 + // https://github.com/cssnano/cssnano/issues/1192 + { mergeLonghand: false } + ] +}; From e6a111305f6860b864ed76048e09057d03bdee34 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 9 Oct 2022 13:02:04 +0000 Subject: [PATCH 64/80] Update Fonts to v4.5.12 --- package-lock.json | 70 +++++++++++++++++++++++------------------------ package.json | 10 +++---- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47f33ac603..359e73c503 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,11 +10,11 @@ "license": "GPL-2.0-or-later", "dependencies": { "@fontsource/noto-sans": "4.5.11", - "@fontsource/noto-sans-hk": "4.5.11", - "@fontsource/noto-sans-jp": "4.5.11", - "@fontsource/noto-sans-kr": "4.5.11", - "@fontsource/noto-sans-sc": "4.5.11", - "@fontsource/noto-sans-tc": "4.5.11", + "@fontsource/noto-sans-hk": "4.5.12", + "@fontsource/noto-sans-jp": "4.5.12", + "@fontsource/noto-sans-kr": "4.5.12", + "@fontsource/noto-sans-sc": "4.5.12", + "@fontsource/noto-sans-tc": "4.5.12", "@jellyfin/libass-wasm": "4.1.1", "@jellyfin/sdk": "0.7.0", "blurhash": "2.0.2", @@ -2322,29 +2322,29 @@ "integrity": "sha512-lBX7FCjIjSrQ+iMuXUuO+mbjbnUsJyZANg/04PgkeeAYe+cwnX81ibbgrAk1F56M6/btIrWQoDjxsK6Sz8KoVQ==" }, "node_modules/@fontsource/noto-sans-hk": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-4.5.11.tgz", - "integrity": "sha512-fL1oc/vlgrotdKo1aPI0SJaB/dU4v0iHP0t2bTvxqBo/2kjz4w4y/gu03sUk4gHujwnYjARhjtwVe73xph7P9w==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-4.5.12.tgz", + "integrity": "sha512-AWDAqUQpSXlraTZXCdwV9FOVuAVHmhed4bvqOjRqksfeMWZAAMiGOi1QfP4XWnGOzjLEZdV+4aNWc4RYw4suuQ==" }, "node_modules/@fontsource/noto-sans-jp": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-4.5.11.tgz", - "integrity": "sha512-fNt9a07uf7YUPo4qEzIz8IseKn2Gg7zQwX29IKJ5pwClQNEUsVaqyP+PkuClo3EZi1eZUBYMJHjyVtsa8oSmsw==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-4.5.12.tgz", + "integrity": "sha512-tdJAUEyuyyCRD4Ot4ZE8+3uyGeSJQD/soSHr7LoltEQr22IotDDWOlqQKF7CpTaJPwt4iOBoXWtAoSN0huVW6A==" }, "node_modules/@fontsource/noto-sans-kr": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-4.5.11.tgz", - "integrity": "sha512-yqUVOeV2eoHivVknPImSltQsZvLDrKjyf7Xl4XuBE02Gs5bGPkl/o72mUK+N+oMswF413pyxL+jQmI0PAYQubA==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-4.5.12.tgz", + "integrity": "sha512-6LBOzXw/V4guB/nATaiUjCcPxwJNGw+ky5DK7/wsgUZvfk8etH9IlKdvjFVidpeCuMVjOdlka2+MEw4hwEHaHA==" }, "node_modules/@fontsource/noto-sans-sc": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-4.5.11.tgz", - "integrity": "sha512-tufdVgKpP2PqhPpk8Wu6nKF8RCe7nKU0lpKm2uWtqmFE0GN5n+Xq/H6UL7ssRNUvDTHffBHIlGB4T7iYXAutgw==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-4.5.12.tgz", + "integrity": "sha512-KQ8Bn8KCGVS6RKrEw7fp65GJYpKyKEJ/TkePoKGxvNy7smSaHoKV7vrmpIiA46hkqQyYdENix/NKSprxs4Soyw==" }, "node_modules/@fontsource/noto-sans-tc": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-4.5.11.tgz", - "integrity": "sha512-Ns7V+lhInWpcNiHNlK5+9aSvn29ea/qQlNbHjG8+X4SKQ2fMK+rMdYaZCx4eYgQiKajQFTXke+uTroKgsuY/MQ==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-4.5.12.tgz", + "integrity": "sha512-c4OUY5Wq03ZLI4Ds9IEHEiPqpjmEXvDpANXufCTlk+bMb8MnweXPVWJSrSHydXnz7r+qstZl3HvWDl2RI5o/1A==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.10.7", @@ -20006,29 +20006,29 @@ "integrity": "sha512-lBX7FCjIjSrQ+iMuXUuO+mbjbnUsJyZANg/04PgkeeAYe+cwnX81ibbgrAk1F56M6/btIrWQoDjxsK6Sz8KoVQ==" }, "@fontsource/noto-sans-hk": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-4.5.11.tgz", - "integrity": "sha512-fL1oc/vlgrotdKo1aPI0SJaB/dU4v0iHP0t2bTvxqBo/2kjz4w4y/gu03sUk4gHujwnYjARhjtwVe73xph7P9w==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-4.5.12.tgz", + "integrity": "sha512-AWDAqUQpSXlraTZXCdwV9FOVuAVHmhed4bvqOjRqksfeMWZAAMiGOi1QfP4XWnGOzjLEZdV+4aNWc4RYw4suuQ==" }, "@fontsource/noto-sans-jp": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-4.5.11.tgz", - "integrity": "sha512-fNt9a07uf7YUPo4qEzIz8IseKn2Gg7zQwX29IKJ5pwClQNEUsVaqyP+PkuClo3EZi1eZUBYMJHjyVtsa8oSmsw==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-4.5.12.tgz", + "integrity": "sha512-tdJAUEyuyyCRD4Ot4ZE8+3uyGeSJQD/soSHr7LoltEQr22IotDDWOlqQKF7CpTaJPwt4iOBoXWtAoSN0huVW6A==" }, "@fontsource/noto-sans-kr": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-4.5.11.tgz", - "integrity": "sha512-yqUVOeV2eoHivVknPImSltQsZvLDrKjyf7Xl4XuBE02Gs5bGPkl/o72mUK+N+oMswF413pyxL+jQmI0PAYQubA==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-4.5.12.tgz", + "integrity": "sha512-6LBOzXw/V4guB/nATaiUjCcPxwJNGw+ky5DK7/wsgUZvfk8etH9IlKdvjFVidpeCuMVjOdlka2+MEw4hwEHaHA==" }, "@fontsource/noto-sans-sc": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-4.5.11.tgz", - "integrity": "sha512-tufdVgKpP2PqhPpk8Wu6nKF8RCe7nKU0lpKm2uWtqmFE0GN5n+Xq/H6UL7ssRNUvDTHffBHIlGB4T7iYXAutgw==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-4.5.12.tgz", + "integrity": "sha512-KQ8Bn8KCGVS6RKrEw7fp65GJYpKyKEJ/TkePoKGxvNy7smSaHoKV7vrmpIiA46hkqQyYdENix/NKSprxs4Soyw==" }, "@fontsource/noto-sans-tc": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-4.5.11.tgz", - "integrity": "sha512-Ns7V+lhInWpcNiHNlK5+9aSvn29ea/qQlNbHjG8+X4SKQ2fMK+rMdYaZCx4eYgQiKajQFTXke+uTroKgsuY/MQ==" + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-4.5.12.tgz", + "integrity": "sha512-c4OUY5Wq03ZLI4Ds9IEHEiPqpjmEXvDpANXufCTlk+bMb8MnweXPVWJSrSHydXnz7r+qstZl3HvWDl2RI5o/1A==" }, "@humanwhocodes/config-array": { "version": "0.10.7", diff --git a/package.json b/package.json index 80ada804cc..304b10c48c 100644 --- a/package.json +++ b/package.json @@ -66,11 +66,11 @@ }, "dependencies": { "@fontsource/noto-sans": "4.5.11", - "@fontsource/noto-sans-hk": "4.5.11", - "@fontsource/noto-sans-jp": "4.5.11", - "@fontsource/noto-sans-kr": "4.5.11", - "@fontsource/noto-sans-sc": "4.5.11", - "@fontsource/noto-sans-tc": "4.5.11", + "@fontsource/noto-sans-hk": "4.5.12", + "@fontsource/noto-sans-jp": "4.5.12", + "@fontsource/noto-sans-kr": "4.5.12", + "@fontsource/noto-sans-sc": "4.5.12", + "@fontsource/noto-sans-tc": "4.5.12", "@jellyfin/libass-wasm": "4.1.1", "@jellyfin/sdk": "0.7.0", "blurhash": "2.0.2", From 33ecd56fe2bc2e8fb13a5428a79bfcdacdc6b95f Mon Sep 17 00:00:00 2001 From: Ela Parra Date: Sun, 9 Oct 2022 13:04:08 +0000 Subject: [PATCH 65/80] Translated using Weblate (Catalan) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ca/ --- src/strings/ca.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/strings/ca.json b/src/strings/ca.json index a5f85cae8c..c8db8f23eb 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -969,7 +969,7 @@ "NoNewDevicesFound": "No es van trobar nous dispositius. Per afegir un nou sintonitzador, tancar aquest diàleg i introduïu la informació de el dispositiu de forma manual.", "NoCreatedLibraries": "Sembla que no s'ha creat cap biblioteca encara. {0} Li agradaria crear una ara? {1}", "No": "No", - "NextUp": "Fins a la pròxima", + "NextUp": "A continuació", "NextTrack": "Passar a la següent", "Next": "Pròxim", "News": "Notícies", @@ -1644,5 +1644,8 @@ "ButtonClose": "Tancar", "ButtonBackspace": "Retrocés", "Arranger": "Arranjador", - "AddToFavorites": "Afegir a preferits" + "AddToFavorites": "Afegir a preferits", + "EnableSplashScreen": "Habilita la pantalla de benvinguda", + "ScreenResolution": "Resolució de pantalla", + "Bold": "Negreta" } From 55117972be39b600136c78f4861d743c94da7747 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Sun, 9 Oct 2022 17:30:01 +0000 Subject: [PATCH 66/80] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 770239a50c..e0c72aa6d3 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -1413,7 +1413,7 @@ "SmallCaps": "Maiúsculas reduzidas", "LabelTonemappingRange": "Alcance do Tone Mapping :", "TonemappingAlgorithmHelp": "O Tone Mapping pode ser afinado. Se não estiver familiarizado com estas opções, mantenha-as nas opções padrão. O valor recomendado é 'BT.2390'.", - "AllowTonemappingHelp": "O processo de Tone Mapping transforma o Dynamic Range de um vídeo HDR em SDR, mantendo os detalhes e as cores, sendo estes bastante importantes para preservar a cena original. Atualmente funciona apenas com vídeos HDR10 ou HLG. Esta opção requer os executáveis CUDA ou OpenCL correspondentes.", + "AllowTonemappingHelp": "O processo de Tone Mapping transforma o Dynamic Range de um vídeo HDR em SDR, mantendo os detalhes e as cores, sendo estes bastante importantes para preservar a cena original. Atualmente funciona apenas com vídeos HDR10 ou HLG. Esta opção requer os executáveis CUDA ou OpenCL correspondentes.", "LabelMaxMuxingQueueSizeHelp": "Número máximo de pacotes armazenados em buffer enquanto aguardam que todas as transmissões iniciem. Tente aumentá-lo caso se depare com o seguinte erro nos registos do FFmpeg \"Too many packets buffered for output stream\". O valor recomendado é 2048.", "DeleteAll": "Apagar tudo", "DeleteDevicesConfirmation": "Tem a certeza que deseja remover todos os dispositivos? Todas as outras sessões serão terminadas. Os dispositivos reaparecerão da próxima vez que um utilizador iniciar sessão.", From 5895830d883c3efe561b13bf111f537b0c62419d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 9 Oct 2022 19:10:15 +0000 Subject: [PATCH 67/80] Update dependency core-js to v3.25.4 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47f33ac603..639263a586 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "blurhash": "2.0.2", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.25.3", + "core-js": "3.25.4", "date-fns": "2.29.3", "dompurify": "2.4.0", "epubjs": "0.3.93", @@ -4873,9 +4873,9 @@ } }, "node_modules/core-js": { - "version": "3.25.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.3.tgz", - "integrity": "sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ==", + "version": "3.25.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.4.tgz", + "integrity": "sha512-JDLxg61lFPFYQ7U0HKoyKwVUV63VbbVTb/K73Yf+k4Mf4ZBZxCjfyrWZjTk1ZM7ZrgFSqhSIOmuzYAxG2f/reQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -21997,9 +21997,9 @@ } }, "core-js": { - "version": "3.25.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.3.tgz", - "integrity": "sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ==" + "version": "3.25.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.4.tgz", + "integrity": "sha512-JDLxg61lFPFYQ7U0HKoyKwVUV63VbbVTb/K73Yf+k4Mf4ZBZxCjfyrWZjTk1ZM7ZrgFSqhSIOmuzYAxG2f/reQ==" }, "core-js-compat": { "version": "3.25.3", diff --git a/package.json b/package.json index 80ada804cc..7b8f18a069 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "blurhash": "2.0.2", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.25.3", + "core-js": "3.25.4", "date-fns": "2.29.3", "dompurify": "2.4.0", "epubjs": "0.3.93", From c0b058e914883ee3066024f0cb07e8ec711b87ec Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Sun, 9 Oct 2022 23:14:09 -0500 Subject: [PATCH 68/80] add home assistant to device images --- src/scripts/imagehelper.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/scripts/imagehelper.js b/src/scripts/imagehelper.js index cb76fa7977..d481f7e4ad 100644 --- a/src/scripts/imagehelper.js +++ b/src/scripts/imagehelper.js @@ -52,6 +52,8 @@ function getWebDeviceIcon(browser) { case 'Jellyfin iOS': case 'Infuse': return BASE_DEVICE_IMAGE_URL + 'apple.svg'; + case 'Home Assistant': + return BASE_DEVICE_IMAGE_URL + 'home-assistant.svg'; case 'Jellyfin Web': return getWebDeviceIcon(device.Name || device.DeviceName); default: From 0640bb9d43e2f6883f2cefc21b707a6017d6fe40 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Sun, 9 Oct 2022 23:20:52 -0500 Subject: [PATCH 69/80] Add files via upload --- src/assets/img/devices/home-assistant.svg | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/assets/img/devices/home-assistant.svg diff --git a/src/assets/img/devices/home-assistant.svg b/src/assets/img/devices/home-assistant.svg new file mode 100644 index 0000000000..8d98948ba8 --- /dev/null +++ b/src/assets/img/devices/home-assistant.svg @@ -0,0 +1,22 @@ + + + + logo-white + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file From 1398b89b500eb84b30fa9e10c95053e61303baf7 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Mon, 10 Oct 2022 01:51:12 -0500 Subject: [PATCH 70/80] svgo optimize home-assistant.svg --- src/assets/img/devices/home-assistant.svg | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/src/assets/img/devices/home-assistant.svg b/src/assets/img/devices/home-assistant.svg index 8d98948ba8..a34be98def 100644 --- a/src/assets/img/devices/home-assistant.svg +++ b/src/assets/img/devices/home-assistant.svg @@ -1,22 +1 @@ - - - - logo-white - Created with Sketch. - - - - - - - - - - - - - - - - - \ No newline at end of file + From 9b12b452e824c2bad0bec730711b0bb2f8ce56a8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Oct 2022 09:59:42 +0000 Subject: [PATCH 71/80] Update dependency blurhash to v2.0.3 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 639263a586..9b5c71f484 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@fontsource/noto-sans-tc": "4.5.11", "@jellyfin/libass-wasm": "4.1.1", "@jellyfin/sdk": "0.7.0", - "blurhash": "2.0.2", + "blurhash": "2.0.3", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", "core-js": "3.25.4", @@ -4026,9 +4026,9 @@ } }, "node_modules/blurhash": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.2.tgz", - "integrity": "sha512-aYWeITmNkjtnR6X7wNgoIJ198qJc3w5yaIwLa7yxsV7/BMnWDWWgugBNvImSCcWNdVHhpNFIJgEb5jzhV4rkHA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.3.tgz", + "integrity": "sha512-nTnJTOheiaV3b189f7rH5AbbrnQB2r3CcOZBg47GUDaE9DrxyBPD2w0HYp4ME2UBlTP7LMIa6nMWqg/58oyIzA==" }, "node_modules/body-parser": { "version": "1.20.0", @@ -21358,9 +21358,9 @@ "dev": true }, "blurhash": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.2.tgz", - "integrity": "sha512-aYWeITmNkjtnR6X7wNgoIJ198qJc3w5yaIwLa7yxsV7/BMnWDWWgugBNvImSCcWNdVHhpNFIJgEb5jzhV4rkHA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.3.tgz", + "integrity": "sha512-nTnJTOheiaV3b189f7rH5AbbrnQB2r3CcOZBg47GUDaE9DrxyBPD2w0HYp4ME2UBlTP7LMIa6nMWqg/58oyIzA==" }, "body-parser": { "version": "1.20.0", diff --git a/package.json b/package.json index 7b8f18a069..5a741a5ff8 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@fontsource/noto-sans-tc": "4.5.11", "@jellyfin/libass-wasm": "4.1.1", "@jellyfin/sdk": "0.7.0", - "blurhash": "2.0.2", + "blurhash": "2.0.3", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", "core-js": "3.25.4", From 3721380aacfa424a8fd6f2a7b4e472f3fbf0ce60 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:42:11 +0000 Subject: [PATCH 72/80] Update dependency core-js to v3.25.5 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 639263a586..cb0a967365 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "blurhash": "2.0.2", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.25.4", + "core-js": "3.25.5", "date-fns": "2.29.3", "dompurify": "2.4.0", "epubjs": "0.3.93", @@ -4873,9 +4873,9 @@ } }, "node_modules/core-js": { - "version": "3.25.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.4.tgz", - "integrity": "sha512-JDLxg61lFPFYQ7U0HKoyKwVUV63VbbVTb/K73Yf+k4Mf4ZBZxCjfyrWZjTk1ZM7ZrgFSqhSIOmuzYAxG2f/reQ==", + "version": "3.25.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.5.tgz", + "integrity": "sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -21997,9 +21997,9 @@ } }, "core-js": { - "version": "3.25.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.4.tgz", - "integrity": "sha512-JDLxg61lFPFYQ7U0HKoyKwVUV63VbbVTb/K73Yf+k4Mf4ZBZxCjfyrWZjTk1ZM7ZrgFSqhSIOmuzYAxG2f/reQ==" + "version": "3.25.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.5.tgz", + "integrity": "sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw==" }, "core-js-compat": { "version": "3.25.3", diff --git a/package.json b/package.json index 7b8f18a069..a899b5767f 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "blurhash": "2.0.2", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.25.4", + "core-js": "3.25.5", "date-fns": "2.29.3", "dompurify": "2.4.0", "epubjs": "0.3.93", From 43672fadb0950dad8d3ec9f88cbabff1e9b0d389 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:42:53 +0000 Subject: [PATCH 73/80] Update Linters to v5.39.0 --- package-lock.json | 188 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 96 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index 639263a586..c88ba143e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,8 +66,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.50", "@types/react-dom": "17.0.17", - "@typescript-eslint/eslint-plugin": "5.38.1", - "@typescript-eslint/parser": "5.38.1", + "@typescript-eslint/eslint-plugin": "5.39.0", + "@typescript-eslint/parser": "5.39.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.12", "babel-loader": "8.2.5", @@ -2972,14 +2972,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz", - "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", + "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/type-utils": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/type-utils": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -3004,9 +3004,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3019,14 +3019,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.1.tgz", - "integrity": "sha512-LDqxZBVFFQnQRz9rUZJhLmox+Ep5kdUmLatLQnCRR6523YV+XhRjfYzStQ4MheFA8kMAfUlclHSbu+RKdRwQKw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", + "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "debug": "^4.3.4" }, "engines": { @@ -3046,13 +3046,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", - "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", + "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1" + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3063,13 +3063,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz", - "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", + "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3090,9 +3090,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", - "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", + "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3103,13 +3103,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", - "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", + "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3159,9 +3159,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3174,15 +3174,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz", - "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", + "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -3198,12 +3198,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", - "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", + "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/types": "5.39.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -20589,14 +20589,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz", - "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", + "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/type-utils": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/type-utils": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -20605,9 +20605,9 @@ }, "dependencies": { "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20616,53 +20616,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.1.tgz", - "integrity": "sha512-LDqxZBVFFQnQRz9rUZJhLmox+Ep5kdUmLatLQnCRR6523YV+XhRjfYzStQ4MheFA8kMAfUlclHSbu+RKdRwQKw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", + "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", - "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", + "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1" + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0" } }, "@typescript-eslint/type-utils": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz", - "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", + "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/utils": "5.39.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", - "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", + "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", - "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", + "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/visitor-keys": "5.39.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -20691,9 +20691,9 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20702,26 +20702,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz", - "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", + "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/scope-manager": "5.39.0", + "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/typescript-estree": "5.39.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", - "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", + "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/types": "5.39.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { diff --git a/package.json b/package.json index 7b8f18a069..27885c4809 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.50", "@types/react-dom": "17.0.17", - "@typescript-eslint/eslint-plugin": "5.38.1", - "@typescript-eslint/parser": "5.38.1", + "@typescript-eslint/eslint-plugin": "5.39.0", + "@typescript-eslint/parser": "5.39.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.12", "babel-loader": "8.2.5", From 858aea92f9cbac80de0950b0e88429ce709f57a9 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 11 Oct 2022 01:37:33 -0400 Subject: [PATCH 74/80] Enable eslint array-callback-return foreach checking --- .eslintrc.js | 2 +- src/components/htmlMediaHelper.js | 8 ++++++-- src/controllers/itemDetails/index.js | 8 ++++++-- src/scripts/multiDownload.js | 3 ++- src/scripts/shell.js | 4 +++- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index abc2cf37a1..099a8a92c5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -34,7 +34,7 @@ module.exports = { 'plugin:sonarjs/recommended' ], rules: { - 'array-callback-return': ['error'], + 'array-callback-return': ['error', { 'checkForEach': true }], 'block-spacing': ['error'], 'brace-style': ['error', '1tbs', { 'allowSingleLine': true }], 'comma-dangle': ['error', 'never'], diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 3bb29ca912..f3e074ce0b 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -159,11 +159,15 @@ import { Events } from 'jellyfin-apiclient'; // (but rewinding cannot happen as the first event with media of non-empty duration) console.debug(`seeking to ${seconds} on ${e.type} event`); setCurrentTimeIfNeeded(element, seconds); - events.forEach(name => element.removeEventListener(name, onMediaChange)); + events.forEach(name => { + element.removeEventListener(name, onMediaChange); + }); if (onMediaReady) onMediaReady(); } }; - events.forEach(name => element.addEventListener(name, onMediaChange)); + events.forEach(name => { + element.addEventListener(name, onMediaChange); + }); } } } diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index a740e450f9..c0e6dc809a 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -205,8 +205,12 @@ function renderTrackSelections(page, instance, item, forceReload) { }); mediaSources = []; - resolutionNames.forEach(v => mediaSources.push(v)); - sourceNames.forEach(v => mediaSources.push(v)); + resolutionNames.forEach(v => { + mediaSources.push(v); + }); + sourceNames.forEach(v => { + mediaSources.push(v); + }); instance._currentPlaybackMediaSources = mediaSources; diff --git a/src/scripts/multiDownload.js b/src/scripts/multiDownload.js index 54921bf4ef..ec3db52015 100644 --- a/src/scripts/multiDownload.js +++ b/src/scripts/multiDownload.js @@ -56,7 +56,8 @@ export default function (urls) { urls.forEach(function (url) { // the download init has to be sequential for firefox if the urls are not on the same domain if (browser.firefox && !sameDomain(url)) { - return setTimeout(download.bind(null, url), 100 * ++delay); + setTimeout(download.bind(null, url), 100 * ++delay); + return; } download(url); diff --git a/src/scripts/shell.js b/src/scripts/shell.js index aba8698cdb..b21d658f9f 100644 --- a/src/scripts/shell.js +++ b/src/scripts/shell.js @@ -43,7 +43,9 @@ export default { */ downloadFiles(items) { if (window.NativeShell?.downloadFile) { - items.forEach(item => window.NativeShell.downloadFile(item)); + items.forEach(item => { + window.NativeShell.downloadFile(item); + }); return true; } return false; From e2db01e4ac0271c1cc9bb107d37c8b8fe9d8359f Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 11 Oct 2022 02:50:59 -0400 Subject: [PATCH 75/80] Use setup-node built-in npm cache --- .github/workflows/lint.yml | 42 +++----------------------------------- 1 file changed, 3 insertions(+), 39 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 20111001c6..7bf01805d2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -20,19 +20,7 @@ jobs: with: node-version: 16 check-latest: true - - - name: Get npm cache directory path - id: npm-cache-dir-path - run: echo "::set-output name=dir::$(npm config get cache)" - - - name: Cache node_modules - uses: actions/cache@56461b9eb0f8438fd15c7a9968e3c9ebb18ceff1 # tag=v3.0.10 - id: npm-cache - with: - path: ${{ steps.npm-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-npm- + cache: npm - name: Install Node.js dependencies run: npm ci --no-audit @@ -55,19 +43,7 @@ jobs: with: node-version: 16 check-latest: true - - - name: Get npm cache directory path - id: npm-cache-dir-path - run: echo "::set-output name=dir::$(npm config get cache)" - - - name: Cache node_modules - uses: actions/cache@56461b9eb0f8438fd15c7a9968e3c9ebb18ceff1 # tag=v3.0.10 - id: npm-cache - with: - path: ${{ steps.npm-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-npm- + cache: npm - name: Set up stylelint matcher uses: xt0rted/stylelint-problem-matcher@34db1b874c0452909f0696aedef70b723870a583 # tag=v1 @@ -93,19 +69,7 @@ jobs: with: node-version: 16 check-latest: true - - - name: Get npm cache directory path - id: npm-cache-dir-path - run: echo "::set-output name=dir::$(npm config get cache)" - - - name: Cache node_modules - uses: actions/cache@56461b9eb0f8438fd15c7a9968e3c9ebb18ceff1 # tag=v3.0.10 - id: npm-cache - with: - path: ${{ steps.npm-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-npm- + cache: npm - name: Set up stylelint matcher uses: xt0rted/stylelint-problem-matcher@34db1b874c0452909f0696aedef70b723870a583 # tag=v1 From b426b6e2bfdf1647032f7bc80d6c95a0623ed34c Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 6 Oct 2022 01:13:06 -0400 Subject: [PATCH 76/80] Fix sonarjs prefer-single-boolean-return --- .eslintrc.js | 3 +- src/components/apphost.js | 6 +-- src/components/backdrop/backdrop.js | 19 ++------- src/components/focusManager.js | 17 ++------ src/components/htmlMediaHelper.js | 17 +++----- src/components/indicators/indicators.js | 12 ++---- src/components/itemHelper.js | 45 ++++++---------------- src/components/playback/playbackmanager.js | 24 +++--------- src/components/scrollManager.js | 6 +-- src/elements/emby-select/emby-select.js | 6 +-- src/plugins/bookPlayer/plugin.js | 6 +-- src/plugins/comicsPlayer/plugin.js | 6 +-- src/plugins/htmlAudioPlayer/plugin.js | 10 ++--- src/plugins/pdfPlayer/plugin.js | 6 +-- src/scripts/browser.js | 23 ++--------- src/scripts/browserDeviceProfile.js | 14 ++----- src/scripts/gamepadtokey.js | 13 +------ src/scripts/mouseManager.js | 6 +-- 18 files changed, 52 insertions(+), 187 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index effa0c7220..8f0e4bd8c3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -76,8 +76,7 @@ module.exports = { 'sonarjs/cognitive-complexity': ['warn'], // TODO: Enable the following rules and fix issues 'sonarjs/no-duplicate-string': ['off'], - 'sonarjs/prefer-object-literal': ['off'], - 'sonarjs/prefer-single-boolean-return': ['off'] + 'sonarjs/prefer-object-literal': ['off'] }, settings: { react: { diff --git a/src/components/apphost.js b/src/components/apphost.js index 19b7d5233f..b75ca6a18a 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -166,11 +166,7 @@ function supportsHtmlMediaAutoplay() { return true; } - if (browser.mobile) { - return false; - } - - return true; + return !!browser.mobile; } function supportsCue() { diff --git a/src/components/backdrop/backdrop.js b/src/components/backdrop/backdrop.js index bcb4f5401a..d1af617da1 100644 --- a/src/components/backdrop/backdrop.js +++ b/src/components/backdrop/backdrop.js @@ -10,24 +10,13 @@ import './backdrop.scss'; /* eslint-disable indent */ function enableAnimation() { - if (browser.slow) { - return false; - } - - return true; + return !browser.slow; } function enableRotation() { - if (browser.tv) { - return false; - } - - // Causes high cpu usage - if (browser.firefox) { - return false; - } - - return true; + return !browser.tv + // Causes high cpu usage + && !browser.firefox; } class Backdrop { diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 740ff7c07d..1eacc49e77 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -56,15 +56,8 @@ import scrollManager from './scrollManager'; }).join(',') + ',.focusable'; function isFocusable(elem) { - if (focusableTagNames.indexOf(elem.tagName) !== -1) { - return true; - } - - if (elem.classList && elem.classList.contains('focusable')) { - return true; - } - - return false; + return focusableTagNames.indexOf(elem.tagName) !== -1 + || (elem.classList?.contains('focusable')); } function normalizeFocusable(elem, originalElement) { @@ -97,11 +90,7 @@ import scrollManager from './scrollManager'; // Determines if a focusable element can be focused at a given point in time function isCurrentlyFocusableInternal(elem) { // http://stackoverflow.com/questions/19669786/check-if-element-is-visible-in-dom - if (elem.offsetParent === null) { - return false; - } - - return true; + return elem.offsetParent !== null; } // Determines if a focusable element can be focused at a given point in time diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 8682cdb9da..f5eab29b93 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -26,12 +26,8 @@ import { Events } from 'jellyfin-apiclient'; function canPlayNativeHls() { const media = document.createElement('video'); - if (media.canPlayType('application/x-mpegURL').replace(/no/, '') || - media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')) { - return true; - } - - return false; + return !!(media.canPlayType('application/x-mpegURL').replace(/no/, '') || + media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')); } export function enableHlsJsPlayer(runTimeTicks, mediaType) { @@ -123,11 +119,10 @@ import { Events } from 'jellyfin-apiclient'; } export function isValidDuration(duration) { - if (duration && !isNaN(duration) && duration !== Number.POSITIVE_INFINITY && duration !== Number.NEGATIVE_INFINITY) { - return true; - } - - return false; + return duration + && !isNaN(duration) + && duration !== Number.POSITIVE_INFINITY + && duration !== Number.NEGATIVE_INFINITY; } function setCurrentTimeIfNeeded(element, seconds) { diff --git a/src/components/indicators/indicators.js b/src/components/indicators/indicators.js index 6fc483c3fd..cd621c2fcc 100644 --- a/src/components/indicators/indicators.js +++ b/src/components/indicators/indicators.js @@ -5,15 +5,9 @@ import './indicators.scss'; import 'material-design-icons-iconfont'; export function enableProgressIndicator(item) { - if (item.MediaType === 'Video' && item.Type !== 'TvChannel') { - return true; - } - - if (item.Type === 'AudioBook' || item.Type === 'AudioPodcast') { - return true; - } - - return false; + return (item.MediaType === 'Video' && item.Type !== 'TvChannel') + || item.Type === 'AudioBook' + || item.Type === 'AudioPodcast'; } export function getProgressHtml(pct, options) { diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index 2a181d3424..0aa9919875 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -117,11 +117,7 @@ export function canEdit(user, item) { } export function isLocalItem(item) { - if (item && item.Id && typeof item.Id === 'string' && item.Id.indexOf('local') === 0) { - return true; - } - - return false; + return item && item.Id && typeof item.Id === 'string' && item.Id.indexOf('local') === 0; } export function canIdentify (user, item) { @@ -148,11 +144,7 @@ export function canEditImages (user, item) { } if (itemType === 'UserView') { - if (user.Policy.IsAdministrator) { - return true; - } - - return false; + return user.Policy.IsAdministrator; } if (item.Type === 'Recording' && item.Status !== 'Completed') { @@ -218,29 +210,21 @@ export function canMarkPlayed (item) { } } - if (item.Type === 'Series' || - item.Type === 'Season' || - item.Type === 'BoxSet' || - item.MediaType === 'Book' || - item.MediaType === 'Recording') { - return true; - } - - return false; + return item.Type === 'Series' + || item.Type === 'Season' + || item.Type === 'BoxSet' + || item.MediaType === 'Book' + || item.MediaType === 'Recording'; } export function canRate (item) { - if (item.Type === 'Program' + return item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'SeriesTimer' || item.Type === 'CollectionFolder' || item.Type === 'UserView' || item.Type === 'Channel' - || !item.UserData) { - return false; - } - - return true; + || !item.UserData; } export function canConvert (item, user) { @@ -271,11 +255,7 @@ export function canConvert (item, user) { return false; } - if (item.IsPlaceHolder) { - return false; - } - - return true; + return item.IsPlaceHolder; } export function canRefreshMetadata (item, user) { @@ -307,11 +287,8 @@ export function supportsMediaSourceSelection (item) { if (item.EnableMediaSourceDisplay === false) { return false; } - if (item.EnableMediaSourceDisplay == null && item.SourceType && item.SourceType !== 'Library') { - return false; - } - return true; + return item.EnableMediaSourceDisplay == null && item.SourceType && item.SourceType !== 'Library'; } export function sortTracks (trackA, trackB) { diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 4259354d81..8b8bc63921 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -19,11 +19,7 @@ function enableLocalPlaylistManagement(player) { return false; } - if (player.isLocalPlayer) { - return true; - } - - return false; + return player.isLocalPlayer; } function bindToFullscreenChange(player) { @@ -225,11 +221,7 @@ function getParam(name, url) { } function isAutomaticPlayer(player) { - if (player.isLocalPlayer) { - return true; - } - - return false; + return player.isLocalPlayer; } function getAutomaticPlayers(instance, forceLocalPlayer) { @@ -244,10 +236,7 @@ function getAutomaticPlayers(instance, forceLocalPlayer) { } function isServerItem(item) { - if (!item.Id) { - return false; - } - return true; + return !!item.Id; } function enableIntros(item) { @@ -3007,11 +2996,8 @@ class PlaybackManager { function enablePlaybackRetryWithTranscoding(streamInfo, errorType, currentlyPreventsVideoStreamCopy, currentlyPreventsAudioStreamCopy) { // mediadecodeerror, medianotsupported, network, servererror - if (streamInfo.mediaSource.SupportsTranscoding && (!currentlyPreventsVideoStreamCopy || !currentlyPreventsAudioStreamCopy)) { - return true; - } - - return false; + return streamInfo.mediaSource.SupportsTranscoding + && (!currentlyPreventsVideoStreamCopy || !currentlyPreventsAudioStreamCopy); } function onPlaybackError(e, error) { diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 53c09e37e5..72f5a69fb2 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -479,11 +479,7 @@ import layoutManager from './layoutManager'; * Returns true if smooth scroll must be used. */ function useSmoothScroll() { - if (browser.tizen) { - return true; - } - - return false; + return !!browser.tizen; } /** diff --git a/src/elements/emby-select/emby-select.js b/src/elements/emby-select/emby-select.js index e069687822..b576042821 100644 --- a/src/elements/emby-select/emby-select.js +++ b/src/elements/emby-select/emby-select.js @@ -23,11 +23,7 @@ import 'webcomponents.js/webcomponents-lite'; return true; } - if (layoutManager.tv) { - return false; - } - - return true; + return !layoutManager.tv; } function triggerChange(select) { diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index a4f49b8b6e..d0fcffa48a 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -339,11 +339,7 @@ export class BookPlayer { } canPlayItem(item) { - if (item.Path && item.Path.endsWith('epub')) { - return true; - } - - return false; + return item.Path && item.Path.endsWith('epub'); } } diff --git a/src/plugins/comicsPlayer/plugin.js b/src/plugins/comicsPlayer/plugin.js index 2d72abaa0b..d209069ad3 100644 --- a/src/plugins/comicsPlayer/plugin.js +++ b/src/plugins/comicsPlayer/plugin.js @@ -356,11 +356,7 @@ export class ComicsPlayer { } canPlayItem(item) { - if (item.Path && (item.Path.endsWith('cbz') || item.Path.endsWith('cbr'))) { - return true; - } - - return false; + return item.Path && (item.Path.endsWith('cbz') || item.Path.endsWith('cbr')); } } diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index 4d31e52cae..1873970e1b 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -41,13 +41,9 @@ function cancelFadeTimeout() { } function supportsFade() { - if (browser.tv) { - // Not working on tizen. - // We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive - return false; - } - - return true; + // Not working on tizen. + // We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive + return !browser.tv; } function requireHlsPlayer(callback) { diff --git a/src/plugins/pdfPlayer/plugin.js b/src/plugins/pdfPlayer/plugin.js index 5bdd5e0bdf..e1f59735d7 100644 --- a/src/plugins/pdfPlayer/plugin.js +++ b/src/plugins/pdfPlayer/plugin.js @@ -304,11 +304,7 @@ export class PdfPlayer { } canPlayItem(item) { - if (item.Path && item.Path.endsWith('pdf')) { - return true; - } - - return false; + return item.Path && item.Path.endsWith('pdf'); } } diff --git a/src/scripts/browser.js b/src/scripts/browser.js index 15e5cf6627..fe0601fc97 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -19,25 +19,14 @@ function isTv() { return true; } - if (isWeb0s()) { - return true; - } - - return false; + return isWeb0s(); } function isWeb0s() { const userAgent = navigator.userAgent.toLowerCase(); - if (userAgent.indexOf('netcast') !== -1) { - return true; - } - - if (userAgent.indexOf('web0s') !== -1) { - return true; - } - - return false; + return userAgent.indexOf('netcast') !== -1 + || userAgent.indexOf('web0s') !== -1; } function isMobile(userAgent) { @@ -84,11 +73,7 @@ function hasKeyboard(browser) { return true; } - if (browser.tv) { - return true; - } - - return false; + return !!browser.tv; } function iOSversion() { diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 4ea95a09da..f68faf4e40 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -53,12 +53,8 @@ import browser from './browser'; } const media = document.createElement('video'); - if (media.canPlayType('application/x-mpegURL').replace(/no/, '') || - media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')) { - return true; - } - - return false; + return !!(media.canPlayType('application/x-mpegURL').replace(/no/, '') || + media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')); } function canPlayHlsWithMSE() { @@ -159,11 +155,7 @@ import browser from './browser'; return true; } - if (browser.edgeUwp) { - return true; - } - - return false; + return !!browser.edgeUwp; } function testCanPlayAv1(videoTestElement) { diff --git a/src/scripts/gamepadtokey.js b/src/scripts/gamepadtokey.js index d7916f1fef..40e33a7caf 100644 --- a/src/scripts/gamepadtokey.js +++ b/src/scripts/gamepadtokey.js @@ -168,12 +168,7 @@ function throttle(key) { const time = times[key] || 0; const now = new Date().getTime(); - if ((now - time) >= 200) { - //times[key] = now; - return true; - } - - return false; + return (now - time) >= 200; } function resetThrottle(key) { @@ -187,11 +182,7 @@ function allowInput() { return false; } - if (appHost.getWindowState() === 'Minimized') { - return false; - } - - return true; + return appHost.getWindowState() !== 'Minimized'; } function raiseEvent(name, key, keyCode) { diff --git a/src/scripts/mouseManager.js b/src/scripts/mouseManager.js index b00850a022..b6ba2e3ca2 100644 --- a/src/scripts/mouseManager.js +++ b/src/scripts/mouseManager.js @@ -105,11 +105,7 @@ import dom from '../scripts/dom'; return false; } - if (browser.tv) { - return true; - } - - return false; + return !!browser.tv; } function onMouseInterval() { From 8f694d7d1cea38d4402e1150faf19207cb693c4e Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 6 Oct 2022 10:58:12 -0400 Subject: [PATCH 77/80] Fix inverted boolean returns --- src/components/apphost.js | 2 +- src/components/itemHelper.js | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/apphost.js b/src/components/apphost.js index b75ca6a18a..5276582154 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -166,7 +166,7 @@ function supportsHtmlMediaAutoplay() { return true; } - return !!browser.mobile; + return !browser.mobile; } function supportsCue() { diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index 0aa9919875..50c9975f2b 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -144,7 +144,7 @@ export function canEditImages (user, item) { } if (itemType === 'UserView') { - return user.Policy.IsAdministrator; + return !!user.Policy.IsAdministrator; } if (item.Type === 'Recording' && item.Status !== 'Completed') { @@ -218,13 +218,13 @@ export function canMarkPlayed (item) { } export function canRate (item) { - return item.Type === 'Program' - || item.Type === 'Timer' - || item.Type === 'SeriesTimer' - || item.Type === 'CollectionFolder' - || item.Type === 'UserView' - || item.Type === 'Channel' - || !item.UserData; + return item.Type !== 'Program' + && item.Type !== 'Timer' + && item.Type !== 'SeriesTimer' + && item.Type !== 'CollectionFolder' + && item.Type !== 'UserView' + && item.Type !== 'Channel' + && item.UserData; } export function canConvert (item, user) { @@ -255,7 +255,7 @@ export function canConvert (item, user) { return false; } - return item.IsPlaceHolder; + return !item.IsPlaceHolder; } export function canRefreshMetadata (item, user) { @@ -284,11 +284,11 @@ export function supportsMediaSourceSelection (item) { if (!item.MediaSources || (item.MediaSources.length === 1 && item.MediaSources[0].Type === 'Placeholder')) { return false; } - if (item.EnableMediaSourceDisplay === false) { + if (!item.EnableMediaSourceDisplay) { return false; } - return item.EnableMediaSourceDisplay == null && item.SourceType && item.SourceType !== 'Library'; + return !item.SourceType || item.SourceType === 'Library'; } export function sortTracks (trackA, trackB) { From 2ada649960cd5bf633ca08cfd2b214c15936f350 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 11 Oct 2022 01:17:21 -0400 Subject: [PATCH 78/80] Fix EnableMediaSourceDisplay logic --- src/components/itemHelper.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index 50c9975f2b..b051fc74c4 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -284,8 +284,9 @@ export function supportsMediaSourceSelection (item) { if (!item.MediaSources || (item.MediaSources.length === 1 && item.MediaSources[0].Type === 'Placeholder')) { return false; } - if (!item.EnableMediaSourceDisplay) { - return false; + + if (item.EnableMediaSourceDisplay != null) { + return !!item.EnableMediaSourceDisplay; } return !item.SourceType || item.SourceType === 'Library'; From 3e80a3288e09299c0ce05334cd6890fc312e1994 Mon Sep 17 00:00:00 2001 From: Ajan JaiRam N Date: Tue, 11 Oct 2022 12:24:56 +0000 Subject: [PATCH 79/80] Translated using Weblate (Tamil) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ta/ --- src/strings/ta.json | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/strings/ta.json b/src/strings/ta.json index 1432ff278e..20e085348d 100644 --- a/src/strings/ta.json +++ b/src/strings/ta.json @@ -429,9 +429,9 @@ "HeaderXmlSettings": "XML அமைப்புகள்", "HeaderXmlDocumentAttributes": "XML ஆவண பண்புக்கூறுகள்", "HeaderXmlDocumentAttribute": "XML ஆவணப் பண்புக்கூறு", - "HeaderVideos": "வீடியோக்கள்", - "HeaderVideoTypes": "வீடியோ வகைகள்", - "HeaderVideoType": "வீடியோ வகை", + "HeaderVideos": "காணொளிகள்", + "HeaderVideoTypes": "காணொளி வகைகள்", + "HeaderVideoType": "காணொளி வகை", "HeaderVideoQuality": "வீடியோ தரம்", "HeaderUsers": "பயனர்கள்", "HeaderUser": "பயனர்", @@ -604,7 +604,7 @@ "LabelMinScreenshotDownloadWidth": "குறைந்தபட்ச ஸ்கிரீன்ஷாட் பதிவிறக்க அகலம்:", "LabelMinResumePercentageHelp": "இந்த நேரத்திற்கு முன் நிறுத்தப்பட்டால் தலைப்புகள் காட்டப்படாது என்று கருதப்படுகிறது.", "LabelMinResumePercentage": "குறைந்தபட்ச மறுதொடக்கம் சதவீதம்:", - "LabelMinResumeDurationHelp": "பின்னணி இருப்பிடத்தைச் சேமிக்கும் மற்றும் மீண்டும் தொடங்க அனுமதிக்கும் வினாடிகளில் மிகக் குறுகிய வீடியோ நீளம்.", + "LabelMinResumeDurationHelp": "பின்னணி இருப்பிடத்தைச் சேமிக்கும் மற்றும் மீண்டும் தொடங்க அனுமதிக்கும் வினாடிகளில் மிகக் குறுகிய காணொளி நீளம்.", "LabelMinResumeDuration": "குறைந்தபட்ச மறுதொடக்கம் காலம்:", "LabelMinBackdropDownloadWidth": "குறைந்தபட்ச பின்னணி பதிவிறக்க அகலம்:", "LabelMethod": "முறை:", @@ -670,7 +670,7 @@ "LabelHardwareAccelerationType": "வன்பொருள் முடுக்கம்:", "LabelEncoderPreset": "குறியீட்டு முன்னமைவு:", "LabelH264Crf": "H.264 குறியாக்கம் CRF:", - "LabelGroupMoviesIntoCollectionsHelp": "திரைப்படங்களின் பட்டியல் காட்சியைத் தேர்வுசெய்தால், பெட்டித் தொகுப்புகள் குழுவாக்கப்பட்ட திரைப்படங்களுடன் உருப்படிகளாகக் காட்டப்படும்.", + "LabelGroupMoviesIntoCollectionsHelp": "திரைப்படப் பட்டியல்களைக் காண்பிக்கும் போது தொகுப்பில் உள்ள திரைப்படங்கள் ஒரு குழுவாகக் காட்டப்படும்.", "LabelGroupMoviesIntoCollections": "திரைப்படங்களை தொகுப்பாக குழு செய்யவும்", "LabelServerNameHelp": "சேவையகத்தை அடையாளம் காண இந்த பெயர் பயன்படுத்தப்படும் மற்றும் சேவையகத்தின் ஹோஸ்ட்பெயருக்கு இயல்புநிலையாக இருக்கும்.", "LabelFriendlyName": "நட்பு பெயர்:", @@ -681,7 +681,7 @@ "LabelFinish": "முடி", "LabelFileOrUrl": "கோப்பு அல்லது URL:", "LabelFailed": "தோல்வி", - "LabelExtractChaptersDuringLibraryScanHelp": "நூலக ஸ்கேன் போது வீடியோக்கள் இறக்குமதி செய்யப்படும்போது அத்தியாய படங்களை உருவாக்கவும். இல்லையெனில், வழக்கமான பட ஸ்கேன் வேகமாக முடிக்க அனுமதிக்கும் அத்தியாயப் படங்கள் திட்டமிடப்பட்ட பணியின் போது அவை பிரித்தெடுக்கப்படும்.", + "LabelExtractChaptersDuringLibraryScanHelp": "நூலக ஸ்கேன் போது காணொளிகள் இறக்குமதி செய்யப்படும்போது அத்தியாய படங்களை உருவாக்கவும். இல்லையெனில், வழக்கமான பட ஸ்கேன் வேகமாக முடிக்க அனுமதிக்கும் அத்தியாயப் படங்கள் திட்டமிடப்பட்ட பணியின் போது அவை பிரித்தெடுக்கப்படும்.", "LabelExtractChaptersDuringLibraryScan": "நூலக ஸ்கேன் போது அத்தியாய படங்களை பிரித்தெடுக்கவும்", "LabelBaseUrlHelp": "சேவையக URL இல் தனிப்பயன் துணை அடைவைச் சேர்க்கவும். உதாரணத்திற்கு: http://example.com/<baseurl>", "LabelBaseUrl": "அடிப்படை URL:", @@ -807,7 +807,7 @@ "LabelSonyAggregationFlags": "Sony திரட்டல் கொடிகள்:", "LabelSkipIfGraphicalSubsPresentHelp": "வசன வரிகள் உரை பதிப்புகளை வைத்திருப்பது மிகவும் திறமையான விநியோகத்திற்கு வழிவகுக்கும் மற்றும் வீடியோ டிரான்ஸ்கோடிங்கின் சாத்தியத்தை குறைக்கும்.", "LabelSkipIfGraphicalSubsPresent": "வீடியோவில் ஏற்கனவே உட்பொதிக்கப்பட்ட வசன வரிகள் இருந்தால் தவிர்க்கவும்", - "LabelSkipIfAudioTrackPresentHelp": "ஆடியோ மொழியைப் பொருட்படுத்தாமல் எல்லா வீடியோக்களுக்கும் வசன வரிகள் இருப்பதை உறுதிப்படுத்த இதைத் தேர்வுநீக்கவும்.", + "LabelSkipIfAudioTrackPresentHelp": "ஆடியோ மொழியைப் பொருட்படுத்தாமல் எல்லா காணொளிகளுக்கும் வசன வரிகள் இருப்பதை உறுதிப்படுத்த இதைத் தேர்வுநீக்கவும்.", "LabelSkipIfAudioTrackPresent": "இயல்புநிலை ஆடியோ டிராக் பதிவிறக்க மொழியுடன் பொருந்தினால் தவிர்க்கவும்", "LabelSkipForwardLength": "முன்னோக்கி நீளத்தைத் தவிர்:", "LabelSkipBackLength": "பின் நீளத்தைத் தவிர்:", @@ -833,7 +833,7 @@ "LabelRuntimeMinutes": "இயக்க நேரம்:", "LabelRequireHttpsHelp": "சரிபார்க்கப்பட்டால், சேவையகம் தானாகவே HTTP வழியாக அனைத்து கோரிக்கைகளையும் HTTPS க்கு திருப்பிவிடும். HTTPS இல் சேவையகம் கேட்கவில்லை என்றால் இது எந்த விளைவையும் ஏற்படுத்தாது.", "LabelRequireHttps": "HTTPS தேவை", - "LabelRemoteClientBitrateLimitHelp": "நெட்வொர்க் சாதனங்களுக்கு வெளியே ஒரு விருப்பமான ஸ்ட்ரீம் பிட்ரேட் வரம்பு. உங்கள் இணைய இணைப்பு கையாளக்கூடியதை விட சாதனங்களை அதிக பிட்ரேட்டைக் கோருவதைத் தடுக்க இது பயனுள்ளதாக இருக்கும். பறக்கும்போது வீடியோக்களை குறைந்த பிட்ரேட்டுக்கு டிரான்ஸ்கோட் செய்வதற்காக இது உங்கள் சேவையகத்தில் CPU சுமை அதிகரிக்கும்.", + "LabelRemoteClientBitrateLimitHelp": "நெட்வொர்க் சாதனங்களுக்கு வெளியே ஒரு விருப்பமான ஸ்ட்ரீம் பிட்ரேட் வரம்பு. உங்கள் இணைய இணைப்பு கையாளக்கூடியதை விட சாதனங்களை அதிக பிட்ரேட்டைக் கோருவதைத் தடுக்க இது பயனுள்ளதாக இருக்கும். பறக்கும்போது காணொளிகளை குறைந்த பிட்ரேட்டுக்கு டிரான்ஸ்கோட் செய்வதற்காக இது உங்கள் சேவையகத்தில் CPU சுமை அதிகரிக்கும்.", "LabelRemoteClientBitrateLimit": "இணைய ஸ்ட்ரீமிங் பிட்ரேட் வரம்பு (Mbps):", "LabelReleaseDate": "வெளிவரும் தேதி:", "LabelRefreshMode": "புதுப்பிப்பு பயன்முறை:", @@ -848,7 +848,7 @@ "LabelProtocolInfoHelp": "சாதனத்திலிருந்து GetProtocolInfo கோரிக்கைகளுக்கு பதிலளிக்கும் போது பயன்படுத்தப்படும் மதிப்பு.", "LabelProtocolInfo": "நெறிமுறை தகவல்:", "LabelProtocol": "நெறிமுறை:", - "LabelProfileVideoCodecs": "வீடியோ கோடெக்குகள்:", + "LabelProfileVideoCodecs": "காணொளி கோடெக்குகள்:", "LabelProfileContainersHelp": "கமாவால் பிரிக்கப்பட்டது. எல்லா கொள்கலன்களுக்கும் விண்ணப்பிக்க இதை காலியாக விடலாம்.", "LabelProfileContainer": "கொள்கலன்:", "LabelProfileCodecsHelp": "கமாவால் பிரிக்கப்பட்டது. எல்லா கோடெக்குகளுக்கும் விண்ணப்பிக்க இதை காலியாக விடலாம்.", @@ -1665,5 +1665,28 @@ "EnableRewatchingNextUp": "அடுத்ததில் மீண்டும் பார்ப்பதை இயக்கவும்", "Digital": "டிஜிட்டல்", "EnableEnhancedNvdecDecoderHelp": "சோதனை NVDEC செயல்படுத்தல், டிகோடிங் பிழைகளை நீங்கள் சந்திக்கும் வரை இந்த விருப்பத்தை இயக்க வேண்டாம்.", - "HomeVideosPhotos": "முகப்பு வீடியோக்கள் மற்றும் புகைப்படங்கள்" + "HomeVideosPhotos": "முகப்பு காணொளிகள் மற்றும் புகைப்படங்கள்", + "LabelMaxVideoResolution": "அனுமதிக்கப்பட்ட அதிகபட்ச காணொளி டிரான்ஸ்கோடிங் தெளிவுத்திறன்", + "IgnoreDtsHelp": "இந்த விருப்பத்தை முடக்குவது சில சிக்கல்களை தீர்க்கலாம், எ.கா. தனி ஆடியோ மற்றும் காணொளி ஸ்ட்ரீம்கள் கொண்ட சேனல்களில் ஆடியோ இருக்காது.", + "MediaInfoDvProfile": "DV விவரம்", + "MediaInfoDvLevel": "DV நிலை", + "MediaInfoDvVersionMinor": "சிறிய DV பதிப்பு", + "MediaInfoDvVersionMajor": "முக்கிய DV பதிப்பு", + "MediaInfoDoViTitle": "DV தலைப்பு", + "MediaInfoVideoRangeType": "வீடியோ வரம்பு வகை", + "LabelVideoRangeType": "வீடியோ வரம்பு வகை:", + "VideoRangeTypeNotSupported": "வீடியோவின் வரம்பு வகை ஆதரிக்கப்படவில்லை", + "LabelVppTonemappingContrastHelp": "VPP tone மேப்பிங்கில் கான்ட்ராஸ்ட் ஆதாயத்தைப் பயன்படுத்தவும். பரிந்துரைக்கப்பட்ட மற்றும் இயல்புநிலை மதிப்புகள் 1.2 மற்றும் 1 ஆகும்.", + "LabelVppTonemappingBrightnessHelp": "VPP tone மேப்பிங்கில் பிரகாச ஆதாயத்தைப் பயன்படுத்தவும். பரிந்துரைக்கப்பட்ட மற்றும் இயல்புநிலை மதிப்புகள் இரண்டும் 0 ஆகும்.", + "EnableSplashScreen": "ஸ்பிளாஸ் திரையை இயக்கவும்", + "ScreenResolution": "திரை அளவு", + "RememberSubtitleSelectionsHelp": "சப்டைட்டில் டிராக்கை கடைசி வீடியோவுக்கு மிக நெருக்கமான பொருத்தமாக அமைக்க முயற்சிக்கவும்.", + "RememberSubtitleSelections": "முந்தைய உருப்படியின் அடிப்படையில் வசன வரிகளை அமைக்கவும்", + "RememberAudioSelectionsHelp": "கடைசி வீடியோவுக்கு மிக நெருக்கமான பொருத்தத்திற்கு ஆடியோ டிராக்கை அமைக்க முயற்சிக்கவும்.", + "RememberAudioSelections": "முந்தைய உருப்படியின் அடிப்படையில் ஆடியோ டிராக்கை அமைக்கவும்", + "OptionDateShowAdded": "நிகழ்ச்சி சேர்க்கப்பட்ட தேதி", + "OptionDateEpisodeAdded": "அத்தியாயம் சேர்க்கப்பட்ட தேதி", + "Bold": "தடி", + "LabelTextWeight": "உரையின் எடை:", + "IgnoreDts": "DTS புறக்கணிக்கவும்" } From 75993c8aea9c5020830311af10ade5b1c06321b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 21:00:20 +0000 Subject: [PATCH 80/80] Bump @xmldom/xmldom and epubjs Removes [@xmldom/xmldom](https://github.com/xmldom/xmldom). It's no longer used after updating ancestor dependency [epubjs](https://github.com/futurepress/epub.js). These dependencies need to be updated together. Removes `@xmldom/xmldom` Updates `epubjs` from 0.3.93 to 0.4.2 - [Release notes](https://github.com/futurepress/epub.js/releases) - [Commits](https://github.com/futurepress/epub.js/commits) --- updated-dependencies: - dependency-name: "@xmldom/xmldom" dependency-type: indirect - dependency-name: epubjs dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 136 +++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 52 insertions(+), 86 deletions(-) diff --git a/package-lock.json b/package-lock.json index a25c108eb7..7a7577bf6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "core-js": "3.25.5", "date-fns": "2.29.3", "dompurify": "2.4.0", - "epubjs": "0.3.93", + "epubjs": "0.4.2", "escape-html": "1.0.3", "fast-text-encoding": "1.0.6", "flv.js": "1.6.2", @@ -2782,15 +2782,6 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "node_modules/@types/localforage": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.34.tgz", - "integrity": "sha1-XjHDLdh5HsS5/z70fJy1Wy0NlDg=", - "deprecated": "This is a stub types definition for localforage (https://github.com/localForage/localForage). localforage provides its own type definitions, so you don't need @types/localforage installed!", - "dependencies": { - "localforage": "*" - } - }, "node_modules/@types/lodash": { "version": "4.14.178", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", @@ -3411,14 +3402,6 @@ } } }, - "node_modules/@xmldom/xmldom": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz", - "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5843,19 +5826,17 @@ } }, "node_modules/epubjs": { - "version": "0.3.93", - "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.3.93.tgz", - "integrity": "sha512-c06pNSdBxcXv3dZSbXAVLE1/pmleRhOT6mXNZo6INKmvuKpYB65MwU/lO7830czCtjIiK9i+KR+3S+p0wtljrw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.4.2.tgz", + "integrity": "sha512-ex+ntja2AmPeq++qgjYfwrEzrO8UUBbTch1RJcRftShUmn8no6qi4Cax75FH0QopLA+6L8HM6iR94M0/I8V3GQ==", "dependencies": { - "@types/localforage": "0.0.34", - "@xmldom/xmldom": "^0.7.5", - "core-js": "^3.18.3", "event-emitter": "^0.3.5", - "jszip": "^3.7.1", - "localforage": "^1.10.0", - "lodash": "^4.17.21", - "marks-pane": "^1.0.9", - "path-webpack": "0.0.3" + "jszip": "^3.1.5", + "lodash": "^4.17.5", + "marks-pane": "^1.0.7", + "path-webpack": "0.0.3", + "stream-browserify": "^2.0.1", + "xmldom": "^0.1.27" } }, "node_modules/error-ex": { @@ -9381,14 +9362,6 @@ "resolved": "https://registry.npmjs.org/libarchive.js/-/libarchive.js-1.3.0.tgz", "integrity": "sha512-EkQfRXt9DhWwj6BnEA2TNpOf4jTnzSTUPGgE+iFxcdNqjktY8GitbDeHnx8qZA0/IukNyyBUR3oQKRdYkO+HFg==" }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/lilconfig": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", @@ -9427,14 +9400,6 @@ "node": ">=8.9.0" } }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dependencies": { - "lie": "3.1.1" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -13972,6 +13937,15 @@ "node": ">= 0.6" } }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -18494,6 +18468,15 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", "dev": true }, + "node_modules/xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", + "engines": { + "node": ">=0.1" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -20401,14 +20384,6 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "@types/localforage": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.34.tgz", - "integrity": "sha1-XjHDLdh5HsS5/z70fJy1Wy0NlDg=", - "requires": { - "localforage": "*" - } - }, "@types/lodash": { "version": "4.14.178", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", @@ -20908,11 +20883,6 @@ "dev": true, "requires": {} }, - "@xmldom/xmldom": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz", - "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==" - }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -22700,19 +22670,17 @@ "dev": true }, "epubjs": { - "version": "0.3.93", - "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.3.93.tgz", - "integrity": "sha512-c06pNSdBxcXv3dZSbXAVLE1/pmleRhOT6mXNZo6INKmvuKpYB65MwU/lO7830czCtjIiK9i+KR+3S+p0wtljrw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.4.2.tgz", + "integrity": "sha512-ex+ntja2AmPeq++qgjYfwrEzrO8UUBbTch1RJcRftShUmn8no6qi4Cax75FH0QopLA+6L8HM6iR94M0/I8V3GQ==", "requires": { - "@types/localforage": "0.0.34", - "@xmldom/xmldom": "^0.7.5", - "core-js": "^3.18.3", "event-emitter": "^0.3.5", - "jszip": "^3.7.1", - "localforage": "^1.10.0", - "lodash": "^4.17.21", - "marks-pane": "^1.0.9", - "path-webpack": "0.0.3" + "jszip": "^3.1.5", + "lodash": "^4.17.5", + "marks-pane": "^1.0.7", + "path-webpack": "0.0.3", + "stream-browserify": "^2.0.1", + "xmldom": "^0.1.27" } }, "error-ex": { @@ -25352,14 +25320,6 @@ "resolved": "https://registry.npmjs.org/libarchive.js/-/libarchive.js-1.3.0.tgz", "integrity": "sha512-EkQfRXt9DhWwj6BnEA2TNpOf4jTnzSTUPGgE+iFxcdNqjktY8GitbDeHnx8qZA0/IukNyyBUR3oQKRdYkO+HFg==" }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "requires": { - "immediate": "~3.0.5" - } - }, "lilconfig": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", @@ -25389,14 +25349,6 @@ "json5": "^2.1.2" } }, - "localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "requires": { - "lie": "3.1.1" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -28708,6 +28660,15 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -32221,6 +32182,11 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", "dev": true }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 3df9178ff6..e575ef961c 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "core-js": "3.25.5", "date-fns": "2.29.3", "dompurify": "2.4.0", - "epubjs": "0.3.93", + "epubjs": "0.4.2", "escape-html": "1.0.3", "fast-text-encoding": "1.0.6", "flv.js": "1.6.2",