diff --git a/package.json b/package.json
index ba67fcf66..b48bd1744 100644
--- a/package.json
+++ b/package.json
@@ -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": [
@@ -127,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",
@@ -158,19 +160,28 @@
"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/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 +211,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 +232,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",
@@ -278,6 +294,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",
@@ -301,6 +318,7 @@
"src/scripts/autoThemes.js",
"src/scripts/themeManager.js",
"src/scripts/keyboardNavigation.js",
+ "src/scripts/libraryMenu.js",
"src/scripts/libraryBrowser.js",
"src/scripts/mouseManager.js",
"src/scripts/multiDownload.js",
diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js
index 37fb66e0d..df74dc2a1 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/imageDownloader/imageDownloader.js b/src/components/imageDownloader/imageDownloader.js
index 2be2ef09b..3f78a5ecb 100644
--- a/src/components/imageDownloader/imageDownloader.js
+++ b/src/components/imageDownloader/imageDownloader.js
@@ -8,7 +8,6 @@ import browser from 'browser';
import layoutManager from 'layoutManager';
import scrollHelper from 'scrollHelper';
import globalize from 'globalize';
-import require from 'require';
import 'emby-checkbox';
import 'paper-icon-button-light';
import 'emby-button';
@@ -317,7 +316,7 @@ import 'cardStyle';
function showEditor(itemId, serverId, itemType) {
loading.show();
- require(['text!./imageDownloader.template.html'], function (template) {
+ import('text!./imageDownloader.template.html').then(({default: template}) => {
const apiClient = connectionManager.getApiClient(serverId);
currentItemId = itemId;
diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js
index 5ce9a3b6e..3883e6e49 100644
--- a/src/components/itemsrefresher.js
+++ b/src/components/itemsrefresher.js
@@ -1,131 +1,130 @@
-define(['playbackManager', 'serverNotifications', 'events'], function (playbackManager, serverNotifications, events) {
- 'use strict';
+import playbackManager from 'playbackManager';
+import serverNotifications from 'serverNotifications';
+import events from 'events';
- serverNotifications = serverNotifications.default || serverNotifications;
- playbackManager = playbackManager.default || playbackManager;
+function onUserDataChanged(e, apiClient, userData) {
+ const instance = this;
- function onUserDataChanged(e, apiClient, userData) {
- var instance = this;
-
- var eventsToMonitor = getEventsToMonitor(instance);
-
- // TODO: Check user data change reason?
- if (eventsToMonitor.indexOf('markfavorite') !== -1) {
- instance.notifyRefreshNeeded();
- } else if (eventsToMonitor.indexOf('markplayed') !== -1) {
- instance.notifyRefreshNeeded();
- }
- }
-
- function getEventsToMonitor(instance) {
- var options = instance.options;
- var monitor = options ? options.monitorEvents : null;
- if (monitor) {
- return monitor.split(',');
- }
-
- return [];
- }
-
- function onTimerCreated(e, apiClient, data) {
- var instance = this;
-
- if (getEventsToMonitor(instance).indexOf('timers') !== -1) {
- instance.notifyRefreshNeeded();
- return;
- }
- }
-
- function onSeriesTimerCreated(e, apiClient, data) {
- var instance = this;
- if (getEventsToMonitor(instance).indexOf('seriestimers') !== -1) {
- instance.notifyRefreshNeeded();
- return;
- }
- }
-
- function onTimerCancelled(e, apiClient, data) {
- var instance = this;
-
- if (getEventsToMonitor(instance).indexOf('timers') !== -1) {
- instance.notifyRefreshNeeded();
- return;
- }
- }
-
- function onSeriesTimerCancelled(e, apiClient, data) {
- var instance = this;
- if (getEventsToMonitor(instance).indexOf('seriestimers') !== -1) {
- instance.notifyRefreshNeeded();
- return;
- }
- }
-
- function onLibraryChanged(e, apiClient, data) {
- var instance = this;
- var eventsToMonitor = getEventsToMonitor(instance);
- if (eventsToMonitor.indexOf('seriestimers') !== -1 || eventsToMonitor.indexOf('timers') !== -1) {
- // yes this is an assumption
- return;
- }
-
- var itemsAdded = data.ItemsAdded || [];
- var itemsRemoved = data.ItemsRemoved || [];
- if (!itemsAdded.length && !itemsRemoved.length) {
- return;
- }
-
- var options = instance.options || {};
- var parentId = options.parentId;
- if (parentId) {
- var foldersAddedTo = data.FoldersAddedTo || [];
- var foldersRemovedFrom = data.FoldersRemovedFrom || [];
- var collectionFolders = data.CollectionFolders || [];
-
- if (foldersAddedTo.indexOf(parentId) === -1 && foldersRemovedFrom.indexOf(parentId) === -1 && collectionFolders.indexOf(parentId) === -1) {
- return;
- }
- }
+ const eventsToMonitor = getEventsToMonitor(instance);
+ // TODO: Check user data change reason?
+ if (eventsToMonitor.indexOf('markfavorite') !== -1) {
+ instance.notifyRefreshNeeded();
+ } else if (eventsToMonitor.indexOf('markplayed') !== -1) {
instance.notifyRefreshNeeded();
}
+}
- function onPlaybackStopped(e, stopInfo) {
- var instance = this;
+function getEventsToMonitor(instance) {
+ const options = instance.options;
+ const monitor = options ? options.monitorEvents : null;
+ if (monitor) {
+ return monitor.split(',');
+ }
- var state = stopInfo.state;
+ return [];
+}
- var eventsToMonitor = getEventsToMonitor(instance);
- if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Video') {
- if (eventsToMonitor.indexOf('videoplayback') !== -1) {
- instance.notifyRefreshNeeded(true);
- return;
- }
- } else if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Audio') {
- if (eventsToMonitor.indexOf('audioplayback') !== -1) {
- instance.notifyRefreshNeeded(true);
- return;
- }
+function onTimerCreated(e, apiClient, data) {
+ const instance = this;
+
+ if (getEventsToMonitor(instance).indexOf('timers') !== -1) {
+ instance.notifyRefreshNeeded();
+ return;
+ }
+}
+
+function onSeriesTimerCreated(e, apiClient, data) {
+ const instance = this;
+ if (getEventsToMonitor(instance).indexOf('seriestimers') !== -1) {
+ instance.notifyRefreshNeeded();
+ return;
+ }
+}
+
+function onTimerCancelled(e, apiClient, data) {
+ const instance = this;
+
+ if (getEventsToMonitor(instance).indexOf('timers') !== -1) {
+ instance.notifyRefreshNeeded();
+ return;
+ }
+}
+
+function onSeriesTimerCancelled(e, apiClient, data) {
+ const instance = this;
+ if (getEventsToMonitor(instance).indexOf('seriestimers') !== -1) {
+ instance.notifyRefreshNeeded();
+ return;
+ }
+}
+
+function onLibraryChanged(e, apiClient, data) {
+ const instance = this;
+ const eventsToMonitor = getEventsToMonitor(instance);
+ if (eventsToMonitor.indexOf('seriestimers') !== -1 || eventsToMonitor.indexOf('timers') !== -1) {
+ // yes this is an assumption
+ return;
+ }
+
+ const itemsAdded = data.ItemsAdded || [];
+ const itemsRemoved = data.ItemsRemoved || [];
+ if (!itemsAdded.length && !itemsRemoved.length) {
+ return;
+ }
+
+ const options = instance.options || {};
+ const parentId = options.parentId;
+ if (parentId) {
+ const foldersAddedTo = data.FoldersAddedTo || [];
+ const foldersRemovedFrom = data.FoldersRemovedFrom || [];
+ const collectionFolders = data.CollectionFolders || [];
+
+ if (foldersAddedTo.indexOf(parentId) === -1 && foldersRemovedFrom.indexOf(parentId) === -1 && collectionFolders.indexOf(parentId) === -1) {
+ return;
}
}
- function addNotificationEvent(instance, name, handler, owner) {
- var localHandler = handler.bind(instance);
+ instance.notifyRefreshNeeded();
+}
+
+function onPlaybackStopped(e, stopInfo) {
+ const instance = this;
+
+ const state = stopInfo.state;
+
+ const eventsToMonitor = getEventsToMonitor(instance);
+ if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Video') {
+ if (eventsToMonitor.indexOf('videoplayback') !== -1) {
+ instance.notifyRefreshNeeded(true);
+ return;
+ }
+ } else if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Audio') {
+ if (eventsToMonitor.indexOf('audioplayback') !== -1) {
+ instance.notifyRefreshNeeded(true);
+ return;
+ }
+ }
+}
+
+function addNotificationEvent(instance, name, handler, owner) {
+ const localHandler = handler.bind(instance);
+ owner = owner || serverNotifications;
+ events.on(owner, name, localHandler);
+ instance['event_' + name] = localHandler;
+}
+
+function removeNotificationEvent(instance, name, owner) {
+ const handler = instance['event_' + name];
+ if (handler) {
owner = owner || serverNotifications;
- events.on(owner, name, localHandler);
- instance['event_' + name] = localHandler;
+ events.off(owner, name, handler);
+ instance['event_' + name] = null;
}
+}
- function removeNotificationEvent(instance, name, owner) {
- var handler = instance['event_' + name];
- if (handler) {
- owner = owner || serverNotifications;
- events.off(owner, name, handler);
- instance['event_' + name] = null;
- }
- }
-
- function ItemsRefresher(options) {
+class ItemsRefresher {
+ constructor(options) {
this.options = options || {};
addNotificationEvent(this, 'UserDataChanged', onUserDataChanged);
@@ -137,18 +136,18 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM
addNotificationEvent(this, 'playbackstop', onPlaybackStopped, playbackManager);
}
- ItemsRefresher.prototype.pause = function () {
+ pause() {
clearRefreshInterval(this, true);
this.paused = true;
- };
+ }
- ItemsRefresher.prototype.resume = function (options) {
+ resume(options) {
this.paused = false;
- var refreshIntervalEndTime = this.refreshIntervalEndTime;
+ const refreshIntervalEndTime = this.refreshIntervalEndTime;
if (refreshIntervalEndTime) {
- var remainingMs = refreshIntervalEndTime - new Date().getTime();
+ const remainingMs = refreshIntervalEndTime - new Date().getTime();
if (remainingMs > 0 && !this.needsRefresh) {
resetRefreshInterval(this, remainingMs);
} else {
@@ -162,9 +161,9 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM
}
return Promise.resolve();
- };
+ }
- ItemsRefresher.prototype.refreshItems = function () {
+ refreshItems() {
if (!this.fetchData) {
return Promise.resolve();
}
@@ -177,15 +176,15 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM
this.needsRefresh = false;
return this.fetchData().then(onDataFetched.bind(this));
- };
+ }
- ItemsRefresher.prototype.notifyRefreshNeeded = function (isInForeground) {
+ notifyRefreshNeeded(isInForeground) {
if (this.paused) {
this.needsRefresh = true;
return;
}
- var timeout = this.refreshTimeout;
+ const timeout = this.refreshTimeout;
if (timeout) {
clearTimeout(timeout);
}
@@ -195,44 +194,9 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM
} else {
this.refreshTimeout = setTimeout(this.refreshItems.bind(this), 10000);
}
- };
-
- function clearRefreshInterval(instance, isPausing) {
- if (instance.refreshInterval) {
- clearInterval(instance.refreshInterval);
- instance.refreshInterval = null;
-
- if (!isPausing) {
- instance.refreshIntervalEndTime = null;
- }
- }
}
- function resetRefreshInterval(instance, intervalMs) {
- clearRefreshInterval(instance);
-
- if (!intervalMs) {
- var options = instance.options;
- if (options) {
- intervalMs = options.refreshIntervalMs;
- }
- }
-
- if (intervalMs) {
- instance.refreshInterval = setInterval(instance.notifyRefreshNeeded.bind(instance), intervalMs);
- instance.refreshIntervalEndTime = new Date().getTime() + intervalMs;
- }
- }
-
- function onDataFetched(result) {
- resetRefreshInterval(this);
-
- if (this.afterRefresh) {
- this.afterRefresh(result);
- }
- }
-
- ItemsRefresher.prototype.destroy = function () {
+ destroy() {
clearRefreshInterval(this);
removeNotificationEvent(this, 'UserDataChanged');
@@ -245,7 +209,42 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM
this.fetchData = null;
this.options = null;
- };
+ }
+}
- return ItemsRefresher;
-});
+function clearRefreshInterval(instance, isPausing) {
+ if (instance.refreshInterval) {
+ clearInterval(instance.refreshInterval);
+ instance.refreshInterval = null;
+
+ if (!isPausing) {
+ instance.refreshIntervalEndTime = null;
+ }
+ }
+}
+
+function resetRefreshInterval(instance, intervalMs) {
+ clearRefreshInterval(instance);
+
+ if (!intervalMs) {
+ const options = instance.options;
+ if (options) {
+ intervalMs = options.refreshIntervalMs;
+ }
+ }
+
+ if (intervalMs) {
+ instance.refreshInterval = setInterval(instance.notifyRefreshNeeded.bind(instance), intervalMs);
+ instance.refreshIntervalEndTime = new Date().getTime() + intervalMs;
+ }
+}
+
+function onDataFetched(result) {
+ resetRefreshInterval(this);
+
+ if (this.afterRefresh) {
+ this.afterRefresh(result);
+ }
+}
+
+export default ItemsRefresher;
diff --git a/src/components/layoutManager.js b/src/components/layoutManager.js
index 85d78f8ff..88a7265f8 100644
--- a/src/components/layoutManager.js
+++ b/src/components/layoutManager.js
@@ -1,23 +1,19 @@
-define(['browser', 'appSettings', 'events'], function (browser, appSettings, events) {
- 'use strict';
+import browser from 'browser';
+import appSettings from 'appSettings';
+import events from 'events';
- browser = browser.default || browser;
-
- function setLayout(instance, layout, selectedLayout) {
- if (layout === selectedLayout) {
- instance[layout] = true;
- document.documentElement.classList.add('layout-' + layout);
- } else {
- instance[layout] = false;
- document.documentElement.classList.remove('layout-' + layout);
- }
+function setLayout(instance, layout, selectedLayout) {
+ if (layout === selectedLayout) {
+ instance[layout] = true;
+ document.documentElement.classList.add('layout-' + layout);
+ } else {
+ instance[layout] = false;
+ document.documentElement.classList.remove('layout-' + layout);
}
+}
- function LayoutManager() {
-
- }
-
- LayoutManager.prototype.setLayout = function (layout, save) {
+class LayoutManager {
+ setLayout(layout, save) {
if (!layout || layout === 'auto') {
this.autoLayout();
@@ -35,13 +31,13 @@ define(['browser', 'appSettings', 'events'], function (browser, appSettings, eve
}
events.trigger(this, 'modechange');
- };
+ }
- LayoutManager.prototype.getSavedLayout = function (layout) {
+ getSavedLayout(layout) {
return appSettings.get('layout');
- };
+ }
- LayoutManager.prototype.autoLayout = function () {
+ autoLayout() {
// Take a guess at initial layout. The consuming app can override
if (browser.mobile) {
this.setLayout('mobile', false);
@@ -50,16 +46,16 @@ define(['browser', 'appSettings', 'events'], function (browser, appSettings, eve
} else {
this.setLayout(this.defaultLayout || 'tv', false);
}
- };
+ }
- LayoutManager.prototype.init = function () {
- var saved = this.getSavedLayout();
+ init() {
+ const saved = this.getSavedLayout();
if (saved) {
this.setLayout(saved, false);
} else {
this.autoLayout();
}
- };
+ }
+}
- return new LayoutManager();
-});
+export default new LayoutManager();
diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js
index be44e86b4..162da8984 100644
--- a/src/components/metadataEditor/metadataEditor.js
+++ b/src/components/metadataEditor/metadataEditor.js
@@ -6,7 +6,6 @@ import loading from 'loading';
import focusManager from 'focusManager';
import connectionManager from 'connectionManager';
import globalize from 'globalize';
-import require from 'require';
import shell from 'shell';
import 'emby-checkbox';
import 'emby-input';
@@ -37,7 +36,7 @@ import 'flexStyles';
function submitUpdatedItem(form, item) {
function afterContentTypeUpdated() {
- require(['toast'], function (toast) {
+ import('toast').then(({default: toast}) => {
toast(globalize.translate('MessageItemSaved'));
});
@@ -227,7 +226,7 @@ import 'flexStyles';
}
function editPerson(context, person, index) {
- require(['personEditor'], function (personEditor) {
+ import('personEditor').then(({default: personEditor}) => {
personEditor.show(person).then(function (updatedPerson) {
const isNew = index === -1;
@@ -246,14 +245,14 @@ import 'flexStyles';
if (parentId) {
reload(context, parentId, item.ServerId);
} else {
- require(['appRouter'], function (appRouter) {
+ import('appRouter').then(({default: appRouter}) => {
appRouter.goHome();
});
}
}
function showMoreMenu(context, button, user) {
- require(['itemContextMenu'], function (itemContextMenu) {
+ import('itemContextMenu').then(({default: itemContextMenu}) => {
var item = currentItem;
itemContextMenu.show({
diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js
index 9c2d8fcb6..d54dd219a 100644
--- a/src/components/recordingcreator/recordingcreator.js
+++ b/src/components/recordingcreator/recordingcreator.js
@@ -1,6 +1,7 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'datetime', 'imageLoader', 'recordingFields', 'events', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, datetime, imageLoader, recordingFields, events) {
'use strict';
+ layoutManager = layoutManager.default || layoutManager;
scrollHelper = scrollHelper.default || scrollHelper;
var currentDialog;
diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js
index 7117778eb..e9aca8534 100644
--- a/src/components/recordingcreator/recordingeditor.js
+++ b/src/components/recordingcreator/recordingeditor.js
@@ -3,6 +3,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
scrollHelper = scrollHelper.default || scrollHelper;
loading = loading.default || loading;
+ layoutManager = layoutManager.default || layoutManager;
var currentDialog;
var recordingDeleted = false;
diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js
index b5ac4c9a8..6048c918c 100644
--- a/src/components/remotecontrol/remotecontrol.js
+++ b/src/components/remotecontrol/remotecontrol.js
@@ -1,939 +1,954 @@
-define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageLoader', 'playbackManager', 'nowPlayingHelper', 'events', 'connectionManager', 'apphost', 'globalize', 'layoutManager', 'userSettings', 'cardBuilder', 'itemContextMenu', 'cardStyle', 'emby-itemscontainer', 'css!./remotecontrol.css', 'emby-ratingbutton'], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings, cardBuilder, itemContextMenu) {
- 'use strict';
+import datetime from 'datetime';
+import backdrop from 'backdrop';
+import listView from 'listView';
+import imageLoader from 'imageLoader';
+import playbackManager from 'playbackManager';
+import nowPlayingHelper from 'nowPlayingHelper';
+import events from 'events';
+import connectionManager from 'connectionManager';
+import appHost from 'apphost';
+import globalize from 'globalize';
+import layoutManager from 'layoutManager';
+import * as userSettings from 'userSettings';
+import cardBuilder from 'cardBuilder';
+import itemContextMenu from 'itemContextMenu';
+import 'cardStyle';
+import 'emby-itemscontainer';
+import 'css!./remotecontrol.css';
+import 'emby-ratingbutton';
- playbackManager = playbackManager.default || playbackManager;
+/*eslint prefer-const: "error"*/
- var showMuteButton = true;
- var showVolumeSlider = true;
+let showMuteButton = true;
+let showVolumeSlider = true;
- function showAudioMenu(context, player, button, item) {
- var currentIndex = playbackManager.getAudioStreamIndex(player);
- var streams = playbackManager.audioTracks(player);
- var menuItems = streams.map(function (s) {
- var menuItem = {
- name: s.DisplayTitle,
- id: s.Index
- };
+function showAudioMenu(context, player, button, item) {
+ const currentIndex = playbackManager.getAudioStreamIndex(player);
+ const streams = playbackManager.audioTracks(player);
+ const menuItems = streams.map(function (s) {
+ const menuItem = {
+ name: s.DisplayTitle,
+ id: s.Index
+ };
- if (s.Index == currentIndex) {
- menuItem.selected = true;
- }
-
- return menuItem;
- });
-
- require(['actionsheet'], function (actionsheet) {
- actionsheet.show({
- items: menuItems,
- positionTo: button,
- callback: function (id) {
- playbackManager.setAudioStreamIndex(parseInt(id), player);
- }
- });
- });
- }
-
- function showSubtitleMenu(context, player, button, item) {
- var currentIndex = playbackManager.getSubtitleStreamIndex(player);
- var streams = playbackManager.subtitleTracks(player);
- var menuItems = streams.map(function (s) {
- var menuItem = {
- name: s.DisplayTitle,
- id: s.Index
- };
-
- if (s.Index == currentIndex) {
- menuItem.selected = true;
- }
-
- return menuItem;
- });
- menuItems.unshift({
- id: -1,
- name: globalize.translate('ButtonOff'),
- selected: currentIndex == null
- });
-
- require(['actionsheet'], function (actionsheet) {
- actionsheet.show({
- items: menuItems,
- positionTo: button,
- callback: function (id) {
- playbackManager.setSubtitleStreamIndex(parseInt(id), player);
- }
- });
- });
- }
-
- function getNowPlayingNameHtml(nowPlayingItem, includeNonNameInfo) {
- return nowPlayingHelper.getNowPlayingNames(nowPlayingItem, includeNonNameInfo).map(function (i) {
- return i.text;
- }).join('
');
- }
-
- function seriesImageUrl(item, options) {
- if (item.Type !== 'Episode') {
- return null;
+ if (s.Index == currentIndex) {
+ menuItem.selected = true;
}
- options = options || {};
- options.type = options.type || 'Primary';
- if (options.type === 'Primary' && item.SeriesPrimaryImageTag) {
- options.tag = item.SeriesPrimaryImageTag;
+ return menuItem;
+ });
+
+ import('actionsheet').then(({ default: actionsheet }) => {
+ actionsheet.show({
+ items: menuItems,
+ positionTo: button,
+ callback: function (id) {
+ playbackManager.setAudioStreamIndex(parseInt(id), player);
+ }
+ });
+ });
+}
+
+function showSubtitleMenu(context, player, button, item) {
+ const currentIndex = playbackManager.getSubtitleStreamIndex(player);
+ const streams = playbackManager.subtitleTracks(player);
+ const menuItems = streams.map(function (s) {
+ const menuItem = {
+ name: s.DisplayTitle,
+ id: s.Index
+ };
+
+ if (s.Index == currentIndex) {
+ menuItem.selected = true;
+ }
+
+ return menuItem;
+ });
+ menuItems.unshift({
+ id: -1,
+ name: globalize.translate('ButtonOff'),
+ selected: currentIndex == null
+ });
+
+ import('actionsheet').then(({ default: actionsheet }) => {
+ actionsheet.show({
+ items: menuItems,
+ positionTo: button,
+ callback: function (id) {
+ playbackManager.setSubtitleStreamIndex(parseInt(id), player);
+ }
+ });
+ });
+}
+
+function getNowPlayingNameHtml(nowPlayingItem, includeNonNameInfo) {
+ return nowPlayingHelper.getNowPlayingNames(nowPlayingItem, includeNonNameInfo).map(function (i) {
+ return i.text;
+ }).join('
');
+}
+
+function seriesImageUrl(item, options) {
+ if (item.Type !== 'Episode') {
+ return null;
+ }
+
+ options = options || {};
+ options.type = options.type || 'Primary';
+ if (options.type === 'Primary' && item.SeriesPrimaryImageTag) {
+ options.tag = item.SeriesPrimaryImageTag;
+ return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ }
+
+ if (options.type === 'Thumb') {
+ if (item.SeriesThumbImageTag) {
+ options.tag = item.SeriesThumbImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
- if (options.type === 'Thumb') {
- if (item.SeriesThumbImageTag) {
- options.tag = item.SeriesThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
- }
-
- if (item.ParentThumbImageTag) {
- options.tag = item.ParentThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
- }
+ if (item.ParentThumbImageTag) {
+ options.tag = item.ParentThumbImageTag;
+ return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
}
-
- return null;
}
- function imageUrl(item, options) {
- options = options || {};
- options.type = options.type || 'Primary';
+ return null;
+}
- if (item.ImageTags && item.ImageTags[options.type]) {
- options.tag = item.ImageTags[options.type];
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
- }
+function imageUrl(item, options) {
+ options = options || {};
+ options.type = options.type || 'Primary';
- if (item.AlbumId && item.AlbumPrimaryImageTag) {
- options.tag = item.AlbumPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
- }
-
- return null;
+ if (item.ImageTags && item.ImageTags[options.type]) {
+ options.tag = item.ImageTags[options.type];
+ return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
}
- function updateNowPlayingInfo(context, state, serverId) {
- var item = state.NowPlayingItem;
- var displayName = item ? getNowPlayingNameHtml(item).replace('
', ' - ') : '';
- if (typeof item !== 'undefined') {
- var nowPlayingServerId = (item.ServerId || serverId);
- if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') {
- var songName = item.Name;
- var artistsSeries = '';
- var albumName = '';
- if (item.Artists != null) {
- if (item.ArtistItems != null) {
- for (const artist of item.ArtistItems) {
- let artistName = artist.Name;
- let artistId = artist.Id;
- artistsSeries += `${artistName}`;
- if (artist !== item.ArtistItems.slice(-1)[0]) {
- artistsSeries += ', ';
- }
+ if (item.AlbumId && item.AlbumPrimaryImageTag) {
+ options.tag = item.AlbumPrimaryImageTag;
+ return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
+ }
+
+ return null;
+}
+
+function updateNowPlayingInfo(context, state, serverId) {
+ const item = state.NowPlayingItem;
+ const displayName = item ? getNowPlayingNameHtml(item).replace('
', ' - ') : '';
+ if (typeof item !== 'undefined') {
+ const nowPlayingServerId = (item.ServerId || serverId);
+ if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') {
+ const songName = item.Name;
+ let artistsSeries = '';
+ let albumName = '';
+ if (item.Artists != null) {
+ if (item.ArtistItems != null) {
+ for (const artist of item.ArtistItems) {
+ const artistName = artist.Name;
+ const artistId = artist.Id;
+ artistsSeries += `${artistName}`;
+ if (artist !== item.ArtistItems.slice(-1)[0]) {
+ artistsSeries += ', ';
}
- } else if (item.Artists) {
- // For some reason, Chromecast Player doesn't return a item.ArtistItems object, so we need to fallback
- // to normal item.Artists item.
- // TODO: Normalise fields returned by all the players
- for (const artist of item.Artists) {
- artistsSeries += `${artist}`;
- if (artist !== item.Artists.slice(-1)[0]) {
- artistsSeries += ', ';
- }
+ }
+ } else if (item.Artists) {
+ // For some reason, Chromecast Player doesn't return a item.ArtistItems object, so we need to fallback
+ // to normal item.Artists item.
+ // TODO: Normalise fields returned by all the players
+ for (const artist of item.Artists) {
+ artistsSeries += `${artist}`;
+ if (artist !== item.Artists.slice(-1)[0]) {
+ artistsSeries += ', ';
}
}
}
- if (item.Album != null) {
- albumName = '` + item.Album + '';
- }
- context.querySelector('.nowPlayingAlbum').innerHTML = albumName;
- context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries;
- context.querySelector('.nowPlayingSongName').innerHTML = songName;
- } else if (item.Type == 'Episode') {
- if (item.SeasonName != null) {
- var seasonName = item.SeasonName;
- context.querySelector('.nowPlayingSeason').innerHTML = '${seasonName}`;
- }
- if (item.SeriesName != null) {
- var seriesName = item.SeriesName;
- if (item.SeriesId != null) {
- context.querySelector('.nowPlayingSerie').innerHTML = '${seriesName}`;
- } else {
- context.querySelector('.nowPlayingSerie').innerHTML = seriesName;
- }
- }
- context.querySelector('.nowPlayingEpisode').innerHTML = item.Name;
- } else {
- context.querySelector('.nowPlayingPageTitle').innerHTML = displayName;
}
-
- if (displayName.length > 0 && item.Type != 'Audio' && item.Type != 'Episode') {
- context.querySelector('.nowPlayingPageTitle').classList.remove('hide');
- } else {
- context.querySelector('.nowPlayingPageTitle').classList.add('hide');
+ if (item.Album != null) {
+ albumName = '` + item.Album + '';
}
-
- var url = item ? seriesImageUrl(item, {
- maxHeight: 300
- }) || imageUrl(item, {
- maxHeight: 300
- }) : null;
-
- let contextButton = context.querySelector('.btnToggleContextMenu');
- // We remove the previous event listener by replacing the item in each update event
- const autoFocusContextButton = document.activeElement === contextButton;
- let contextButtonClone = contextButton.cloneNode(true);
- contextButton.parentNode.replaceChild(contextButtonClone, contextButton);
- contextButton = context.querySelector('.btnToggleContextMenu');
- if (autoFocusContextButton) {
- contextButton.focus();
+ context.querySelector('.nowPlayingAlbum').innerHTML = albumName;
+ context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries;
+ context.querySelector('.nowPlayingSongName').innerHTML = songName;
+ } else if (item.Type == 'Episode') {
+ if (item.SeasonName != null) {
+ const seasonName = item.SeasonName;
+ context.querySelector('.nowPlayingSeason').innerHTML = '${seasonName}`;
}
- const stopPlayback = !!layoutManager.mobile;
- var options = {
- play: false,
- queue: false,
- stopPlayback: stopPlayback,
- clearQueue: true,
- openAlbum: false,
- positionTo: contextButton
- };
- var apiClient = connectionManager.getApiClient(item.ServerId);
- apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
- apiClient.getCurrentUser().then(function (user) {
- contextButton.addEventListener('click', function () {
- itemContextMenu.show(Object.assign({
- item: fullItem,
- user: user
- }, options));
- });
- });
- });
- setImageUrl(context, state, url);
- if (item) {
- backdrop.setBackdrops([item]);
- apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
- var userData = fullItem.UserData || {};
- var likes = userData.Likes == null ? '' : userData.Likes;
- context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = '';
- context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = '';
- });
- } else {
- backdrop.clearBackdrop();
- context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = '';
- }
- }
- }
-
- function setImageUrl(context, state, url) {
- var item = state.NowPlayingItem;
- var imgContainer = context.querySelector('.nowPlayingPageImageContainer');
-
- if (url) {
- imgContainer.innerHTML = '';
- if (item.Type == 'Audio') {
- context.querySelector('.nowPlayingPageImage').classList.add('nowPlayingPageImageAudio');
- context.querySelector('.nowPlayingPageImageContainer').classList.remove('nowPlayingPageImageAudio');
- } else {
- context.querySelector('.nowPlayingPageImageContainer').classList.add('nowPlayingPageImagePoster');
- context.querySelector('.nowPlayingPageImage').classList.remove('nowPlayingPageImageAudio');
- }
- } else {
- imgContainer.innerHTML = '
'; - html += globalize.translate('MessageBrowsePluginCatalog'); - html += '
'; - html += ''; + html += globalize.translate('MessageBrowsePluginCatalog'); + html += '
'; + html += '
';
}
- }
- 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 5148d2b82..a9fbeda9a 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/libraryBrowser.js b/src/scripts/libraryBrowser.js
index 46cda51e5..83d683a69 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 376b19f70..0780916a7 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 += 'http://example.com/<baseurl>。",
+ "LabelBaseUrlHelp": "为服务器 URL添加自定义子目录,例如:http://example.com/<baseurl>",
"MusicLibraryHelp": "重播 {0}音乐命名指南{1}。",
"HeaderFavoritePeople": "最喜欢的人物",
"OptionRandom": "随机",
@@ -1480,7 +1480,7 @@
"LabelRequireHttpsHelp": "开启后服务器将自动将所有 HTTP 请求重定向到 HTTPS。如果服务器没有启用 HTTPS 则不生效。",
"LabelRequireHttps": "强制 HTTPS",
"LabelStable": "稳定版",
- "LabelEnableHttpsHelp": "开启服务器对所配置 HTTPS 端口的监听。必须配置有效的证书才会生效。",
+ "LabelEnableHttpsHelp": "监听已配置的 HTTPS 端口。必须配置有效的证书才会生效。",
"LabelEnableHttps": "启用 HTTPS",
"LabelChromecastVersion": "Chromecast版本",
"HeaderDVR": "DVR",
@@ -1539,5 +1539,13 @@
"ClearQueue": "清空队列",
"StopPlayback": "停止播放",
"Writers": "作者",
- "ViewAlbumArtist": "查看专辑艺术家"
+ "ViewAlbumArtist": "查看专辑艺术家",
+ "Preview": "预览",
+ "SubtitleVerticalPositionHelp": "文字出现的行号。正数表示由上到下,负数表示由下到上。",
+ "LabelSubtitleVerticalPosition": "垂直位置:",
+ "PreviousTrack": "上一曲",
+ "MessageGetInstalledPluginsError": "获取已安装插件列表时出现错误。",
+ "MessagePluginInstallError": "安装插件时出现错误。",
+ "NextTrack": "下一曲",
+ "LabelUnstable": "不稳定"
}
diff --git a/yarn.lock b/yarn.lock
index ad55e1617..758ded53f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5465,10 +5465,10 @@ hex-color-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
-hls.js@^0.14.7:
- version "0.14.7"
- resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.14.7.tgz#47fbd2662b13121ab17c07aea06b1c07828240cf"
- integrity sha512-9JY0D9nwMrfQPRWc8/kEJTKK0TYfDTzIs6Xq+gdCvasRxdvQKQ2T76rdueTkS0AsFV6sQlJN0wxbnI44aRvvUA==
+hls.js@^0.14.8:
+ version "0.14.8"
+ resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.14.8.tgz#c2c6ca7005524c81eece316c2a4a199258bd0590"
+ integrity sha512-4fh8k/sl1SmYXsT4Om8AY5fKa5tUUtAxup2sffrSMh5MNk4Kt4FOZxbjqTGL5VwkroY1oJ9twSciNQNFbPA/WQ==
dependencies:
eventemitter3 "^4.0.3"
url-toolkit "^2.1.6"
@@ -11994,10 +11994,10 @@ webworkify@^1.5.0:
resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.5.0.tgz#734ad87a774de6ebdd546e1d3e027da5b8f4a42c"
integrity sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g==
-whatwg-fetch@^3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.3.1.tgz#6c1acf37dec176b0fd6bc9a74b616bec2f612935"
- integrity sha512-faXTmGDcLuEPBpJwb5LQfyxvubKiE+RlbmmweFGKjvIPFj4uHTTfdtTIkdTRhC6OSH9S9eyYbx8kZ0UEaQqYTA==
+whatwg-fetch@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.0.tgz#e11de14f4878f773fbebcde8871b2c0699af8b30"
+ integrity sha512-rsum2ulz2iuZH08mJkT0Yi6JnKhwdw4oeyMjokgxd+mmqYSd9cPpOQf01TIWgjxG/U4+QR+AwKq6lSbXVxkyoQ==
which-module@^1.0.0:
version "1.0.0"