diff --git a/package.json b/package.json
index 8930867484..a70bfac564 100644
--- a/package.json
+++ b/package.json
@@ -191,6 +191,7 @@
"src/controllers/dashboard/users/userparentalcontrol.js",
"src/controllers/dashboard/users/userpasswordpage.js",
"src/controllers/dashboard/users/userprofilespage.js",
+ "src/controllers/itemDetails/index.js",
"src/controllers/playback/queue/index.js",
"src/controllers/playback/video/index.js",
"src/controllers/searchpage.js",
diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js
index 29aa8ad1e1..0e5b41b658 100644
--- a/src/controllers/itemDetails/index.js
+++ b/src/controllers/itemDetails/index.js
@@ -1,8 +1,36 @@
-define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSettings', 'cardBuilder', 'datetime', 'mediaInfo', 'backdrop', 'listView', 'itemContextMenu', 'itemHelper', 'dom', 'indicators', 'imageLoader', 'libraryMenu', 'globalize', 'browser', 'events', 'playbackManager', 'scrollStyles', 'emby-itemscontainer', 'emby-checkbox', 'emby-button', 'emby-playstatebutton', 'emby-ratingbutton', 'emby-scroller', 'emby-select'], function (loading, appRouter, layoutManager, connectionManager, userSettings, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, dom, indicators, imageLoader, libraryMenu, globalize, browser, events, playbackManager) {
- 'use strict';
+import loading from 'loading';
+import appRouter from 'appRouter';
+import layoutManager from 'layoutManager';
+import connectionManager from 'connectionManager';
+import * as userSettings from 'userSettings';
+import cardBuilder from 'cardBuilder';
+import datetime from 'datetime';
+import mediaInfo from 'mediaInfo';
+import backdrop from 'backdrop';
+import listView from 'listView';
+import itemContextMenu from 'itemContextMenu';
+import itemHelper from 'itemHelper';
+import dom from 'dom';
+import indicators from 'indicators';
+import imageLoader from 'imageLoader';
+import libraryMenu from 'libraryMenu';
+import globalize from 'globalize';
+import browser from 'browser';
+import events from 'events';
+import playbackManager from 'playbackManager';
+import 'scrollStyles';
+import 'emby-itemscontainer';
+import 'emby-checkbox';
+import 'emby-button';
+import 'emby-playstatebutton';
+import 'emby-ratingbutton';
+import 'emby-scroller';
+import 'emby-select';
+
+/* eslint-disable indent */
function getPromise(apiClient, params) {
- var id = params.id;
+ const id = params.id;
if (id) {
return apiClient.getItem(apiClient.getCurrentUserId(), id);
@@ -38,7 +66,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function getContextMenuOptions(item, user, button) {
- var options = {
+ const options = {
item: item,
open: false,
play: false,
@@ -58,7 +86,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function getProgramScheduleHtml(items) {
- var html = '';
+ let html = '';
html += '
';
html += listView.getListViewHtml({
@@ -94,8 +122,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
result.Items = [];
}
- var html = getProgramScheduleHtml(result.Items);
- var scheduleTab = page.querySelector('.seriesTimerSchedule');
+ const html = getProgramScheduleHtml(result.Items);
+ const scheduleTab = page.querySelector('.seriesTimerSchedule');
scheduleTab.innerHTML = html;
imageLoader.lazyChildren(scheduleTab);
});
@@ -115,7 +143,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
if (user.Policy.EnableLiveTvManagement) {
- require(['seriesRecordingEditor'], function (seriesRecordingEditor) {
+ import('seriesRecordingEditor').then(({default: seriesRecordingEditor}) => {
seriesRecordingEditor.embed(item, apiClient.serverId(), {
context: page.querySelector('.seriesRecordingEditor')
});
@@ -131,7 +159,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderTrackSelections(page, instance, item, forceReload) {
- var select = page.querySelector('.selectSource');
+ const select = page.querySelector('.selectSource');
if (!item.MediaSources || !itemHelper.supportsMediaSourceSelection(item) || -1 === playbackManager.getSupportedCommands().indexOf('PlayMediaSource') || !playbackManager.canPlay(item)) {
page.querySelector('.trackSelections').classList.add('hide');
@@ -142,17 +170,17 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
return;
}
- var mediaSources = item.MediaSources;
+ const mediaSources = item.MediaSources;
instance._currentPlaybackMediaSources = mediaSources;
page.querySelector('.trackSelections').classList.remove('hide');
select.setLabel(globalize.translate('LabelVersion'));
- var currentValue = select.value;
+ const currentValue = select.value;
- var selectedId = mediaSources[0].Id;
+ const selectedId = mediaSources[0].Id;
select.innerHTML = mediaSources.map(function (v) {
- var selected = v.Id === selectedId ? ' selected' : '';
+ const selected = v.Id === selectedId ? ' selected' : '';
return '
';
}).join('');
@@ -170,22 +198,22 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderVideoSelections(page, mediaSources) {
- var mediaSourceId = page.querySelector('.selectSource').value;
- var mediaSource = mediaSources.filter(function (m) {
+ const mediaSourceId = page.querySelector('.selectSource').value;
+ const mediaSource = mediaSources.filter(function (m) {
return m.Id === mediaSourceId;
})[0];
- var tracks = mediaSource.MediaStreams.filter(function (m) {
+ const tracks = mediaSource.MediaStreams.filter(function (m) {
return m.Type === 'Video';
});
- var select = page.querySelector('.selectVideo');
+ const select = page.querySelector('.selectVideo');
select.setLabel(globalize.translate('LabelVideo'));
- var selectedId = tracks.length ? tracks[0].Index : -1;
+ const selectedId = tracks.length ? tracks[0].Index : -1;
select.innerHTML = tracks.map(function (v) {
- var selected = v.Index === selectedId ? ' selected' : '';
- var titleParts = [];
- var resolutionText = mediaInfo.getResolutionText(v);
+ const selected = v.Index === selectedId ? ' selected' : '';
+ const titleParts = [];
+ const resolutionText = mediaInfo.getResolutionText(v);
if (resolutionText) {
titleParts.push(resolutionText);
@@ -207,18 +235,18 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderAudioSelections(page, mediaSources) {
- var mediaSourceId = page.querySelector('.selectSource').value;
- var mediaSource = mediaSources.filter(function (m) {
+ const mediaSourceId = page.querySelector('.selectSource').value;
+ const mediaSource = mediaSources.filter(function (m) {
return m.Id === mediaSourceId;
})[0];
- var tracks = mediaSource.MediaStreams.filter(function (m) {
+ const tracks = mediaSource.MediaStreams.filter(function (m) {
return 'Audio' === m.Type;
});
- var select = page.querySelector('.selectAudio');
+ const select = page.querySelector('.selectAudio');
select.setLabel(globalize.translate('LabelAudio'));
- var selectedId = mediaSource.DefaultAudioStreamIndex;
+ const selectedId = mediaSource.DefaultAudioStreamIndex;
select.innerHTML = tracks.map(function (v) {
- var selected = v.Index === selectedId ? ' selected' : '';
+ const selected = v.Index === selectedId ? ' selected' : '';
return '
';
}).join('');
@@ -236,24 +264,24 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderSubtitleSelections(page, mediaSources) {
- var mediaSourceId = page.querySelector('.selectSource').value;
- var mediaSource = mediaSources.filter(function (m) {
+ const mediaSourceId = page.querySelector('.selectSource').value;
+ const mediaSource = mediaSources.filter(function (m) {
return m.Id === mediaSourceId;
})[0];
- var tracks = mediaSource.MediaStreams.filter(function (m) {
+ const tracks = mediaSource.MediaStreams.filter(function (m) {
return 'Subtitle' === m.Type;
});
- var select = page.querySelector('.selectSubtitles');
+ const select = page.querySelector('.selectSubtitles');
select.setLabel(globalize.translate('LabelSubtitles'));
- var selectedId = null == mediaSource.DefaultSubtitleStreamIndex ? -1 : mediaSource.DefaultSubtitleStreamIndex;
+ const selectedId = null == mediaSource.DefaultSubtitleStreamIndex ? -1 : mediaSource.DefaultSubtitleStreamIndex;
- var videoTracks = mediaSource.MediaStreams.filter(function (m) {
+ const videoTracks = mediaSource.MediaStreams.filter(function (m) {
return 'Video' === m.Type;
});
// This only makes sense on Video items
if (videoTracks.length) {
- var selected = -1 === selectedId ? ' selected' : '';
+ let selected = -1 === selectedId ? ' selected' : '';
select.innerHTML = '
' + tracks.map(function (v) {
selected = v.Index === selectedId ? ' selected' : '';
return '
';
@@ -273,10 +301,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function reloadPlayButtons(page, item) {
- var canPlay = false;
+ let canPlay = false;
if ('Program' == item.Type) {
- var now = new Date();
+ const now = new Date();
if (now >= datetime.parseISO8601Date(item.StartDate, true) && now < datetime.parseISO8601Date(item.EndDate, true)) {
hideAll(page, 'btnPlay', true);
@@ -290,9 +318,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
hideAll(page, 'btnShuffle');
} else if (playbackManager.canPlay(item)) {
hideAll(page, 'btnPlay', true);
- var enableInstantMix = -1 !== ['Audio', 'MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type);
+ const enableInstantMix = -1 !== ['Audio', 'MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type);
hideAll(page, 'btnInstantMix', enableInstantMix);
- var enableShuffle = item.IsFolder || -1 !== ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type);
+ const enableShuffle = item.IsFolder || -1 !== ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type);
hideAll(page, 'btnShuffle', enableShuffle);
canPlay = true;
@@ -315,12 +343,12 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function reloadUserDataButtons(page, item) {
- var i;
- var length;
- var btnPlaystates = page.querySelectorAll('.btnPlaystate');
+ let i;
+ let length;
+ const btnPlaystates = page.querySelectorAll('.btnPlaystate');
for (i = 0, length = btnPlaystates.length; i < length; i++) {
- var btnPlaystate = btnPlaystates[i];
+ const btnPlaystate = btnPlaystates[i];
if (itemHelper.canMarkPlayed(item)) {
btnPlaystate.classList.remove('hide');
@@ -331,10 +359,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
}
- var btnUserRatings = page.querySelectorAll('.btnUserRating');
+ const btnUserRatings = page.querySelectorAll('.btnUserRating');
for (i = 0, length = btnUserRatings.length; i < length; i++) {
- var btnUserRating = btnUserRatings[i];
+ const btnUserRating = btnUserRatings[i];
if (itemHelper.canRate(item)) {
btnUserRating.classList.remove('hide');
@@ -347,10 +375,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function getArtistLinksHtml(artists, serverId, context) {
- var html = [];
+ let html = [];
for (const artist of artists) {
- var href = appRouter.getRouteUrl(artist, {
+ const href = appRouter.getRouteUrl(artist, {
context: context,
itemType: 'MusicArtist',
serverId: serverId
@@ -369,9 +397,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
* @param {Object} context - Application context.
*/
function renderName(item, container, context) {
- var parentRoute;
- var parentNameHtml = [];
- var parentNameLast = false;
+ let parentRoute;
+ const parentNameHtml = [];
+ let parentNameLast = false;
if (item.AlbumArtists) {
parentNameHtml.push(getArtistLinksHtml(item.AlbumArtists, item.ServerId, context));
@@ -434,9 +462,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
// FIXME: This whole section needs some refactoring, so it becames easier to scale across all form factors. See GH #1022
- var html = '';
- var tvShowHtml = parentNameHtml[0];
- var tvSeasonHtml = parentNameHtml[1];
+ let html = '';
+ const tvShowHtml = parentNameHtml[0];
+ const tvSeasonHtml = parentNameHtml[1];
if (parentNameHtml.length) {
if (parentNameLast) {
@@ -451,7 +479,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
}
- var name = itemHelper.getDisplayName(item, {
+ const name = itemHelper.getDisplayName(item, {
includeParentInfo: false
});
@@ -497,9 +525,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderDetailPageBackdrop(page, item, apiClient) {
- var imgUrl;
- var hasbackdrop = false;
- var itemBackdropElement = page.querySelector('#itemBackdrop');
+ let imgUrl;
+ let hasbackdrop = false;
+ const itemBackdropElement = page.querySelector('#itemBackdrop');
if (!layoutManager.mobile && !userSettings.detailsBanner()) {
return false;
@@ -550,7 +578,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
renderSeriesTimerEditor(page, item, apiClient, user);
renderTimerEditor(page, item, apiClient, user);
setInitialCollapsibleState(page, item, apiClient, params.context, user);
- var canPlay = reloadPlayButtons(page, item);
+ const canPlay = reloadPlayButtons(page, item);
if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf('PlayTrailers')) {
hideAll(page, 'btnPlayTrailer', true);
@@ -567,7 +595,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
showRecordingFields(instance, page, item, user);
- var groupedVersions = (item.MediaSources || []).filter(function (g) {
+ const groupedVersions = (item.MediaSources || []).filter(function (g) {
return 'Grouping' == g.Type;
});
@@ -583,11 +611,11 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
hideAll(page, 'btnMoreCommands');
}
- var itemBirthday = page.querySelector('#itemBirthday');
+ const itemBirthday = page.querySelector('#itemBirthday');
if ('Person' == item.Type && item.PremiereDate) {
try {
- var birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString();
+ const birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString();
itemBirthday.classList.remove('hide');
itemBirthday.innerHTML = globalize.translate('BirthDateValue', birthday);
} catch (err) {
@@ -597,11 +625,11 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
itemBirthday.classList.add('hide');
}
- var itemDeathDate = page.querySelector('#itemDeathDate');
+ const itemDeathDate = page.querySelector('#itemDeathDate');
if ('Person' == item.Type && item.EndDate) {
try {
- var deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString();
+ const deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString();
itemDeathDate.classList.remove('hide');
itemDeathDate.innerHTML = globalize.translate('DeathDateValue', deathday);
} catch (err) {
@@ -611,10 +639,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
itemDeathDate.classList.add('hide');
}
- var itemBirthLocation = page.querySelector('#itemBirthLocation');
+ const itemBirthLocation = page.querySelector('#itemBirthLocation');
if ('Person' == item.Type && item.ProductionLocations && item.ProductionLocations.length) {
- var gmap = '
' + item.ProductionLocations[0] + '';
+ const gmap = '
' + item.ProductionLocations[0] + '';
itemBirthLocation.classList.remove('hide');
itemBirthLocation.innerHTML = globalize.translate('BirthPlaceValue', gmap);
} else {
@@ -628,7 +656,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
hideAll(page, 'btnDownload', true);
}
- require(['autoFocuser'], function (autoFocuser) {
+ import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(page);
});
}
@@ -651,9 +679,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderLogo(page, item, apiClient) {
- var detailLogo = page.querySelector('.detailLogo');
+ const detailLogo = page.querySelector('.detailLogo');
- var url = logoImageUrl(item, apiClient, {});
+ const url = logoImageUrl(item, apiClient, {});
if (!layoutManager.mobile && !userSettings.enableBackdrops()) {
detailLogo.classList.add('hide');
@@ -667,10 +695,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
function showRecordingFields(instance, page, item, user) {
if (!instance.currentRecordingFields) {
- var recordingFieldsElement = page.querySelector('.recordingFields');
+ const recordingFieldsElement = page.querySelector('.recordingFields');
if ('Program' == item.Type && user.Policy.EnableLiveTvManagement) {
- require(['recordingFields'], function (recordingFields) {
+ import('recordingFields').then(({default: recordingFields}) => {
instance.currentRecordingFields = new recordingFields({
parent: recordingFieldsElement,
programId: item.Id,
@@ -686,9 +714,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderLinks(page, item) {
- var externalLinksElem = page.querySelector('.itemExternalLinks');
+ const externalLinksElem = page.querySelector('.itemExternalLinks');
- var links = [];
+ const links = [];
if (!layoutManager.tv && item.HomePageUrl) {
links.push(`
${globalize.translate('ButtonWebsite')}`);
@@ -700,7 +728,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
}
- var html = [];
+ const html = [];
if (links.length) {
html.push(links.join(', '));
}
@@ -758,7 +786,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderNextUp(page, item, user) {
- var section = page.querySelector('.nextUpSection');
+ const section = page.querySelector('.nextUpSection');
if ('Series' != item.Type) {
return void section.classList.add('hide');
@@ -774,7 +802,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
section.classList.add('hide');
}
- var html = cardBuilder.getCardsHtml({
+ const html = cardBuilder.getCardsHtml({
items: result.Items,
shape: 'overflowBackdrop',
showTitle: true,
@@ -783,7 +811,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
centerText: true,
overlayPlayButton: true
});
- var itemsContainer = section.querySelector('.nextUpItems');
+ const itemsContainer = section.querySelector('.nextUpItems');
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
});
@@ -841,8 +869,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function toggleLineClamp(clampTarget, e) {
- var expandButton = e.target;
- var clampClassName = 'detail-clamp-text';
+ const expandButton = e.target;
+ const clampClassName = 'detail-clamp-text';
if (clampTarget.classList.contains(clampClassName)) {
clampTarget.classList.remove(clampClassName);
@@ -855,7 +883,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
function renderOverview(page, item) {
for (const overviewElemnt of page.querySelectorAll('.overview')) {
- var overview = item.Overview || '';
+ const overview = item.Overview || '';
if (overview) {
overviewElemnt.innerHTML = overview;
@@ -863,7 +891,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
overviewElemnt.classList.add('detail-clamp-text');
// Grab the sibling element to control the expand state
- var expandButton = overviewElemnt.parentElement.querySelector('.overview-expand');
+ const expandButton = overviewElemnt.parentElement.querySelector('.overview-expand');
// Detect if we have overflow of text. Based on this StackOverflow answer
// https://stackoverflow.com/a/35157976
@@ -886,10 +914,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderGenres(page, item, context = inferContext(item)) {
- var genres = item.GenreItems || [];
- var type = context === 'music' ? 'MusicGenre' : 'Genre';
+ const genres = item.GenreItems || [];
+ const type = context === 'music' ? 'MusicGenre' : 'Genre';
- var html = genres.map(function (p) {
+ const html = genres.map(function (p) {
return '
' + p.Name + '';
}).join(', ');
- var genresLabel = page.querySelector('.genresLabel');
+ const genresLabel = page.querySelector('.genresLabel');
genresLabel.innerHTML = globalize.translate(genres.length > 1 ? 'Genres' : 'Genre');
- var genresValue = page.querySelector('.genres');
+ const genresValue = page.querySelector('.genres');
genresValue.innerHTML = html;
- var genresGroup = page.querySelector('.genresGroup');
+ const genresGroup = page.querySelector('.genresGroup');
if (genres.length) {
genresGroup.classList.remove('hide');
} else {
@@ -914,11 +942,11 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderWriter(page, item, context) {
- var writers = (item.People || []).filter(function (person) {
+ const writers = (item.People || []).filter(function (person) {
return person.Type === 'Writer';
});
- var html = writers.map(function (person) {
+ const html = writers.map(function (person) {
return '
' + person.Name + '';
}).join(', ');
- var writersLabel = page.querySelector('.writersLabel');
+ const writersLabel = page.querySelector('.writersLabel');
writersLabel.innerHTML = globalize.translate(writers.length > 1 ? 'Writers' : 'Writer');
- var writersValue = page.querySelector('.writers');
+ const writersValue = page.querySelector('.writers');
writersValue.innerHTML = html;
- var writersGroup = page.querySelector('.writersGroup');
+ const writersGroup = page.querySelector('.writersGroup');
if (writers.length) {
writersGroup.classList.remove('hide');
} else {
@@ -943,11 +971,11 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderDirector(page, item, context) {
- var directors = (item.People || []).filter(function (person) {
+ const directors = (item.People || []).filter(function (person) {
return person.Type === 'Director';
});
- var html = directors.map(function (person) {
+ const html = directors.map(function (person) {
return '
' + person.Name + '';
}).join(', ');
- var directorsLabel = page.querySelector('.directorsLabel');
+ const directorsLabel = page.querySelector('.directorsLabel');
directorsLabel.innerHTML = globalize.translate(directors.length > 1 ? 'Directors' : 'Director');
- var directorsValue = page.querySelector('.directors');
+ const directorsValue = page.querySelector('.directors');
directorsValue.innerHTML = html;
- var directorsGroup = page.querySelector('.directorsGroup');
+ const directorsGroup = page.querySelector('.directorsGroup');
if (directors.length) {
directorsGroup.classList.remove('hide');
} else {
@@ -1004,7 +1032,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderTagline(page, item) {
- var taglineElement = page.querySelector('.tagline');
+ const taglineElement = page.querySelector('.tagline');
if (item.Taglines && item.Taglines.length) {
taglineElement.classList.remove('hide');
@@ -1052,14 +1080,14 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderMoreFromSeason(view, item, apiClient) {
- var section = view.querySelector('.moreFromSeasonSection');
+ const section = view.querySelector('.moreFromSeasonSection');
if (section) {
if ('Episode' !== item.Type || !item.SeasonId || !item.SeriesId) {
return void section.classList.add('hide');
}
- var userId = apiClient.getCurrentUserId();
+ const userId = apiClient.getCurrentUserId();
apiClient.getEpisodes(item.SeriesId, {
SeasonId: item.SeasonId,
UserId: userId,
@@ -1071,7 +1099,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
section.classList.remove('hide');
section.querySelector('h2').innerHTML = globalize.translate('MoreFromValue', item.SeasonName);
- var itemsContainer = section.querySelector('.itemsContainer');
+ const itemsContainer = section.querySelector('.itemsContainer');
cardBuilder.buildCards(result.Items, {
parentContainer: section,
itemsContainer: itemsContainer,
@@ -1084,7 +1112,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
includeParentInfoInTitle: false,
allowBottomPadding: false
});
- var card = itemsContainer.querySelector('.card[data-id="' + item.Id + '"]');
+ const card = itemsContainer.querySelector('.card[data-id="' + item.Id + '"]');
if (card) {
setTimeout(function () {
@@ -1096,7 +1124,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderMoreFromArtist(view, item, apiClient) {
- var section = view.querySelector('.moreFromArtistSection');
+ const section = view.querySelector('.moreFromArtistSection');
if (section) {
if ('MusicArtist' === item.Type) {
@@ -1107,7 +1135,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
return void section.classList.add('hide');
}
- var query = {
+ const query = {
IncludeItemTypes: 'MusicAlbum',
Recursive: true,
ExcludeItemIds: item.Id,
@@ -1155,7 +1183,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderSimilarItems(page, item, context) {
- var similarCollapsible = page.querySelector('#similarCollapsible');
+ const similarCollapsible = page.querySelector('#similarCollapsible');
if (similarCollapsible) {
if ('Movie' != item.Type && 'Trailer' != item.Type && 'Series' != item.Type && 'Program' != item.Type && 'Recording' != item.Type && 'MusicAlbum' != item.Type && 'MusicArtist' != item.Type && 'Playlist' != item.Type) {
@@ -1163,8 +1191,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
similarCollapsible.classList.remove('hide');
- var apiClient = connectionManager.getApiClient(item.ServerId);
- var options = {
+ const apiClient = connectionManager.getApiClient(item.ServerId);
+ const options = {
userId: apiClient.getCurrentUserId(),
limit: 12,
fields: 'PrimaryImageAspectRatio,UserData,CanDelete'
@@ -1180,7 +1208,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
similarCollapsible.classList.remove('hide');
- var html = '';
+ let html = '';
html += cardBuilder.getCardsHtml({
items: result.Items,
shape: 'autooverflow',
@@ -1195,7 +1223,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
overlayText: false,
showYear: 'Movie' === item.Type || 'Trailer' === item.Type || 'Series' === item.Type
});
- var similarContent = similarCollapsible.querySelector('.similarContent');
+ const similarContent = similarCollapsible.querySelector('.similarContent');
similarContent.innerHTML = html;
imageLoader.lazyChildren(similarContent);
});
@@ -1203,12 +1231,12 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderSeriesAirTime(page, item, isStatic) {
- var seriesAirTime = page.querySelector('#seriesAirTime');
+ const seriesAirTime = page.querySelector('#seriesAirTime');
if ('Series' != item.Type) {
seriesAirTime.classList.add('hide');
return;
}
- var html = '';
+ let html = '';
if (item.AirDays && item.AirDays.length) {
if (7 == item.AirDays.length) {
html += 'daily';
@@ -1225,8 +1253,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
if (isStatic) {
html += ' on ' + item.Studios[0].Name;
} else {
- var context = inferContext(item);
- var href = appRouter.getRouteUrl(item.Studios[0], {
+ const context = inferContext(item);
+ const href = appRouter.getRouteUrl(item.Studios[0], {
context: context,
itemType: 'Studio',
serverId: item.ServerId
@@ -1244,15 +1272,15 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderTags(page, item) {
- var itemTags = page.querySelector('.itemTags');
- var tagElements = [];
- var tags = item.Tags || [];
+ const itemTags = page.querySelector('.itemTags');
+ const tagElements = [];
+ let tags = item.Tags || [];
if ('Program' === item.Type) {
tags = [];
}
- for (var i = 0, length = tags.length; i < length; i++) {
+ for (let i = 0, length = tags.length; i < length; i++) {
tagElements.push(tags[i]);
}
@@ -1266,8 +1294,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderChildren(page, item) {
- var fields = 'ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount';
- var query = {
+ let fields = 'ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount';
+ const query = {
ParentId: item.Id,
Fields: fields
};
@@ -1276,9 +1304,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
query.SortBy = 'SortName';
}
- var promise;
- var apiClient = connectionManager.getApiClient(item.ServerId);
- var userId = apiClient.getCurrentUserId();
+ let promise;
+ const apiClient = connectionManager.getApiClient(item.ServerId);
+ const userId = apiClient.getCurrentUserId();
if ('Series' == item.Type) {
promise = apiClient.getSeasons(item.Id, {
@@ -1298,10 +1326,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
promise = promise || apiClient.getItems(apiClient.getCurrentUserId(), query);
promise.then(function (result) {
- var html = '';
- var scrollX = false;
- var isList = false;
- var childrenItemsContainer = page.querySelector('.childrenItemsContainer');
+ let html = '';
+ let scrollX = false;
+ let isList = false;
+ const childrenItemsContainer = page.querySelector('.childrenItemsContainer');
if ('MusicAlbum' == item.Type) {
html = listView.getListViewHtml({
@@ -1394,7 +1422,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
childrenItemsContainer.innerHTML = html;
imageLoader.lazyChildren(childrenItemsContainer);
if ('BoxSet' == item.Type) {
- var collectionItemTypes = [{
+ const collectionItemTypes = [{
name: globalize.translate('HeaderVideos'),
mediaType: 'Video'
}, {
@@ -1430,25 +1458,25 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderItemsByName(page, item) {
- require('scripts/itembynamedetailpage'.split(','), function () {
+ import('scripts/itembynamedetailpage').then(() => {
window.ItemsByName.renderItems(page, item);
});
}
function renderPlaylistItems(page, item) {
- require('scripts/playlistedit'.split(','), function () {
+ import('scripts/playlistedit').then(() => {
PlaylistViewer.render(page, item);
});
}
function renderProgramsForChannel(page, result) {
- var html = '';
- var currentItems = [];
- var currentStartDate = null;
+ let html = '';
+ let currentItems = [];
+ let currentStartDate = null;
- for (var i = 0, length = result.Items.length; i < length; i++) {
- var item = result.Items[i];
- var itemStartDate = datetime.parseISO8601Date(item.StartDate);
+ for (let i = 0, length = result.Items.length; i < length; i++) {
+ const item = result.Items[i];
+ const itemStartDate = datetime.parseISO8601Date(item.StartDate);
if (!(currentStartDate && currentStartDate.toDateString() === itemStartDate.toDateString())) {
if (currentItems.length) {
@@ -1516,7 +1544,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderSeriesSchedule(page, item) {
- var apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = connectionManager.getApiClient(item.ServerId);
apiClient.getLiveTvPrograms({
UserId: apiClient.getCurrentUserId(),
HasAired: false,
@@ -1580,9 +1608,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function canPlaySomeItemInCollection(items) {
- var i = 0;
+ let i = 0;
- for (var length = items.length; i < length; i++) {
+ for (let length = items.length; i < length; i++) {
if (playbackManager.canPlay(items[i])) {
return true;
}
@@ -1596,17 +1624,17 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
page.querySelector('.collectionItems').innerHTML = '';
for (const type of types) {
- var typeItems = filterItemsByCollectionItemType(items, type);
+ const typeItems = filterItemsByCollectionItemType(items, type);
if (typeItems.length) {
renderCollectionItemType(page, parentItem, type, typeItems);
}
}
- var otherType = {
+ const otherType = {
name: globalize.translate('HeaderOtherItems')
};
- var otherTypeItems = items.filter(function (curr) {
+ const otherTypeItems = items.filter(function (curr) {
return !types.filter(function (t) {
return filterItemsByCollectionItemType([curr], t).length > 0;
}).length;
@@ -1622,9 +1650,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}, items);
}
- var containers = page.querySelectorAll('.collectionItemsContainer');
+ const containers = page.querySelectorAll('.collectionItemsContainer');
- var notifyRefreshNeeded = function () {
+ const notifyRefreshNeeded = function () {
renderChildren(page, parentItem);
};
@@ -1640,13 +1668,13 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
// HACK: Call autoFocuser again because btnPlay may be hidden, but focused by reloadFromItem
// FIXME: Sometimes focus does not move until all (?) sections are loaded
- require(['autoFocuser'], function (autoFocuser) {
+ import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(page);
});
}
function renderCollectionItemType(page, parentItem, type, items) {
- var html = '';
+ let html = '';
html += '
';
html += '
';
html += '
';
@@ -1654,7 +1682,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
html += '
';
html += '';
html += '
';
- var shape = 'MusicAlbum' == type.type ? getSquareShape(false) : getPortraitShape(false);
+ const shape = 'MusicAlbum' == type.type ? getSquareShape(false) : getPortraitShape(false);
html += cardBuilder.getCardsHtml({
items: items,
shape: shape,
@@ -1670,7 +1698,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
});
html += '
';
html += '
';
- var collectionItems = page.querySelector('.collectionItems');
+ const collectionItems = page.querySelector('.collectionItems');
collectionItems.insertAdjacentHTML('beforeend', html);
imageLoader.lazyChildren(collectionItems);
}
@@ -1686,7 +1714,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}).then(function (result) {
if (result.Items.length) {
page.querySelector('#musicVideosCollapsible').classList.remove('hide');
- var musicVideosContent = page.querySelector('.musicVideosContent');
+ const musicVideosContent = page.querySelector('.musicVideosContent');
musicVideosContent.innerHTML = getVideosHtml(result.Items);
imageLoader.lazyChildren(musicVideosContent);
} else {
@@ -1699,7 +1727,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
connectionManager.getApiClient(item.ServerId).getAdditionalVideoParts(user.Id, item.Id).then(function (result) {
if (result.Items.length) {
page.querySelector('#additionalPartsCollapsible').classList.remove('hide');
- var additionalPartsContent = page.querySelector('#additionalPartsContent');
+ const additionalPartsContent = page.querySelector('#additionalPartsContent');
additionalPartsContent.innerHTML = getVideosHtml(result.Items);
imageLoader.lazyChildren(additionalPartsContent);
} else {
@@ -1709,13 +1737,13 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderScenes(page, item) {
- var chapters = item.Chapters || [];
+ let chapters = item.Chapters || [];
if (chapters.length && !chapters[0].ImageTag && (chapters = []), chapters.length) {
page.querySelector('#scenesCollapsible').classList.remove('hide');
- var scenesContent = page.querySelector('#scenesContent');
+ const scenesContent = page.querySelector('#scenesContent');
- require(['chaptercardbuilder'], function (chaptercardbuilder) {
+ import('chaptercardbuilder').then(({default: chaptercardbuilder}) => {
chaptercardbuilder.buildChapterCards(item, chapters, {
itemsContainer: scenesContent,
backdropShape: 'overflowBackdrop',
@@ -1729,7 +1757,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function getVideosHtml(items) {
- var html = cardBuilder.getCardsHtml({
+ const html = cardBuilder.getCardsHtml({
items: items,
shape: 'autooverflow',
showTitle: true,
@@ -1744,14 +1772,14 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
function renderSpecials(page, item, user) {
connectionManager.getApiClient(item.ServerId).getSpecialFeatures(user.Id, item.Id).then(function (specials) {
- var specialsContent = page.querySelector('#specialsContent');
+ const specialsContent = page.querySelector('#specialsContent');
specialsContent.innerHTML = getVideosHtml(specials);
imageLoader.lazyChildren(specialsContent);
});
}
function renderCast(page, item) {
- var people = (item.People || []).filter(function (p) {
+ const people = (item.People || []).filter(function (p) {
return p.Type === 'Actor';
});
@@ -1760,9 +1788,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
page.querySelector('#castCollapsible').classList.remove('hide');
- var castContent = page.querySelector('#castContent');
+ const castContent = page.querySelector('#castContent');
- require(['peoplecardbuilder'], function (peoplecardbuilder) {
+ import('peoplecardbuilder').then(({default: peoplecardbuilder}) => {
peoplecardbuilder.buildPeopleCards(people, {
itemsContainer: castContent,
coverImage: true,
@@ -1774,14 +1802,14 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function itemDetailPage() {
- var self = this;
+ const self = this;
self.setInitialCollapsibleState = setInitialCollapsibleState;
self.renderDetails = renderDetails;
self.renderCast = renderCast;
}
function bindAll(view, selector, eventName, fn) {
- var elems = view.querySelectorAll(selector);
+ const elems = view.querySelectorAll(selector);
for (const elem of elems) {
elem.addEventListener(eventName, fn);
@@ -1794,11 +1822,12 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
window.ItemDetailPage = new itemDetailPage();
- return function (view, params) {
+
+ export default function (view, params) {
function reload(instance, page, params) {
loading.show();
- var apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
+ const apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
Promise.all([getPromise(apiClient, params), apiClient.getCurrentUser()]).then(([item, user]) => {
currentItem = item;
@@ -1809,8 +1838,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function splitVersions(instance, page, apiClient, params) {
- require(['confirm'], function (confirm) {
- confirm.default('Are you sure you wish to split the media sources into separate items?', 'Split Media Apart').then(function () {
+ import('confirm').then(({default: confirm}) => {
+ confirm('Are you sure you wish to split the media sources into separate items?', 'Split Media Apart').then(function () {
loading.show();
apiClient.ajax({
type: 'DELETE',
@@ -1824,7 +1853,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function getPlayOptions(startPosition) {
- var audioStreamIndex = view.querySelector('.selectAudio').value || null;
+ const audioStreamIndex = view.querySelector('.selectAudio').value || null;
return {
startPositionTicks: startPosition,
mediaSourceId: view.querySelector('.selectSource').value,
@@ -1834,7 +1863,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function playItem(item, startPosition) {
- var playOptions = getPlayOptions(startPosition);
+ const playOptions = getPlayOptions(startPosition);
playOptions.items = [item];
playbackManager.play(playOptions);
}
@@ -1844,10 +1873,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function playCurrentItem(button, mode) {
- var item = currentItem;
+ const item = currentItem;
if ('Program' === item.Type) {
- var apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = connectionManager.getApiClient(item.ServerId);
return void apiClient.getLiveTvChannel(item.ChannelId, apiClient.getCurrentUserId()).then(function (channel) {
playbackManager.play({
items: [channel]
@@ -1871,7 +1900,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function onCancelSeriesTimerClick() {
- require(['recordingHelper'], function (recordingHelper) {
+ import('recordingHelper').then(({default: recordingHelper}) => {
recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () {
Dashboard.navigate('livetv.html');
});
@@ -1879,7 +1908,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function onCancelTimerClick() {
- require(['recordingHelper'], function (recordingHelper) {
+ import('recordingHelper').then(({default: recordingHelper}) => {
recordingHelper.cancelTimer(connectionManager.getApiClient(currentItem.ServerId), currentItem.TimerId).then(function () {
reload(self, view, params);
});
@@ -1891,8 +1920,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function onDownloadClick() {
- require(['fileDownloader'], function (fileDownloader) {
- var downloadHref = apiClient.getItemDownloadUrl(currentItem.Id);
+ import('fileDownloader').then(({default: fileDownloader}) => {
+ const downloadHref = apiClient.getItemDownloadUrl(currentItem.Id);
fileDownloader.download([{
url: downloadHref,
itemId: currentItem.Id,
@@ -1902,7 +1931,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function onMoreCommandsClick() {
- var button = this;
+ const button = this;
apiClient.getCurrentUser().then(function (user) {
itemContextMenu.show(getContextMenuOptions(currentItem, user, button)).then(function (result) {
if (result.deleted) {
@@ -1920,11 +1949,11 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function onWebSocketMessage(e, data) {
- var msg = data;
+ const msg = data;
if ('UserDataChanged' === msg.MessageType && currentItem && msg.Data.UserId == apiClient.getCurrentUserId()) {
- var key = currentItem.UserData.Key;
- var userData = msg.Data.UserDataList.filter(function (u) {
+ const key = currentItem.UserData.Key;
+ const userData = msg.Data.UserDataList.filter(function (u) {
return u.Key == key;
})[0];
@@ -1936,9 +1965,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
}
- var currentItem;
- var self = this;
- var apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
+ let currentItem;
+ const self = this;
+ const apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
view.querySelectorAll('.btnPlay');
bindAll(view, '.btnPlay', 'click', onPlayClick);
bindAll(view, '.btnResume', 'click', onPlayClick);
@@ -1959,7 +1988,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
renderSubtitleSelections(view, self._currentPlaybackMediaSources);
});
view.addEventListener('viewshow', function (e) {
- var page = this;
+ const page = this;
libraryMenu.setTransparentMenu(true);
@@ -1985,5 +2014,6 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
self._currentPlaybackMediaSources = null;
self.currentRecordingFields = null;
});
- };
-});
+ }
+
+/* eslint-enable indent */