';
html += '' + globalize.translate('ValueCodec', profile.Codec || allText) + '
';
- if (profile.Conditions && profile.Conditions.length) {
+ if (profile.Conditions?.length) {
html += '';
html += globalize.translate('ValueConditions', profile.Conditions.map(function (c) {
return c.Property;
@@ -567,7 +567,7 @@ function renderResponseProfiles(page, profiles) {
}
}
- if (profile.Conditions && profile.Conditions.length) {
+ if (profile.Conditions?.length) {
html += '
';
html += globalize.translate('ValueConditions', profile.Conditions.map(function (c) {
return c.Property;
diff --git a/src/controllers/dashboard/library.js b/src/controllers/dashboard/library.js
index f9d80fa3fc..08203b76f6 100644
--- a/src/controllers/dashboard/library.js
+++ b/src/controllers/dashboard/library.js
@@ -13,8 +13,8 @@ import confirm from '../../components/confirm/confirm';
import cardBuilder from '../../components/cardbuilder/cardBuilder';
function addVirtualFolder(page) {
- import('../../components/mediaLibraryCreator/mediaLibraryCreator').then(({ default: medialibrarycreator }) => {
- new medialibrarycreator({
+ import('../../components/mediaLibraryCreator/mediaLibraryCreator').then(({ default: MediaLibraryCreator }) => {
+ new MediaLibraryCreator({
collectionTypeOptions: getCollectionTypeOptions().filter(function (f) {
return !f.hidden;
}),
@@ -28,8 +28,8 @@ function addVirtualFolder(page) {
}
function editVirtualFolder(page, virtualFolder) {
- import('../../components/mediaLibraryEditor/mediaLibraryEditor').then(({ default: medialibraryeditor }) => {
- new medialibraryeditor({
+ import('../../components/mediaLibraryEditor/mediaLibraryEditor').then(({ default: MediaLibraryEditor }) => {
+ new MediaLibraryEditor({
refresh: shouldRefreshLibraryAfterChanges(page),
library: virtualFolder
}).then(function (hasChanges) {
@@ -62,8 +62,8 @@ function deleteVirtualFolder(page, virtualFolder) {
}
function refreshVirtualFolder(page, virtualFolder) {
- import('../../components/refreshdialog/refreshdialog').then(({ default: refreshDialog }) => {
- new refreshDialog({
+ import('../../components/refreshdialog/refreshdialog').then(({ default: RefreshDialog }) => {
+ new RefreshDialog({
itemIds: [virtualFolder.ItemId],
serverId: ApiClient.serverId(),
mode: 'scan'
diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtask.js b/src/controllers/dashboard/scheduledtasks/scheduledtask.js
index 5abb615001..215948205f 100644
--- a/src/controllers/dashboard/scheduledtasks/scheduledtask.js
+++ b/src/controllers/dashboard/scheduledtasks/scheduledtask.js
@@ -24,12 +24,6 @@ function fillTimeOfDay(select) {
}).join('');
}
-Array.prototype.remove = function (from, to) {
- const rest = this.slice((to || from) + 1 || this.length);
- this.length = from < 0 ? this.length + from : from;
- return this.push.apply(this, rest);
-};
-
const ScheduledTaskPage = {
refreshScheduledTask: function (view) {
loading.show();
@@ -143,7 +137,7 @@ const ScheduledTaskPage = {
loading.show();
const id = getParameterByName('id');
ApiClient.getScheduledTask(id).then(function (task) {
- task.Triggers.remove(index);
+ task.Triggers.splice(index, 1);
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
ScheduledTaskPage.refreshScheduledTask(view);
});
diff --git a/src/controllers/home.js b/src/controllers/home.js
index 657d406f67..e85d4eb83a 100644
--- a/src/controllers/home.js
+++ b/src/controllers/home.js
@@ -49,11 +49,11 @@ class HomeView extends TabbedView {
}
const instance = this;
- return import(/* webpackChunkName: "[request]" */ `../controllers/${depends}`).then(({ default: controllerFactory }) => {
+ return import(/* webpackChunkName: "[request]" */ `../controllers/${depends}`).then(({ default: ControllerFactory }) => {
let controller = instance.tabControllers[index];
if (!controller) {
- controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
+ controller = new ControllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
instance.tabControllers[index] = controller;
}
diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js
index 68d431b0c4..37f5d3108a 100644
--- a/src/controllers/itemDetails/index.js
+++ b/src/controllers/itemDetails/index.js
@@ -406,7 +406,7 @@ function renderName(item, container, context) {
if (item.AlbumArtists) {
parentNameHtml.push(getArtistLinksHtml(item.AlbumArtists, item.ServerId, context));
parentNameLast = true;
- } else if (item.ArtistItems && item.ArtistItems.length && item.Type === 'MusicVideo') {
+ } else if (item.ArtistItems?.length && item.Type === 'MusicVideo') {
parentNameHtml.push(getArtistLinksHtml(item.ArtistItems, item.ServerId, context));
parentNameLast = true;
} else if (item.SeriesName && item.Type === 'Episode') {
@@ -475,7 +475,7 @@ function renderName(item, container, context) {
}
function setTrailerButtonVisibility(page, item) {
- if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && playbackManager.getSupportedCommands().indexOf('PlayTrailers') !== -1) {
+ if ((item.LocalTrailerCount || item.RemoteTrailers?.length) && playbackManager.getSupportedCommands().indexOf('PlayTrailers') !== -1) {
hideAll(page, 'btnPlayTrailer', true);
} else {
hideAll(page, 'btnPlayTrailer');
@@ -505,7 +505,7 @@ function renderDetailPageBackdrop(page, item, apiClient) {
let hasbackdrop = false;
const itemBackdropElement = page.querySelector('#itemBackdrop');
- if (item.BackdropImageTags && item.BackdropImageTags.length) {
+ if (item.BackdropImageTags?.length) {
imgUrl = apiClient.getScaledImageUrl(item.Id, {
type: 'Backdrop',
maxWidth: dom.getScreenWidth(),
@@ -523,7 +523,7 @@ function renderDetailPageBackdrop(page, item, apiClient) {
});
imageLoader.lazyImage(itemBackdropElement, imgUrl);
hasbackdrop = true;
- } else if (item.ImageTags && item.ImageTags.Primary) {
+ } else if (item.ImageTags?.Primary) {
imgUrl = apiClient.getScaledImageUrl(item.Id, {
type: 'Primary',
maxWidth: dom.getScreenWidth(),
@@ -660,7 +660,7 @@ function logoImageUrl(item, apiClient, options) {
options = options || {};
options.type = 'Logo';
- if (item.ImageTags && item.ImageTags.Logo) {
+ if (item.ImageTags?.Logo) {
options.tag = item.ImageTags.Logo;
return apiClient.getScaledImageUrl(item.Id, options);
}
@@ -691,8 +691,8 @@ function showRecordingFields(instance, page, item, user) {
const recordingFieldsElement = page.querySelector('.recordingFields');
if (item.Type == 'Program' && user.Policy.EnableLiveTvManagement) {
- import('../../components/recordingcreator/recordingfields').then(({ default: recordingFields }) => {
- instance.currentRecordingFields = new recordingFields({
+ import('../../components/recordingcreator/recordingfields').then(({ default: RecordingFields }) => {
+ instance.currentRecordingFields = new RecordingFields({
parent: recordingFieldsElement,
programId: item.Id,
serverId: item.ServerId
@@ -1054,7 +1054,7 @@ function renderMiscInfo(page, item) {
function renderTagline(page, item) {
const taglineElement = page.querySelector('.tagline');
- if (item.Taglines && item.Taglines.length) {
+ if (item.Taglines?.length) {
taglineElement.classList.remove('hide');
taglineElement.innerHTML = '' + escapeHtml(item.Taglines[0]) + '';
} else {
@@ -1263,7 +1263,7 @@ function renderSeriesAirTime(page, item) {
return;
}
let html = '';
- if (item.AirDays && item.AirDays.length) {
+ if (item.AirDays?.length) {
if (item.AirDays.length == 7) {
html += 'daily';
} else {
@@ -1826,7 +1826,7 @@ function renderCast(page, item) {
});
}
-function itemDetailPage() {
+function ItemDetailPage() {
const self = this;
self.setInitialCollapsibleState = setInitialCollapsibleState;
self.renderDetails = renderDetails;
@@ -1846,7 +1846,7 @@ function onTrackSelectionsSubmit(e) {
return false;
}
-window.ItemDetailPage = new itemDetailPage();
+window.ItemDetailPage = new ItemDetailPage();
export default function (view, params) {
function getApiClient() {
diff --git a/src/controllers/list.js b/src/controllers/list.js
index 62ef3c12cb..0378a1025c 100644
--- a/src/controllers/list.js
+++ b/src/controllers/list.js
@@ -399,8 +399,8 @@ function showSortMenu() {
function onNewItemClick() {
const instance = this;
- import('../components/playlisteditor/playlisteditor').then(({ default: playlistEditor }) => {
- new playlistEditor({
+ import('../components/playlisteditor/playlisteditor').then(({ default: PlaylistEditor }) => {
+ new PlaylistEditor({
items: [],
serverId: instance.params.serverId
});
diff --git a/src/controllers/livetv/livetvguide.js b/src/controllers/livetv/livetvguide.js
index c56d4ebd04..2d109b6bef 100644
--- a/src/controllers/livetv/livetvguide.js
+++ b/src/controllers/livetv/livetvguide.js
@@ -1,4 +1,4 @@
-import tvguide from '../../components/guide/guide';
+import Guide from '../../components/guide/guide';
export default function (view, params, tabContent) {
let guideInstance;
@@ -6,7 +6,7 @@ export default function (view, params, tabContent) {
self.renderTab = function () {
if (!guideInstance) {
- guideInstance = new tvguide({
+ guideInstance = new Guide({
element: tabContent,
serverId: ApiClient.serverId()
});
diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js
index eb604b2d29..d8325f7a2b 100644
--- a/src/controllers/livetv/livetvsuggested.js
+++ b/src/controllers/livetv/livetvsuggested.js
@@ -229,7 +229,7 @@ export default function (view, params) {
function onTabChange(evt) {
const previousTabController = tabControllers[parseInt(evt.detail.previousIndex, 10)];
- if (previousTabController && previousTabController.onHide) {
+ if (previousTabController?.onHide) {
previousTabController.onHide();
}
@@ -274,7 +274,7 @@ export default function (view, params) {
break;
}
- import(`../livetv/${depends}`).then(({ default: controllerFactory }) => {
+ import(`../livetv/${depends}`).then(({ default: ControllerFactory }) => {
let tabContent;
if (index === 0) {
@@ -290,7 +290,7 @@ export default function (view, params) {
if (index === 0) {
controller = self;
} else {
- controller = new controllerFactory(view, params, tabContent);
+ controller = new ControllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
@@ -388,7 +388,7 @@ export default function (view, params) {
inputManager.on(window, onInputCommand);
});
view.addEventListener('viewbeforehide', function () {
- if (currentTabController && currentTabController.onHide) {
+ if (currentTabController?.onHide) {
currentTabController.onHide();
}
diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js
index fbc77cc7b6..7a133945f2 100644
--- a/src/controllers/livetvguideprovider.js
+++ b/src/controllers/livetvguideprovider.js
@@ -9,8 +9,8 @@ function onListingsSubmitted() {
}
function init(page, type, providerId) {
- import(`../components/tvproviders/${type}`).then(({ default: factory }) => {
- const instance = new factory(page, providerId, {});
+ import(`../components/tvproviders/${type}`).then(({ default: ProviderFactory }) => {
+ const instance = new ProviderFactory(page, providerId, {});
Events.on(instance, 'submitted', onListingsSubmitted);
instance.init();
});
diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js
index 5eb13c9793..3c0e304939 100644
--- a/src/controllers/livetvstatus.js
+++ b/src/controllers/livetvstatus.js
@@ -165,8 +165,8 @@ function showProviderOptions(page, providerId, button) {
}
function mapChannels(page, providerId) {
- import('../components/channelMapper/channelMapper').then(({ default: channelMapper }) => {
- new channelMapper({
+ import('../components/channelMapper/channelMapper').then(({ default: ChannelMapper }) => {
+ new ChannelMapper({
serverId: ApiClient.serverInfo().Id,
providerId: providerId
}).show();
diff --git a/src/controllers/livetvtuner.js b/src/controllers/livetvtuner.js
index b15eea9d8a..7f6ec20270 100644
--- a/src/controllers/livetvtuner.js
+++ b/src/controllers/livetvtuner.js
@@ -106,8 +106,8 @@ function submitForm(page) {
}
function getDetectedDevice() {
- return import('../components/tunerPicker').then(({ default: tunerPicker }) => {
- return new tunerPicker().show({
+ return import('../components/tunerPicker').then(({ default: TunerPicker }) => {
+ return new TunerPicker().show({
serverId: ApiClient.serverId()
});
});
diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js
index 6ec5243715..0d89706cf8 100644
--- a/src/controllers/movies/movies.js
+++ b/src/controllers/movies/movies.js
@@ -289,8 +289,8 @@ export default function (view, params, tabContent, options) {
query = userSettings.loadQuerySettings(savedQueryKey, query);
this.showFilterMenu = function () {
- import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => {
- const filterDialog = new filterDialogFactory({
+ import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => {
+ const filterDialog = new FilterDialog({
query: query,
mode: 'movies',
serverId: ApiClient.serverId()
diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js
index 2d6aa223cb..1dc60c30e1 100644
--- a/src/controllers/movies/moviesrecommended.js
+++ b/src/controllers/movies/moviesrecommended.js
@@ -314,7 +314,7 @@ export default function (view, params) {
break;
}
- import(`../movies/${depends}`).then(({ default: controllerFactory }) => {
+ import(`../movies/${depends}`).then(({ default: ControllerFactory }) => {
let tabContent;
if (index === suggestionsTabIndex) {
@@ -330,11 +330,11 @@ export default function (view, params) {
if (index === suggestionsTabIndex) {
controller = this;
} else if (index == 0 || index == 3) {
- controller = new controllerFactory(view, params, tabContent, {
+ controller = new ControllerFactory(view, params, tabContent, {
mode: index ? 'favorites' : 'movies'
});
} else {
- controller = new controllerFactory(view, params, tabContent);
+ controller = new ControllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js
index a96d7e51aa..81f9f8b149 100644
--- a/src/controllers/movies/movietrailers.js
+++ b/src/controllers/movies/movietrailers.js
@@ -182,8 +182,8 @@ export default function (view, params, tabContent) {
let isLoading = false;
this.showFilterMenu = function () {
- import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => {
- const filterDialog = new filterDialogFactory({
+ import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => {
+ const filterDialog = new FilterDialog({
query: getQuery(),
mode: 'movies',
serverId: ApiClient.serverId()
diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js
index 04ea17a983..6c0c45a0f0 100644
--- a/src/controllers/music/musicalbums.js
+++ b/src/controllers/music/musicalbums.js
@@ -189,8 +189,8 @@ export default function (view, params, tabContent) {
let isLoading = false;
this.showFilterMenu = function () {
- import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => {
- const filterDialog = new filterDialogFactory({
+ import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => {
+ const filterDialog = new FilterDialog({
query: getQuery(),
mode: 'albums',
serverId: ApiClient.serverId()
diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js
index 084f092db3..4126086ade 100644
--- a/src/controllers/music/musicartists.js
+++ b/src/controllers/music/musicartists.js
@@ -170,8 +170,8 @@ export default function (view, params, tabContent) {
let isLoading = false;
this.showFilterMenu = function () {
- import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => {
- const filterDialog = new filterDialogFactory({
+ import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => {
+ const filterDialog = new FilterDialog({
query: getQuery(tabContent),
mode: this.mode,
serverId: ApiClient.serverId()
diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js
index 3599ecedc8..dc32aca6f6 100644
--- a/src/controllers/music/musicrecommended.js
+++ b/src/controllers/music/musicrecommended.js
@@ -290,7 +290,7 @@ export default function (view, params) {
break;
}
- import(`../music/${depends}`).then(({ default: controllerFactory }) => {
+ import(`../music/${depends}`).then(({ default: ControllerFactory }) => {
let tabContent;
if (index == 1) {
@@ -306,7 +306,7 @@ export default function (view, params) {
if (index === 1) {
controller = this;
} else {
- controller = new controllerFactory(view, params, tabContent);
+ controller = new ControllerFactory(view, params, tabContent);
}
if (index == 2) {
diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js
index 06af0b3081..5e5337d032 100644
--- a/src/controllers/music/songs.js
+++ b/src/controllers/music/songs.js
@@ -135,8 +135,8 @@ export default function (view, params, tabContent) {
let isLoading = false;
self.showFilterMenu = function () {
- import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => {
- const filterDialog = new filterDialogFactory({
+ import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => {
+ const filterDialog = new FilterDialog({
query: getQuery(tabContent),
mode: 'songs',
serverId: ApiClient.serverId()
diff --git a/src/controllers/playback/queue/index.js b/src/controllers/playback/queue/index.js
index cf39aa145b..602135a794 100644
--- a/src/controllers/playback/queue/index.js
+++ b/src/controllers/playback/queue/index.js
@@ -1,9 +1,9 @@
-import remotecontrolFactory from '../../../components/remotecontrol/remotecontrol';
+import RemoteControl from '../../../components/remotecontrol/remotecontrol';
import libraryMenu from '../../../scripts/libraryMenu';
import '../../../elements/emby-button/emby-button';
export default function (view) {
- const remoteControl = new remotecontrolFactory();
+ const remoteControl = new RemoteControl();
remoteControl.init(view, view.querySelector('.remoteControlContent'));
view.addEventListener('viewshow', function () {
libraryMenu.setTransparentMenu(true);
diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js
index cb237d3466..0feb6e3752 100644
--- a/src/controllers/playback/video/index.js
+++ b/src/controllers/playback/video/index.js
@@ -666,7 +666,7 @@ export default function (view) {
if (item.Type === 'TvChannel') {
const program = item.CurrentProgram;
- if (program && program.EndDate) {
+ if (program?.EndDate) {
try {
const endDate = datetime.parseISO8601Date(program.EndDate);
@@ -1685,7 +1685,7 @@ export default function (view) {
ticks *= value;
const item = currentItem;
- if (item && item.Chapters && item.Chapters.length && item.Chapters[0].ImageTag) {
+ if (item?.Chapters?.length && item.Chapters[0].ImageTag) {
const html = getChapterBubbleHtml(ServerConnections.getApiClient(item.ServerId), item, item.Chapters, ticks);
if (html) {
diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js
index 38b7d077c3..f2f6c605d7 100644
--- a/src/controllers/shows/episodes.js
+++ b/src/controllers/shows/episodes.js
@@ -171,8 +171,8 @@ export default function (view, params, tabContent) {
let isLoading = false;
self.showFilterMenu = function () {
- import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => {
- const filterDialog = new filterDialogFactory({
+ import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => {
+ const filterDialog = new FilterDialog({
query: getQuery(tabContent),
mode: 'episodes',
serverId: ApiClient.serverId()
diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js
index 68019511ba..d3673bf6ae 100644
--- a/src/controllers/shows/tvrecommended.js
+++ b/src/controllers/shows/tvrecommended.js
@@ -268,7 +268,7 @@ export default function (view, params) {
break;
}
- import(`../shows/${depends}`).then(({ default: controllerFactory }) => {
+ import(`../shows/${depends}`).then(({ default: ControllerFactory }) => {
let tabContent;
if (index === 1) {
@@ -284,7 +284,7 @@ export default function (view, params) {
if (index === 1) {
controller = self;
} else {
- controller = new controllerFactory(view, params, tabContent);
+ controller = new ControllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js
index d378cd34d5..3dea00f1b8 100644
--- a/src/controllers/shows/tvshows.js
+++ b/src/controllers/shows/tvshows.js
@@ -199,8 +199,8 @@ export default function (view, params, tabContent) {
let isLoading = false;
this.showFilterMenu = function () {
- import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => {
- const filterDialog = new filterDialogFactory({
+ import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => {
+ const filterDialog = new FilterDialog({
query: getQuery(tabContent),
mode: 'series',
serverId: ApiClient.serverId()
diff --git a/src/elements/emby-input/emby-input.js b/src/elements/emby-input/emby-input.js
index 1b7067cef8..81b0c3b3ee 100644
--- a/src/elements/emby-input/emby-input.js
+++ b/src/elements/emby-input/emby-input.js
@@ -12,7 +12,7 @@ if (Object.getOwnPropertyDescriptor && Object.defineProperty) {
const descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
// descriptor returning null in webos
- if (descriptor && descriptor.configurable) {
+ if (descriptor?.configurable) {
const baseSetMethod = descriptor.set;
descriptor.set = function (value) {
baseSetMethod.call(this, value);
diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js
index d34cc25438..b951fa7d2f 100644
--- a/src/elements/emby-itemscontainer/emby-itemscontainer.js
+++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js
@@ -37,7 +37,7 @@ function onContextMenu(e) {
const card = dom.parentWithAttribute(target, 'data-id');
// check for serverId, it won't be present on selectserver
- if (card && card.getAttribute('data-serverid')) {
+ if (card?.getAttribute('data-serverid')) {
inputManager.handleCommand('menu', {
sourceElement: card
});
@@ -357,7 +357,7 @@ ItemsContainerPrototype.resume = function (options) {
}
}
- if (this.needsRefresh || (options && options.refresh)) {
+ if (this.needsRefresh || (options?.refresh)) {
return this.refreshItems();
}
diff --git a/src/elements/emby-playstatebutton/emby-playstatebutton.js b/src/elements/emby-playstatebutton/emby-playstatebutton.js
index 6e7756d902..6bc43b461a 100644
--- a/src/elements/emby-playstatebutton/emby-playstatebutton.js
+++ b/src/elements/emby-playstatebutton/emby-playstatebutton.js
@@ -132,7 +132,7 @@ EmbyPlaystateButtonPrototype.setItem = function (item) {
this.setAttribute('data-serverid', item.ServerId);
this.setAttribute('data-type', item.Type);
- const played = item.UserData && item.UserData.Played;
+ const played = item.UserData?.Played;
setState(this, played);
bindEvents(this);
} else {
diff --git a/src/elements/emby-scroller/Scroller.tsx b/src/elements/emby-scroller/Scroller.tsx
index 57349bad4c..cb3d5b75b4 100644
--- a/src/elements/emby-scroller/Scroller.tsx
+++ b/src/elements/emby-scroller/Scroller.tsx
@@ -5,7 +5,7 @@ import layoutManager from '../../components/layoutManager';
import dom from '../../scripts/dom';
import browser from '../../scripts/browser';
import focusManager from '../../components/focusManager';
-import scrollerFactory from '../../libraries/scroller';
+import ScrollerFactory from '../../libraries/scroller';
import ScrollButtons from '../emby-scrollbuttons/ScrollButtons';
import './emby-scroller.scss';
@@ -41,7 +41,7 @@ const Scroller: FC = ({
scrollPos: 0,
scrollWidth: 0
});
- const scrollerFactoryRef = useRef(null);
+ const scrollerFactoryRef = useRef(null);
const getScrollSlider = useCallback(() => {
if (scrollerFactoryRef.current) {
@@ -126,7 +126,7 @@ const Scroller: FC = ({
});
}, [getScrollPosition, getScrollSize, getScrollWidth]);
- const initCenterFocus = useCallback((elem, scrollerInstance: scrollerFactory) => {
+ const initCenterFocus = useCallback((elem, scrollerInstance: ScrollerFactory) => {
dom.addEventListener(elem, 'focus', function (e: FocusEvent) {
const focused = focusManager.focusableParent(e.target);
if (focused) {
@@ -179,7 +179,7 @@ const Scroller: FC = ({
};
// If just inserted it might not have any height yet - yes this is a hack
- scrollerFactoryRef.current = new scrollerFactory(scrollRef.current, options);
+ scrollerFactoryRef.current = new ScrollerFactory(scrollRef.current, options);
scrollerFactoryRef.current.init();
scrollerFactoryRef.current.reload();
diff --git a/src/elements/emby-scroller/emby-scroller.js b/src/elements/emby-scroller/emby-scroller.js
index eb5f3abfe4..cf716bed41 100644
--- a/src/elements/emby-scroller/emby-scroller.js
+++ b/src/elements/emby-scroller/emby-scroller.js
@@ -1,4 +1,4 @@
-import scroller from '../../libraries/scroller';
+import ScrollerFactory from '../../libraries/scroller';
import dom from '../../scripts/dom';
import layoutManager from '../../components/layoutManager';
import inputManager from '../../scripts/inputManager';
@@ -140,7 +140,7 @@ ScrollerPrototype.attachedCallback = function () {
};
// If just inserted it might not have any height yet - yes this is a hack
- this.scroller = new scroller(scrollFrame, options);
+ this.scroller = new ScrollerFactory(scrollFrame, options);
this.scroller.init();
this.scroller.reload();
diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js
index 16c52f5863..ec93e61fd6 100644
--- a/src/elements/emby-slider/emby-slider.js
+++ b/src/elements/emby-slider/emby-slider.js
@@ -14,7 +14,7 @@ let supportsValueSetOverride = false;
if (Object.getOwnPropertyDescriptor && Object.defineProperty) {
const descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
// descriptor returning null in webos
- if (descriptor && descriptor.configurable) {
+ if (descriptor?.configurable) {
supportsValueSetOverride = true;
}
}
@@ -167,7 +167,7 @@ function setMarker(range, valueMarker, marker, valueProgress) {
}
function updateMarkers(range, currentValue) {
- if (range.markerInfo && range.markerInfo.length && range.markerElements && range.markerElements.length) {
+ if (range.markerInfo?.length && 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);
diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js
index 22d12e75af..b4b541a3dd 100644
--- a/src/elements/emby-tabs/emby-tabs.js
+++ b/src/elements/emby-tabs/emby-tabs.js
@@ -1,6 +1,6 @@
import 'webcomponents.js/webcomponents-lite';
import dom from '../../scripts/dom';
-import scroller from '../../libraries/scroller';
+import ScrollerFactory from '../../libraries/scroller';
import browser from '../../scripts/browser';
import focusManager from '../../components/focusManager';
import layoutManager from '../../components/layoutManager';
@@ -124,7 +124,7 @@ function initScroller(tabs) {
const contentScrollSlider = tabs.querySelector('.emby-tabs-slider');
if (contentScrollSlider) {
- tabs.scroller = new scroller(tabs, {
+ tabs.scroller = new ScrollerFactory(tabs, {
horizontal: 1,
itemNav: 0,
mouseDragging: 1,
diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js
index 04ce1a42d9..d186398a06 100644
--- a/src/elements/emby-textarea/emby-textarea.js
+++ b/src/elements/emby-textarea/emby-textarea.js
@@ -19,7 +19,7 @@ function calculateOffset(textarea) {
return offset;
}
-function autoGrow(textarea, maxLines) {
+function AutoGrow(textarea, maxLines) {
const self = this;
if (maxLines === undefined) {
@@ -74,7 +74,7 @@ if (Object.getOwnPropertyDescriptor && Object.defineProperty) {
const descriptor = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value');
// descriptor returning null in webos
- if (descriptor && descriptor.configurable) {
+ if (descriptor?.configurable) {
const baseSetMethod = descriptor.set;
descriptor.set = function (value) {
baseSetMethod.call(this, value);
@@ -125,7 +125,7 @@ EmbyTextAreaPrototype.attachedCallback = function () {
label.innerText = text;
};
- new autoGrow(this);
+ new AutoGrow(this);
};
document.registerElement('emby-textarea', {
diff --git a/src/legacy/focusPreventScroll.js b/src/legacy/focusPreventScroll.js
index ad2f12a4b7..f21cce2d40 100644
--- a/src/legacy/focusPreventScroll.js
+++ b/src/legacy/focusPreventScroll.js
@@ -33,7 +33,7 @@ if (HTMLElement.prototype.nativeFocus === undefined) {
this.nativeFocus();
// Restore window scroll if preventScroll
- if (options && options.preventScroll) {
+ if (options?.preventScroll) {
window.scroll(scrollX, scrollY);
}
};
diff --git a/src/libraries/navdrawer/navdrawer.js b/src/libraries/navdrawer/navdrawer.js
index 539682a076..ef6dd1e04f 100644
--- a/src/libraries/navdrawer/navdrawer.js
+++ b/src/libraries/navdrawer/navdrawer.js
@@ -131,7 +131,7 @@ class NavDrawer {
if (this.isPeeking) {
this.onMenuTouchMove(e);
} else {
- if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) {
+ if ((getTouches(e)[0]?.clientX || 0) <= options.handleSize) {
this.isPeeking = true;
if (e.type === 'touchstart') {
diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js
index abfa30cdf0..01038fa0b4 100644
--- a/src/libraries/scroller.js
+++ b/src/libraries/scroller.js
@@ -904,6 +904,7 @@ scrollerFactory.prototype.toCenter = function (item, immediate) {
};
scrollerFactory.create = function (frame, options) {
+ // eslint-disable-next-line new-cap
const instance = new scrollerFactory(frame, options);
return Promise.resolve(instance);
};
diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js
index 8924d06951..6418d84e6b 100644
--- a/src/plugins/bookPlayer/plugin.js
+++ b/src/plugins/bookPlayer/plugin.js
@@ -384,7 +384,7 @@ export class BookPlayer {
}
canPlayItem(item) {
- return item.Path && item.Path.endsWith('epub');
+ return item.Path?.endsWith('epub');
}
}
diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js
index deb479c4b4..569e347cd2 100644
--- a/src/plugins/chromecastPlayer/plugin.js
+++ b/src/plugins/chromecastPlayer/plugin.js
@@ -2,7 +2,7 @@ import appSettings from '../../scripts/settings/appSettings';
import * as userSettings from '../../scripts/settings/userSettings';
import { playbackManager } from '../../components/playback/playbackmanager';
import globalize from '../../scripts/globalize';
-import castSenderApiLoader from './castSenderApi';
+import CastSenderApi from './castSenderApi';
import ServerConnections from '../../components/ServerConnections';
import alert from '../../components/alert';
import { PluginType } from '../../types/plugin.ts';
@@ -103,7 +103,7 @@ class CastPlayer {
return;
}
- if (!chrome.cast || !chrome.cast.isAvailable) {
+ if (!chrome.cast?.isAvailable) {
setTimeout(this.initializeCastPlayer.bind(this), 1000);
return;
}
@@ -322,14 +322,14 @@ class CastPlayer {
const session = player.session;
- if (session && session.receiver && session.receiver.friendlyName) {
+ if (session?.receiver?.friendlyName) {
receiverName = session.receiver.friendlyName;
}
let apiClient;
- if (message.options && message.options.ServerId) {
+ if (message.options?.ServerId) {
apiClient = ServerConnections.getApiClient(message.options.ServerId);
- } else if (message.options && message.options.items && message.options.items.length) {
+ } else if (message.options?.items?.length) {
apiClient = ServerConnections.getApiClient(message.options.items[0].ServerId);
} else {
apiClient = ServerConnections.currentApiClient();
@@ -350,7 +350,7 @@ class CastPlayer {
message.maxBitrate = bitrateSetting;
}
- if (message.options && message.options.items) {
+ if (message.options?.items) {
message.subtitleAppearance = userSettings.getSubtitleAppearanceSettings();
message.subtitleBurnIn = appSettings.get('subtitleburnin') || '';
}
@@ -451,10 +451,10 @@ function onVolumeDownKeyDown() {
}
function normalizeImages(state) {
- if (state && state.NowPlayingItem) {
+ if (state?.NowPlayingItem) {
const item = state.NowPlayingItem;
- if ((!item.ImageTags || !item.ImageTags.Primary) && item.PrimaryImageTag) {
+ if ((!item.ImageTags?.Primary) && item.PrimaryImageTag) {
item.ImageTags = item.ImageTags || {};
item.ImageTags.Primary = item.PrimaryImageTag;
}
@@ -576,7 +576,7 @@ class ChromecastPlayer {
this.isLocalPlayer = false;
this.lastPlayerData = {};
- new castSenderApiLoader().load().then(initializeChromecast.bind(this));
+ new CastSenderApi().load().then(initializeChromecast.bind(this));
}
tryPair() {
@@ -599,7 +599,7 @@ class ChromecastPlayer {
getTargets() {
const targets = [];
- if (this._castPlayer && this._castPlayer.hasReceivers) {
+ if (this._castPlayer?.hasReceivers) {
targets.push(this.getCurrentTargetInfo());
}
@@ -612,7 +612,7 @@ class ChromecastPlayer {
const castPlayer = this._castPlayer;
- if (castPlayer.session && castPlayer.session.receiver && castPlayer.session.receiver.friendlyName) {
+ if (castPlayer.session?.receiver?.friendlyName) {
appName = castPlayer.session.receiver.friendlyName;
}
diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js
index a7c7be0c15..2d0c6cceb1 100644
--- a/src/plugins/htmlAudioPlayer/plugin.js
+++ b/src/plugins/htmlAudioPlayer/plugin.js
@@ -413,7 +413,7 @@ class HtmlAudioPlayer {
const mediaElement = this._mediaElement;
if (mediaElement) {
const seekable = mediaElement.seekable;
- if (seekable && seekable.length) {
+ if (seekable?.length) {
let start = seekable.start(0);
let end = seekable.end(0);
diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js
index 0ec83d6363..b2410ed0ec 100644
--- a/src/plugins/htmlVideoPlayer/plugin.js
+++ b/src/plugins/htmlVideoPlayer/plugin.js
@@ -1010,7 +1010,7 @@ export class HtmlVideoPlayer {
}
if (elem.videoWidth === 0 && elem.videoHeight === 0) {
- const mediaSource = (this._currentPlayOptions || {}).mediaSource;
+ const mediaSource = this._currentPlayOptions?.mediaSource;
// Only trigger this if there is media info
// Avoid triggering in situations where it might not actually have a video stream (audio only live tv channel)
@@ -1490,8 +1490,8 @@ export class HtmlVideoPlayer {
// add some cues to show the text
// in safari, the cues need to be added before setting the track mode to showing
for (const trackEvent of data.TrackEvents) {
- const trackCueObject = window.VTTCue || window.TextTrackCue;
- const cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text, false));
+ const TrackCue = window.VTTCue || window.TextTrackCue;
+ const cue = new TrackCue(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text, false));
if (cue.line === 'auto') {
cue.line = cueLine;
@@ -1536,7 +1536,7 @@ export class HtmlVideoPlayer {
}
}
- if (selectedTrackEvent && selectedTrackEvent.Text) {
+ if (selectedTrackEvent?.Text) {
subtitleTextElement.innerHTML = DOMPurify.sanitize(
normalizeTrackEventText(selectedTrackEvent.Text, true));
subtitleTextElement.classList.remove('hide');
@@ -1812,7 +1812,7 @@ export class HtmlVideoPlayer {
Windows.UI.ViewManagement.ApplicationView.getForCurrentView().tryEnterViewModeAsync(Windows.UI.ViewManagement.ApplicationViewMode.default);
}
} else {
- if (video && video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function') {
+ if (video?.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function') {
video.webkitSetPresentationMode(isEnabled ? 'picture-in-picture' : 'inline');
}
}
@@ -1891,7 +1891,7 @@ export class HtmlVideoPlayer {
const mediaElement = this.#mediaElement;
if (mediaElement) {
const seekable = mediaElement.seekable;
- if (seekable && seekable.length) {
+ if (seekable?.length) {
let start = seekable.start(0);
let end = seekable.end(0);
diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js
index fc999ccccf..9cd0e1a445 100644
--- a/src/plugins/logoScreensaver/plugin.js
+++ b/src/plugins/logoScreensaver/plugin.js
@@ -25,7 +25,7 @@ export default function () {
const elem = document.querySelector('.logoScreenSaverImage');
- if (elem && elem.animate) {
+ if (elem?.animate) {
const random = randomInt(0, animations.length - 1);
animations[random](elem, 1);
diff --git a/src/plugins/pdfPlayer/plugin.js b/src/plugins/pdfPlayer/plugin.js
index 00625c2776..6a14a4a684 100644
--- a/src/plugins/pdfPlayer/plugin.js
+++ b/src/plugins/pdfPlayer/plugin.js
@@ -312,7 +312,7 @@ export class PdfPlayer {
}
canPlayItem(item) {
- return item.Path && item.Path.endsWith('pdf');
+ return item.Path?.endsWith('pdf');
}
}
diff --git a/src/plugins/sessionPlayer/plugin.js b/src/plugins/sessionPlayer/plugin.js
index 98e0e843ab..6feef63575 100644
--- a/src/plugins/sessionPlayer/plugin.js
+++ b/src/plugins/sessionPlayer/plugin.js
@@ -157,7 +157,7 @@ function subscribeToPlayerUpdates(instance) {
}
function normalizeImages(state, apiClient) {
- if (state && state.NowPlayingItem) {
+ if (state?.NowPlayingItem) {
const item = state.NowPlayingItem;
if (!item.ImageTags || !item.ImageTags.Primary && item.PrimaryImageTag) {
diff --git a/src/plugins/syncPlay/core/Manager.js b/src/plugins/syncPlay/core/Manager.js
index ee1e3e3ae7..9f25f44608 100644
--- a/src/plugins/syncPlay/core/Manager.js
+++ b/src/plugins/syncPlay/core/Manager.js
@@ -246,7 +246,7 @@ class Manager {
/**
* Handles a playback command from the server.
- * @param {Object} cmd The playback command.
+ * @param {Object|null} cmd The playback command.
*/
processCommand(cmd) {
if (cmd === null) return;
@@ -294,7 +294,7 @@ class Manager {
/**
* Handles a group state change.
- * @param {Object} update The group state update.
+ * @param {Object|null} update The group state update.
*/
processStateChange(update) {
if (update === null || update.State === null || update.Reason === null) return;
diff --git a/src/scripts/autocast.js b/src/scripts/autocast.js
index 854403b4da..9ed7de5df7 100644
--- a/src/scripts/autocast.js
+++ b/src/scripts/autocast.js
@@ -12,7 +12,7 @@ export function enable(enabled) {
if (enabled) {
const currentPlayerInfo = playbackManager.getPlayerInfo();
- if (currentPlayerInfo && currentPlayerInfo.id) {
+ if (currentPlayerInfo?.id) {
localStorage.setItem('autocastPlayerId', currentPlayerInfo.id);
}
} else {
diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js
index c4623718bc..98be70a9b1 100644
--- a/src/scripts/browserDeviceProfile.js
+++ b/src/scripts/browserDeviceProfile.js
@@ -3,7 +3,7 @@ import * as userSettings from './settings/userSettings';
import browser from './browser';
function canPlayH264(videoTestElement) {
- return !!(videoTestElement.canPlayType && videoTestElement.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, ''));
+ return !!(videoTestElement.canPlayType?.('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, ''));
}
function canPlayHevc(videoTestElement, options) {
diff --git a/src/scripts/dom.js b/src/scripts/dom.js
index 9488c7e16d..cd0fd71849 100644
--- a/src/scripts/dom.js
+++ b/src/scripts/dom.js
@@ -15,7 +15,7 @@ export function parentWithAttribute(elem, name, value) {
while ((value ? elem.getAttribute(name) !== value : !elem.getAttribute(name))) {
elem = elem.parentNode;
- if (!elem || !elem.getAttribute) {
+ if (!elem?.getAttribute) {
return null;
}
}
@@ -65,7 +65,7 @@ function containsAnyClass(classList, classNames) {
* Returns parent of element with one of specified class names.
* @param {HTMLElement} elem - Element whose parent need to find.
* @param {(string|Array)} classNames - Class name or array of class names.
- * @returns {HTMLElement} Parent with one of specified class names.
+ * @returns {HTMLElement|null} Parent with one of specified class names.
*/
export function parentWithClass(elem, classNames) {
// accept both string and array passed in
diff --git a/src/scripts/gamepadtokey.js b/src/scripts/gamepadtokey.js
index 847ef02a52..cfd6e3790c 100644
--- a/src/scripts/gamepadtokey.js
+++ b/src/scripts/gamepadtokey.js
@@ -349,7 +349,7 @@ function isGamepadConnected() {
const gamepads = navigator.getGamepads(); /* eslint-disable-line compat/compat */
for (let i = 0, len = gamepads.length; i < len; i++) {
const gamepad = gamepads[i];
- if (gamepad && gamepad.connected) {
+ if (gamepad?.connected) {
return true;
}
}
diff --git a/src/scripts/globalize.js b/src/scripts/globalize.js
index 256207acec..21260e2be4 100644
--- a/src/scripts/globalize.js
+++ b/src/scripts/globalize.js
@@ -37,7 +37,7 @@ function getDefaultLanguage() {
if (navigator.userLanguage) {
return navigator.userLanguage;
}
- if (navigator.languages && navigator.languages.length) {
+ if (navigator.languages?.length) {
return navigator.languages[0];
}
@@ -217,12 +217,12 @@ function translateKey(key) {
function translateKeyFromModule(key, module) {
let dictionary = getDictionary(module, getCurrentLocale());
- if (dictionary && dictionary[key]) {
+ if (dictionary?.[key]) {
return dictionary[key];
}
dictionary = getDictionary(module, fallbackCulture);
- if (dictionary && dictionary[key]) {
+ if (dictionary?.[key]) {
return dictionary[key];
}
diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js
index c49a8336d3..b77dfa92e1 100644
--- a/src/scripts/libraryMenu.js
+++ b/src/scripts/libraryMenu.js
@@ -71,7 +71,7 @@ function renderHeader() {
}
function getCurrentApiClient() {
- if (currentUser && currentUser.localUser) {
+ if (currentUser?.localUser) {
return ServerConnections.getApiClient(currentUser.localUser.ServerId);
}
@@ -127,7 +127,7 @@ function updateUserInHeader(user) {
let hasImage;
- if (user && user.name) {
+ if (user?.name) {
if (user.imageUrl) {
const url = user.imageUrl;
updateHeaderUserButton(url);
@@ -143,7 +143,7 @@ function updateUserInHeader(user) {
updateHeaderUserButton(null);
}
- if (user && user.localUser) {
+ if (user?.localUser) {
if (headerHomeButton) {
headerHomeButton.classList.remove('hide');
}
@@ -322,7 +322,7 @@ function refreshLibraryInfoInDrawer(user) {
// libraries are added here
html += '';
- if (user.localUser && user.localUser.Policy.IsAdministrator) {
+ if (user.localUser?.Policy.IsAdministrator) {
html += '