diff --git a/package.json b/package.json
index 486b7cb44a..b7800ebd62 100644
--- a/package.json
+++ b/package.json
@@ -6,8 +6,8 @@
"license": "GPL-2.0-or-later",
"devDependencies": {
"@babel/core": "^7.11.1",
- "@babel/eslint-parser": "^7.11.0",
- "@babel/eslint-plugin": "^7.11.0",
+ "@babel/eslint-parser": "^7.11.3",
+ "@babel/eslint-plugin": "^7.11.3",
"@babel/plugin-proposal-class-properties": "^7.10.1",
"@babel/plugin-proposal-private-methods": "^7.10.1",
"@babel/plugin-transform-modules-amd": "^7.10.5",
@@ -63,7 +63,7 @@
"fast-text-encoding": "^1.0.3",
"flv.js": "^1.5.0",
"headroom.js": "^0.11.0",
- "hls.js": "^0.14.7",
+ "hls.js": "^0.14.8",
"howler": "^2.2.0",
"intersection-observer": "^0.11.0",
"jellyfin-apiclient": "^1.4.1",
@@ -80,7 +80,7 @@
"sortablejs": "^1.10.2",
"swiper": "^5.4.5",
"webcomponents.js": "^0.7.24",
- "whatwg-fetch": "^3.3.1"
+ "whatwg-fetch": "^3.4.0"
},
"babel": {
"presets": [
@@ -112,6 +112,8 @@
"src/components/filterdialog/filterdialog.js",
"src/components/focusManager.js",
"src/components/groupedcards.js",
+ "src/components/guide/guide.js",
+ "src/components/guide/guide-settings.js",
"src/components/homeScreenSettings/homeScreenSettings.js",
"src/components/homesections/homesections.js",
"src/components/htmlMediaHelper.js",
@@ -125,6 +127,8 @@
"src/components/itemHelper.js",
"src/components/itemidentifier/itemidentifier.js",
"src/components/itemMediaInfo/itemMediaInfo.js",
+ "src/components/itemsrefresher.js",
+ "src/components/layoutManager.js",
"src/components/lazyLoader/lazyLoaderIntersectionObserver.js",
"src/components/libraryoptionseditor/libraryoptionseditor.js",
"src/components/listview/listview.js",
@@ -153,24 +157,37 @@
"src/components/playlisteditor/playlisteditor.js",
"src/components/playmenu.js",
"src/components/prompt/prompt.js",
+ "src/components/recordingcreator/recordingbutton.js",
+ "src/components/recordingcreator/recordingcreator.js",
"src/components/recordingcreator/seriesrecordingeditor.js",
"src/components/recordingcreator/recordinghelper.js",
"src/components/refreshdialog/refreshdialog.js",
+ "src/components/remotecontrol/remotecontrol.js",
"src/components/sanatizefilename.js",
"src/components/scrollManager.js",
"src/plugins/experimentalWarnings/plugin.js",
"src/plugins/htmlVideoPlayer/plugin.js",
"src/plugins/sessionPlayer/plugin.js",
+ "src/plugins/htmlAudioPlayer/plugin.js",
+ "src/plugins/chromecastPlayer/plugin.js",
+ "src/components/slideshow/slideshow.js",
+ "src/components/sortmenu/sortmenu.js",
+ "src/plugins/htmlVideoPlayer/plugin.js",
+ "src/plugins/logoScreensaver/plugin.js",
+ "src/plugins/playAccessValidation/plugin.js",
"src/components/search/searchfields.js",
"src/components/search/searchresults.js",
"src/components/settingshelper.js",
"src/components/shortcuts.js",
+ "src/components/subtitleeditor/subtitleeditor.js",
+ "src/components/subtitlesync/subtitlesync.js",
"src/components/subtitlesettings/subtitleappearancehelper.js",
"src/components/subtitlesettings/subtitlesettings.js",
"src/components/syncPlay/groupSelectionMenu.js",
"src/components/syncPlay/playbackPermissionManager.js",
"src/components/syncPlay/syncPlayManager.js",
"src/components/syncPlay/timeSyncManager.js",
+ "src/components/tabbedview/tabbedview.js",
"src/components/viewManager/viewManager.js",
"src/components/tvproviders/schedulesdirect.js",
"src/components/tvproviders/xmltv.js",
@@ -200,13 +217,16 @@
"src/controllers/music/musicplaylists.js",
"src/controllers/music/musicrecommended.js",
"src/controllers/music/songs.js",
- "src/controllers/dashboard/mediaLibrary.js",
+ "src/controllers/dashboard/library.js",
"src/controllers/dashboard/metadataImages.js",
"src/controllers/dashboard/metadatanfo.js",
"src/controllers/dashboard/networking.js",
"src/controllers/dashboard/notifications/notification.js",
"src/controllers/dashboard/notifications/notifications.js",
"src/controllers/dashboard/playback.js",
+ "src/controllers/dashboard/plugins/add/index.js",
+ "src/controllers/dashboard/plugins/installed/index.js",
+ "src/controllers/dashboard/plugins/available/index.js",
"src/controllers/dashboard/plugins/repositories/index.js",
"src/controllers/dashboard/scheduledtasks/scheduledtask.js",
"src/controllers/dashboard/scheduledtasks/scheduledtasks.js",
@@ -218,6 +238,8 @@
"src/controllers/dashboard/users/userparentalcontrol.js",
"src/controllers/dashboard/users/userpasswordpage.js",
"src/controllers/dashboard/users/userprofilespage.js",
+ "src/controllers/home.js",
+ "src/controllers/list.js",
"src/controllers/edititemmetadata.js",
"src/controllers/favorites.js",
"src/controllers/hometab.js",
@@ -232,6 +254,7 @@
"src/controllers/playback/queue/index.js",
"src/controllers/playback/video/index.js",
"src/controllers/searchpage.js",
+ "src/controllers/livetv/livetvguide.js",
"src/controllers/livetvtuner.js",
"src/controllers/livetvstatus.js",
"src/controllers/livetvguideprovider.js",
@@ -278,6 +301,7 @@
"src/elements/emby-tabs/emby-tabs.js",
"src/elements/emby-textarea/emby-textarea.js",
"src/elements/emby-toggle/emby-toggle.js",
+ "src/libraries/screensavermanager.js",
"src/libraries/navdrawer/navdrawer.js",
"src/libraries/scroller.js",
"src/plugins/backdropScreensaver/plugin.js",
@@ -297,11 +321,14 @@
"src/scripts/filesystem.js",
"src/scripts/globalize.js",
"src/scripts/imagehelper.js",
+ "src/scripts/itembynamedetailpage.js",
"src/scripts/inputManager.js",
"src/scripts/autoThemes.js",
"src/scripts/themeManager.js",
"src/scripts/keyboardNavigation.js",
+ "src/scripts/libraryMenu.js",
"src/scripts/libraryBrowser.js",
+ "src/scripts/livetvcomponents.js",
"src/scripts/mouseManager.js",
"src/scripts/multiDownload.js",
"src/scripts/playlists.js",
diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js
index 37fb66e0d9..df74dc2a16 100644
--- a/src/components/filtermenu/filtermenu.js
+++ b/src/components/filtermenu/filtermenu.js
@@ -2,6 +2,8 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
'use strict';
focusManager = focusManager.default || focusManager;
+ layoutManager = layoutManager.default || layoutManager;
+
function onSubmit(e) {
e.preventDefault();
return false;
diff --git a/src/components/guide/guide-settings.js b/src/components/guide/guide-settings.js
index a644c9c9b0..35f0d3e06e 100644
--- a/src/components/guide/guide-settings.js
+++ b/src/components/guide/guide-settings.js
@@ -1,149 +1,149 @@
-define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectionManager', 'require', 'loading', 'scrollHelper', 'emby-checkbox', 'emby-radio', 'css!./../formdialog', 'material-icons'], function (dialogHelper, globalize, userSettings, layoutManager, connectionManager, require, loading, scrollHelper) {
- 'use strict';
+import dialogHelper from 'dialogHelper';
+import globalize from 'globalize';
+import * as userSettings from 'userSettings';
+import layoutManager from 'layoutManager';
+import scrollHelper from 'scrollHelper';
+import 'emby-checkbox';
+import 'emby-radio';
+import 'css!./../formdialog';
+import 'material-icons';
- scrollHelper = scrollHelper.default || scrollHelper;
+function saveCategories(context, options) {
+ const categories = [];
- function saveCategories(context, options) {
- var categories = [];
+ const chkCategorys = context.querySelectorAll('.chkCategory');
+ for (const chkCategory of chkCategorys) {
+ const type = chkCategory.getAttribute('data-type');
- var chkCategorys = context.querySelectorAll('.chkCategory');
- for (var i = 0, length = chkCategorys.length; i < length; i++) {
- var type = chkCategorys[i].getAttribute('data-type');
-
- if (chkCategorys[i].checked) {
- categories.push(type);
- }
- }
-
- if (categories.length >= 4) {
- categories.push('series');
- }
-
- // differentiate between none and all
- categories.push('all');
- options.categories = categories;
- }
-
- function loadCategories(context, options) {
- var selectedCategories = options.categories || [];
-
- var chkCategorys = context.querySelectorAll('.chkCategory');
- for (var i = 0, length = chkCategorys.length; i < length; i++) {
- var type = chkCategorys[i].getAttribute('data-type');
-
- chkCategorys[i].checked = !selectedCategories.length || selectedCategories.indexOf(type) !== -1;
+ if (chkCategory.checked) {
+ categories.push(type);
}
}
- function save(context) {
- var i;
- var length;
+ if (categories.length >= 4) {
+ categories.push('series');
+ }
- var chkIndicators = context.querySelectorAll('.chkIndicator');
- for (i = 0, length = chkIndicators.length; i < length; i++) {
- var type = chkIndicators[i].getAttribute('data-type');
- userSettings.set('guide-indicator-' + type, chkIndicators[i].checked);
+ // differentiate between none and all
+ categories.push('all');
+ options.categories = categories;
+}
+
+function loadCategories(context, options) {
+ const selectedCategories = options.categories || [];
+
+ const chkCategorys = context.querySelectorAll('.chkCategory');
+ for (const chkCategory of chkCategorys) {
+ const type = chkCategory.getAttribute('data-type');
+
+ chkCategory.checked = !selectedCategories.length || selectedCategories.indexOf(type) !== -1;
+ }
+}
+
+function save(context) {
+ const chkIndicators = context.querySelectorAll('.chkIndicator');
+
+ for (const chkIndicator of chkIndicators) {
+ const type = chkIndicator.getAttribute('data-type');
+ userSettings.set('guide-indicator-' + type, chkIndicator.checked);
+ }
+
+ userSettings.set('guide-colorcodedbackgrounds', context.querySelector('.chkColorCodedBackgrounds').checked);
+ userSettings.set('livetv-favoritechannelsattop', context.querySelector('.chkFavoriteChannelsAtTop').checked);
+
+ const sortBys = context.querySelectorAll('.chkSortOrder');
+ for (const sortBy of sortBys) {
+ if (sortBy.checked) {
+ userSettings.set('livetv-channelorder', sortBy.value);
+ break;
}
+ }
+}
- userSettings.set('guide-colorcodedbackgrounds', context.querySelector('.chkColorCodedBackgrounds').checked);
- userSettings.set('livetv-favoritechannelsattop', context.querySelector('.chkFavoriteChannelsAtTop').checked);
+function load(context) {
+ const chkIndicators = context.querySelectorAll('.chkIndicator');
- var sortBys = context.querySelectorAll('.chkSortOrder');
- for (i = 0, length = sortBys.length; i < length; i++) {
- if (sortBys[i].checked) {
- userSettings.set('livetv-channelorder', sortBys[i].value);
- break;
- }
+ for (const chkIndicator of chkIndicators) {
+ const type = chkIndicator.getAttribute('data-type');
+
+ if (chkIndicator.getAttribute('data-default') === 'true') {
+ chkIndicator.checked = userSettings.get('guide-indicator-' + type) !== 'false';
+ } else {
+ chkIndicator.checked = userSettings.get('guide-indicator-' + type) === 'true';
}
}
- function load(context) {
- var i;
- var length;
+ context.querySelector('.chkColorCodedBackgrounds').checked = userSettings.get('guide-colorcodedbackgrounds') === 'true';
+ context.querySelector('.chkFavoriteChannelsAtTop').checked = userSettings.get('livetv-favoritechannelsattop') !== 'false';
- var chkIndicators = context.querySelectorAll('.chkIndicator');
- for (i = 0, length = chkIndicators.length; i < length; i++) {
- var type = chkIndicators[i].getAttribute('data-type');
+ const sortByValue = userSettings.get('livetv-channelorder') || 'Number';
- if (chkIndicators[i].getAttribute('data-default') === 'true') {
- chkIndicators[i].checked = userSettings.get('guide-indicator-' + type) !== 'false';
+ const sortBys = context.querySelectorAll('.chkSortOrder');
+ for (const sortBy of sortBys) {
+ sortBy.checked = sortBy.value === sortByValue;
+ }
+}
+
+function showEditor(options) {
+ return new Promise(function (resolve, reject) {
+ let settingsChanged = false;
+
+ import('text!./guide-settings.template.html').then(({ default: template }) => {
+ const dialogOptions = {
+ removeOnClose: true,
+ scrollY: false
+ };
+
+ if (layoutManager.tv) {
+ dialogOptions.size = 'fullscreen';
} else {
- chkIndicators[i].checked = userSettings.get('guide-indicator-' + type) === 'true';
+ dialogOptions.size = 'small';
}
- }
- context.querySelector('.chkColorCodedBackgrounds').checked = userSettings.get('guide-colorcodedbackgrounds') === 'true';
- context.querySelector('.chkFavoriteChannelsAtTop').checked = userSettings.get('livetv-favoritechannelsattop') !== 'false';
+ const dlg = dialogHelper.createDialog(dialogOptions);
- var sortByValue = userSettings.get('livetv-channelorder') || 'Number';
+ dlg.classList.add('formDialog');
- var sortBys = context.querySelectorAll('.chkSortOrder');
- for (i = 0, length = sortBys.length; i < length; i++) {
- sortBys[i].checked = sortBys[i].value === sortByValue;
- }
- }
+ let html = '';
- function showEditor(options) {
- return new Promise(function (resolve, reject) {
- var settingsChanged = false;
+ html += globalize.translateHtml(template, 'core');
- require(['text!./guide-settings.template.html'], function (template) {
- var dialogOptions = {
- removeOnClose: true,
- scrollY: false
- };
+ dlg.innerHTML = html;
- if (layoutManager.tv) {
- dialogOptions.size = 'fullscreen';
- } else {
- dialogOptions.size = 'small';
- }
-
- var dlg = dialogHelper.createDialog(dialogOptions);
-
- dlg.classList.add('formDialog');
-
- var html = '';
-
- html += globalize.translateHtml(template, 'core');
-
- dlg.innerHTML = html;
-
- dlg.addEventListener('change', function () {
- settingsChanged = true;
- });
-
- dlg.addEventListener('close', function () {
- if (layoutManager.tv) {
- scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);
- }
-
- save(dlg);
- saveCategories(dlg, options);
-
- if (settingsChanged) {
- resolve();
- } else {
- reject();
- }
- });
-
- dlg.querySelector('.btnCancel').addEventListener('click', function () {
- dialogHelper.close(dlg);
- });
-
- if (layoutManager.tv) {
- scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
- }
-
- load(dlg);
- loadCategories(dlg, options);
- dialogHelper.open(dlg);
+ dlg.addEventListener('change', function () {
+ settingsChanged = true;
});
- });
- }
- return {
- show: showEditor
- };
-});
+ dlg.addEventListener('close', function () {
+ if (layoutManager.tv) {
+ scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);
+ }
+
+ save(dlg);
+ saveCategories(dlg, options);
+
+ if (settingsChanged) {
+ resolve();
+ } else {
+ reject();
+ }
+ });
+
+ dlg.querySelector('.btnCancel').addEventListener('click', function () {
+ dialogHelper.close(dlg);
+ });
+
+ if (layoutManager.tv) {
+ scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
+ }
+
+ load(dlg);
+ loadCategories(dlg, options);
+ dialogHelper.open(dlg);
+ });
+ });
+}
+
+export default {
+ show: showEditor
+};
diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js
index 05fa2b608d..a7b32d887d 100644
--- a/src/components/guide/guide.js
+++ b/src/components/guide/guide.js
@@ -1,1181 +1,1198 @@
-define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', 'scrollHelper', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'playbackManager', 'userSettings', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'dom', 'css!./guide.css', 'programStyles', 'material-icons', 'scrollStyles', 'emby-programcell', 'emby-button', 'paper-icon-button-light', 'emby-tabs', 'emby-scroller', 'flexStyles', 'webcomponents'], function (require, inputManager, browser, globalize, connectionManager, scrollHelper, serverNotifications, loading, datetime, focusManager, playbackManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, dom) {
- 'use strict';
+import inputManager from 'inputManager';
+import browser from 'browser';
+import globalize from 'globalize';
+import connectionManager from 'connectionManager';
+import scrollHelper from 'scrollHelper';
+import serverNotifications from 'serverNotifications';
+import loading from 'loading';
+import datetime from 'datetime';
+import focusManager from 'focusManager';
+import playbackManager from 'playbackManager';
+import * as userSettings from 'userSettings';
+import imageLoader from 'imageLoader';
+import events from 'events';
+import layoutManager from 'layoutManager';
+import itemShortcuts from 'itemShortcuts';
+import dom from 'dom';
+import 'css!./guide.css';
+import 'programStyles';
+import 'material-icons';
+import 'scrollStyles';
+import 'emby-programcell';
+import 'emby-button';
+import 'paper-icon-button-light';
+import 'emby-tabs';
+import 'emby-scroller';
+import 'flexStyles';
+import 'webcomponents';
- playbackManager = playbackManager.default || playbackManager;
- browser = browser.default || browser;
- loading = loading.default || loading;
- focusManager = focusManager.default || focusManager;
- scrollHelper = scrollHelper.default || scrollHelper;
- serverNotifications = serverNotifications.default || serverNotifications;
-
- function showViewSettings(instance) {
- require(['guide-settings-dialog'], function (guideSettingsDialog) {
- guideSettingsDialog.show(instance.categoryOptions).then(function () {
- instance.refresh();
- });
+function showViewSettings(instance) {
+ import('guide-settings-dialog').then(({default: guideSettingsDialog}) => {
+ guideSettingsDialog.show(instance.categoryOptions).then(function () {
+ instance.refresh();
});
+ });
+}
+
+function updateProgramCellOnScroll(cell, scrollPct) {
+ let left = cell.posLeft;
+ if (!left) {
+ left = parseFloat(cell.style.left.replace('%', ''));
+ cell.posLeft = left;
+ }
+ let width = cell.posWidth;
+ if (!width) {
+ width = parseFloat(cell.style.width.replace('%', ''));
+ cell.posWidth = width;
}
- function updateProgramCellOnScroll(cell, scrollPct) {
- var left = cell.posLeft;
- if (!left) {
- left = parseFloat(cell.style.left.replace('%', ''));
- cell.posLeft = left;
- }
- var width = cell.posWidth;
- if (!width) {
- width = parseFloat(cell.style.width.replace('%', ''));
- cell.posWidth = width;
- }
+ const right = left + width;
+ const newPct = Math.max(Math.min(scrollPct, right), left);
- var right = left + width;
- var newPct = Math.max(Math.min(scrollPct, right), left);
+ const offset = newPct - left;
+ const pctOfWidth = (offset / width) * 100;
- var offset = newPct - left;
- var pctOfWidth = (offset / width) * 100;
-
- var guideProgramName = cell.guideProgramName;
- if (!guideProgramName) {
- guideProgramName = cell.querySelector('.guideProgramName');
- cell.guideProgramName = guideProgramName;
- }
-
- var caret = cell.caret;
- if (!caret) {
- caret = cell.querySelector('.guide-programNameCaret');
- cell.caret = caret;
- }
-
- if (guideProgramName) {
- if (pctOfWidth > 0 && pctOfWidth <= 100) {
- guideProgramName.style.transform = 'translateX(' + pctOfWidth + '%)';
- caret.classList.remove('hide');
- } else {
- guideProgramName.style.transform = 'none';
- caret.classList.add('hide');
- }
- }
+ let guideProgramName = cell.guideProgramName;
+ if (!guideProgramName) {
+ guideProgramName = cell.querySelector('.guideProgramName');
+ cell.guideProgramName = guideProgramName;
}
- var isUpdatingProgramCellScroll = false;
- function updateProgramCellsOnScroll(programGrid, programCells) {
- if (isUpdatingProgramCellScroll) {
- return;
- }
-
- isUpdatingProgramCellScroll = true;
-
- requestAnimationFrame(function () {
- var scrollLeft = programGrid.scrollLeft;
-
- var scrollPct = scrollLeft ? (scrollLeft / programGrid.scrollWidth) * 100 : 0;
-
- for (var i = 0, length = programCells.length; i < length; i++) {
- updateProgramCellOnScroll(programCells[i], scrollPct);
- }
-
- isUpdatingProgramCellScroll = false;
- });
+ let caret = cell.caret;
+ if (!caret) {
+ caret = cell.querySelector('.guide-programNameCaret');
+ cell.caret = caret;
}
- function onProgramGridClick(e) {
- if (!layoutManager.tv) {
- return;
- }
-
- var programCell = dom.parentWithClass(e.target, 'programCell');
- if (programCell) {
- var startDate = programCell.getAttribute('data-startdate');
- var endDate = programCell.getAttribute('data-enddate');
- startDate = datetime.parseISO8601Date(startDate, { toLocal: true }).getTime();
- endDate = datetime.parseISO8601Date(endDate, { toLocal: true }).getTime();
-
- var now = new Date().getTime();
- if (now >= startDate && now < endDate) {
- var channelId = programCell.getAttribute('data-channelid');
- var serverId = programCell.getAttribute('data-serverid');
-
- e.preventDefault();
- e.stopPropagation();
-
- playbackManager.play({
- ids: [channelId],
- serverId: serverId
- });
- }
+ if (guideProgramName) {
+ if (pctOfWidth > 0 && pctOfWidth <= 100) {
+ guideProgramName.style.transform = 'translateX(' + pctOfWidth + '%)';
+ caret.classList.remove('hide');
+ } else {
+ guideProgramName.style.transform = 'none';
+ caret.classList.add('hide');
}
}
+}
- function Guide(options) {
- var self = this;
- var items = {};
+let isUpdatingProgramCellScroll = false;
+function updateProgramCellsOnScroll(programGrid, programCells) {
+ if (isUpdatingProgramCellScroll) {
+ return;
+ }
- self.options = options;
- self.categoryOptions = { categories: [] };
+ isUpdatingProgramCellScroll = true;
- // 30 mins
- var cellCurationMinutes = 30;
- var cellDurationMs = cellCurationMinutes * 60 * 1000;
- var msPerDay = 86400000;
+ requestAnimationFrame(function () {
+ const scrollLeft = programGrid.scrollLeft;
- var currentDate;
- var currentStartIndex = 0;
- var currentChannelLimit = 0;
- var autoRefreshInterval;
- var programCells;
- var lastFocusDirection;
- var programGrid;
+ const scrollPct = scrollLeft ? (scrollLeft / programGrid.scrollWidth) * 100 : 0;
- self.refresh = function () {
- currentDate = null;
- reloadPage(options.element);
- restartAutoRefresh();
- };
-
- self.pause = function () {
- stopAutoRefresh();
- };
-
- self.resume = function (refreshData) {
- if (refreshData) {
- self.refresh();
- } else {
- restartAutoRefresh();
- }
- };
-
- self.destroy = function () {
- stopAutoRefresh();
-
- events.off(serverNotifications, 'TimerCreated', onTimerCreated);
- events.off(serverNotifications, 'SeriesTimerCreated', onSeriesTimerCreated);
- events.off(serverNotifications, 'TimerCancelled', onTimerCancelled);
- events.off(serverNotifications, 'SeriesTimerCancelled', onSeriesTimerCancelled);
-
- setScrollEvents(options.element, false);
- itemShortcuts.off(options.element);
- items = {};
- };
-
- function restartAutoRefresh() {
- stopAutoRefresh();
-
- var intervalMs = 60000 * 15; // (minutes)
-
- autoRefreshInterval = setInterval(function () {
- self.refresh();
- }, intervalMs);
+ for (const programCell of programCells) {
+ updateProgramCellOnScroll(programCell, scrollPct);
}
- function stopAutoRefresh() {
- if (autoRefreshInterval) {
- clearInterval(autoRefreshInterval);
- autoRefreshInterval = null;
- }
- }
-
- function normalizeDateToTimeslot(date) {
- var minutesOffset = date.getMinutes() - cellCurationMinutes;
-
- if (minutesOffset >= 0) {
- date.setHours(date.getHours(), cellCurationMinutes, 0, 0);
- } else {
- date.setHours(date.getHours(), 0, 0, 0);
- }
-
- return date;
- }
-
- function showLoading() {
- loading.show();
- }
-
- function hideLoading() {
- loading.hide();
- }
-
- function reloadGuide(context, newStartDate, scrollToTimeMs, focusToTimeMs, startTimeOfDayMs, focusProgramOnRender) {
- var apiClient = connectionManager.getApiClient(options.serverId);
-
- var channelQuery = {
-
- StartIndex: 0,
- EnableFavoriteSorting: userSettings.get('livetv-favoritechannelsattop') !== 'false'
- };
-
- channelQuery.UserId = apiClient.getCurrentUserId();
-
- var channelLimit = 500;
- currentChannelLimit = channelLimit;
-
- showLoading();
-
- channelQuery.StartIndex = currentStartIndex;
- channelQuery.Limit = channelLimit;
- channelQuery.AddCurrentProgram = false;
- channelQuery.EnableUserData = false;
- channelQuery.EnableImageTypes = 'Primary';
-
- var categories = self.categoryOptions.categories || [];
- var displayMovieContent = !categories.length || categories.indexOf('movies') !== -1;
- var displaySportsContent = !categories.length || categories.indexOf('sports') !== -1;
- var displayNewsContent = !categories.length || categories.indexOf('news') !== -1;
- var displayKidsContent = !categories.length || categories.indexOf('kids') !== -1;
- var displaySeriesContent = !categories.length || categories.indexOf('series') !== -1;
-
- if (displayMovieContent && displaySportsContent && displayNewsContent && displayKidsContent) {
- channelQuery.IsMovie = null;
- channelQuery.IsSports = null;
- channelQuery.IsKids = null;
- channelQuery.IsNews = null;
- channelQuery.IsSeries = null;
- } else {
- if (displayNewsContent) {
- channelQuery.IsNews = true;
- }
- if (displaySportsContent) {
- channelQuery.IsSports = true;
- }
- if (displayKidsContent) {
- channelQuery.IsKids = true;
- }
- if (displayMovieContent) {
- channelQuery.IsMovie = true;
- }
- if (displaySeriesContent) {
- channelQuery.IsSeries = true;
- }
- }
-
- if (userSettings.get('livetv-channelorder') === 'DatePlayed') {
- channelQuery.SortBy = 'DatePlayed';
- channelQuery.SortOrder = 'Descending';
- } else {
- channelQuery.SortBy = null;
- channelQuery.SortOrder = null;
- }
-
- var date = newStartDate;
- // Add one second to avoid getting programs that are just ending
- date = new Date(date.getTime() + 1000);
-
- // Subtract to avoid getting programs that are starting when the grid ends
- var nextDay = new Date(date.getTime() + msPerDay - 2000);
-
- // Normally we'd want to just let responsive css handle this,
- // but since mobile browsers are often underpowered,
- // it can help performance to get them out of the markup
- var allowIndicators = dom.getWindowSize().innerWidth >= 600;
-
- var renderOptions = {
- showHdIcon: allowIndicators && userSettings.get('guide-indicator-hd') === 'true',
- showLiveIndicator: allowIndicators && userSettings.get('guide-indicator-live') !== 'false',
- showPremiereIndicator: allowIndicators && userSettings.get('guide-indicator-premiere') !== 'false',
- showNewIndicator: allowIndicators && userSettings.get('guide-indicator-new') !== 'false',
- showRepeatIndicator: allowIndicators && userSettings.get('guide-indicator-repeat') === 'true',
- showEpisodeTitle: layoutManager.tv ? false : true
- };
-
- apiClient.getLiveTvChannels(channelQuery).then(function (channelsResult) {
- var btnPreviousPage = context.querySelector('.btnPreviousPage');
- var btnNextPage = context.querySelector('.btnNextPage');
-
- if (channelsResult.TotalRecordCount > channelLimit) {
- context.querySelector('.guideOptions').classList.remove('hide');
-
- btnPreviousPage.classList.remove('hide');
- btnNextPage.classList.remove('hide');
-
- if (channelQuery.StartIndex) {
- context.querySelector('.btnPreviousPage').disabled = false;
- } else {
- context.querySelector('.btnPreviousPage').disabled = true;
- }
-
- if ((channelQuery.StartIndex + channelLimit) < channelsResult.TotalRecordCount) {
- btnNextPage.disabled = false;
- } else {
- btnNextPage.disabled = true;
- }
- } else {
- context.querySelector('.guideOptions').classList.add('hide');
- }
-
- var programFields = [];
-
- var programQuery = {
- UserId: apiClient.getCurrentUserId(),
- MaxStartDate: nextDay.toISOString(),
- MinEndDate: date.toISOString(),
- channelIds: channelsResult.Items.map(function (c) {
- return c.Id;
- }).join(','),
- ImageTypeLimit: 1,
- EnableImages: false,
- //EnableImageTypes: layoutManager.tv ? "Primary,Backdrop" : "Primary",
- SortBy: 'StartDate',
- EnableTotalRecordCount: false,
- EnableUserData: false
- };
-
- if (renderOptions.showHdIcon) {
- programFields.push('IsHD');
- }
-
- if (programFields.length) {
- programQuery.Fields = programFields.join('');
- }
-
- apiClient.getLiveTvPrograms(programQuery).then(function (programsResult) {
- renderGuide(context, date, channelsResult.Items, programsResult.Items, renderOptions, apiClient, scrollToTimeMs, focusToTimeMs, startTimeOfDayMs, focusProgramOnRender);
-
- hideLoading();
- });
- });
- }
-
- function getDisplayTime(date) {
- if ((typeof date).toString().toLowerCase() === 'string') {
- try {
- date = datetime.parseISO8601Date(date, { toLocal: true });
- } catch (err) {
- return date;
- }
- }
-
- return datetime.getDisplayTime(date).toLowerCase();
- }
-
- function getTimeslotHeadersHtml(startDate, endDateTime) {
- var html = '';
-
- // clone
- startDate = new Date(startDate.getTime());
-
- html += '
';
+ html += '';
}
- if (a.name > b.name) {
- return 1;
- } else if (b.name > a.name) {
- return -1;
- }
- return 0;
- });
-
- var currentCategory = null;
- var html = '';
-
- for (var i = 0; i < availablePlugins.length; i++) {
- var plugin = availablePlugins[i];
- var category = plugin.categoryDisplayName;
- if (category != currentCategory) {
- if (currentCategory) {
- html += '';
- html += '';
- }
- html += '";
- html += '
';
- html += '
';
- html += '
';
- return html;
- }
-
- function renderPlugins(page, plugins) {
- ApiClient.getJSON(ApiClient.getUrl('web/configurationpages') + '?pageType=PluginConfiguration').then(function (configPages) {
- populateList(page, plugins, configPages);
- });
- }
-
- function populateList(page, plugins, pluginConfigurationPages) {
- plugins = plugins.sort(function (plugin1, plugin2) {
- if (plugin1.Name > plugin2.Name) {
- return 1;
- }
-
- return -1;
- });
-
- var html = plugins.map(function (p) {
- return getPluginCardHtml(p, pluginConfigurationPages);
- }).join('');
-
- var installedPluginsElement = page.querySelector('.installedPlugins');
- installedPluginsElement.removeEventListener('click', onInstalledPluginsClick);
- installedPluginsElement.addEventListener('click', onInstalledPluginsClick);
-
- if (plugins.length) {
- installedPluginsElement.classList.add('itemsContainer');
- installedPluginsElement.classList.add('vertical-wrap');
- } else {
- html += '
';
- }
-
- installedPluginsElement.innerHTML = html;
- loading.hide();
- }
-
- function showPluginMenu(page, elem) {
- var card = dom.parentWithClass(elem, 'card');
- var id = card.getAttribute('data-id');
- var name = card.getAttribute('data-name');
- var removable = card.getAttribute('data-removable');
- var configHref = card.querySelector('.cardContent').getAttribute('href');
- var menuItems = [];
-
- if (configHref) {
- menuItems.push({
- name: globalize.translate('ButtonSettings'),
- id: 'open',
- icon: 'mode_edit'
- });
- }
-
- if (removable === 'true') {
- menuItems.push({
- name: globalize.translate('ButtonUninstall'),
- id: 'delete',
- icon: 'delete'
- });
- }
-
- require(['actionsheet'], function (actionsheet) {
- actionsheet.show({
- items: menuItems,
- positionTo: elem,
- callback: function (resultId) {
- switch (resultId) {
- case 'open':
- Dashboard.navigate(configHref);
- break;
- case 'delete':
- deletePlugin(page, id, name);
- break;
- }
- }
- });
- });
- }
-
- function reloadList(page) {
- loading.show();
- ApiClient.getInstalledPlugins().then(function (plugins) {
- renderPlugins(page, plugins);
- });
- }
-
- function getTabs() {
- return [{
- href: 'installedplugins.html',
- name: globalize.translate('TabMyPlugins')
- }, {
- href: 'availableplugins.html',
- name: globalize.translate('TabCatalog')
- }, {
- href: 'repositories.html',
- name: globalize.translate('TabRepositories')
- }];
- }
-
- function onInstalledPluginsClick(e) {
- if (dom.parentWithClass(e.target, 'noConfigPluginCard')) {
- showNoConfigurationMessage();
- } else if (dom.parentWithClass(e.target, 'connectModePluginCard')) {
- showConnectMessage();
- } else {
- var btnCardMenu = dom.parentWithClass(e.target, 'btnCardMenu');
- if (btnCardMenu) {
- showPluginMenu(dom.parentWithClass(btnCardMenu, 'page'), btnCardMenu);
- }
- }
- }
-
- pageIdOn('pageshow', 'pluginsPage', function () {
- libraryMenu.setTabs('plugins', 0, getTabs);
- reloadList(this);
+ return -1;
});
- window.PluginsPage = {
- renderPlugins: renderPlugins
- };
+ let html = plugins.map(function (p) {
+ return getPluginCardHtml(p, pluginConfigurationPages);
+ }).join('');
+
+ const installedPluginsElement = page.querySelector('.installedPlugins');
+ installedPluginsElement.removeEventListener('click', onInstalledPluginsClick);
+ installedPluginsElement.addEventListener('click', onInstalledPluginsClick);
+
+ if (plugins.length) {
+ installedPluginsElement.classList.add('itemsContainer');
+ installedPluginsElement.classList.add('vertical-wrap');
+ } else {
+ html += '
';
+ }
+
+ installedPluginsElement.innerHTML = html;
+ loading.hide();
+}
+
+function showPluginMenu(page, elem) {
+ const card = dom.parentWithClass(elem, 'card');
+ const id = card.getAttribute('data-id');
+ const name = card.getAttribute('data-name');
+ const removable = card.getAttribute('data-removable');
+ const configHref = card.querySelector('.cardContent').getAttribute('href');
+ const menuItems = [];
+
+ if (configHref) {
+ menuItems.push({
+ name: globalize.translate('ButtonSettings'),
+ id: 'open',
+ icon: 'mode_edit'
+ });
+ }
+
+ if (removable === 'true') {
+ menuItems.push({
+ name: globalize.translate('ButtonUninstall'),
+ id: 'delete',
+ icon: 'delete'
+ });
+ }
+
+ import('actionsheet').then(({default: actionsheet}) => {
+ actionsheet.show({
+ items: menuItems,
+ positionTo: elem,
+ callback: function (resultId) {
+ switch (resultId) {
+ case 'open':
+ Dashboard.navigate(configHref);
+ break;
+ case 'delete':
+ deletePlugin(page, id, name);
+ break;
+ }
+ }
+ });
+ });
+}
+
+function reloadList(page) {
+ loading.show();
+ ApiClient.getInstalledPlugins().then(function (plugins) {
+ renderPlugins(page, plugins);
+ });
+}
+
+function getTabs() {
+ return [{
+ href: 'installedplugins.html',
+ name: globalize.translate('TabMyPlugins')
+ }, {
+ href: 'availableplugins.html',
+ name: globalize.translate('TabCatalog')
+ }, {
+ href: 'repositories.html',
+ name: globalize.translate('TabRepositories')
+ }];
+}
+
+function onInstalledPluginsClick(e) {
+ if (dom.parentWithClass(e.target, 'noConfigPluginCard')) {
+ showNoConfigurationMessage();
+ } else if (dom.parentWithClass(e.target, 'connectModePluginCard')) {
+ showConnectMessage();
+ } else {
+ const btnCardMenu = dom.parentWithClass(e.target, 'btnCardMenu');
+ if (btnCardMenu) {
+ showPluginMenu(dom.parentWithClass(btnCardMenu, 'page'), btnCardMenu);
+ }
+ }
+}
+
+pageIdOn('pageshow', 'pluginsPage', function () {
+ libraryMenu.setTabs('plugins', 0, getTabs);
+ reloadList(this);
});
+
+window.PluginsPage = {
+ renderPlugins: renderPlugins
+};
diff --git a/src/scheduledtask.html b/src/controllers/dashboard/scheduledtasks/scheduledtask.html
similarity index 100%
rename from src/scheduledtask.html
rename to src/controllers/dashboard/scheduledtasks/scheduledtask.html
diff --git a/src/scheduledtasks.html b/src/controllers/dashboard/scheduledtasks/scheduledtasks.html
similarity index 100%
rename from src/scheduledtasks.html
rename to src/controllers/dashboard/scheduledtasks/scheduledtasks.html
diff --git a/src/serveractivity.html b/src/controllers/dashboard/serveractivity.html
similarity index 100%
rename from src/serveractivity.html
rename to src/controllers/dashboard/serveractivity.html
diff --git a/src/streamingsettings.html b/src/controllers/dashboard/streaming.html
similarity index 100%
rename from src/streamingsettings.html
rename to src/controllers/dashboard/streaming.html
diff --git a/src/useredit.html b/src/controllers/dashboard/users/useredit.html
similarity index 100%
rename from src/useredit.html
rename to src/controllers/dashboard/users/useredit.html
diff --git a/src/userlibraryaccess.html b/src/controllers/dashboard/users/userlibraryaccess.html
similarity index 100%
rename from src/userlibraryaccess.html
rename to src/controllers/dashboard/users/userlibraryaccess.html
diff --git a/src/usernew.html b/src/controllers/dashboard/users/usernew.html
similarity index 100%
rename from src/usernew.html
rename to src/controllers/dashboard/users/usernew.html
diff --git a/src/userparentalcontrol.html b/src/controllers/dashboard/users/userparentalcontrol.html
similarity index 100%
rename from src/userparentalcontrol.html
rename to src/controllers/dashboard/users/userparentalcontrol.html
diff --git a/src/userpassword.html b/src/controllers/dashboard/users/userpassword.html
similarity index 100%
rename from src/userpassword.html
rename to src/controllers/dashboard/users/userpassword.html
diff --git a/src/userprofiles.html b/src/controllers/dashboard/users/userprofiles.html
similarity index 100%
rename from src/userprofiles.html
rename to src/controllers/dashboard/users/userprofiles.html
diff --git a/src/edititemmetadata.html b/src/controllers/edititemmetadata.html
similarity index 100%
rename from src/edititemmetadata.html
rename to src/controllers/edititemmetadata.html
diff --git a/src/home.html b/src/controllers/home.html
similarity index 100%
rename from src/home.html
rename to src/controllers/home.html
diff --git a/src/controllers/home.js b/src/controllers/home.js
index b615b3609d..72e326e46b 100644
--- a/src/controllers/home.js
+++ b/src/controllers/home.js
@@ -1,7 +1,33 @@
-define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby-scroller'], function (TabbedView, globalize, require) {
- 'use strict';
+import TabbedView from 'tabbedView';
+import globalize from 'globalize';
+import 'emby-tabs';
+import 'emby-button';
+import 'emby-scroller';
- function getTabs() {
+class HomeView extends TabbedView {
+ constructor(view, params) {
+ super(view, params);
+ }
+
+ setTitle() {
+ Emby.Page.setTitle(null);
+ }
+
+ onPause() {
+ super.onPause(this);
+ document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader');
+ }
+
+ onResume(options) {
+ super.onResume(this, options);
+ document.querySelector('.skinHeader').classList.add('noHomeButtonHeader');
+ }
+
+ getDefaultTabIndex() {
+ return 0;
+ }
+
+ getTabs() {
return [{
name: globalize.translate('Home')
}, {
@@ -9,67 +35,34 @@ define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby-
}];
}
- function getDefaultTabIndex() {
- return 0;
- }
-
- function getRequirePromise(deps) {
- return new Promise(function (resolve, reject) {
- require(deps, resolve);
- });
- }
-
- function getTabController(index) {
+ getTabController(index) {
if (index == null) {
throw new Error('index cannot be null');
}
- var depends = [];
+ let depends = '';
switch (index) {
case 0:
- depends.push('controllers/hometab');
+ depends = 'controllers/hometab';
break;
case 1:
- depends.push('controllers/favorites');
+ depends = 'controllers/favorites';
}
- var instance = this;
- return getRequirePromise(depends).then(function (controllerFactory) {
- var controller = instance.tabControllers[index];
+ const instance = this;
+ return import(depends).then(({ default: controllerFactory }) => {
+ let controller = instance.tabControllers[index];
if (!controller) {
- controller = new controllerFactory.default(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;
}
return controller;
});
}
+}
- function HomeView(view, params) {
- TabbedView.call(this, view, params);
- }
-
- Object.assign(HomeView.prototype, TabbedView.prototype);
- HomeView.prototype.getTabs = getTabs;
- HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex;
- HomeView.prototype.getTabController = getTabController;
-
- HomeView.prototype.setTitle = function () {
- Emby.Page.setTitle(null);
- };
-
- HomeView.prototype.onPause = function () {
- TabbedView.prototype.onPause.call(this);
- document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader');
- };
-
- HomeView.prototype.onResume = function (options) {
- TabbedView.prototype.onResume.call(this, options);
- document.querySelector('.skinHeader').classList.add('noHomeButtonHeader');
- };
-
- return HomeView;
-});
+export default HomeView;
diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js
index df2855d69a..b2cdc63234 100644
--- a/src/controllers/itemDetails/index.js
+++ b/src/controllers/itemDetails/index.js
@@ -1,3 +1,4 @@
+import appHost from 'apphost';
import loading from 'loading';
import appRouter from 'appRouter';
import layoutManager from 'layoutManager';
@@ -657,7 +658,7 @@ import 'emby-select';
setPeopleHeader(page, item);
loading.hide();
- if (item.Type === 'Book') {
+ if (item.Type === 'Book' && item.CanDownload && appHost.supports('filedownload')) {
hideAll(page, 'btnDownload', true);
}
diff --git a/src/list.html b/src/controllers/list.html
similarity index 100%
rename from src/list.html
rename to src/controllers/list.html
diff --git a/src/controllers/list.js b/src/controllers/list.js
index 14c6768757..0027c576f1 100644
--- a/src/controllers/list.js
+++ b/src/controllers/list.js
@@ -1,12 +1,21 @@
-define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, playbackManager, AlphaPicker) {
- 'use strict';
+import globalize from 'globalize';
+import listView from 'listView';
+import layoutManager from 'layoutManager';
+import * as userSettings from 'userSettings';
+import focusManager from 'focusManager';
+import cardBuilder from 'cardBuilder';
+import loading from 'loading';
+import connectionManager from 'connectionManager';
+import AlphaNumericShortcuts from 'alphaNumericShortcuts';
+import playbackManager from 'playbackManager';
+import AlphaPicker from 'alphaPicker';
+import 'emby-itemscontainer';
+import 'emby-scroller';
- playbackManager = playbackManager.default || playbackManager;
- loading = loading.default || loading;
- focusManager = focusManager.default || focusManager;
+/* eslint-disable indent */
function getInitialLiveTvQuery(instance, params) {
- var query = {
+ const query = {
UserId: connectionManager.getApiClient(params.serverId).getCurrentUserId(),
StartIndex: 0,
Fields: 'ChannelInfo,PrimaryImageAspectRatio',
@@ -63,7 +72,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function modifyQueryWithFilters(instance, query) {
- var sortValues = instance.getSortValues();
+ const sortValues = instance.getSortValues();
if (!query.SortBy) {
query.SortBy = sortValues.sortBy;
@@ -72,9 +81,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
query.Fields = query.Fields ? query.Fields + ',PrimaryImageAspectRatio' : 'PrimaryImageAspectRatio';
query.ImageTypeLimit = 1;
- var hasFilters;
- var queryFilters = [];
- var filters = instance.getFilters();
+ let hasFilters;
+ const queryFilters = [];
+ const filters = instance.getFilters();
if (filters.IsPlayed) {
queryFilters.push('IsPlayed');
@@ -168,21 +177,21 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function updateSortText(instance) {
- var btnSortText = instance.btnSortText;
+ const btnSortText = instance.btnSortText;
if (btnSortText) {
- var options = instance.getSortMenuOptions();
- var values = instance.getSortValues();
- var sortBy = values.sortBy;
+ const options = instance.getSortMenuOptions();
+ const values = instance.getSortValues();
+ const sortBy = values.sortBy;
- for (var i = 0, length = options.length; i < length; i++) {
- if (sortBy === options[i].value) {
- btnSortText.innerHTML = globalize.translate('SortByValue', options[i].name);
+ for (const option of options) {
+ if (sortBy === option.value) {
+ btnSortText.innerHTML = globalize.translate('SortByValue', option.name);
break;
}
}
- var btnSortIcon = instance.btnSortIcon;
+ const btnSortIcon = instance.btnSortIcon;
if (btnSortIcon) {
setSortButtonIcon(btnSortIcon, values.sortOrder === 'Descending' ? 'arrow_downward' : 'arrow_upward');
@@ -202,10 +211,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
function updateAlphaPickerState(instance, numItems) {
if (instance.alphaPicker) {
- var alphaPicker = instance.alphaPickerElement;
+ const alphaPicker = instance.alphaPickerElement;
if (alphaPicker) {
- var values = instance.getSortValues();
+ const values = instance.getSortValues();
if (numItems == null) {
numItems = 100;
@@ -223,7 +232,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function getItems(instance, params, item, sortBy, startIndex, limit) {
- var apiClient = connectionManager.getApiClient(params.serverId);
+ const apiClient = connectionManager.getApiClient(params.serverId);
instance.queryRecursive = false;
if (params.type === 'Recordings') {
@@ -252,7 +261,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
if (!item) {
instance.queryRecursive = true;
- var method = 'getItems';
+ let method = 'getItems';
if (params.type === 'MusicArtist') {
method = 'getArtists';
@@ -275,7 +284,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
if (item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'Studio' || item.Type === 'Person') {
instance.queryRecursive = true;
- var query = {
+ const query = {
StartIndex: startIndex,
Limit: limit,
Fields: 'PrimaryImageAspectRatio,SortName',
@@ -324,8 +333,8 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
return Promise.resolve(null);
}
- var apiClient = connectionManager.getApiClient(params.serverId);
- var itemId = params.genreId || params.musicGenreId || params.studioId || params.personId || params.parentId;
+ const apiClient = connectionManager.getApiClient(params.serverId);
+ const itemId = params.genreId || params.musicGenreId || params.studioId || params.personId || params.parentId;
if (itemId) {
return apiClient.getItem(apiClient.getCurrentUserId(), itemId);
@@ -335,9 +344,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function showViewSettingsMenu() {
- var instance = this;
+ const instance = this;
- require(['viewSettings'], function (ViewSettings) {
+ import('viewSettings').then(({default: ViewSettings}) => {
new ViewSettings().show({
settingsKey: instance.getSettingsKey(),
settings: instance.getViewSettings(),
@@ -350,9 +359,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function showFilterMenu() {
- var instance = this;
+ const instance = this;
- require(['filterMenu'], function (FilterMenu) {
+ import('filterMenu').then(({default: FilterMenu}) => {
new FilterMenu().show({
settingsKey: instance.getSettingsKey(),
settings: instance.getFilters(),
@@ -369,9 +378,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function showSortMenu() {
- var instance = this;
+ const instance = this;
- require(['sortMenu'], function (SortMenu) {
+ import('sortMenu').then(({default: SortMenu}) => {
new SortMenu().show({
settingsKey: instance.getSettingsKey(),
settings: instance.getSortValues(),
@@ -387,10 +396,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function onNewItemClick() {
- var instance = this;
+ const instance = this;
- require(['playlistEditor'], function (playlistEditor) {
- new playlistEditor.showEditor({
+ import('playlistEditor').then(({default: playlistEditor}) => {
+ new playlistEditor({
items: [],
serverId: instance.params.serverId
});
@@ -398,22 +407,23 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function hideOrShowAll(elems, hide) {
- for (var i = 0, length = elems.length; i < length; i++) {
+ for (const elem of elems) {
if (hide) {
- elems[i].classList.add('hide');
+ elem.classList.add('hide');
} else {
- elems[i].classList.remove('hide');
+ elem.classList.remove('hide');
}
}
}
function bindAll(elems, eventName, fn) {
- for (var i = 0, length = elems.length; i < length; i++) {
- elems[i].addEventListener(eventName, fn);
+ for (const elem of elems) {
+ elem.addEventListener(eventName, fn);
}
}
- function ItemsView(view, params) {
+class ItemsView {
+ constructor(view, params) {
function fetchData() {
return getItems(self, params, self.currentItem).then(function (result) {
if (self.totalItemCount == null) {
@@ -426,7 +436,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function getItemsHtml(items) {
- var settings = self.getViewSettings();
+ const settings = self.getViewSettings();
if (settings.imageType === 'list') {
return listView.getListViewHtml({
@@ -434,13 +444,13 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
});
}
- var shape;
- var preferThumb;
- var preferDisc;
- var preferLogo;
- var defaultShape;
- var item = self.currentItem;
- var lines = settings.showTitle ? 2 : 0;
+ let shape;
+ let preferThumb;
+ let preferDisc;
+ let preferLogo;
+ let defaultShape;
+ const item = self.currentItem;
+ let lines = settings.showTitle ? 2 : 0;
if (settings.imageType === 'banner') {
shape = 'banner';
@@ -464,7 +474,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
shape = 'autoVertical';
}
- var posterOptions = {
+ let posterOptions = {
shape: shape,
showTitle: settings.showTitle,
showYear: settings.showTitle,
@@ -497,19 +507,19 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
lines = 1;
} else if (params.type === 'Programs') {
lines = settings.showTitle ? 1 : 0;
- var showParentTitle = settings.showTitle && params.IsMovie !== 'true';
+ const showParentTitle = settings.showTitle && params.IsMovie !== 'true';
if (showParentTitle) {
lines++;
}
- var showAirTime = settings.showTitle && params.type !== 'Recordings';
+ const showAirTime = settings.showTitle && params.type !== 'Recordings';
if (showAirTime) {
lines++;
}
- var showYear = settings.showTitle && params.IsMovie === 'true' && params.type === 'Recordings';
+ const showYear = settings.showTitle && params.IsMovie === 'true' && params.type === 'Recordings';
if (showYear) {
lines++;
@@ -542,13 +552,13 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
function initAlphaPicker() {
self.scroller = view.querySelector('.scrollFrameY');
- var alphaPickerElement = self.alphaPickerElement;
+ const alphaPickerElement = self.alphaPickerElement;
alphaPickerElement.classList.add('alphaPicker-fixed-right');
alphaPickerElement.classList.add('focuscontainer-right');
self.itemsContainer.parentNode.classList.add('padded-right-withalphapicker');
- self.alphaPicker = new AlphaPicker.default({
+ self.alphaPicker = new AlphaPicker({
element: alphaPickerElement,
itemsContainer: layoutManager.tv ? self.itemsContainer : null,
itemClass: 'card',
@@ -653,7 +663,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function play() {
- var currentItem = self.currentItem;
+ const currentItem = self.currentItem;
if (currentItem && !self.hasFilters) {
playbackManager.play({
@@ -669,7 +679,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function queue() {
- var currentItem = self.currentItem;
+ const currentItem = self.currentItem;
if (currentItem && !self.hasFilters) {
playbackManager.queue({
@@ -685,7 +695,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
function shuffle() {
- var currentItem = self.currentItem;
+ const currentItem = self.currentItem;
if (currentItem && !self.hasFilters) {
playbackManager.shuffle(currentItem);
@@ -698,7 +708,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
}
- var self = this;
+ const self = this;
self.params = params;
this.itemsContainer = view.querySelector('.itemsContainer');
@@ -712,20 +722,17 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
this.itemsContainer.setAttribute('data-refreshinterval', '300000');
}
- var i;
- var length;
- var btnViewSettings = view.querySelectorAll('.btnViewSettings');
+ const btnViewSettings = view.querySelectorAll('.btnViewSettings');
- for (i = 0, length = btnViewSettings.length; i < length; i++) {
- btnViewSettings[i].addEventListener('click', showViewSettingsMenu.bind(this));
+ for (const btnViewSetting of btnViewSettings) {
+ btnViewSetting.addEventListener('click', showViewSettingsMenu.bind(this));
}
- var filterButtons = view.querySelectorAll('.btnFilter');
+ const filterButtons = view.querySelectorAll('.btnFilter');
this.filterButtons = filterButtons;
- var hasVisibleFilters = this.getVisibleFilters().length;
+ const hasVisibleFilters = this.getVisibleFilters().length;
- for (i = 0, length = filterButtons.length; i < length; i++) {
- var btnFilter = filterButtons[i];
+ for (const btnFilter of filterButtons) {
btnFilter.addEventListener('click', showFilterMenu.bind(this));
if (hasVisibleFilters) {
@@ -735,10 +742,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
}
- var sortButtons = view.querySelectorAll('.btnSort');
+ const sortButtons = view.querySelectorAll('.btnSort');
- for (this.sortButtons = sortButtons, i = 0, length = sortButtons.length; i < length; i++) {
- var sortButton = sortButtons[i];
+ this.sortButtons = sortButtons;
+ for (const sortButton of sortButtons) {
sortButton.addEventListener('click', showSortMenu.bind(this));
if (params.type !== 'nextup') {
@@ -753,7 +760,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
self.itemsContainer.fetchData = fetchData;
self.itemsContainer.getItemsHtml = getItemsHtml;
view.addEventListener('viewshow', function (e) {
- var isRestored = e.detail.isRestored;
+ const isRestored = e.detail.isRestored;
if (!isRestored) {
loading.show();
@@ -765,7 +772,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
getItem(params).then(function (item) {
setTitle(item);
self.currentItem = item;
- var refresh = !isRestored;
+ const refresh = !isRestored;
self.itemsContainer.resume({
refresh: refresh
}).then(function () {
@@ -780,7 +787,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
initAlphaPicker();
}
- var itemType = item ? item.Type : null;
+ const itemType = item ? item.Type : null;
if (itemType === 'MusicGenre' || params.type !== 'Programs' && itemType !== 'Channel') {
hideOrShowAll(view.querySelectorAll('.btnPlay'), false);
@@ -807,18 +814,18 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
bindAll(view.querySelectorAll('.btnShuffle'), 'click', shuffle);
}
- self.alphaNumericShortcuts = new AlphaNumericShortcuts.default({
+ self.alphaNumericShortcuts = new AlphaNumericShortcuts({
itemsContainer: self.itemsContainer
});
});
view.addEventListener('viewhide', function (e) {
- var itemsContainer = self.itemsContainer;
+ const itemsContainer = self.itemsContainer;
if (itemsContainer) {
itemsContainer.pause();
}
- var alphaNumericShortcuts = self.alphaNumericShortcuts;
+ const alphaNumericShortcuts = self.alphaNumericShortcuts;
if (alphaNumericShortcuts) {
alphaNumericShortcuts.destroy();
@@ -846,8 +853,8 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
});
}
- ItemsView.prototype.getFilters = function () {
- var basekey = this.getSettingsKey();
+ getFilters() {
+ const basekey = this.getSettingsKey();
return {
IsPlayed: userSettings.getFilter(basekey + '-filter-IsPlayed') === 'true',
IsUnplayed: userSettings.getFilter(basekey + '-filter-IsUnplayed') === 'true',
@@ -866,39 +873,37 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
HasThemeVideo: userSettings.getFilter(basekey + '-filter-HasThemeVideo'),
GenreIds: userSettings.getFilter(basekey + '-filter-GenreIds')
};
- };
+ }
- ItemsView.prototype.getSortValues = function () {
- var basekey = this.getSettingsKey();
+ getSortValues() {
+ const basekey = this.getSettingsKey();
return {
sortBy: userSettings.getFilter(basekey + '-sortby') || this.getDefaultSortBy(),
sortOrder: userSettings.getFilter(basekey + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending'
};
- };
+ }
- ItemsView.prototype.getDefaultSortBy = function () {
- var params = this.params;
- var sortNameOption = this.getNameSortOption(params);
+ getDefaultSortBy() {
+ const sortNameOption = this.getNameSortOption(this.params);
- if (params.type) {
+ if (this.params.type) {
return sortNameOption.value;
}
return 'IsFolder,' + sortNameOption.value;
- };
+ }
- ItemsView.prototype.getSortMenuOptions = function () {
- var sortBy = [];
- var params = this.params;
+ getSortMenuOptions() {
+ const sortBy = [];
- if (params.type === 'Programs') {
+ if (this.params.type === 'Programs') {
sortBy.push({
name: globalize.translate('AirDate'),
value: 'StartDate,SortName'
});
}
- var option = this.getNameSortOption(params);
+ let option = this.getNameSortOption(this.params);
if (option) {
sortBy.push(option);
@@ -916,7 +921,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
sortBy.push(option);
}
- if (params.type !== 'Programs') {
+ if (this.params.type !== 'Programs') {
sortBy.push({
name: globalize.translate('DateAdded'),
value: 'DateCreated,SortName'
@@ -929,8 +934,8 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
sortBy.push(option);
}
- if (!params.type) {
- option = this.getNameSortOption(params);
+ if (!this.params.type) {
+ option = this.getNameSortOption(this.params);
sortBy.push({
name: globalize.translate('Folders'),
value: 'IsFolder,' + option.value
@@ -956,9 +961,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
value: 'Runtime,SortName'
});
return sortBy;
- };
+ }
- ItemsView.prototype.getNameSortOption = function (params) {
+ getNameSortOption(params) {
if (params.type === 'Episode') {
return {
name: globalize.translate('Name'),
@@ -970,9 +975,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
name: globalize.translate('Name'),
value: 'SortName'
};
- };
+ }
- ItemsView.prototype.getPlayCountSortOption = function () {
+ getPlayCountSortOption() {
if (this.params.type === 'Programs') {
return null;
}
@@ -981,9 +986,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
name: globalize.translate('PlayCount'),
value: 'PlayCount,SortName'
};
- };
+ }
- ItemsView.prototype.getDatePlayedSortOption = function () {
+ getDatePlayedSortOption() {
if (this.params.type === 'Programs') {
return null;
}
@@ -992,9 +997,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
name: globalize.translate('DatePlayed'),
value: 'DatePlayed,SortName'
};
- };
+ }
- ItemsView.prototype.getCriticRatingSortOption = function () {
+ getCriticRatingSortOption() {
if (this.params.type === 'Programs') {
return null;
}
@@ -1003,18 +1008,18 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
name: globalize.translate('CriticRating'),
value: 'CriticRating,SortName'
};
- };
+ }
- ItemsView.prototype.getCommunityRatingSortOption = function () {
+ getCommunityRatingSortOption() {
return {
name: globalize.translate('CommunityRating'),
value: 'CommunityRating,SortName'
};
- };
+ }
- ItemsView.prototype.getVisibleFilters = function () {
- var filters = [];
- var params = this.params;
+ getVisibleFilters() {
+ const filters = [];
+ const params = this.params;
if (!(params.type === 'nextup')) {
if (params.type === 'Programs') {
@@ -1038,16 +1043,15 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
return filters;
- };
+ }
- ItemsView.prototype.setFilterStatus = function (hasFilters) {
+ setFilterStatus(hasFilters) {
this.hasFilters = hasFilters;
- var filterButtons = this.filterButtons;
+ const filterButtons = this.filterButtons;
if (filterButtons.length) {
- for (var i = 0, length = filterButtons.length; i < length; i++) {
- var btnFilter = filterButtons[i];
- var bubble = btnFilter.querySelector('.filterButtonBubble');
+ for (const btnFilter of filterButtons) {
+ let bubble = btnFilter.querySelector('.filterButtonBubble');
if (!bubble) {
if (!hasFilters) {
@@ -1066,10 +1070,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
}
}
- };
+ }
- ItemsView.prototype.getFilterMenuOptions = function () {
- var params = this.params;
+ getFilterMenuOptions() {
+ const params = this.params;
return {
IsAiring: params.IsAiring,
IsMovie: params.IsMovie,
@@ -1079,11 +1083,11 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
IsSeries: params.IsSeries,
Recursive: this.queryRecursive
};
- };
+ }
- ItemsView.prototype.getVisibleViewSettings = function () {
- var item = (this.params, this.currentItem);
- var fields = ['showTitle'];
+ getVisibleViewSettings() {
+ const item = (this.params, this.currentItem);
+ const fields = ['showTitle'];
if (!item || item.Type !== 'PhotoAlbum' && item.Type !== 'ChannelFolderItem') {
fields.push('imageType');
@@ -1091,13 +1095,13 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
fields.push('viewType');
return fields;
- };
+ }
- ItemsView.prototype.getViewSettings = function () {
- var basekey = this.getSettingsKey();
- var params = this.params;
- var item = this.currentItem;
- var showTitle = userSettings.get(basekey + '-showTitle');
+ getViewSettings() {
+ const basekey = this.getSettingsKey();
+ const params = this.params;
+ const item = this.currentItem;
+ let showTitle = userSettings.get(basekey + '-showTitle');
if (showTitle === 'true') {
showTitle = true;
@@ -1109,7 +1113,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
showTitle = true;
}
- var imageType = userSettings.get(basekey + '-imageType');
+ let imageType = userSettings.get(basekey + '-imageType');
if (!imageType && params.type === 'nextup') {
imageType = 'thumb';
@@ -1121,10 +1125,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
imageType: imageType || 'primary',
viewType: userSettings.get(basekey + '-viewType') || 'images'
};
- };
+ }
- ItemsView.prototype.getItemTypes = function () {
- var params = this.params;
+ getItemTypes() {
+ const params = this.params;
if (params.type === 'nextup') {
return ['Episode'];
@@ -1135,12 +1139,12 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
return [];
- };
+ }
- ItemsView.prototype.getSettingsKey = function () {
- var values = [];
+ getSettingsKey() {
+ const values = [];
values.push('items');
- var params = this.params;
+ const params = this.params;
if (params.type) {
values.push(params.type);
@@ -1197,7 +1201,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
}
return values.join('-');
- };
+ }
+}
- return ItemsView;
-});
+export default ItemsView;
+
+/* eslint-enable indent */
diff --git a/src/livetv.html b/src/controllers/livetv.html
similarity index 100%
rename from src/livetv.html
rename to src/controllers/livetv.html
diff --git a/src/controllers/livetv/livetvguide.js b/src/controllers/livetv/livetvguide.js
index ec7a7a3f81..f8b49bd22a 100644
--- a/src/controllers/livetv/livetvguide.js
+++ b/src/controllers/livetv/livetvguide.js
@@ -1,29 +1,27 @@
-define(['tvguide'], function (tvguide) {
- 'use strict';
+import tvguide from 'tvguide';
- return function (view, params, tabContent) {
- var guideInstance;
- var self = this;
+export default function (view, params, tabContent) {
+ let guideInstance;
+ const self = this;
- self.renderTab = function () {
- if (!guideInstance) {
- guideInstance = new tvguide({
- element: tabContent,
- serverId: ApiClient.serverId()
- });
- }
- };
-
- self.onShow = function () {
- if (guideInstance) {
- guideInstance.resume();
- }
- };
-
- self.onHide = function () {
- if (guideInstance) {
- guideInstance.pause();
- }
- };
+ self.renderTab = function () {
+ if (!guideInstance) {
+ guideInstance = new tvguide({
+ element: tabContent,
+ serverId: ApiClient.serverId()
+ });
+ }
};
-});
+
+ self.onShow = function () {
+ if (guideInstance) {
+ guideInstance.resume();
+ }
+ };
+
+ self.onHide = function () {
+ if (guideInstance) {
+ guideInstance.pause();
+ }
+ };
+}
diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js
index 05e852fd0b..fa06e99b7d 100644
--- a/src/controllers/livetv/livetvsuggested.js
+++ b/src/controllers/livetv/livetvsuggested.js
@@ -2,6 +2,7 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
'use strict';
loading = loading.default || loading;
+ layoutManager = layoutManager.default || layoutManager;
function enableScrollX() {
return !layoutManager.desktop;
@@ -255,6 +256,8 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
}
require(depends, function (controllerFactory) {
+ controllerFactory = controllerFactory.default || controllerFactory;
+
var tabContent;
if (index == 0) {
diff --git a/src/livetvguideprovider.html b/src/controllers/livetvguideprovider.html
similarity index 100%
rename from src/livetvguideprovider.html
rename to src/controllers/livetvguideprovider.html
diff --git a/src/livetvsettings.html b/src/controllers/livetvsettings.html
similarity index 100%
rename from src/livetvsettings.html
rename to src/controllers/livetvsettings.html
diff --git a/src/livetvstatus.html b/src/controllers/livetvstatus.html
similarity index 100%
rename from src/livetvstatus.html
rename to src/controllers/livetvstatus.html
diff --git a/src/livetvtuner.html b/src/controllers/livetvtuner.html
similarity index 100%
rename from src/livetvtuner.html
rename to src/controllers/livetvtuner.html
diff --git a/src/movies.html b/src/controllers/movies/movies.html
similarity index 100%
rename from src/movies.html
rename to src/controllers/movies/movies.html
diff --git a/src/music.html b/src/controllers/music/music.html
similarity index 100%
rename from src/music.html
rename to src/controllers/music/music.html
diff --git a/src/search.html b/src/controllers/search.html
similarity index 100%
rename from src/search.html
rename to src/controllers/search.html
diff --git a/src/tv.html b/src/controllers/shows/tvrecommended.html
similarity index 100%
rename from src/tv.html
rename to src/controllers/shows/tvrecommended.html
diff --git a/src/wizardlibrary.html b/src/controllers/wizard/library.html
similarity index 100%
rename from src/wizardlibrary.html
rename to src/controllers/wizard/library.html
diff --git a/src/index.html b/src/index.html
index 797fce8a94..c689a42f30 100644
--- a/src/index.html
+++ b/src/index.html
@@ -137,8 +137,7 @@
}
@media screen
- and (min-device-width: 992px)
- and (-webkit-min-device-pixel-ratio: 1) {
+ and (min-device-width: 992px) {
.splashLogo {
background-image: url(assets/img/banner-light.png);
}
diff --git a/src/libraries/screensavermanager.js b/src/libraries/screensavermanager.js
index 557b31e0f4..5c24ec63d0 100644
--- a/src/libraries/screensavermanager.js
+++ b/src/libraries/screensavermanager.js
@@ -1,134 +1,128 @@
-define(["events", "playbackManager", "pluginManager", "inputManager", "connectionManager", "userSettings"], function (events, playbackManager, pluginManager, inputManager, connectionManager, userSettings) {
- "use strict";
+import events from 'events';
+import playbackManager from 'playbackManager';
+import pluginManager from 'pluginManager';
+import inputManager from 'inputManager';
+import connectionManager from 'connectionManager';
+import * as userSettings from 'userSettings';
- playbackManager = playbackManager.default || playbackManager;
+function getMinIdleTime() {
+ // Returns the minimum amount of idle time required before the screen saver can be displayed
+ //time units used Millisecond
+ return 180000;
+}
- function getMinIdleTime() {
- // Returns the minimum amount of idle time required before the screen saver can be displayed
- //time units used Millisecond
- return 180000;
+let lastFunctionalEvent = 0;
+
+function getFunctionalEventIdleTime() {
+ return new Date().getTime() - lastFunctionalEvent;
+}
+
+events.on(playbackManager, 'playbackstop', function (e, stopInfo) {
+ const state = stopInfo.state;
+ if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') {
+ lastFunctionalEvent = new Date().getTime();
}
-
- var lastFunctionalEvent = 0;
-
- function getFunctionalEventIdleTime() {
- return new Date().getTime() - lastFunctionalEvent;
- }
-
- events.on(playbackManager, "playbackstop", function (e, stopInfo) {
- var state = stopInfo.state;
- if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") {
- lastFunctionalEvent = new Date().getTime();
- }
- });
-
- function getScreensaverPlugin(isLoggedIn) {
-
- var option;
- try {
- option = userSettings.get("screensaver", false);
- } catch (err) {
- option = isLoggedIn ? "backdropscreensaver" : "logoscreensaver";
- }
-
- var plugins = pluginManager.ofType("screensaver");
-
- for (var i = 0, length = plugins.length; i < length; i++) {
- var plugin = plugins[i];
-
- if (plugin.id === option) {
- return plugin;
- }
- }
-
- return null;
- }
-
- function ScreenSaverManager() {
-
- var self = this;
- var activeScreenSaver;
-
- function showScreenSaver(screensaver) {
-
- if (activeScreenSaver) {
- throw new Error("An existing screensaver is already active.");
- }
-
- console.debug("Showing screensaver " + screensaver.name);
-
- screensaver.show();
- activeScreenSaver = screensaver;
-
- if (screensaver.hideOnClick !== false) {
- window.addEventListener("click", hide, true);
- }
- if (screensaver.hideOnMouse !== false) {
- window.addEventListener("mousemove", hide, true);
- }
- if (screensaver.hideOnKey !== false) {
- window.addEventListener("keydown", hide, true);
- }
- }
-
- function hide() {
- if (activeScreenSaver) {
- console.debug("Hiding screensaver");
- activeScreenSaver.hide();
- activeScreenSaver = null;
- }
-
- window.removeEventListener("click", hide, true);
- window.removeEventListener("mousemove", hide, true);
- window.removeEventListener("keydown", hide, true);
- }
-
- self.isShowing = function () {
- return activeScreenSaver != null;
- };
-
- self.show = function () {
- var isLoggedIn;
- var apiClient = connectionManager.currentApiClient();
-
- if (apiClient && apiClient.isLoggedIn()) {
- isLoggedIn = true;
- }
-
- var screensaver = getScreensaverPlugin(isLoggedIn);
-
- if (screensaver) {
- showScreenSaver(screensaver);
- }
- };
-
- self.hide = function () {
- hide();
- };
-
- function onInterval() {
-
- if (self.isShowing()) {
- return;
- }
-
- if (inputManager.idleTime() < getMinIdleTime()) {
- return;
- }
-
- if (getFunctionalEventIdleTime < getMinIdleTime()) {
- return;
- }
-
- if (playbackManager.isPlayingVideo()) {
- return;
- }
-
- self.show();
- }
-
- setInterval(onInterval, 10000);
- }
-
- return new ScreenSaverManager();
});
+
+function getScreensaverPlugin(isLoggedIn) {
+ let option;
+ try {
+ option = userSettings.get('screensaver', false);
+ } catch (err) {
+ option = isLoggedIn ? 'backdropscreensaver' : 'logoscreensaver';
+ }
+
+ const plugins = pluginManager.ofType('screensaver');
+
+ for (const plugin of plugins) {
+ if (plugin.id === option) {
+ return plugin;
+ }
+ }
+
+ return null;
+}
+
+function ScreenSaverManager() {
+ let activeScreenSaver;
+
+ function showScreenSaver(screensaver) {
+ if (activeScreenSaver) {
+ throw new Error('An existing screensaver is already active.');
+ }
+
+ console.debug('Showing screensaver ' + screensaver.name);
+
+ screensaver.show();
+ activeScreenSaver = screensaver;
+
+ if (screensaver.hideOnClick !== false) {
+ window.addEventListener('click', hide, true);
+ }
+ if (screensaver.hideOnMouse !== false) {
+ window.addEventListener('mousemove', hide, true);
+ }
+ if (screensaver.hideOnKey !== false) {
+ window.addEventListener('keydown', hide, true);
+ }
+ }
+
+ function hide() {
+ if (activeScreenSaver) {
+ console.debug('Hiding screensaver');
+ activeScreenSaver.hide();
+ activeScreenSaver = null;
+ }
+
+ window.removeEventListener('click', hide, true);
+ window.removeEventListener('mousemove', hide, true);
+ window.removeEventListener('keydown', hide, true);
+ }
+
+ this.isShowing = () => {
+ return activeScreenSaver != null;
+ };
+
+ this.show = function () {
+ let isLoggedIn;
+ const apiClient = connectionManager.currentApiClient();
+
+ if (apiClient && apiClient.isLoggedIn()) {
+ isLoggedIn = true;
+ }
+
+ const screensaver = getScreensaverPlugin(isLoggedIn);
+
+ if (screensaver) {
+ showScreenSaver(screensaver);
+ }
+ };
+
+ this.hide = function () {
+ hide();
+ };
+
+ const onInterval = () => {
+ if (this.isShowing()) {
+ return;
+ }
+
+ if (inputManager.idleTime() < getMinIdleTime()) {
+ return;
+ }
+
+ if (getFunctionalEventIdleTime < getMinIdleTime()) {
+ return;
+ }
+
+ if (playbackManager.isPlayingVideo()) {
+ return;
+ }
+
+ this.show();
+ };
+
+ setInterval(onInterval, 10000);
+}
+
+export default new ScreenSaverManager;
diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js
index 22b49d6faf..b7e6d05969 100644
--- a/src/plugins/chromecastPlayer/plugin.js
+++ b/src/plugins/chromecastPlayer/plugin.js
@@ -1,66 +1,71 @@
-define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', 'globalize', 'events', 'require', 'castSenderApiLoader'], function (appSettings, userSettings, playbackManager, connectionManager, globalize, events, require, castSenderApiLoader) {
- 'use strict';
+import appSettings from 'appSettings';
+import * as userSettings from 'userSettings';
+import playbackManager from 'playbackManager';
+import connectionManager from 'connectionManager';
+import globalize from 'globalize';
+import events from 'events';
+import castSenderApiLoader from 'castSenderApiLoader';
- playbackManager = playbackManager.default || playbackManager;
+// Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js
- // Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js
- var currentResolve;
- var currentReject;
+let currentResolve;
+let currentReject;
- var PlayerName = 'Google Cast';
+const PlayerName = 'Google Cast';
- function sendConnectionResult(isOk) {
- var resolve = currentResolve;
- var reject = currentReject;
+function sendConnectionResult(isOk) {
+ const resolve = currentResolve;
+ const reject = currentReject;
- currentResolve = null;
- currentReject = null;
+ currentResolve = null;
+ currentReject = null;
- if (isOk) {
- if (resolve) {
- resolve();
- }
+ if (isOk) {
+ if (resolve) {
+ resolve();
+ }
+ } else {
+ if (reject) {
+ reject();
} else {
- if (reject) {
- reject();
- } else {
- playbackManager.removeActivePlayer(PlayerName);
- }
+ playbackManager.removeActivePlayer(PlayerName);
}
}
+}
- /**
- * Constants of states for Chromecast device
- **/
- var DEVICE_STATE = {
- 'IDLE': 0,
- 'ACTIVE': 1,
- 'WARNING': 2,
- 'ERROR': 3
- };
+/**
+ * Constants of states for Chromecast device
+ **/
+const DEVICE_STATE = {
+ 'IDLE': 0,
+ 'ACTIVE': 1,
+ 'WARNING': 2,
+ 'ERROR': 3
+};
- /**
- * Constants of states for CastPlayer
- **/
- var PLAYER_STATE = {
- 'IDLE': 'IDLE',
- 'LOADING': 'LOADING',
- 'LOADED': 'LOADED',
- 'PLAYING': 'PLAYING',
- 'PAUSED': 'PAUSED',
- 'STOPPED': 'STOPPED',
- 'SEEKING': 'SEEKING',
- 'ERROR': 'ERROR'
- };
+/**
+ * Constants of states for CastPlayer
+ **/
+const PLAYER_STATE = {
+ 'IDLE': 'IDLE',
+ 'LOADING': 'LOADING',
+ 'LOADED': 'LOADED',
+ 'PLAYING': 'PLAYING',
+ 'PAUSED': 'PAUSED',
+ 'STOPPED': 'STOPPED',
+ 'SEEKING': 'SEEKING',
+ 'ERROR': 'ERROR'
+};
- // production version registered with google
- // replace this value if you want to test changes on another instance
- var applicationStable = 'F007D354';
- var applicationUnstable = '6F511C87';
+// production version registered with google
+// replace this value if you want to test changes on another instance
+const applicationStable = 'F007D354';
+const applicationUnstable = '6F511C87';
- var messageNamespace = 'urn:x-cast:com.connectsdk';
+const messageNamespace = 'urn:x-cast:com.connectsdk';
- var CastPlayer = function () {
+class CastPlayer {
+ constructor() {
/* device variables */
// @type {DEVICE_STATE} A state for device
this.deviceState = DEVICE_STATE.IDLE;
@@ -81,7 +86,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.mediaStatusUpdateHandler = this.onMediaStatusUpdate.bind(this);
this.initializeCastPlayer();
- };
+ }
/**
* Initialize Cast media player
@@ -89,8 +94,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
* invoked once the API has finished initialization. The sessionListener and
* receiverListener may be invoked at any time afterwards, and possibly more than once.
*/
- CastPlayer.prototype.initializeCastPlayer = function () {
- var chrome = window.chrome;
+ initializeCastPlayer() {
+ const chrome = window.chrome;
if (!chrome) {
return;
}
@@ -100,35 +105,35 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
return;
}
- var applicationID = applicationStable;
+ let applicationID = applicationStable;
if (userSettings.chromecastVersion() === 'unstable') {
applicationID = applicationUnstable;
}
// request session
- var sessionRequest = new chrome.cast.SessionRequest(applicationID);
- var apiConfig = new chrome.cast.ApiConfig(sessionRequest,
+ const sessionRequest = new chrome.cast.SessionRequest(applicationID);
+ const apiConfig = new chrome.cast.ApiConfig(sessionRequest,
this.sessionListener.bind(this),
this.receiverListener.bind(this));
console.debug('chromecast.initialize');
chrome.cast.initialize(apiConfig, this.onInitSuccess.bind(this), this.errorHandler);
- };
+ }
/**
* Callback function for init success
*/
- CastPlayer.prototype.onInitSuccess = function () {
+ onInitSuccess() {
this.isInitialized = true;
console.debug('chromecast init success');
- };
+ }
/**
* Generic error callback function
*/
- CastPlayer.prototype.onError = function () {
+ onError() {
console.debug('chromecast error');
- };
+ }
/**
* @param {!Object} e A new session
@@ -137,7 +142,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
* join existing session and occur in Cast mode and media
* status gets synced up with current media of the session
*/
- CastPlayer.prototype.sessionListener = function (e) {
+ sessionListener(e) {
this.session = e;
if (this.session) {
if (this.session.media[0]) {
@@ -146,24 +151,15 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.onSessionConnected(e);
}
- };
-
- function alertText(text, title) {
- require(['alert'], function (alert) {
- alert.default({
- text: text,
- title: title
- });
- });
}
- CastPlayer.prototype.messageListener = function (namespace, message) {
+ messageListener(namespace, message) {
if (typeof (message) === 'string') {
message = JSON.parse(message);
}
if (message.type === 'playbackerror') {
- var errorCode = message.data;
+ const errorCode = message.data;
setTimeout(function () {
alertText(globalize.translate('MessagePlaybackError' + errorCode), globalize.translate('HeaderPlaybackError'));
}, 300);
@@ -174,14 +170,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
} else if (message.type) {
events.trigger(this, message.type, [message.data]);
}
- };
+ }
/**
* @param {string} e Receiver availability
* This indicates availability of receivers but
* does not provide a list of device IDs
*/
- CastPlayer.prototype.receiverListener = function (e) {
+ receiverListener(e) {
if (e === 'available') {
console.debug('chromecast receiver found');
this.hasReceivers = true;
@@ -189,12 +185,12 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
console.debug('chromecast receiver list empty');
this.hasReceivers = false;
}
- };
+ }
/**
* session update listener
*/
- CastPlayer.prototype.sessionUpdateListener = function (isAlive) {
+ sessionUpdateListener(isAlive) {
if (isAlive) {
console.debug('sessionUpdateListener: already alive');
} else {
@@ -209,28 +205,28 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
sendConnectionResult(false);
}
- };
+ }
/**
* Requests that a receiver application session be created or joined. By default, the SessionRequest
* passed to the API at initialization time is used; this may be overridden by passing a different
* session request in opt_sessionRequest.
*/
- CastPlayer.prototype.launchApp = function () {
+ launchApp() {
console.debug('chromecast launching app...');
chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this));
- };
+ }
/**
* Callback function for request session success
* @param {Object} e A chrome.cast.Session object
*/
- CastPlayer.prototype.onRequestSessionSuccess = function (e) {
+ onRequestSessionSuccess(e) {
console.debug('chromecast session success: ' + e.sessionId);
this.onSessionConnected(e);
- };
+ }
- CastPlayer.prototype.onSessionConnected = function (session) {
+ onSessionConnected(session) {
this.session = session;
this.deviceState = DEVICE_STATE.ACTIVE;
@@ -246,46 +242,38 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
options: {},
command: 'Identify'
});
- };
-
- function onVolumeUpKeyDown() {
- playbackManager.volumeUp();
- }
-
- function onVolumeDownKeyDown() {
- playbackManager.volumeDown();
}
/**
* session update listener
*/
- CastPlayer.prototype.sessionMediaListener = function (e) {
+ sessionMediaListener(e) {
this.currentMediaSession = e;
this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler);
- };
+ }
/**
* Callback function for launch error
*/
- CastPlayer.prototype.onLaunchError = function () {
+ onLaunchError() {
console.debug('chromecast launch error');
this.deviceState = DEVICE_STATE.ERROR;
sendConnectionResult(false);
- };
+ }
/**
* Stops the running receiver application associated with the session.
*/
- CastPlayer.prototype.stopApp = function () {
+ stopApp() {
if (this.session) {
this.session.stop(this.onStopAppSuccess.bind(this, 'Session stopped'), this.errorHandler);
}
- };
+ }
/**
* Callback function for stop app success
*/
- CastPlayer.prototype.onStopAppSuccess = function (message) {
+ onStopAppSuccess(message) {
console.debug(message);
this.deviceState = DEVICE_STATE.IDLE;
@@ -294,13 +282,13 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
document.removeEventListener('volumedownbutton', onVolumeDownKeyDown, false);
this.currentMediaSession = null;
- };
+ }
/**
* Loads media into a running receiver application
* @param {Number} mediaIndex An index number to indicate current media content
*/
- CastPlayer.prototype.loadMedia = function (options, command) {
+ loadMedia(options, command) {
if (!this.session) {
console.debug('no session');
return Promise.reject();
@@ -322,20 +310,20 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
options: options,
command: command
});
- };
+ }
- CastPlayer.prototype.sendMessage = function (message) {
- var player = this;
+ sendMessage(message) {
+ const player = this;
- var receiverName = null;
+ let receiverName = null;
- var session = player.session;
+ const session = player.session;
if (session && session.receiver && session.receiver.friendlyName) {
receiverName = session.receiver.friendlyName;
}
- var apiClient;
+ let apiClient;
if (message.options && message.options.ServerId) {
apiClient = connectionManager.getApiClient(message.options.ServerId);
} else if (message.options && message.options.items && message.options.items.length) {
@@ -354,7 +342,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
receiverName: receiverName
});
- var bitrateSetting = appSettings.maxChromecastBitrate();
+ const bitrateSetting = appSettings.maxChromecastBitrate();
if (bitrateSetting) {
message.maxBitrate = bitrateSetting;
}
@@ -365,31 +353,31 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
}
return new Promise(function (resolve, reject) {
- require(['./chromecastHelper'], function (chromecastHelper) {
+ import('./chromecastHelper').then(({ default: chromecastHelper }) => {
chromecastHelper.getServerAddress(apiClient).then(function (serverAddress) {
message.serverAddress = serverAddress;
player.sendMessageInternal(message).then(resolve, reject);
}, reject);
});
});
- };
+ }
- CastPlayer.prototype.sendMessageInternal = function (message) {
+ sendMessageInternal(message) {
message = JSON.stringify(message);
this.session.sendMessage(messageNamespace, message, this.onPlayCommandSuccess.bind(this), this.errorHandler);
return Promise.resolve();
- };
+ }
- CastPlayer.prototype.onPlayCommandSuccess = function () {
+ onPlayCommandSuccess() {
console.debug('Message was sent to receiver ok.');
- };
+ }
/**
* Callback function for loadMedia success
* @param {Object} mediaSession A new media object.
*/
- CastPlayer.prototype.onMediaDiscovered = function (how, mediaSession) {
+ onMediaDiscovered(how, mediaSession) {
console.debug('chromecast new media session ID:' + mediaSession.mediaSessionId + ' (' + how + ')');
this.currentMediaSession = mediaSession;
@@ -402,24 +390,24 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
}
this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler);
- };
+ }
/**
* Callback function for media status update from receiver
* @param {!Boolean} e true/false
*/
- CastPlayer.prototype.onMediaStatusUpdate = function (e) {
+ onMediaStatusUpdate(e) {
console.debug('chromecast updating media: ' + e);
if (e === false) {
this.castPlayerState = PLAYER_STATE.IDLE;
}
- };
+ }
/**
* Set media volume in Cast mode
* @param {Boolean} mute A boolean
*/
- CastPlayer.prototype.setReceiverVolume = function (mute, vol) {
+ setReceiverVolume(mute, vol) {
if (!this.currentMediaSession) {
console.debug('this.currentMediaSession is null');
return;
@@ -434,142 +422,161 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.mediaCommandSuccessCallback.bind(this),
this.errorHandler);
}
- };
+ }
/**
* Mute CC
*/
- CastPlayer.prototype.mute = function () {
+ mute() {
this.setReceiverVolume(true);
- };
+ }
/**
* Callback function for media command success
*/
- CastPlayer.prototype.mediaCommandSuccessCallback = function (info, e) {
+ mediaCommandSuccessCallback(info, e) {
console.debug(info);
- };
+ }
+}
- function normalizeImages(state) {
- if (state && state.NowPlayingItem) {
- var item = state.NowPlayingItem;
+function alertText(text, title) {
+ import('alert').then(({default: alert}) => {
+ alert({
+ text: text,
+ title: title
+ });
+ });
+}
- if (!item.ImageTags || !item.ImageTags.Primary) {
- if (item.PrimaryImageTag) {
- item.ImageTags = item.ImageTags || {};
- item.ImageTags.Primary = item.PrimaryImageTag;
- }
- }
- if (item.BackdropImageTag && item.BackdropItemId === item.Id) {
- item.BackdropImageTags = [item.BackdropImageTag];
- }
- if (item.BackdropImageTag && item.BackdropItemId !== item.Id) {
- item.ParentBackdropImageTags = [item.BackdropImageTag];
- item.ParentBackdropItemId = item.BackdropItemId;
+function onVolumeUpKeyDown() {
+ playbackManager.volumeUp();
+}
+
+function onVolumeDownKeyDown() {
+ playbackManager.volumeDown();
+}
+
+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.BackdropImageTag && item.BackdropItemId === item.Id) {
+ item.BackdropImageTags = [item.BackdropImageTag];
+ }
+ if (item.BackdropImageTag && item.BackdropItemId !== item.Id) {
+ item.ParentBackdropImageTags = [item.BackdropImageTag];
+ item.ParentBackdropItemId = item.BackdropItemId;
+ }
}
+}
- function getItemsForPlayback(apiClient, query) {
- var userId = apiClient.getCurrentUserId();
+function getItemsForPlayback(apiClient, query) {
+ const userId = apiClient.getCurrentUserId();
- if (query.Ids && query.Ids.split(',').length === 1) {
- return apiClient.getItem(userId, query.Ids.split(',')).then(function (item) {
- return {
- Items: [item],
- TotalRecordCount: 1
- };
- });
+ if (query.Ids && query.Ids.split(',').length === 1) {
+ return apiClient.getItem(userId, query.Ids.split(',')).then(function (item) {
+ return {
+ Items: [item],
+ TotalRecordCount: 1
+ };
+ });
+ } else {
+ query.Limit = query.Limit || 100;
+ query.ExcludeLocationTypes = 'Virtual';
+ query.EnableTotalRecordCount = false;
+
+ return apiClient.getItems(userId, query);
+ }
+}
+
+function bindEventForRelay(instance, eventName) {
+ events.on(instance._castPlayer, eventName, function (e, data) {
+ console.debug('cc: ' + eventName);
+ const state = instance.getPlayerStateInternal(data);
+
+ events.trigger(instance, eventName, [state]);
+ });
+}
+
+function initializeChromecast() {
+ const instance = this;
+ instance._castPlayer = new CastPlayer();
+
+ // To allow the native android app to override
+ document.dispatchEvent(new CustomEvent('chromecastloaded', {
+ detail: {
+ player: instance
+ }
+ }));
+
+ events.on(instance._castPlayer, 'connect', function (e) {
+ if (currentResolve) {
+ sendConnectionResult(true);
} else {
- query.Limit = query.Limit || 100;
- query.ExcludeLocationTypes = 'Virtual';
- query.EnableTotalRecordCount = false;
-
- return apiClient.getItems(userId, query);
+ playbackManager.setActivePlayer(PlayerName, instance.getCurrentTargetInfo());
}
- }
- function bindEventForRelay(instance, eventName) {
- events.on(instance._castPlayer, eventName, function (e, data) {
- console.debug('cc: ' + eventName);
- var state = instance.getPlayerStateInternal(data);
+ console.debug('cc: connect');
+ // Reset this so that statechange will fire
+ instance.lastPlayerData = null;
+ });
- events.trigger(instance, eventName, [state]);
- });
- }
+ events.on(instance._castPlayer, 'playbackstart', function (e, data) {
+ console.debug('cc: playbackstart');
- function initializeChromecast() {
- var instance = this;
- instance._castPlayer = new CastPlayer();
+ instance._castPlayer.initializeCastPlayer();
- // To allow the native android app to override
- document.dispatchEvent(new CustomEvent('chromecastloaded', {
- detail: {
- player: instance
- }
- }));
+ const state = instance.getPlayerStateInternal(data);
+ events.trigger(instance, 'playbackstart', [state]);
+ });
- events.on(instance._castPlayer, 'connect', function (e) {
- if (currentResolve) {
- sendConnectionResult(true);
- } else {
- playbackManager.setActivePlayer(PlayerName, instance.getCurrentTargetInfo());
- }
+ events.on(instance._castPlayer, 'playbackstop', function (e, data) {
+ console.debug('cc: playbackstop');
+ let state = instance.getPlayerStateInternal(data);
- console.debug('cc: connect');
- // Reset this so that statechange will fire
- instance.lastPlayerData = null;
- });
+ events.trigger(instance, 'playbackstop', [state]);
- events.on(instance._castPlayer, 'playbackstart', function (e, data) {
- console.debug('cc: playbackstart');
+ state = instance.lastPlayerData.PlayState || {};
+ const volume = state.VolumeLevel || 0.5;
+ const mute = state.IsMuted || false;
- instance._castPlayer.initializeCastPlayer();
+ // Reset this so the next query doesn't make it appear like content is playing.
+ instance.lastPlayerData = {};
+ instance.lastPlayerData.PlayState = {};
+ instance.lastPlayerData.PlayState.VolumeLevel = volume;
+ instance.lastPlayerData.PlayState.IsMuted = mute;
+ });
- var state = instance.getPlayerStateInternal(data);
- events.trigger(instance, 'playbackstart', [state]);
- });
+ events.on(instance._castPlayer, 'playbackprogress', function (e, data) {
+ console.debug('cc: positionchange');
+ const state = instance.getPlayerStateInternal(data);
- events.on(instance._castPlayer, 'playbackstop', function (e, data) {
- console.debug('cc: playbackstop');
- var state = instance.getPlayerStateInternal(data);
+ events.trigger(instance, 'timeupdate', [state]);
+ });
- events.trigger(instance, 'playbackstop', [state]);
+ bindEventForRelay(instance, 'timeupdate');
+ bindEventForRelay(instance, 'pause');
+ bindEventForRelay(instance, 'unpause');
+ bindEventForRelay(instance, 'volumechange');
+ bindEventForRelay(instance, 'repeatmodechange');
+ bindEventForRelay(instance, 'shufflequeuemodechange');
- state = instance.lastPlayerData.PlayState || {};
- var volume = state.VolumeLevel || 0.5;
- var mute = state.IsMuted || false;
+ events.on(instance._castPlayer, 'playstatechange', function (e, data) {
+ console.debug('cc: playstatechange');
+ const state = instance.getPlayerStateInternal(data);
- // Reset this so the next query doesn't make it appear like content is playing.
- instance.lastPlayerData = {};
- instance.lastPlayerData.PlayState = {};
- instance.lastPlayerData.PlayState.VolumeLevel = volume;
- instance.lastPlayerData.PlayState.IsMuted = mute;
- });
+ events.trigger(instance, 'pause', [state]);
+ });
+}
- events.on(instance._castPlayer, 'playbackprogress', function (e, data) {
- console.debug('cc: positionchange');
- var state = instance.getPlayerStateInternal(data);
-
- events.trigger(instance, 'timeupdate', [state]);
- });
-
- bindEventForRelay(instance, 'timeupdate');
- bindEventForRelay(instance, 'pause');
- bindEventForRelay(instance, 'unpause');
- bindEventForRelay(instance, 'volumechange');
- bindEventForRelay(instance, 'repeatmodechange');
- bindEventForRelay(instance, 'shufflequeuemodechange');
-
- events.on(instance._castPlayer, 'playstatechange', function (e, data) {
- console.debug('cc: playstatechange');
- var state = instance.getPlayerStateInternal(data);
-
- events.trigger(instance, 'pause', [state]);
- });
- }
-
- function ChromecastPlayer() {
+class ChromecastPlayer {
+ constructor() {
// playbackManager needs this
this.name = PlayerName;
this.type = 'mediaplayer';
@@ -577,11 +584,11 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.isLocalPlayer = false;
this.lastPlayerData = {};
- new castSenderApiLoader.default().load().then(initializeChromecast.bind(this));
+ new castSenderApiLoader().load().then(initializeChromecast.bind(this));
}
- ChromecastPlayer.prototype.tryPair = function (target) {
- var castPlayer = this._castPlayer;
+ tryPair(target) {
+ const castPlayer = this._castPlayer;
if (castPlayer.deviceState !== DEVICE_STATE.ACTIVE && castPlayer.isInitialized) {
return new Promise(function (resolve, reject) {
@@ -595,23 +602,23 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
return Promise.reject();
}
- };
+ }
- ChromecastPlayer.prototype.getTargets = function () {
- var targets = [];
+ getTargets() {
+ const targets = [];
if (this._castPlayer && this._castPlayer.hasReceivers) {
targets.push(this.getCurrentTargetInfo());
}
return Promise.resolve(targets);
- };
+ }
// This is a privately used method
- ChromecastPlayer.prototype.getCurrentTargetInfo = function () {
- var appName = null;
+ getCurrentTargetInfo() {
+ let appName = null;
- var castPlayer = this._castPlayer;
+ const castPlayer = this._castPlayer;
if (castPlayer.session && castPlayer.session.receiver && castPlayer.session.receiver.friendlyName) {
appName = castPlayer.session.receiver.friendlyName;
@@ -642,10 +649,10 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
'PlayTrailers'
]
};
- };
+ }
- ChromecastPlayer.prototype.getPlayerStateInternal = function (data) {
- var triggerStateChange = false;
+ getPlayerStateInternal(data) {
+ let triggerStateChange = false;
if (data && !this.lastPlayerData) {
triggerStateChange = true;
}
@@ -662,12 +669,12 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
}
return data;
- };
+ }
- ChromecastPlayer.prototype.playWithCommand = function (options, command) {
+ playWithCommand(options, command) {
if (!options.items) {
- var apiClient = connectionManager.getApiClient(options.serverId);
- var instance = this;
+ const apiClient = connectionManager.getApiClient(options.serverId);
+ const instance = this;
return apiClient.getItem(apiClient.getCurrentUserId(), options.ids[0]).then(function (item) {
options.items = [item];
@@ -683,9 +690,9 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
}
return this._castPlayer.loadMedia(options, command);
- };
+ }
- ChromecastPlayer.prototype.seek = function (position) {
+ seek(position) {
position = parseInt(position);
position = position / 10000000;
@@ -696,55 +703,55 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
},
command: 'Seek'
});
- };
+ }
- ChromecastPlayer.prototype.setAudioStreamIndex = function (index) {
+ setAudioStreamIndex(index) {
this._castPlayer.sendMessage({
options: {
index: index
},
command: 'SetAudioStreamIndex'
});
- };
+ }
- ChromecastPlayer.prototype.setSubtitleStreamIndex = function (index) {
+ setSubtitleStreamIndex(index) {
this._castPlayer.sendMessage({
options: {
index: index
},
command: 'SetSubtitleStreamIndex'
});
- };
+ }
- ChromecastPlayer.prototype.setMaxStreamingBitrate = function (options) {
+ setMaxStreamingBitrate(options) {
this._castPlayer.sendMessage({
options: options,
command: 'SetMaxStreamingBitrate'
});
- };
+ }
- ChromecastPlayer.prototype.isFullscreen = function () {
- var state = this.lastPlayerData || {};
+ isFullscreen() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.IsFullscreen;
- };
+ }
- ChromecastPlayer.prototype.nextTrack = function () {
+ nextTrack() {
this._castPlayer.sendMessage({
options: {},
command: 'NextTrack'
});
- };
+ }
- ChromecastPlayer.prototype.previousTrack = function () {
+ previousTrack() {
this._castPlayer.sendMessage({
options: {},
command: 'PreviousTrack'
});
- };
+ }
- ChromecastPlayer.prototype.volumeDown = function () {
- var vol = this._castPlayer.session.receiver.volume.level;
+ volumeDown() {
+ let vol = this._castPlayer.session.receiver.volume.level;
if (vol == null) {
vol = 0.5;
}
@@ -752,20 +759,20 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
vol = Math.max(vol, 0);
this._castPlayer.session.setReceiverVolumeLevel(vol);
- };
+ }
- ChromecastPlayer.prototype.endSession = function () {
- var instance = this;
+ endSession() {
+ const instance = this;
this.stop().then(function () {
setTimeout(function () {
instance._castPlayer.stopApp();
}, 1000);
});
- };
+ }
- ChromecastPlayer.prototype.volumeUp = function () {
- var vol = this._castPlayer.session.receiver.volume.level;
+ volumeUp() {
+ let vol = this._castPlayer.session.receiver.volume.level;
if (vol == null) {
vol = 0.5;
}
@@ -773,53 +780,53 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
vol = Math.min(vol, 1);
this._castPlayer.session.setReceiverVolumeLevel(vol);
- };
+ }
- ChromecastPlayer.prototype.setVolume = function (vol) {
+ setVolume(vol) {
vol = Math.min(vol, 100);
vol = Math.max(vol, 0);
vol = vol / 100;
this._castPlayer.session.setReceiverVolumeLevel(vol);
- };
+ }
- ChromecastPlayer.prototype.unpause = function () {
+ unpause() {
this._castPlayer.sendMessage({
options: {},
command: 'Unpause'
});
- };
+ }
- ChromecastPlayer.prototype.playPause = function () {
+ playPause() {
this._castPlayer.sendMessage({
options: {},
command: 'PlayPause'
});
- };
+ }
- ChromecastPlayer.prototype.pause = function () {
+ pause() {
this._castPlayer.sendMessage({
options: {},
command: 'Pause'
});
- };
+ }
- ChromecastPlayer.prototype.stop = function () {
+ stop() {
return this._castPlayer.sendMessage({
options: {},
command: 'Stop'
});
- };
+ }
- ChromecastPlayer.prototype.displayContent = function (options) {
+ displayContent(options) {
this._castPlayer.sendMessage({
options: options,
command: 'DisplayContent'
});
- };
+ }
- ChromecastPlayer.prototype.setMute = function (isMuted) {
- var castPlayer = this._castPlayer;
+ setMute(isMuted) {
+ const castPlayer = this._castPlayer;
if (isMuted) {
castPlayer.sendMessage({
@@ -832,21 +839,21 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
command: 'Unmute'
});
}
- };
+ }
- ChromecastPlayer.prototype.getRepeatMode = function () {
- var state = this.lastPlayerData || {};
+ getRepeatMode() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.RepeatMode;
- };
+ }
- ChromecastPlayer.prototype.getQueueShuffleMode = function () {
- var state = this.lastPlayerData || {};
+ getQueueShuffleMode() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.ShuffleMode;
- };
+ }
- ChromecastPlayer.prototype.playTrailers = function (item) {
+ playTrailers(item) {
this._castPlayer.sendMessage({
options: {
ItemId: item.Id,
@@ -854,177 +861,173 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
},
command: 'PlayTrailers'
});
- };
+ }
- ChromecastPlayer.prototype.setRepeatMode = function (mode) {
+ setRepeatMode(mode) {
this._castPlayer.sendMessage({
options: {
RepeatMode: mode
},
command: 'SetRepeatMode'
});
- };
+ }
- ChromecastPlayer.prototype.setQueueShuffleMode = function (value) {
+ setQueueShuffleMode(value) {
this._castPlayer.sendMessage({
options: {
ShuffleMode: value
},
command: 'SetShuffleQueue'
});
- };
+ }
- ChromecastPlayer.prototype.toggleMute = function () {
+ toggleMute() {
this._castPlayer.sendMessage({
options: {},
command: 'ToggleMute'
});
- };
+ }
- ChromecastPlayer.prototype.audioTracks = function () {
- var state = this.lastPlayerData || {};
+ audioTracks() {
+ let state = this.lastPlayerData || {};
state = state.NowPlayingItem || {};
- var streams = state.MediaStreams || [];
+ const streams = state.MediaStreams || [];
return streams.filter(function (s) {
return s.Type === 'Audio';
});
- };
+ }
- ChromecastPlayer.prototype.getAudioStreamIndex = function () {
- var state = this.lastPlayerData || {};
+ getAudioStreamIndex() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.AudioStreamIndex;
- };
+ }
- ChromecastPlayer.prototype.subtitleTracks = function () {
- var state = this.lastPlayerData || {};
+ subtitleTracks() {
+ let state = this.lastPlayerData || {};
state = state.NowPlayingItem || {};
- var streams = state.MediaStreams || [];
+ const streams = state.MediaStreams || [];
return streams.filter(function (s) {
return s.Type === 'Subtitle';
});
- };
+ }
- ChromecastPlayer.prototype.getSubtitleStreamIndex = function () {
- var state = this.lastPlayerData || {};
+ getSubtitleStreamIndex() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.SubtitleStreamIndex;
- };
+ }
- ChromecastPlayer.prototype.getMaxStreamingBitrate = function () {
- var state = this.lastPlayerData || {};
+ getMaxStreamingBitrate() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.MaxStreamingBitrate;
- };
+ }
- ChromecastPlayer.prototype.getVolume = function () {
- var state = this.lastPlayerData || {};
+ getVolume() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.VolumeLevel == null ? 100 : state.VolumeLevel;
- };
+ }
- ChromecastPlayer.prototype.isPlaying = function () {
- var state = this.lastPlayerData || {};
+ isPlaying() {
+ const state = this.lastPlayerData || {};
return state.NowPlayingItem != null;
- };
+ }
- ChromecastPlayer.prototype.isPlayingVideo = function () {
- var state = this.lastPlayerData || {};
+ isPlayingVideo() {
+ let state = this.lastPlayerData || {};
state = state.NowPlayingItem || {};
return state.MediaType === 'Video';
- };
+ }
- ChromecastPlayer.prototype.isPlayingAudio = function () {
- var state = this.lastPlayerData || {};
+ isPlayingAudio() {
+ let state = this.lastPlayerData || {};
state = state.NowPlayingItem || {};
return state.MediaType === 'Audio';
- };
+ }
- ChromecastPlayer.prototype.currentTime = function (val) {
+ currentTime(val) {
if (val != null) {
return this.seek(val);
}
- var state = this.lastPlayerData || {};
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.PositionTicks;
- };
+ }
- ChromecastPlayer.prototype.duration = function () {
- var state = this.lastPlayerData || {};
+ duration() {
+ let state = this.lastPlayerData || {};
state = state.NowPlayingItem || {};
return state.RunTimeTicks;
- };
+ }
- ChromecastPlayer.prototype.getBufferedRanges = function () {
- var state = this.lastPlayerData || {};
+ getBufferedRanges() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.BufferedRanges || [];
- };
+ }
- ChromecastPlayer.prototype.paused = function () {
- var state = this.lastPlayerData || {};
+ paused() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.IsPaused;
- };
+ }
- ChromecastPlayer.prototype.isMuted = function () {
- var state = this.lastPlayerData || {};
+ isMuted() {
+ let state = this.lastPlayerData || {};
state = state.PlayState || {};
return state.IsMuted;
- };
+ }
- ChromecastPlayer.prototype.shuffle = function (item) {
- var apiClient = connectionManager.getApiClient(item.ServerId);
- var userId = apiClient.getCurrentUserId();
+ shuffle(item) {
+ const apiClient = connectionManager.getApiClient(item.ServerId);
+ const userId = apiClient.getCurrentUserId();
- var instance = this;
+ const instance = this;
apiClient.getItem(userId, item.Id).then(function (item) {
instance.playWithCommand({
-
items: [item]
-
}, 'Shuffle');
});
- };
+ }
- ChromecastPlayer.prototype.instantMix = function (item) {
- var apiClient = connectionManager.getApiClient(item.ServerId);
- var userId = apiClient.getCurrentUserId();
+ instantMix(item) {
+ const apiClient = connectionManager.getApiClient(item.ServerId);
+ const userId = apiClient.getCurrentUserId();
- var instance = this;
+ const instance = this;
apiClient.getItem(userId, item.Id).then(function (item) {
instance.playWithCommand({
-
items: [item]
-
}, 'InstantMix');
});
- };
+ }
- ChromecastPlayer.prototype.canPlayMediaType = function (mediaType) {
+ canPlayMediaType(mediaType) {
mediaType = (mediaType || '').toLowerCase();
return mediaType === 'audio' || mediaType === 'video';
- };
+ }
- ChromecastPlayer.prototype.canQueueMediaType = function (mediaType) {
+ canQueueMediaType(mediaType) {
return this.canPlayMediaType(mediaType);
- };
+ }
- ChromecastPlayer.prototype.queue = function (options) {
+ queue(options) {
this.playWithCommand(options, 'PlayLast');
- };
+ }
- ChromecastPlayer.prototype.queueNext = function (options) {
+ queueNext(options) {
this.playWithCommand(options, 'PlayNext');
- };
+ }
- ChromecastPlayer.prototype.play = function (options) {
+ play(options) {
if (options.items) {
return this.playWithCommand(options, 'PlayNow');
} else {
@@ -1032,50 +1035,48 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
throw new Error('serverId required!');
}
- var instance = this;
- var apiClient = connectionManager.getApiClient(options.serverId);
+ const instance = this;
+ const apiClient = connectionManager.getApiClient(options.serverId);
return getItemsForPlayback(apiClient, {
-
Ids: options.ids.join(',')
-
}).then(function (result) {
options.items = result.Items;
return instance.playWithCommand(options, 'PlayNow');
});
}
- };
+ }
- ChromecastPlayer.prototype.toggleFullscreen = function () {
+ toggleFullscreen() {
// not supported
- };
+ }
- ChromecastPlayer.prototype.beginPlayerUpdates = function () {
+ beginPlayerUpdates() {
// Setup polling here
- };
+ }
- ChromecastPlayer.prototype.endPlayerUpdates = function () {
+ endPlayerUpdates() {
// Stop polling here
- };
+ }
- ChromecastPlayer.prototype.getPlaylist = function () {
+ getPlaylist() {
return Promise.resolve([]);
- };
+ }
- ChromecastPlayer.prototype.getCurrentPlaylistItemId = function () {
- };
+ getCurrentPlaylistItemId() {
+ }
- ChromecastPlayer.prototype.setCurrentPlaylistItem = function (playlistItemId) {
+ setCurrentPlaylistItem(playlistItemId) {
return Promise.resolve();
- };
+ }
- ChromecastPlayer.prototype.removeFromPlaylist = function (playlistItemIds) {
+ removeFromPlaylist(playlistItemIds) {
return Promise.resolve();
- };
+ }
- ChromecastPlayer.prototype.getPlayerState = function () {
+ getPlayerState() {
return this.getPlayerStateInternal() || {};
- };
+ }
+}
- return ChromecastPlayer;
-});
+export default ChromecastPlayer;
diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js
index 16fce8c9d1..acce15df88 100644
--- a/src/plugins/htmlAudioPlayer/plugin.js
+++ b/src/plugins/htmlAudioPlayer/plugin.js
@@ -1,91 +1,92 @@
-define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelper'], function (events, browser, require, appHost, appSettings, htmlMediaHelper) {
- 'use strict';
+import events from 'events';
+import browser from 'browser';
+import appHost from 'apphost';
+import * as htmlMediaHelper from 'htmlMediaHelper';
- function getDefaultProfile() {
- return new Promise(function (resolve, reject) {
- require(['browserdeviceprofile'], function (profileBuilder) {
- resolve(profileBuilder({}));
- });
+function getDefaultProfile() {
+ return import('browserdeviceprofile').then(({ default: profileBuilder }) => {
+ return profileBuilder({});
+ });
+}
+
+let fadeTimeout;
+function fade(instance, elem, startingVolume) {
+ instance._isFadingOut = true;
+
+ // Need to record the starting volume on each pass rather than querying elem.volume
+ // This is due to iOS safari not allowing volume changes and always returning the system volume value
+ const newVolume = Math.max(0, startingVolume - 0.15);
+ console.debug('fading volume to ' + newVolume);
+ elem.volume = newVolume;
+
+ if (newVolume <= 0) {
+ instance._isFadingOut = false;
+ return Promise.resolve();
+ }
+
+ return new Promise(function (resolve, reject) {
+ cancelFadeTimeout();
+ fadeTimeout = setTimeout(function () {
+ fade(instance, elem, newVolume).then(resolve, reject);
+ }, 100);
+ });
+}
+
+function cancelFadeTimeout() {
+ const timeout = fadeTimeout;
+ if (timeout) {
+ clearTimeout(timeout);
+ fadeTimeout = null;
+ }
+}
+
+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;
+}
+
+function requireHlsPlayer(callback) {
+ import('hlsjs').then(({ default: hls }) => {
+ window.Hls = hls;
+ callback();
+ });
+}
+
+function enableHlsPlayer(url, item, mediaSource, mediaType) {
+ if (!htmlMediaHelper.enableHlsJsPlayer(mediaSource.RunTimeTicks, mediaType)) {
+ return Promise.reject();
+ }
+
+ if (url.indexOf('.m3u8') !== -1) {
+ return Promise.resolve();
+ }
+
+ // issue head request to get content type
+ return new Promise(function (resolve, reject) {
+ import('fetchHelper').then((fetchHelper) => {
+ fetchHelper.ajax({
+ url: url,
+ type: 'HEAD'
+ }).then(function (response) {
+ const contentType = (response.headers.get('Content-Type') || '').toLowerCase();
+ if (contentType === 'application/x-mpegurl') {
+ resolve();
+ } else {
+ reject();
+ }
+ }, reject);
});
- }
+ });
+}
- var fadeTimeout;
- function fade(instance, elem, startingVolume) {
- instance._isFadingOut = true;
-
- // Need to record the starting volume on each pass rather than querying elem.volume
- // This is due to iOS safari not allowing volume changes and always returning the system volume value
- var newVolume = Math.max(0, startingVolume - 0.15);
- console.debug('fading volume to ' + newVolume);
- elem.volume = newVolume;
-
- if (newVolume <= 0) {
- instance._isFadingOut = false;
- return Promise.resolve();
- }
-
- return new Promise(function (resolve, reject) {
- cancelFadeTimeout();
- fadeTimeout = setTimeout(function () {
- fade(instance, elem, newVolume).then(resolve, reject);
- }, 100);
- });
- }
-
- function cancelFadeTimeout() {
- var timeout = fadeTimeout;
- if (timeout) {
- clearTimeout(timeout);
- fadeTimeout = null;
- }
- }
-
- 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;
- }
-
- function requireHlsPlayer(callback) {
- require(['hlsjs'], function (hls) {
- window.Hls = hls;
- callback();
- });
- }
-
- function enableHlsPlayer(url, item, mediaSource, mediaType) {
- if (!htmlMediaHelper.enableHlsJsPlayer(mediaSource.RunTimeTicks, mediaType)) {
- return Promise.reject();
- }
-
- if (url.indexOf('.m3u8') !== -1) {
- return Promise.resolve();
- }
-
- // issue head request to get content type
- return new Promise(function (resolve, reject) {
- require(['fetchHelper'], function (fetchHelper) {
- fetchHelper.ajax({
- url: url,
- type: 'HEAD'
- }).then(function (response) {
- var contentType = (response.headers.get('Content-Type') || '').toLowerCase();
- if (contentType === 'application/x-mpegurl') {
- resolve();
- } else {
- reject();
- }
- }, reject);
- });
- });
- }
-
- function HtmlAudioPlayer() {
- var self = this;
+class HtmlAudioPlayer {
+ constructor() {
+ const self = this;
self.name = 'Html Audio Player';
self.type = 'mediaplayer';
@@ -99,7 +100,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
self._timeUpdated = false;
self._currentTime = null;
- var elem = createMediaElement();
+ const elem = createMediaElement();
return setCurrentSrc(elem, options);
};
@@ -109,11 +110,11 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
unBindEvents(elem);
bindEvents(elem);
- var val = options.url;
+ let val = options.url;
console.debug('playing url: ' + val);
// Convert to seconds
- var seconds = (options.playerStartPositionTicks || 0) / 10000000;
+ const seconds = (options.playerStartPositionTicks || 0) / 10000000;
if (seconds) {
val += '#t=' + seconds;
}
@@ -122,7 +123,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
self._currentPlayOptions = options;
- var crossOrigin = htmlMediaHelper.getCrossOriginValue(options.mediaSource);
+ const crossOrigin = htmlMediaHelper.getCrossOriginValue(options.mediaSource);
if (crossOrigin) {
elem.crossOrigin = crossOrigin;
}
@@ -130,9 +131,9 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
return enableHlsPlayer(val, options.item, options.mediaSource, 'Audio').then(function () {
return new Promise(function (resolve, reject) {
requireHlsPlayer(function () {
- var hls = new Hls({
+ const hls = new Hls({
manifestLoadingTimeOut: 20000,
- xhrSetup: function(xhr, url) {
+ xhrSetup: function (xhr, url) {
xhr.withCredentials = true;
}
});
@@ -183,8 +184,8 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
self.stop = function (destroyPlayer) {
cancelFadeTimeout();
- var elem = self._mediaElement;
- var src = self._currentSrc;
+ const elem = self._mediaElement;
+ const src = self._currentSrc;
if (elem && src) {
if (!destroyPlayer || !supportsFade()) {
@@ -198,7 +199,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
return Promise.resolve();
}
- var originalVolume = elem.volume;
+ const originalVolume = elem.volume;
return fade(self, elem, elem.volume).then(function () {
elem.pause();
@@ -219,7 +220,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
};
function createMediaElement() {
- var elem = self._mediaElement;
+ let elem = self._mediaElement;
if (elem) {
return elem;
@@ -248,7 +249,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
function onTimeUpdate() {
// Get the player position + the transcoding offset
- var time = this.currentTime;
+ const time = this.currentTime;
// Don't trigger events after user stop
if (!self._isFadingOut) {
@@ -287,11 +288,11 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
}
function onError() {
- var errorCode = this.error ? (this.error.code || 0) : 0;
- var errorMessage = this.error ? (this.error.message || '') : '';
+ const errorCode = this.error ? (this.error.code || 0) : 0;
+ const errorMessage = this.error ? (this.error.message || '') : '';
console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage);
- var type;
+ let type;
switch (errorCode) {
case 1:
@@ -325,59 +326,59 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
}
}
- HtmlAudioPlayer.prototype.currentSrc = function () {
+ currentSrc() {
return this._currentSrc;
- };
+ }
- HtmlAudioPlayer.prototype.canPlayMediaType = function (mediaType) {
+ canPlayMediaType(mediaType) {
return (mediaType || '').toLowerCase() === 'audio';
- };
+ }
- HtmlAudioPlayer.prototype.getDeviceProfile = function (item) {
+ getDeviceProfile(item) {
if (appHost.getDeviceProfile) {
return appHost.getDeviceProfile(item);
}
return getDefaultProfile();
- };
+ }
// Save this for when playback stops, because querying the time at that point might return 0
- HtmlAudioPlayer.prototype.currentTime = function (val) {
- var mediaElement = this._mediaElement;
+ currentTime(val) {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
if (val != null) {
mediaElement.currentTime = val / 1000;
return;
}
- var currentTime = this._currentTime;
+ const currentTime = this._currentTime;
if (currentTime) {
return currentTime * 1000;
}
return (mediaElement.currentTime || 0) * 1000;
}
- };
+ }
- HtmlAudioPlayer.prototype.duration = function (val) {
- var mediaElement = this._mediaElement;
+ duration(val) {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
- var duration = mediaElement.duration;
+ const duration = mediaElement.duration;
if (htmlMediaHelper.isValidDuration(duration)) {
return duration * 1000;
}
}
return null;
- };
+ }
- HtmlAudioPlayer.prototype.seekable = function () {
- var mediaElement = this._mediaElement;
+ seekable() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
- var seekable = mediaElement.seekable;
+ const seekable = mediaElement.seekable;
if (seekable && seekable.length) {
- var start = seekable.start(0);
- var end = seekable.end(0);
+ let start = seekable.start(0);
+ let end = seekable.end(0);
if (!htmlMediaHelper.isValidDuration(start)) {
start = 0;
@@ -391,124 +392,120 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
return false;
}
- };
+ }
- HtmlAudioPlayer.prototype.getBufferedRanges = function () {
- var mediaElement = this._mediaElement;
+ getBufferedRanges() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
return htmlMediaHelper.getBufferedRanges(this, mediaElement);
}
return [];
- };
+ }
- HtmlAudioPlayer.prototype.pause = function () {
- var mediaElement = this._mediaElement;
+ pause() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
mediaElement.pause();
}
- };
+ }
// This is a retry after error
- HtmlAudioPlayer.prototype.resume = function () {
- var mediaElement = this._mediaElement;
+ resume() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
mediaElement.play();
}
- };
+ }
- HtmlAudioPlayer.prototype.unpause = function () {
- var mediaElement = this._mediaElement;
+ unpause() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
mediaElement.play();
}
- };
+ }
- HtmlAudioPlayer.prototype.paused = function () {
- var mediaElement = this._mediaElement;
+ paused() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
return mediaElement.paused;
}
return false;
- };
+ }
- HtmlAudioPlayer.prototype.setPlaybackRate = function (value) {
- var mediaElement = this._mediaElement;
+ setPlaybackRate(value) {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
mediaElement.playbackRate = value;
}
- };
+ }
- HtmlAudioPlayer.prototype.getPlaybackRate = function () {
- var mediaElement = this._mediaElement;
+ getPlaybackRate() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
return mediaElement.playbackRate;
}
return null;
- };
+ }
- HtmlAudioPlayer.prototype.setVolume = function (val) {
- var mediaElement = this._mediaElement;
+ setVolume(val) {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
mediaElement.volume = val / 100;
}
- };
+ }
- HtmlAudioPlayer.prototype.getVolume = function () {
- var mediaElement = this._mediaElement;
+ getVolume() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
return Math.min(Math.round(mediaElement.volume * 100), 100);
}
- };
+ }
- HtmlAudioPlayer.prototype.volumeUp = function () {
+ volumeUp() {
this.setVolume(Math.min(this.getVolume() + 2, 100));
- };
+ }
- HtmlAudioPlayer.prototype.volumeDown = function () {
+ volumeDown() {
this.setVolume(Math.max(this.getVolume() - 2, 0));
- };
+ }
- HtmlAudioPlayer.prototype.setMute = function (mute) {
- var mediaElement = this._mediaElement;
+ setMute(mute) {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
mediaElement.muted = mute;
}
- };
+ }
- HtmlAudioPlayer.prototype.isMuted = function () {
- var mediaElement = this._mediaElement;
+ isMuted() {
+ const mediaElement = this._mediaElement;
if (mediaElement) {
return mediaElement.muted;
}
return false;
- };
-
- HtmlAudioPlayer.prototype.destroy = function () {
-
- };
-
- var supportedFeatures;
-
- function getSupportedFeatures() {
- var list = [];
- var audio = document.createElement('audio');
-
- if (typeof audio.playbackRate === 'number') {
- list.push('PlaybackRate');
- }
-
- return list;
}
- HtmlAudioPlayer.prototype.supports = function (feature) {
+ supports(feature) {
if (!supportedFeatures) {
supportedFeatures = getSupportedFeatures();
}
return supportedFeatures.indexOf(feature) !== -1;
- };
+ }
+}
- return HtmlAudioPlayer;
-});
+let supportedFeatures;
+
+function getSupportedFeatures() {
+ const list = [];
+ const audio = document.createElement('audio');
+
+ if (typeof audio.playbackRate === 'number') {
+ list.push('PlaybackRate');
+ }
+
+ return list;
+}
+
+export default HtmlAudioPlayer;
diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js
index bdd1d34e79..61b8f8a6d6 100644
--- a/src/plugins/logoScreensaver/plugin.js
+++ b/src/plugins/logoScreensaver/plugin.js
@@ -1,165 +1,165 @@
-define(['pluginManager'], function (pluginManager) {
- return function () {
- var self = this;
+import pluginManager from 'pluginManager';
- self.name = 'Logo ScreenSaver';
- self.type = 'screensaver';
- self.id = 'logoscreensaver';
- self.supportsAnonymous = true;
+export default function () {
+ const self = this;
- var interval;
+ self.name = 'Logo ScreenSaver';
+ self.type = 'screensaver';
+ self.id = 'logoscreensaver';
+ self.supportsAnonymous = true;
- function animate() {
- var animations = [
+ let interval;
- bounceInLeft,
- bounceInRight,
- swing,
- tada,
- wobble,
- rotateIn,
- rotateOut
- ];
+ function animate() {
+ const animations = [
- var elem = document.querySelector('.logoScreenSaverImage');
+ bounceInLeft,
+ bounceInRight,
+ swing,
+ tada,
+ wobble,
+ rotateIn,
+ rotateOut
+ ];
- if (elem && elem.animate) {
- var random = getRandomInt(0, animations.length - 1);
+ const elem = document.querySelector('.logoScreenSaverImage');
- animations[random](elem, 1);
+ if (elem && elem.animate) {
+ const random = getRandomInt(0, animations.length - 1);
+
+ animations[random](elem, 1);
+ }
+ }
+
+ function getRandomInt(min, max) {
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+ }
+
+ function bounceInLeft(elem, iterations) {
+ const keyframes = [
+ { transform: 'translate3d(-3000px, 0, 0)', opacity: '0', offset: 0 },
+ { transform: 'translate3d(25px, 0, 0)', opacity: '1', offset: 0.6 },
+ { transform: 'translate3d(-100px, 0, 0)', offset: 0.75 },
+ { transform: 'translate3d(5px, 0, 0)', offset: 0.9 },
+ { transform: 'none', opacity: '1', offset: 1 }];
+ const timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' };
+ return elem.animate(keyframes, timing);
+ }
+
+ function bounceInRight(elem, iterations) {
+ const keyframes = [
+ { transform: 'translate3d(3000px, 0, 0)', opacity: '0', offset: 0 },
+ { transform: 'translate3d(-25px, 0, 0)', opacity: '1', offset: 0.6 },
+ { transform: 'translate3d(100px, 0, 0)', offset: 0.75 },
+ { transform: 'translate3d(-5px, 0, 0)', offset: 0.9 },
+ { transform: 'none', opacity: '1', offset: 1 }];
+ const timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' };
+ return elem.animate(keyframes, timing);
+ }
+
+ function swing(elem, iterations) {
+ const keyframes = [
+ { transform: 'translate(0%)', offset: 0 },
+ { transform: 'rotate3d(0, 0, 1, 15deg)', offset: 0.2 },
+ { transform: 'rotate3d(0, 0, 1, -10deg)', offset: 0.4 },
+ { transform: 'rotate3d(0, 0, 1, 5deg)', offset: 0.6 },
+ { transform: 'rotate3d(0, 0, 1, -5deg)', offset: 0.8 },
+ { transform: 'rotate3d(0, 0, 1, 0deg)', offset: 1 }];
+ const timing = { duration: 900, iterations: iterations };
+ return elem.animate(keyframes, timing);
+ }
+
+ function tada(elem, iterations) {
+ const keyframes = [
+ { transform: 'scale3d(1, 1, 1)', offset: 0 },
+ { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.1 },
+ { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.2 },
+ { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.3 },
+ { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.4 },
+ { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.5 },
+ { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.6 },
+ { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.7 },
+ { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.8 },
+ { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.9 },
+ { transform: 'scale3d(1, 1, 1)', offset: 1 }];
+ const timing = { duration: 900, iterations: iterations };
+ return elem.animate(keyframes, timing);
+ }
+
+ function wobble(elem, iterations) {
+ const keyframes = [
+ { transform: 'translate(0%)', offset: 0 },
+ { transform: 'translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)', offset: 0.15 },
+ { transform: 'translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)', offset: 0.45 },
+ { transform: 'translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)', offset: 0.6 },
+ { transform: 'translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)', offset: 0.75 },
+ { transform: 'translateX(0%)', offset: 1 }];
+ const timing = { duration: 900, iterations: iterations };
+ return elem.animate(keyframes, timing);
+ }
+
+ function rotateIn(elem, iterations) {
+ const keyframes = [{ transform: 'rotate3d(0, 0, 1, -200deg)', opacity: '0', transformOrigin: 'center', offset: 0 },
+ { transform: 'none', opacity: '1', transformOrigin: 'center', offset: 1 }];
+ const timing = { duration: 900, iterations: iterations };
+ return elem.animate(keyframes, timing);
+ }
+
+ function rotateOut(elem, iterations) {
+ const keyframes = [{ transform: 'none', opacity: '1', transformOrigin: 'center', offset: 0 },
+ { transform: 'rotate3d(0, 0, 1, 200deg)', opacity: '0', transformOrigin: 'center', offset: 1 }];
+ const timing = { duration: 900, iterations: iterations };
+ return elem.animate(keyframes, timing);
+ }
+
+ function fadeOut(elem, iterations) {
+ const keyframes = [
+ { opacity: '1', offset: 0 },
+ { opacity: '0', offset: 1 }];
+ const timing = { duration: 400, iterations: iterations };
+ return elem.animate(keyframes, timing);
+ }
+
+ function stopInterval() {
+ if (interval) {
+ clearInterval(interval);
+ interval = null;
+ }
+ }
+
+ self.show = function () {
+ import('css!' + pluginManager.mapPath(self, 'style.css')).then(() => {
+ let elem = document.querySelector('.logoScreenSaver');
+
+ if (!elem) {
+ elem = document.createElement('div');
+ elem.classList.add('logoScreenSaver');
+ document.body.appendChild(elem);
+
+ elem.innerHTML = '

';
}
- }
- function getRandomInt(min, max) {
- return Math.floor(Math.random() * (max - min + 1)) + min;
- }
-
- function bounceInLeft(elem, iterations) {
- var keyframes = [
- { transform: 'translate3d(-3000px, 0, 0)', opacity: '0', offset: 0 },
- { transform: 'translate3d(25px, 0, 0)', opacity: '1', offset: 0.6 },
- { transform: 'translate3d(-100px, 0, 0)', offset: 0.75 },
- { transform: 'translate3d(5px, 0, 0)', offset: 0.9 },
- { transform: 'none', opacity: '1', offset: 1 }];
- var timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' };
- return elem.animate(keyframes, timing);
- }
-
- function bounceInRight(elem, iterations) {
- var keyframes = [
- { transform: 'translate3d(3000px, 0, 0)', opacity: '0', offset: 0 },
- { transform: 'translate3d(-25px, 0, 0)', opacity: '1', offset: 0.6 },
- { transform: 'translate3d(100px, 0, 0)', offset: 0.75 },
- { transform: 'translate3d(-5px, 0, 0)', offset: 0.9 },
- { transform: 'none', opacity: '1', offset: 1 }];
- var timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' };
- return elem.animate(keyframes, timing);
- }
-
- function swing(elem, iterations) {
- var keyframes = [
- { transform: 'translate(0%)', offset: 0 },
- { transform: 'rotate3d(0, 0, 1, 15deg)', offset: 0.2 },
- { transform: 'rotate3d(0, 0, 1, -10deg)', offset: 0.4 },
- { transform: 'rotate3d(0, 0, 1, 5deg)', offset: 0.6 },
- { transform: 'rotate3d(0, 0, 1, -5deg)', offset: 0.8 },
- { transform: 'rotate3d(0, 0, 1, 0deg)', offset: 1 }];
- var timing = { duration: 900, iterations: iterations };
- return elem.animate(keyframes, timing);
- }
-
- function tada(elem, iterations) {
- var keyframes = [
- { transform: 'scale3d(1, 1, 1)', offset: 0 },
- { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.1 },
- { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.2 },
- { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.3 },
- { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.4 },
- { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.5 },
- { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.6 },
- { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.7 },
- { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.8 },
- { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.9 },
- { transform: 'scale3d(1, 1, 1)', offset: 1 }];
- var timing = { duration: 900, iterations: iterations };
- return elem.animate(keyframes, timing);
- }
-
- function wobble(elem, iterations) {
- var keyframes = [
- { transform: 'translate(0%)', offset: 0 },
- { transform: 'translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)', offset: 0.15 },
- { transform: 'translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)', offset: 0.45 },
- { transform: 'translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)', offset: 0.6 },
- { transform: 'translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)', offset: 0.75 },
- { transform: 'translateX(0%)', offset: 1 }];
- var timing = { duration: 900, iterations: iterations };
- return elem.animate(keyframes, timing);
- }
-
- function rotateIn(elem, iterations) {
- var keyframes = [{ transform: 'rotate3d(0, 0, 1, -200deg)', opacity: '0', transformOrigin: 'center', offset: 0 },
- { transform: 'none', opacity: '1', transformOrigin: 'center', offset: 1 }];
- var timing = { duration: 900, iterations: iterations };
- return elem.animate(keyframes, timing);
- }
-
- function rotateOut(elem, iterations) {
- var keyframes = [{ transform: 'none', opacity: '1', transformOrigin: 'center', offset: 0 },
- { transform: 'rotate3d(0, 0, 1, 200deg)', opacity: '0', transformOrigin: 'center', offset: 1 }];
- var timing = { duration: 900, iterations: iterations };
- return elem.animate(keyframes, timing);
- }
-
- function fadeOut(elem, iterations) {
- var keyframes = [
- { opacity: '1', offset: 0 },
- { opacity: '0', offset: 1 }];
- var timing = { duration: 400, iterations: iterations };
- return elem.animate(keyframes, timing);
- }
-
- function stopInterval() {
- if (interval) {
- clearInterval(interval);
- interval = null;
- }
- }
-
- self.show = function () {
- require(['css!' + pluginManager.mapPath(self, 'style.css')], function () {
- var elem = document.querySelector('.logoScreenSaver');
-
- if (!elem) {
- elem = document.createElement('div');
- elem.classList.add('logoScreenSaver');
- document.body.appendChild(elem);
-
- elem.innerHTML = '

';
- }
-
- stopInterval();
- interval = setInterval(animate, 3000);
- });
- };
-
- self.hide = function () {
stopInterval();
-
- var elem = document.querySelector('.logoScreenSaver');
-
- if (elem) {
- var onAnimationFinish = function () {
- elem.parentNode.removeChild(elem);
- };
-
- if (elem.animate) {
- var animation = fadeOut(elem, 1);
- animation.onfinish = onAnimationFinish;
- } else {
- onAnimationFinish();
- }
- }
- };
+ interval = setInterval(animate, 3000);
+ });
};
-});
+
+ self.hide = function () {
+ stopInterval();
+
+ const elem = document.querySelector('.logoScreenSaver');
+
+ if (elem) {
+ const onAnimationFinish = function () {
+ elem.parentNode.removeChild(elem);
+ };
+
+ if (elem.animate) {
+ const animation = fadeOut(elem, 1);
+ animation.onfinish = onAnimationFinish;
+ } else {
+ onAnimationFinish();
+ }
+ }
+ };
+}
diff --git a/src/plugins/playAccessValidation/plugin.js b/src/plugins/playAccessValidation/plugin.js
index 5148d2b821..a9fbeda9a9 100644
--- a/src/plugins/playAccessValidation/plugin.js
+++ b/src/plugins/playAccessValidation/plugin.js
@@ -1,33 +1,26 @@
-define(['connectionManager', 'globalize'], function (connectionManager, globalize) {
- 'use strict';
+import connectionManager from 'connectionManager';
+import globalize from 'globalize';
- function getRequirePromise(deps) {
- return new Promise(function (resolve, reject) {
- require(deps, resolve);
- });
- }
+function showErrorMessage() {
+ return import('alert').then(({default: alert}) => {
+ return alert(globalize.translate('MessagePlayAccessRestricted'));
+ });
+}
- function showErrorMessage() {
- return getRequirePromise(['alert']).then(function (alert) {
- return alert(globalize.translate('MessagePlayAccessRestricted')).then(function () {
- return Promise.reject();
- });
- });
- }
-
- function PlayAccessValidation() {
+class PlayAccessValidation {
+ constructor() {
this.name = 'Playback validation';
this.type = 'preplayintercept';
this.id = 'playaccessvalidation';
this.order = -2;
}
- PlayAccessValidation.prototype.intercept = function (options) {
- var item = options.item;
+ intercept(options) {
+ const item = options.item;
if (!item) {
return Promise.resolve();
}
- var serverId = item.ServerId;
+ const serverId = item.ServerId;
if (!serverId) {
return Promise.resolve();
}
@@ -44,7 +37,7 @@ define(['connectionManager', 'globalize'], function (connectionManager, globaliz
return showErrorMessage();
});
- };
+ }
+}
- return PlayAccessValidation;
-});
+export default PlayAccessValidation;
diff --git a/src/scripts/itembynamedetailpage.js b/src/scripts/itembynamedetailpage.js
index eaeecba275..f464f3b9e9 100644
--- a/src/scripts/itembynamedetailpage.js
+++ b/src/scripts/itembynamedetailpage.js
@@ -1,369 +1,374 @@
-define(['connectionManager', 'listView', 'cardBuilder', 'imageLoader', 'libraryBrowser', 'globalize', 'emby-itemscontainer', 'emby-button'], function (connectionManager, listView, cardBuilder, imageLoader, libraryBrowser, globalize) {
- 'use strict';
+import connectionManager from 'connectionManager';
+import listView from 'listView';
+import cardBuilder from 'cardBuilder';
+import imageLoader from 'imageLoader';
+import globalize from 'globalize';
+import 'emby-itemscontainer';
+import 'emby-button';
- function renderItems(page, item) {
- var sections = [];
+function renderItems(page, item) {
+ const sections = [];
- if (item.ArtistCount) {
- sections.push({
- name: globalize.translate('TabArtists'),
- type: 'MusicArtist'
- });
- }
-
- if (item.ProgramCount && item.Type == 'Person') {
- sections.push({
- name: globalize.translate('HeaderUpcomingOnTV'),
- type: 'Program'
- });
- }
-
- if (item.MovieCount) {
- sections.push({
- name: globalize.translate('TabMovies'),
- type: 'Movie'
- });
- }
-
- if (item.SeriesCount) {
- sections.push({
- name: globalize.translate('TabShows'),
- type: 'Series'
- });
- }
-
- if (item.EpisodeCount) {
- sections.push({
- name: globalize.translate('TabEpisodes'),
- type: 'Episode'
- });
- }
-
- if (item.TrailerCount) {
- sections.push({
- name: globalize.translate('TabTrailers'),
- type: 'Trailer'
- });
- }
-
- if (item.AlbumCount) {
- sections.push({
- name: globalize.translate('TabAlbums'),
- type: 'MusicAlbum'
- });
- }
-
- if (item.MusicVideoCount) {
- sections.push({
- name: globalize.translate('TabMusicVideos'),
- type: 'MusicVideo'
- });
- }
-
- var elem = page.querySelector('#childrenContent');
- elem.innerHTML = sections.map(function (section) {
- var html = '';
- var sectionClass = 'verticalSection';
-
- if (section.type === 'Audio') {
- sectionClass += ' verticalSection-extrabottompadding';
- }
-
- html += '
';
- html += '
';
- html += '
';
- html += '
';
- return html += '
';
- }).join('');
- var sectionElems = elem.querySelectorAll('.verticalSection');
-
- for (var i = 0, length = sectionElems.length; i < length; i++) {
- renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute('data-type'));
- }
- }
-
- function renderSection(page, item, element, type) {
- switch (type) {
- case 'Program':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'Program',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- Limit: 10,
- SortBy: 'StartDate'
- }, {
- shape: 'overflowBackdrop',
- showTitle: true,
- centerText: true,
- overlayMoreButton: true,
- preferThumb: true,
- overlayText: false,
- showAirTime: true,
- showAirDateTime: true,
- showChannelName: true
- });
- break;
-
- case 'Movie':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'Movie',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- Limit: 10,
- SortBy: 'SortName'
- }, {
- shape: 'overflowPortrait',
- showTitle: true,
- centerText: true,
- overlayMoreButton: true,
- overlayText: false,
- showYear: true
- });
- break;
-
- case 'MusicVideo':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'MusicVideo',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- Limit: 10,
- SortBy: 'SortName'
- }, {
- shape: 'overflowPortrait',
- showTitle: true,
- centerText: true,
- overlayPlayButton: true
- });
- break;
-
- case 'Trailer':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'Trailer',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- Limit: 10,
- SortBy: 'SortName'
- }, {
- shape: 'overflowPortrait',
- showTitle: true,
- centerText: true,
- overlayPlayButton: true
- });
- break;
-
- case 'Series':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'Series',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- Limit: 10,
- SortBy: 'SortName'
- }, {
- shape: 'overflowPortrait',
- showTitle: true,
- centerText: true,
- overlayMoreButton: true
- });
- break;
-
- case 'MusicAlbum':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'MusicAlbum',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- SortOrder: 'Descending',
- SortBy: 'ProductionYear,Sortname'
- }, {
- shape: 'overflowSquare',
- playFromHere: true,
- showTitle: true,
- showYear: true,
- coverImage: true,
- centerText: true,
- overlayPlayButton: true
- });
- break;
-
- case 'MusicArtist':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'MusicArtist',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- Limit: 8,
- SortBy: 'SortName'
- }, {
- shape: 'overflowSquare',
- playFromHere: true,
- showTitle: true,
- showParentTitle: true,
- coverImage: true,
- centerText: true,
- overlayPlayButton: true
- });
- break;
-
- case 'Episode':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'Episode',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- Limit: 6,
- SortBy: 'SortName'
- }, {
- shape: 'overflowBackdrop',
- showTitle: true,
- showParentTitle: true,
- centerText: true,
- overlayPlayButton: true
- });
- break;
-
- case 'Audio':
- loadItems(element, item, type, {
- MediaTypes: '',
- IncludeItemTypes: 'Audio',
- PersonTypes: '',
- ArtistIds: '',
- AlbumArtistIds: '',
- SortBy: 'AlbumArtist,Album,SortName'
- }, {
- playFromHere: true,
- action: 'playallfromhere',
- smallIcon: true,
- artist: true
- });
- }
- }
-
- function loadItems(element, item, type, query, listOptions) {
- query = getQuery(query, item);
- getItemsFunction(query, item)(query.StartIndex, query.Limit, query.Fields).then(function (result) {
- var html = '';
-
- if (query.Limit && result.TotalRecordCount > query.Limit) {
- var link = element.querySelector('a');
- link.classList.remove('hide');
- link.setAttribute('href', getMoreItemsHref(item, type));
- } else {
- element.querySelector('a').classList.add('hide');
- }
-
- listOptions.items = result.Items;
- var itemsContainer = element.querySelector('.itemsContainer');
-
- if (type == 'Audio') {
- html = listView.getListViewHtml(listOptions);
- itemsContainer.classList.remove('vertical-wrap');
- itemsContainer.classList.add('vertical-list');
- } else {
- html = cardBuilder.getCardsHtml(listOptions);
- itemsContainer.classList.add('vertical-wrap');
- itemsContainer.classList.remove('vertical-list');
- }
-
- itemsContainer.innerHTML = html;
- imageLoader.lazyChildren(itemsContainer);
+ if (item.ArtistCount) {
+ sections.push({
+ name: globalize.translate('TabArtists'),
+ type: 'MusicArtist'
});
}
- function getMoreItemsHref(item, type) {
- if (item.Type == 'Genre') {
- return 'list.html?type=' + type + '&genreId=' + item.Id + '&serverId=' + item.ServerId;
- }
-
- if (item.Type == 'MusicGenre') {
- return 'list.html?type=' + type + '&musicGenreId=' + item.Id + '&serverId=' + item.ServerId;
- }
-
- if (item.Type == 'Studio') {
- return 'list.html?type=' + type + '&studioId=' + item.Id + '&serverId=' + item.ServerId;
- }
-
- if (item.Type == 'MusicArtist') {
- return 'list.html?type=' + type + '&artistId=' + item.Id + '&serverId=' + item.ServerId;
- }
-
- if (item.Type == 'Person') {
- return 'list.html?type=' + type + '&personId=' + item.Id + '&serverId=' + item.ServerId;
- }
-
- return 'list.html?type=' + type + '&parentId=' + item.Id + '&serverId=' + item.ServerId;
+ if (item.ProgramCount && item.Type === 'Person') {
+ sections.push({
+ name: globalize.translate('HeaderUpcomingOnTV'),
+ type: 'Program'
+ });
}
- function addCurrentItemToQuery(query, item) {
- if (item.Type == 'Person') {
- query.PersonIds = item.Id;
- } else if (item.Type == 'Genre') {
- query.Genres = item.Name;
- } else if (item.Type == 'MusicGenre') {
- query.Genres = item.Name;
- } else if (item.Type == 'GameGenre') {
- query.Genres = item.Name;
- } else if (item.Type == 'Studio') {
- query.StudioIds = item.Id;
- } else if (item.Type == 'MusicArtist') {
- query.AlbumArtistIds = item.Id;
+ if (item.MovieCount) {
+ sections.push({
+ name: globalize.translate('TabMovies'),
+ type: 'Movie'
+ });
+ }
+
+ if (item.SeriesCount) {
+ sections.push({
+ name: globalize.translate('TabShows'),
+ type: 'Series'
+ });
+ }
+
+ if (item.EpisodeCount) {
+ sections.push({
+ name: globalize.translate('TabEpisodes'),
+ type: 'Episode'
+ });
+ }
+
+ if (item.TrailerCount) {
+ sections.push({
+ name: globalize.translate('TabTrailers'),
+ type: 'Trailer'
+ });
+ }
+
+ if (item.AlbumCount) {
+ sections.push({
+ name: globalize.translate('TabAlbums'),
+ type: 'MusicAlbum'
+ });
+ }
+
+ if (item.MusicVideoCount) {
+ sections.push({
+ name: globalize.translate('TabMusicVideos'),
+ type: 'MusicVideo'
+ });
+ }
+
+ const elem = page.querySelector('#childrenContent');
+ elem.innerHTML = sections.map(function (section) {
+ let html = '';
+ let sectionClass = 'verticalSection';
+
+ if (section.type === 'Audio') {
+ sectionClass += ' verticalSection-extrabottompadding';
}
+
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '
';
+ return html;
+ }).join('');
+ const sectionElems = elem.querySelectorAll('.verticalSection');
+
+ for (let i = 0, length = sectionElems.length; i < length; i++) {
+ renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute('data-type'));
+ }
+}
+
+function renderSection(page, item, element, type) {
+ switch (type) {
+ case 'Program':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'Program',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ Limit: 10,
+ SortBy: 'StartDate'
+ }, {
+ shape: 'overflowBackdrop',
+ showTitle: true,
+ centerText: true,
+ overlayMoreButton: true,
+ preferThumb: true,
+ overlayText: false,
+ showAirTime: true,
+ showAirDateTime: true,
+ showChannelName: true
+ });
+ break;
+
+ case 'Movie':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'Movie',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ Limit: 10,
+ SortBy: 'SortName'
+ }, {
+ shape: 'overflowPortrait',
+ showTitle: true,
+ centerText: true,
+ overlayMoreButton: true,
+ overlayText: false,
+ showYear: true
+ });
+ break;
+
+ case 'MusicVideo':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'MusicVideo',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ Limit: 10,
+ SortBy: 'SortName'
+ }, {
+ shape: 'overflowPortrait',
+ showTitle: true,
+ centerText: true,
+ overlayPlayButton: true
+ });
+ break;
+
+ case 'Trailer':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'Trailer',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ Limit: 10,
+ SortBy: 'SortName'
+ }, {
+ shape: 'overflowPortrait',
+ showTitle: true,
+ centerText: true,
+ overlayPlayButton: true
+ });
+ break;
+
+ case 'Series':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'Series',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ Limit: 10,
+ SortBy: 'SortName'
+ }, {
+ shape: 'overflowPortrait',
+ showTitle: true,
+ centerText: true,
+ overlayMoreButton: true
+ });
+ break;
+
+ case 'MusicAlbum':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'MusicAlbum',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ SortOrder: 'Descending',
+ SortBy: 'ProductionYear,Sortname'
+ }, {
+ shape: 'overflowSquare',
+ playFromHere: true,
+ showTitle: true,
+ showYear: true,
+ coverImage: true,
+ centerText: true,
+ overlayPlayButton: true
+ });
+ break;
+
+ case 'MusicArtist':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'MusicArtist',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ Limit: 8,
+ SortBy: 'SortName'
+ }, {
+ shape: 'overflowSquare',
+ playFromHere: true,
+ showTitle: true,
+ showParentTitle: true,
+ coverImage: true,
+ centerText: true,
+ overlayPlayButton: true
+ });
+ break;
+
+ case 'Episode':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'Episode',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ Limit: 6,
+ SortBy: 'SortName'
+ }, {
+ shape: 'overflowBackdrop',
+ showTitle: true,
+ showParentTitle: true,
+ centerText: true,
+ overlayPlayButton: true
+ });
+ break;
+
+ case 'Audio':
+ loadItems(element, item, type, {
+ MediaTypes: '',
+ IncludeItemTypes: 'Audio',
+ PersonTypes: '',
+ ArtistIds: '',
+ AlbumArtistIds: '',
+ SortBy: 'AlbumArtist,Album,SortName'
+ }, {
+ playFromHere: true,
+ action: 'playallfromhere',
+ smallIcon: true,
+ artist: true
+ });
+ }
+}
+
+function loadItems(element, item, type, query, listOptions) {
+ query = getQuery(query, item);
+ getItemsFunction(query, item)(query.StartIndex, query.Limit, query.Fields).then(function (result) {
+ let html = '';
+
+ if (query.Limit && result.TotalRecordCount > query.Limit) {
+ const link = element.querySelector('a');
+ link.classList.remove('hide');
+ link.setAttribute('href', getMoreItemsHref(item, type));
+ } else {
+ element.querySelector('a').classList.add('hide');
+ }
+
+ listOptions.items = result.Items;
+ const itemsContainer = element.querySelector('.itemsContainer');
+
+ if (type === 'Audio') {
+ html = listView.getListViewHtml(listOptions);
+ itemsContainer.classList.remove('vertical-wrap');
+ itemsContainer.classList.add('vertical-list');
+ } else {
+ html = cardBuilder.getCardsHtml(listOptions);
+ itemsContainer.classList.add('vertical-wrap');
+ itemsContainer.classList.remove('vertical-list');
+ }
+
+ itemsContainer.innerHTML = html;
+ imageLoader.lazyChildren(itemsContainer);
+ });
+}
+
+function getMoreItemsHref(item, type) {
+ if (item.Type === 'Genre') {
+ return 'list.html?type=' + type + '&genreId=' + item.Id + '&serverId=' + item.ServerId;
}
- function getQuery(options, item) {
- var query = {
- SortOrder: 'Ascending',
- IncludeItemTypes: '',
- Recursive: true,
- Fields: 'AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo',
- Limit: 100,
- StartIndex: 0,
- CollapseBoxSetItems: false
- };
- query = Object.assign(query, options || {});
- addCurrentItemToQuery(query, item);
- return query;
+ if (item.Type === 'MusicGenre') {
+ return 'list.html?type=' + type + '&musicGenreId=' + item.Id + '&serverId=' + item.ServerId;
}
- function getItemsFunction(options, item) {
- var query = getQuery(options, item);
- return function (index, limit, fields) {
- query.StartIndex = index;
- query.Limit = limit;
-
- if (fields) {
- query.Fields += ',' + fields;
- }
-
- var apiClient = connectionManager.getApiClient(item.ServerId);
-
- if (query.IncludeItemTypes === 'MusicArtist') {
- query.IncludeItemTypes = null;
- return apiClient.getAlbumArtists(apiClient.getCurrentUserId(), query);
- }
-
- return apiClient.getItems(apiClient.getCurrentUserId(), query);
- };
+ if (item.Type === 'Studio') {
+ return 'list.html?type=' + type + '&studioId=' + item.Id + '&serverId=' + item.ServerId;
}
- window.ItemsByName = {
- renderItems: renderItems
+ if (item.Type === 'MusicArtist') {
+ return 'list.html?type=' + type + '&artistId=' + item.Id + '&serverId=' + item.ServerId;
+ }
+
+ if (item.Type === 'Person') {
+ return 'list.html?type=' + type + '&personId=' + item.Id + '&serverId=' + item.ServerId;
+ }
+
+ return 'list.html?type=' + type + '&parentId=' + item.Id + '&serverId=' + item.ServerId;
+}
+
+function addCurrentItemToQuery(query, item) {
+ if (item.Type === 'Person') {
+ query.PersonIds = item.Id;
+ } else if (item.Type === 'Genre') {
+ query.Genres = item.Name;
+ } else if (item.Type === 'MusicGenre') {
+ query.Genres = item.Name;
+ } else if (item.Type === 'GameGenre') {
+ query.Genres = item.Name;
+ } else if (item.Type === 'Studio') {
+ query.StudioIds = item.Id;
+ } else if (item.Type === 'MusicArtist') {
+ query.AlbumArtistIds = item.Id;
+ }
+}
+
+function getQuery(options, item) {
+ let query = {
+ SortOrder: 'Ascending',
+ IncludeItemTypes: '',
+ Recursive: true,
+ Fields: 'AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo',
+ Limit: 100,
+ StartIndex: 0,
+ CollapseBoxSetItems: false
};
-});
+ query = Object.assign(query, options || {});
+ addCurrentItemToQuery(query, item);
+ return query;
+}
+
+function getItemsFunction(options, item) {
+ const query = getQuery(options, item);
+ return function (index, limit, fields) {
+ query.StartIndex = index;
+ query.Limit = limit;
+
+ if (fields) {
+ query.Fields += ',' + fields;
+ }
+
+ const apiClient = connectionManager.getApiClient(item.ServerId);
+
+ if (query.IncludeItemTypes === 'MusicArtist') {
+ query.IncludeItemTypes = null;
+ return apiClient.getAlbumArtists(apiClient.getCurrentUserId(), query);
+ }
+
+ return apiClient.getItems(apiClient.getCurrentUserId(), query);
+ };
+}
+
+window.ItemsByName = {
+ renderItems: renderItems
+};
diff --git a/src/scripts/libraryBrowser.js b/src/scripts/libraryBrowser.js
index 46cda51e55..83d683a690 100644
--- a/src/scripts/libraryBrowser.js
+++ b/src/scripts/libraryBrowser.js
@@ -119,7 +119,10 @@ export function getQueryPagingHtml (options) {
}
export function showSortMenu (options) {
- require(['dialogHelper', 'emby-radio'], function (dialogHelper) {
+ Promise.all([
+ import('dialogHelper'),
+ import('emby-radio')
+ ]).then(([{default: dialogHelper}]) => {
function onSortByChange() {
var newValue = this.value;
diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js
index 376b19f70d..ec572752b9 100644
--- a/src/scripts/libraryMenu.js
+++ b/src/scripts/libraryMenu.js
@@ -1,12 +1,26 @@
-define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', 'viewManager', 'libraryBrowser', 'appRouter', 'apphost', 'playbackManager', 'syncPlayManager', 'groupSelectionMenu', 'browser', 'globalize', 'scripts/imagehelper', 'paper-icon-button-light', 'material-icons', 'scrollStyles', 'flexStyles'], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, syncPlayManager, groupSelectionMenu, browser, globalize, imageHelper) {
- 'use strict';
+import dom from 'dom';
+import layoutManager from 'layoutManager';
+import inputManager from 'inputManager';
+import connectionManager from 'connectionManager';
+import events from 'events';
+import viewManager from 'viewManager';
+import appRouter from 'appRouter';
+import appHost from 'apphost';
+import playbackManager from 'playbackManager';
+import syncPlayManager from 'syncPlayManager';
+import groupSelectionMenu from 'groupSelectionMenu';
+import browser from 'browser';
+import globalize from 'globalize';
+import imageHelper from 'scripts/imagehelper';
+import 'paper-icon-button-light';
+import 'material-icons';
+import 'scrollStyles';
+import 'flexStyles';
- viewManager = viewManager.default || viewManager;
- playbackManager = playbackManager.default || playbackManager;
- browser = browser.default || browser;
+/* eslint-disable indent */
function renderHeader() {
- var html = '';
+ let html = '';
html += '