', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) {
@@ -144,7 +153,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
html += '
';
if (enableScrollX()) {
- var scrollXClass = 'scrollX hiddenScrollX';
+ let scrollXClass = 'scrollX hiddenScrollX';
if (layoutManager.tv) {
scrollXClass += ' smoothScrollX';
}
@@ -154,7 +163,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
html += '';
}
- var cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle;
+ let cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle;
cardLayout = false;
html += cardBuilder.getCardsHtml(result.Items, {
preferThumb: section.preferThumb,
@@ -179,10 +188,10 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
});
}
- function loadSections(page, userId, topParentId, types) {
+ export function loadSections(page, userId, topParentId, types) {
loading.show();
- var sections = getSections();
- var sectionid = getParameterByName('sectionid');
+ let sections = getSections();
+ const sectionid = getParameterByName('sectionid');
if (sectionid) {
sections = sections.filter(function (s) {
@@ -196,24 +205,22 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
});
}
- var i;
- var length;
- var elem = page.querySelector('.favoriteSections');
+ let elem = page.querySelector('.favoriteSections');
if (!elem.innerHTML) {
- var html = '';
+ let html = '';
- for (i = 0, length = sections.length; i < length; i++) {
+ for (let i = 0, length = sections.length; i < length; i++) {
html += '
';
}
elem.innerHTML = html;
}
- var promises = [];
+ const promises = [];
- for (i = 0, length = sections.length; i < length; i++) {
- var section = sections[i];
+ for (let i = 0, length = sections.length; i < length; i++) {
+ const section = sections[i];
elem = page.querySelector('.section' + section.id);
promises.push(loadSection(elem, userId, topParentId, section, sections.length === 1));
}
@@ -223,7 +230,8 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
});
}
- return {
- render: loadSections
- };
-});
+export default {
+ render: loadSections
+};
+
+/* eslint-enable indent */
diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js
index bd3ad89aaa..61caa9188f 100644
--- a/src/components/guide/guide.js
+++ b/src/components/guide/guide.js
@@ -1,6 +1,10 @@
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';
+ playbackManager = playbackManager.default || playbackManager;
+ browser = browser.default || browser;
+ loading = loading.default || loading;
+
function showViewSettings(instance) {
require(['guide-settings-dialog'], function (guideSettingsDialog) {
guideSettingsDialog.show(instance.categoryOptions).then(function () {
diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js
index 78c35bb15f..a67b0afef1 100644
--- a/src/components/imageeditor/imageeditor.js
+++ b/src/components/imageeditor/imageeditor.js
@@ -59,8 +59,8 @@ import 'css!./imageeditor';
currentItem = item;
apiClient.getRemoteImageProviders(getBaseRemoteOptions()).then(function (providers) {
- const btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages');
- for (let i = 0, length = btnBrowseAllImages.length; i < length; i++) {
+ var btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages');
+ for (var i = 0, length = btnBrowseAllImages.length; i < length; i++) {
if (providers.length) {
btnBrowseAllImages[i].classList.remove('hide');
} else {
@@ -217,7 +217,7 @@ import 'css!./imageeditor';
reload(context, null, focusContext);
}, function () {
import('alert').then(({default: alert}) => {
- alert(globalize.translate('DefaultErrorMessage'));
+ alert(globalize.translate('ErrorDefault'));
});
});
}
diff --git a/src/components/images/imageLoader.js b/src/components/images/imageLoader.js
index c9d3e6fdb2..0effcc7a57 100644
--- a/src/components/images/imageLoader.js
+++ b/src/components/images/imageLoader.js
@@ -205,7 +205,7 @@ import 'css!./style';
/* eslint-enable indent */
export default {
- serLazyImage: setLazyImage,
+ setLazyImage: setLazyImage,
fillImages: fillImages,
fillImage: fillImage,
lazyImage: lazyImage,
diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js
index a210af31af..74b08db07f 100644
--- a/src/components/itemsrefresher.js
+++ b/src/components/itemsrefresher.js
@@ -1,6 +1,8 @@
define(['playbackManager', 'serverNotifications', 'events'], function (playbackManager, serverNotifications, events) {
'use strict';
+ playbackManager = playbackManager.default || playbackManager;
+
function onUserDataChanged(e, apiClient, userData) {
var instance = this;
diff --git a/src/components/layoutManager.js b/src/components/layoutManager.js
index bec7d4ae3b..85d78f8ff4 100644
--- a/src/components/layoutManager.js
+++ b/src/components/layoutManager.js
@@ -1,6 +1,8 @@
define(['browser', 'appSettings', 'events'], function (browser, appSettings, events) {
'use strict';
+ browser = browser.default || browser;
+
function setLayout(instance, layout, selectedLayout) {
if (layout === selectedLayout) {
instance[layout] = true;
diff --git a/src/components/loading/loading.js b/src/components/loading/loading.js
index 9f86ba452f..8237611373 100644
--- a/src/components/loading/loading.js
+++ b/src/components/loading/loading.js
@@ -1,78 +1,74 @@
-define(['css!./loading'], function () {
- 'use strict';
+import 'css!./loading';
- var loadingElem;
- var layer1;
- var layer2;
- var layer3;
- var layer4;
- var circleLefts;
- var circleRights;
+let loadingElem;
+let layer1;
+let layer2;
+let layer3;
+let layer4;
+let circleLefts;
+let circleRights;
- return {
- show: function () {
- var elem = loadingElem;
+export function show() {
+ let elem = loadingElem;
- if (!elem) {
- elem = document.createElement('div');
- loadingElem = elem;
+ if (!elem) {
+ elem = document.createElement('div');
+ loadingElem = elem;
- elem.classList.add('docspinner');
- elem.classList.add('mdl-spinner');
+ elem.classList.add('docspinner');
+ elem.classList.add('mdl-spinner');
- elem.innerHTML = '
';
+ elem.innerHTML = '
';
- document.body.appendChild(elem);
+ document.body.appendChild(elem);
- layer1 = elem.querySelector('.mdl-spinner__layer-1');
- layer2 = elem.querySelector('.mdl-spinner__layer-2');
- layer3 = elem.querySelector('.mdl-spinner__layer-3');
- layer4 = elem.querySelector('.mdl-spinner__layer-4');
+ layer1 = elem.querySelector('.mdl-spinner__layer-1');
+ layer2 = elem.querySelector('.mdl-spinner__layer-2');
+ layer3 = elem.querySelector('.mdl-spinner__layer-3');
+ layer4 = elem.querySelector('.mdl-spinner__layer-4');
- circleLefts = elem.querySelectorAll('.mdl-spinner__circleLeft');
- circleRights = elem.querySelectorAll('.mdl-spinner__circleRight');
- }
+ circleLefts = elem.querySelectorAll('.mdl-spinner__circleLeft');
+ circleRights = elem.querySelectorAll('.mdl-spinner__circleRight');
+ }
- elem.classList.add('mdlSpinnerActive');
+ elem.classList.add('mdlSpinnerActive');
- layer1.classList.add('mdl-spinner__layer-1-active');
- layer2.classList.add('mdl-spinner__layer-2-active');
- layer3.classList.add('mdl-spinner__layer-3-active');
- layer4.classList.add('mdl-spinner__layer-4-active');
+ layer1.classList.add('mdl-spinner__layer-1-active');
+ layer2.classList.add('mdl-spinner__layer-2-active');
+ layer3.classList.add('mdl-spinner__layer-3-active');
+ layer4.classList.add('mdl-spinner__layer-4-active');
- var i;
- var length;
+ for (let i = 0, length = circleLefts.length; i < length; i++) {
+ circleLefts[i].classList.add('mdl-spinner__circleLeft-active');
+ }
- for (i = 0, length = circleLefts.length; i < length; i++) {
- circleLefts[i].classList.add('mdl-spinner__circleLeft-active');
- }
+ for (let i = 0, length = circleRights.length; i < length; i++) {
+ circleRights[i].classList.add('mdl-spinner__circleRight-active');
+ }
+}
- for (i = 0, length = circleRights.length; i < length; i++) {
- circleRights[i].classList.add('mdl-spinner__circleRight-active');
- }
- },
- hide: function () {
- var elem = loadingElem;
+export function hide() {
+ const elem = loadingElem;
- if (elem) {
- elem.classList.remove('mdlSpinnerActive');
+ if (elem) {
+ elem.classList.remove('mdlSpinnerActive');
- elem.classList.remove('mdl-spinner__layer-1-active');
- elem.classList.remove('mdl-spinner__layer-2-active');
- elem.classList.remove('mdl-spinner__layer-3-active');
- elem.classList.remove('mdl-spinner__layer-4-active');
+ elem.classList.remove('mdl-spinner__layer-1-active');
+ elem.classList.remove('mdl-spinner__layer-2-active');
+ elem.classList.remove('mdl-spinner__layer-3-active');
+ elem.classList.remove('mdl-spinner__layer-4-active');
- var i;
- var length;
-
- for (i = 0, length = circleLefts.length; i < length; i++) {
- circleLefts[i].classList.remove('mdl-spinner__circleLeft-active');
- }
-
- for (i = 0, length = circleRights.length; i < length; i++) {
- circleRights[i].classList.remove('mdl-spinner__circleRight-active');
- }
- }
+ for (let i = 0, length = circleLefts.length; i < length; i++) {
+ circleLefts[i].classList.remove('mdl-spinner__circleLeft-active');
}
- };
-});
+
+ for (let i = 0, length = circleRights.length; i < length; i++) {
+ circleRights[i].classList.remove('mdl-spinner__circleRight-active');
+ }
+ }
+}
+
+export default {
+ show: show,
+ hide: hide
+};
diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js
index b04f632055..0e68c6a289 100644
--- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js
+++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js
@@ -85,7 +85,7 @@ import 'flexStyles';
refreshLibraryFromServer(dom.parentWithClass(button, 'dlg-libraryeditor'));
}, () => {
import('toast').then(({default: toast}) => {
- toast(globalize.translate('DefaultErrorMessage'));
+ toast(globalize.translate('ErrorDefault'));
});
});
});
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index b4647bbf25..0bf270f2a1 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -1,6 +1,8 @@
define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'require'], function (serverNotifications, playbackManager, events, globalize, require) {
'use strict';
+ playbackManager = playbackManager.default || playbackManager;
+
function onOneDocumentClick() {
document.removeEventListener('click', onOneDocumentClick);
document.removeEventListener('keydown', onOneDocumentClick);
diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js
index 1d74cd69f5..437127be18 100644
--- a/src/components/playback/playbackmanager.js
+++ b/src/components/playback/playbackmanager.js
@@ -1,729 +1,738 @@
-define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'playQueueManager', 'userSettings', 'globalize', 'connectionManager', 'loading', 'apphost', 'screenfull'], function (events, datetime, appSettings, itemHelper, pluginManager, PlayQueueManager, userSettings, globalize, connectionManager, loading, apphost, screenfull) {
- 'use strict';
-
- PlayQueueManager = PlayQueueManager.default || PlayQueueManager;
-
- function enableLocalPlaylistManagement(player) {
- if (player.getPlaylist) {
- return false;
- }
-
- if (player.isLocalPlayer) {
- return true;
- }
+import events from 'events';
+import datetime from 'datetime';
+import appSettings from 'appSettings';
+import itemHelper from 'itemHelper';
+import pluginManager from 'pluginManager';
+import PlayQueueManager from 'playQueueManager';
+import * as userSettings from 'userSettings';
+import globalize from 'globalize';
+import connectionManager from 'connectionManager';
+import loading from 'loading';
+import apphost from 'apphost';
+import screenfull from 'screenfull';
+function enableLocalPlaylistManagement(player) {
+ if (player.getPlaylist) {
return false;
}
- function bindToFullscreenChange(player) {
- if (screenfull.isEnabled) {
- screenfull.on('change', function () {
- events.trigger(player, 'fullscreenchange');
- });
- } else {
- // iOS Safari
- document.addEventListener('webkitfullscreenchange', function () {
- events.trigger(player, 'fullscreenchange');
- }, false);
- }
- }
-
- function triggerPlayerChange(playbackManagerInstance, newPlayer, newTarget, previousPlayer, previousTargetInfo) {
- if (!newPlayer && !previousPlayer) {
- return;
- }
-
- if (newTarget && previousTargetInfo) {
- if (newTarget.id === previousTargetInfo.id) {
- return;
- }
- }
-
- events.trigger(playbackManagerInstance, 'playerchange', [newPlayer, newTarget, previousPlayer]);
- }
-
- function reportPlayback(playbackManagerInstance, state, player, reportPlaylist, serverId, method, progressEventName) {
- if (!serverId) {
- // Not a server item
- // We can expand on this later and possibly report them
- events.trigger(playbackManagerInstance, 'reportplayback', [false]);
- return;
- }
-
- var info = Object.assign({}, state.PlayState);
- info.ItemId = state.NowPlayingItem.Id;
-
- if (progressEventName) {
- info.EventName = progressEventName;
- }
-
- if (reportPlaylist) {
- addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId);
- }
-
- var apiClient = connectionManager.getApiClient(serverId);
- var reportPlaybackPromise = apiClient[method](info);
- // Notify that report has been sent
- reportPlaybackPromise.then(() => {
- events.trigger(playbackManagerInstance, 'reportplayback', [true]);
- });
- }
-
- function getPlaylistSync(playbackManagerInstance, player) {
- player = player || playbackManagerInstance._currentPlayer;
- if (player && !enableLocalPlaylistManagement(player)) {
- return player.getPlaylistSync();
- }
-
- return playbackManagerInstance._playQueueManager.getPlaylist();
- }
-
- function addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId) {
- info.NowPlayingQueue = getPlaylistSync(playbackManagerInstance, player).map(function (i) {
- var itemInfo = {
- Id: i.Id,
- PlaylistItemId: i.PlaylistItemId
- };
-
- if (i.ServerId !== serverId) {
- itemInfo.ServerId = i.ServerId;
- }
-
- return itemInfo;
- });
- }
-
- function normalizeName(t) {
- return t.toLowerCase().replace(' ', '');
- }
-
- function getItemsForPlayback(serverId, query) {
- var apiClient = connectionManager.getApiClient(serverId);
-
- if (query.Ids && query.Ids.split(',').length === 1) {
- var itemId = query.Ids.split(',');
-
- return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) {
- return {
- Items: [item],
- TotalRecordCount: 1
- };
- });
- } else {
- query.Limit = query.Limit || 300;
- query.Fields = 'Chapters';
- query.ExcludeLocationTypes = 'Virtual';
- query.EnableTotalRecordCount = false;
- query.CollapseBoxSetItems = false;
-
- return apiClient.getItems(apiClient.getCurrentUserId(), query);
- }
- }
-
- function createStreamInfoFromUrlItem(item) {
- // Check item.Path for games
- return {
- url: item.Url || item.Path,
- playMethod: 'DirectPlay',
- item: item,
- textTracks: [],
- mediaType: item.MediaType
- };
- }
-
- function mergePlaybackQueries(obj1, obj2) {
- var query = Object.assign(obj1, obj2);
-
- var filters = query.Filters ? query.Filters.split(',') : [];
- if (filters.indexOf('IsNotFolder') === -1) {
- filters.push('IsNotFolder');
- }
- query.Filters = filters.join(',');
- return query;
- }
-
- function backdropImageUrl(apiClient, item, options) {
- options = options || {};
- options.type = options.type || 'Backdrop';
-
- // If not resizing, get the original image
- if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) {
- options.quality = 100;
- }
-
- if (item.BackdropImageTags && item.BackdropImageTags.length) {
- options.tag = item.BackdropImageTags[0];
- return apiClient.getScaledImageUrl(item.Id, options);
- }
-
- if (item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
- options.tag = item.ParentBackdropImageTags[0];
- return apiClient.getScaledImageUrl(item.ParentBackdropItemId, options);
- }
-
- return null;
- }
-
- function getMimeType(type, container) {
- container = (container || '').toLowerCase();
-
- if (type === 'audio') {
- if (container === 'opus') {
- return 'audio/ogg';
- }
- if (container === 'webma') {
- return 'audio/webm';
- }
- if (container === 'm4a') {
- return 'audio/mp4';
- }
- } else if (type === 'video') {
- if (container === 'mkv') {
- return 'video/x-matroska';
- }
- if (container === 'm4v') {
- return 'video/mp4';
- }
- if (container === 'mov') {
- return 'video/quicktime';
- }
- if (container === 'mpg') {
- return 'video/mpeg';
- }
- if (container === 'flv') {
- return 'video/x-flv';
- }
- }
-
- return type + '/' + container;
- }
-
- function getParam(name, url) {
- name = name.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]');
- var regexS = '[\\?&]' + name + '=([^]*)';
- var regex = new RegExp(regexS, 'i');
-
- var results = regex.exec(url);
- if (results == null) {
- return '';
- } else {
- return decodeURIComponent(results[1].replace(/\+/g, ' '));
- }
- }
-
- function isAutomaticPlayer(player) {
- if (player.isLocalPlayer) {
- return true;
- }
-
- return false;
- }
-
- function getAutomaticPlayers(instance, forceLocalPlayer) {
- if (!forceLocalPlayer) {
- var player = instance._currentPlayer;
- if (player && !isAutomaticPlayer(player)) {
- return [player];
- }
- }
-
- return instance.getPlayers().filter(isAutomaticPlayer);
- }
-
- function isServerItem(item) {
- if (!item.Id) {
- return false;
- }
+ if (player.isLocalPlayer) {
return true;
}
- function enableIntros(item) {
- if (item.MediaType !== 'Video') {
- return false;
- }
- if (item.Type === 'TvChannel') {
- return false;
- }
- // disable for in-progress recordings
- if (item.Status === 'InProgress') {
- return false;
- }
+ return false;
+}
- return isServerItem(item);
+function bindToFullscreenChange(player) {
+ if (screenfull.isEnabled) {
+ screenfull.on('change', function () {
+ events.trigger(player, 'fullscreenchange');
+ });
+ } else {
+ // iOS Safari
+ document.addEventListener('webkitfullscreenchange', function () {
+ events.trigger(player, 'fullscreenchange');
+ }, false);
+ }
+}
+
+function triggerPlayerChange(playbackManagerInstance, newPlayer, newTarget, previousPlayer, previousTargetInfo) {
+ if (!newPlayer && !previousPlayer) {
+ return;
}
- function getIntros(firstItem, apiClient, options) {
- if (options.startPositionTicks || options.startIndex || options.fullscreen === false || !enableIntros(firstItem) || !userSettings.enableCinemaMode()) {
- return Promise.resolve({
- Items: []
- });
+ if (newTarget && previousTargetInfo) {
+ if (newTarget.id === previousTargetInfo.id) {
+ return;
}
-
- return apiClient.getIntros(firstItem.Id).then(function (result) {
- return result;
- }, function (err) {
- return Promise.resolve({
- Items: []
- });
- });
}
- function getAudioMaxValues(deviceProfile) {
- // TODO - this could vary per codec and should be done on the server using the entire profile
- var maxAudioSampleRate = null;
- var maxAudioBitDepth = null;
- var maxAudioBitrate = null;
+ events.trigger(playbackManagerInstance, 'playerchange', [newPlayer, newTarget, previousPlayer]);
+}
- deviceProfile.CodecProfiles.map(function (codecProfile) {
- if (codecProfile.Type === 'Audio') {
- (codecProfile.Conditions || []).map(function (condition) {
- if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitDepth') {
- return maxAudioBitDepth = condition.Value;
- } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioSampleRate') {
- return maxAudioSampleRate = condition.Value;
- } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitrate') {
- return maxAudioBitrate = condition.Value;
- }
- });
- }
- });
+function reportPlayback(playbackManagerInstance, state, player, reportPlaylist, serverId, method, progressEventName) {
+ if (!serverId) {
+ // Not a server item
+ // We can expand on this later and possibly report them
+ events.trigger(playbackManagerInstance, 'reportplayback', [false]);
+ return;
+ }
- return {
- maxAudioSampleRate: maxAudioSampleRate,
- maxAudioBitDepth: maxAudioBitDepth,
- maxAudioBitrate: maxAudioBitrate
+ const info = Object.assign({}, state.PlayState);
+ info.ItemId = state.NowPlayingItem.Id;
+
+ if (progressEventName) {
+ info.EventName = progressEventName;
+ }
+
+ if (reportPlaylist) {
+ addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId);
+ }
+
+ const apiClient = connectionManager.getApiClient(serverId);
+ const reportPlaybackPromise = apiClient[method](info);
+ // Notify that report has been sent
+ reportPlaybackPromise.then(() => {
+ events.trigger(playbackManagerInstance, 'reportplayback', [true]);
+ });
+}
+
+function getPlaylistSync(playbackManagerInstance, player) {
+ player = player || playbackManagerInstance._currentPlayer;
+ if (player && !enableLocalPlaylistManagement(player)) {
+ return player.getPlaylistSync();
+ }
+
+ return playbackManagerInstance._playQueueManager.getPlaylist();
+}
+
+function addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId) {
+ info.NowPlayingQueue = getPlaylistSync(playbackManagerInstance, player).map(function (i) {
+ const itemInfo = {
+ Id: i.Id,
+ PlaylistItemId: i.PlaylistItemId
};
+
+ if (i.ServerId !== serverId) {
+ itemInfo.ServerId = i.ServerId;
+ }
+
+ return itemInfo;
+ });
+}
+
+function normalizeName(t) {
+ return t.toLowerCase().replace(' ', '');
+}
+
+function getItemsForPlayback(serverId, query) {
+ const apiClient = connectionManager.getApiClient(serverId);
+
+ if (query.Ids && query.Ids.split(',').length === 1) {
+ const itemId = query.Ids.split(',');
+
+ return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) {
+ return {
+ Items: [item],
+ TotalRecordCount: 1
+ };
+ });
+ } else {
+ query.Limit = query.Limit || 300;
+ query.Fields = 'Chapters';
+ query.ExcludeLocationTypes = 'Virtual';
+ query.EnableTotalRecordCount = false;
+ query.CollapseBoxSetItems = false;
+
+ return apiClient.getItems(apiClient.getCurrentUserId(), query);
+ }
+}
+
+function createStreamInfoFromUrlItem(item) {
+ // Check item.Path for games
+ return {
+ url: item.Url || item.Path,
+ playMethod: 'DirectPlay',
+ item: item,
+ textTracks: [],
+ mediaType: item.MediaType
+ };
+}
+
+function mergePlaybackQueries(obj1, obj2) {
+ const query = Object.assign(obj1, obj2);
+
+ const filters = query.Filters ? query.Filters.split(',') : [];
+ if (filters.indexOf('IsNotFolder') === -1) {
+ filters.push('IsNotFolder');
+ }
+ query.Filters = filters.join(',');
+ return query;
+}
+
+function backdropImageUrl(apiClient, item, options) {
+ options = options || {};
+ options.type = options.type || 'Backdrop';
+
+ // If not resizing, get the original image
+ if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) {
+ options.quality = 100;
}
- var startingPlaySession = new Date().getTime();
- function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxAudioSampleRate, maxAudioBitDepth, maxAudioBitrate, startPosition) {
- var url = 'Audio/' + item.Id + '/universal';
+ if (item.BackdropImageTags && item.BackdropImageTags.length) {
+ options.tag = item.BackdropImageTags[0];
+ return apiClient.getScaledImageUrl(item.Id, options);
+ }
- startingPlaySession++;
- return apiClient.getUrl(url, {
- UserId: apiClient.getCurrentUserId(),
- DeviceId: apiClient.deviceId(),
- MaxStreamingBitrate: maxAudioBitrate || maxBitrate,
- Container: directPlayContainers,
- TranscodingContainer: transcodingProfile.Container || null,
- TranscodingProtocol: transcodingProfile.Protocol || null,
- AudioCodec: transcodingProfile.AudioCodec,
- MaxAudioSampleRate: maxAudioSampleRate,
- MaxAudioBitDepth: maxAudioBitDepth,
- api_key: apiClient.accessToken(),
- PlaySessionId: startingPlaySession,
- StartTimeTicks: startPosition || 0,
- EnableRedirection: true,
- EnableRemoteMedia: apphost.supports('remoteaudio')
+ if (item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
+ options.tag = item.ParentBackdropImageTags[0];
+ return apiClient.getScaledImageUrl(item.ParentBackdropItemId, options);
+ }
+
+ return null;
+}
+
+function getMimeType(type, container) {
+ container = (container || '').toLowerCase();
+
+ if (type === 'audio') {
+ if (container === 'opus') {
+ return 'audio/ogg';
+ }
+ if (container === 'webma') {
+ return 'audio/webm';
+ }
+ if (container === 'm4a') {
+ return 'audio/mp4';
+ }
+ } else if (type === 'video') {
+ if (container === 'mkv') {
+ return 'video/x-matroska';
+ }
+ if (container === 'm4v') {
+ return 'video/mp4';
+ }
+ if (container === 'mov') {
+ return 'video/quicktime';
+ }
+ if (container === 'mpg') {
+ return 'video/mpeg';
+ }
+ if (container === 'flv') {
+ return 'video/x-flv';
+ }
+ }
+
+ return type + '/' + container;
+}
+
+function getParam(name, url) {
+ name = name.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]');
+ const regexS = '[\\?&]' + name + '=([^]*)';
+ const regex = new RegExp(regexS, 'i');
+
+ const results = regex.exec(url);
+ if (results == null) {
+ return '';
+ } else {
+ return decodeURIComponent(results[1].replace(/\+/g, ' '));
+ }
+}
+
+function isAutomaticPlayer(player) {
+ if (player.isLocalPlayer) {
+ return true;
+ }
+
+ return false;
+}
+
+function getAutomaticPlayers(instance, forceLocalPlayer) {
+ if (!forceLocalPlayer) {
+ const player = instance._currentPlayer;
+ if (player && !isAutomaticPlayer(player)) {
+ return [player];
+ }
+ }
+
+ return instance.getPlayers().filter(isAutomaticPlayer);
+}
+
+function isServerItem(item) {
+ if (!item.Id) {
+ return false;
+ }
+ return true;
+}
+
+function enableIntros(item) {
+ if (item.MediaType !== 'Video') {
+ return false;
+ }
+ if (item.Type === 'TvChannel') {
+ return false;
+ }
+ // disable for in-progress recordings
+ if (item.Status === 'InProgress') {
+ return false;
+ }
+
+ return isServerItem(item);
+}
+
+function getIntros(firstItem, apiClient, options) {
+ if (options.startPositionTicks || options.startIndex || options.fullscreen === false || !enableIntros(firstItem) || !userSettings.enableCinemaMode()) {
+ return Promise.resolve({
+ Items: []
});
}
- function getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition) {
- var transcodingProfile = deviceProfile.TranscodingProfiles.filter(function (p) {
- return p.Type === 'Audio' && p.Context === 'Streaming';
+ return apiClient.getIntros(firstItem.Id).then(function (result) {
+ return result;
+ }, function (err) {
+ return Promise.resolve({
+ Items: []
+ });
+ });
+}
+
+function getAudioMaxValues(deviceProfile) {
+ // TODO - this could vary per codec and should be done on the server using the entire profile
+ let maxAudioSampleRate = null;
+ let maxAudioBitDepth = null;
+ let maxAudioBitrate = null;
+
+ deviceProfile.CodecProfiles.map(function (codecProfile) {
+ if (codecProfile.Type === 'Audio') {
+ (codecProfile.Conditions || []).map(function (condition) {
+ if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitDepth') {
+ return maxAudioBitDepth = condition.Value;
+ } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioSampleRate') {
+ return maxAudioSampleRate = condition.Value;
+ } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitrate') {
+ return maxAudioBitrate = condition.Value;
+ }
+ });
+ }
+ });
+
+ return {
+ maxAudioSampleRate: maxAudioSampleRate,
+ maxAudioBitDepth: maxAudioBitDepth,
+ maxAudioBitrate: maxAudioBitrate
+ };
+}
+
+let startingPlaySession = new Date().getTime();
+function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxAudioSampleRate, maxAudioBitDepth, maxAudioBitrate, startPosition) {
+ const url = 'Audio/' + item.Id + '/universal';
+
+ startingPlaySession++;
+ return apiClient.getUrl(url, {
+ UserId: apiClient.getCurrentUserId(),
+ DeviceId: apiClient.deviceId(),
+ MaxStreamingBitrate: maxAudioBitrate || maxBitrate,
+ Container: directPlayContainers,
+ TranscodingContainer: transcodingProfile.Container || null,
+ TranscodingProtocol: transcodingProfile.Protocol || null,
+ AudioCodec: transcodingProfile.AudioCodec,
+ MaxAudioSampleRate: maxAudioSampleRate,
+ MaxAudioBitDepth: maxAudioBitDepth,
+ api_key: apiClient.accessToken(),
+ PlaySessionId: startingPlaySession,
+ StartTimeTicks: startPosition || 0,
+ EnableRedirection: true,
+ EnableRemoteMedia: apphost.supports('remoteaudio')
+ });
+}
+
+function getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition) {
+ const transcodingProfile = deviceProfile.TranscodingProfiles.filter(function (p) {
+ return p.Type === 'Audio' && p.Context === 'Streaming';
+ })[0];
+
+ let directPlayContainers = '';
+
+ deviceProfile.DirectPlayProfiles.map(function (p) {
+ if (p.Type === 'Audio') {
+ if (directPlayContainers) {
+ directPlayContainers += ',' + p.Container;
+ } else {
+ directPlayContainers = p.Container;
+ }
+
+ if (p.AudioCodec) {
+ directPlayContainers += '|' + p.AudioCodec;
+ }
+ }
+ });
+
+ const maxValues = getAudioMaxValues(deviceProfile);
+
+ return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition);
+}
+
+function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) {
+ const audioTranscodingProfile = deviceProfile.TranscodingProfiles.filter(function (p) {
+ return p.Type === 'Audio' && p.Context === 'Streaming';
+ })[0];
+
+ let audioDirectPlayContainers = '';
+
+ deviceProfile.DirectPlayProfiles.map(function (p) {
+ if (p.Type === 'Audio') {
+ if (audioDirectPlayContainers) {
+ audioDirectPlayContainers += ',' + p.Container;
+ } else {
+ audioDirectPlayContainers = p.Container;
+ }
+
+ if (p.AudioCodec) {
+ audioDirectPlayContainers += '|' + p.AudioCodec;
+ }
+ }
+ });
+
+ const maxValues = getAudioMaxValues(deviceProfile);
+
+ const streamUrls = [];
+
+ for (let i = 0, length = items.length; i < length; i++) {
+ const item = items[i];
+ let streamUrl;
+
+ if (item.MediaType === 'Audio' && !itemHelper.isLocalItem(item)) {
+ streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition);
+ }
+
+ streamUrls.push(streamUrl || '');
+
+ if (i === 0) {
+ startPosition = 0;
+ }
+ }
+
+ return Promise.resolve(streamUrls);
+}
+
+function setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) {
+ return getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition).then(function (streamUrls) {
+ for (let i = 0, length = items.length; i < length; i++) {
+ const item = items[i];
+ const streamUrl = streamUrls[i];
+
+ if (streamUrl) {
+ item.PresetMediaSource = {
+ StreamUrl: streamUrl,
+ Id: item.Id,
+ MediaStreams: [],
+ RunTimeTicks: item.RunTimeTicks
+ };
+ }
+ }
+ });
+}
+
+function getPlaybackInfo(player,
+ apiClient,
+ item,
+ deviceProfile,
+ maxBitrate,
+ startPosition,
+ isPlayback,
+ mediaSourceId,
+ audioStreamIndex,
+ subtitleStreamIndex,
+ liveStreamId,
+ enableDirectPlay,
+ enableDirectStream,
+ allowVideoStreamCopy,
+ allowAudioStreamCopy) {
+ if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio') {
+ return Promise.resolve({
+ MediaSources: [
+ {
+ StreamUrl: getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition),
+ Id: item.Id,
+ MediaStreams: [],
+ RunTimeTicks: item.RunTimeTicks
+ }]
+ });
+ }
+
+ if (item.PresetMediaSource) {
+ return Promise.resolve({
+ MediaSources: [item.PresetMediaSource]
+ });
+ }
+
+ const itemId = item.Id;
+
+ const query = {
+ UserId: apiClient.getCurrentUserId(),
+ StartTimeTicks: startPosition || 0
+ };
+
+ if (isPlayback) {
+ query.IsPlayback = true;
+ query.AutoOpenLiveStream = true;
+ } else {
+ query.IsPlayback = false;
+ query.AutoOpenLiveStream = false;
+ }
+
+ if (audioStreamIndex != null) {
+ query.AudioStreamIndex = audioStreamIndex;
+ }
+ if (subtitleStreamIndex != null) {
+ query.SubtitleStreamIndex = subtitleStreamIndex;
+ }
+ if (enableDirectPlay != null) {
+ query.EnableDirectPlay = enableDirectPlay;
+ }
+
+ if (enableDirectStream != null) {
+ query.EnableDirectStream = enableDirectStream;
+ }
+ if (allowVideoStreamCopy != null) {
+ query.AllowVideoStreamCopy = allowVideoStreamCopy;
+ }
+ if (allowAudioStreamCopy != null) {
+ query.AllowAudioStreamCopy = allowAudioStreamCopy;
+ }
+ if (mediaSourceId) {
+ query.MediaSourceId = mediaSourceId;
+ }
+ if (liveStreamId) {
+ query.LiveStreamId = liveStreamId;
+ }
+ if (maxBitrate) {
+ query.MaxStreamingBitrate = maxBitrate;
+ }
+ if (player.enableMediaProbe && !player.enableMediaProbe(item)) {
+ query.EnableMediaProbe = false;
+ }
+
+ // lastly, enforce player overrides for special situations
+ if (query.EnableDirectStream !== false) {
+ if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) {
+ query.EnableDirectStream = false;
+ }
+ }
+
+ if (player.getDirectPlayProtocols) {
+ query.DirectPlayProtocols = player.getDirectPlayProtocols();
+ }
+
+ return apiClient.getPlaybackInfo(itemId, query, deviceProfile);
+}
+
+function getOptimalMediaSource(apiClient, item, versions) {
+ const promises = versions.map(function (v) {
+ return supportsDirectPlay(apiClient, item, v);
+ });
+
+ if (!promises.length) {
+ return Promise.reject();
+ }
+
+ return Promise.all(promises).then(function (results) {
+ for (let i = 0, length = versions.length; i < length; i++) {
+ versions[i].enableDirectPlay = results[i] || false;
+ }
+ let optimalVersion = versions.filter(function (v) {
+ return v.enableDirectPlay;
})[0];
- var directPlayContainers = '';
+ if (!optimalVersion) {
+ optimalVersion = versions.filter(function (v) {
+ return v.SupportsDirectStream;
+ })[0];
+ }
- deviceProfile.DirectPlayProfiles.map(function (p) {
- if (p.Type === 'Audio') {
- if (directPlayContainers) {
- directPlayContainers += ',' + p.Container;
- } else {
- directPlayContainers = p.Container;
- }
-
- if (p.AudioCodec) {
- directPlayContainers += '|' + p.AudioCodec;
- }
- }
- });
-
- var maxValues = getAudioMaxValues(deviceProfile);
-
- return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition);
- }
-
- function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) {
- var audioTranscodingProfile = deviceProfile.TranscodingProfiles.filter(function (p) {
- return p.Type === 'Audio' && p.Context === 'Streaming';
+ optimalVersion = optimalVersion || versions.filter(function (s) {
+ return s.SupportsTranscoding;
})[0];
- var audioDirectPlayContainers = '';
+ return optimalVersion || versions[0];
+ });
+}
- deviceProfile.DirectPlayProfiles.map(function (p) {
- if (p.Type === 'Audio') {
- if (audioDirectPlayContainers) {
- audioDirectPlayContainers += ',' + p.Container;
- } else {
- audioDirectPlayContainers = p.Container;
- }
+function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, maxBitrate, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex) {
+ const postData = {
+ DeviceProfile: deviceProfile,
+ OpenToken: mediaSource.OpenToken
+ };
- if (p.AudioCodec) {
- audioDirectPlayContainers += '|' + p.AudioCodec;
+ const query = {
+ UserId: apiClient.getCurrentUserId(),
+ StartTimeTicks: startPosition || 0,
+ ItemId: item.Id,
+ PlaySessionId: playSessionId
+ };
+
+ if (maxBitrate) {
+ query.MaxStreamingBitrate = maxBitrate;
+ }
+ if (audioStreamIndex != null) {
+ query.AudioStreamIndex = audioStreamIndex;
+ }
+ if (subtitleStreamIndex != null) {
+ query.SubtitleStreamIndex = subtitleStreamIndex;
+ }
+
+ // lastly, enforce player overrides for special situations
+ if (query.EnableDirectStream !== false) {
+ if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) {
+ query.EnableDirectStream = false;
+ }
+ }
+
+ return apiClient.ajax({
+ url: apiClient.getUrl('LiveStreams/Open', query),
+ type: 'POST',
+ data: JSON.stringify(postData),
+ contentType: 'application/json',
+ dataType: 'json'
+
+ });
+}
+
+function isHostReachable(mediaSource, apiClient) {
+ if (mediaSource.IsRemote) {
+ return Promise.resolve(true);
+ }
+
+ return apiClient.getEndpointInfo().then(function (endpointInfo) {
+ if (endpointInfo.IsInNetwork) {
+ if (!endpointInfo.IsLocal) {
+ const path = (mediaSource.Path || '').toLowerCase();
+ if (path.indexOf('localhost') !== -1 || path.indexOf('127.0.0.1') !== -1) {
+ // This will only work if the app is on the same machine as the server
+ return Promise.resolve(false);
}
}
- });
- var maxValues = getAudioMaxValues(deviceProfile);
-
- var streamUrls = [];
-
- for (var i = 0, length = items.length; i < length; i++) {
- var item = items[i];
- var streamUrl;
-
- if (item.MediaType === 'Audio' && !itemHelper.isLocalItem(item)) {
- streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition);
- }
-
- streamUrls.push(streamUrl || '');
-
- if (i === 0) {
- startPosition = 0;
- }
- }
-
- return Promise.resolve(streamUrls);
- }
-
- function setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) {
- return getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition).then(function (streamUrls) {
- for (var i = 0, length = items.length; i < length; i++) {
- var item = items[i];
- var streamUrl = streamUrls[i];
-
- if (streamUrl) {
- item.PresetMediaSource = {
- StreamUrl: streamUrl,
- Id: item.Id,
- MediaStreams: [],
- RunTimeTicks: item.RunTimeTicks
- };
- }
- }
- });
- }
-
- function getPlaybackInfo(player,
- apiClient,
- item,
- deviceProfile,
- maxBitrate,
- startPosition,
- isPlayback,
- mediaSourceId,
- audioStreamIndex,
- subtitleStreamIndex,
- liveStreamId,
- enableDirectPlay,
- enableDirectStream,
- allowVideoStreamCopy,
- allowAudioStreamCopy) {
- if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio') {
- return Promise.resolve({
- MediaSources: [
- {
- StreamUrl: getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition),
- Id: item.Id,
- MediaStreams: [],
- RunTimeTicks: item.RunTimeTicks
- }]
- });
- }
-
- if (item.PresetMediaSource) {
- return Promise.resolve({
- MediaSources: [item.PresetMediaSource]
- });
- }
-
- var itemId = item.Id;
-
- var query = {
- UserId: apiClient.getCurrentUserId(),
- StartTimeTicks: startPosition || 0
- };
-
- if (isPlayback) {
- query.IsPlayback = true;
- query.AutoOpenLiveStream = true;
- } else {
- query.IsPlayback = false;
- query.AutoOpenLiveStream = false;
- }
-
- if (audioStreamIndex != null) {
- query.AudioStreamIndex = audioStreamIndex;
- }
- if (subtitleStreamIndex != null) {
- query.SubtitleStreamIndex = subtitleStreamIndex;
- }
- if (enableDirectPlay != null) {
- query.EnableDirectPlay = enableDirectPlay;
- }
-
- if (enableDirectStream != null) {
- query.EnableDirectStream = enableDirectStream;
- }
- if (allowVideoStreamCopy != null) {
- query.AllowVideoStreamCopy = allowVideoStreamCopy;
- }
- if (allowAudioStreamCopy != null) {
- query.AllowAudioStreamCopy = allowAudioStreamCopy;
- }
- if (mediaSourceId) {
- query.MediaSourceId = mediaSourceId;
- }
- if (liveStreamId) {
- query.LiveStreamId = liveStreamId;
- }
- if (maxBitrate) {
- query.MaxStreamingBitrate = maxBitrate;
- }
- if (player.enableMediaProbe && !player.enableMediaProbe(item)) {
- query.EnableMediaProbe = false;
- }
-
- // lastly, enforce player overrides for special situations
- if (query.EnableDirectStream !== false) {
- if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) {
- query.EnableDirectStream = false;
- }
- }
-
- if (player.getDirectPlayProtocols) {
- query.DirectPlayProtocols = player.getDirectPlayProtocols();
- }
-
- return apiClient.getPlaybackInfo(itemId, query, deviceProfile);
- }
-
- function getOptimalMediaSource(apiClient, item, versions) {
- var promises = versions.map(function (v) {
- return supportsDirectPlay(apiClient, item, v);
- });
-
- if (!promises.length) {
- return Promise.reject();
- }
-
- return Promise.all(promises).then(function (results) {
- for (var i = 0, length = versions.length; i < length; i++) {
- versions[i].enableDirectPlay = results[i] || false;
- }
- var optimalVersion = versions.filter(function (v) {
- return v.enableDirectPlay;
- })[0];
-
- if (!optimalVersion) {
- optimalVersion = versions.filter(function (v) {
- return v.SupportsDirectStream;
- })[0];
- }
-
- optimalVersion = optimalVersion || versions.filter(function (s) {
- return s.SupportsTranscoding;
- })[0];
-
- return optimalVersion || versions[0];
- });
- }
-
- function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, maxBitrate, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex) {
- var postData = {
- DeviceProfile: deviceProfile,
- OpenToken: mediaSource.OpenToken
- };
-
- var query = {
- UserId: apiClient.getCurrentUserId(),
- StartTimeTicks: startPosition || 0,
- ItemId: item.Id,
- PlaySessionId: playSessionId
- };
-
- if (maxBitrate) {
- query.MaxStreamingBitrate = maxBitrate;
- }
- if (audioStreamIndex != null) {
- query.AudioStreamIndex = audioStreamIndex;
- }
- if (subtitleStreamIndex != null) {
- query.SubtitleStreamIndex = subtitleStreamIndex;
- }
-
- // lastly, enforce player overrides for special situations
- if (query.EnableDirectStream !== false) {
- if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) {
- query.EnableDirectStream = false;
- }
- }
-
- return apiClient.ajax({
- url: apiClient.getUrl('LiveStreams/Open', query),
- type: 'POST',
- data: JSON.stringify(postData),
- contentType: 'application/json',
- dataType: 'json'
-
- });
- }
-
- function isHostReachable(mediaSource, apiClient) {
- if (mediaSource.IsRemote) {
return Promise.resolve(true);
}
- return apiClient.getEndpointInfo().then(function (endpointInfo) {
- if (endpointInfo.IsInNetwork) {
- if (!endpointInfo.IsLocal) {
- var path = (mediaSource.Path || '').toLowerCase();
- if (path.indexOf('localhost') !== -1 || path.indexOf('127.0.0.1') !== -1) {
- // This will only work if the app is on the same machine as the server
- return Promise.resolve(false);
- }
- }
+ // media source is in network, but connection is out of network
+ return Promise.resolve(false);
+ });
+}
- return Promise.resolve(true);
- }
+function supportsDirectPlay(apiClient, item, mediaSource) {
+ // folder rip hacks due to not yet being supported by the stream building engine
+ const isFolderRip = mediaSource.VideoType === 'BluRay' || mediaSource.VideoType === 'Dvd' || mediaSource.VideoType === 'HdDvd';
- // media source is in network, but connection is out of network
+ if (mediaSource.SupportsDirectPlay || isFolderRip) {
+ if (mediaSource.IsRemote && !apphost.supports('remotevideo')) {
return Promise.resolve(false);
- });
- }
+ }
- function supportsDirectPlay(apiClient, item, mediaSource) {
- // folder rip hacks due to not yet being supported by the stream building engine
- var isFolderRip = mediaSource.VideoType === 'BluRay' || mediaSource.VideoType === 'Dvd' || mediaSource.VideoType === 'HdDvd';
-
- if (mediaSource.SupportsDirectPlay || isFolderRip) {
- if (mediaSource.IsRemote && !apphost.supports('remotevideo')) {
- return Promise.resolve(false);
+ if (mediaSource.Protocol === 'Http' && !mediaSource.RequiredHttpHeaders.length) {
+ // If this is the only way it can be played, then allow it
+ if (!mediaSource.SupportsDirectStream && !mediaSource.SupportsTranscoding) {
+ return Promise.resolve(true);
+ } else {
+ return isHostReachable(mediaSource, apiClient);
}
+ } else if (mediaSource.Protocol === 'File') {
+ return new Promise(function (resolve, reject) {
+ // Determine if the file can be accessed directly
+ import('filesystem').then((filesystem) => {
+ const method = isFolderRip ?
+ 'directoryExists' :
+ 'fileExists';
- if (mediaSource.Protocol === 'Http' && !mediaSource.RequiredHttpHeaders.length) {
- // If this is the only way it can be played, then allow it
- if (!mediaSource.SupportsDirectStream && !mediaSource.SupportsTranscoding) {
- return Promise.resolve(true);
- } else {
- return isHostReachable(mediaSource, apiClient);
- }
- } else if (mediaSource.Protocol === 'File') {
- return new Promise(function (resolve, reject) {
- // Determine if the file can be accessed directly
- require(['filesystem'], function (filesystem) {
- var method = isFolderRip ?
- 'directoryExists' :
- 'fileExists';
-
- filesystem[method](mediaSource.Path).then(function () {
- resolve(true);
- }, function () {
- resolve(false);
- });
+ filesystem[method](mediaSource.Path).then(function () {
+ resolve(true);
+ }, function () {
+ resolve(false);
});
});
- }
- }
-
- return Promise.resolve(false);
- }
-
- function validatePlaybackInfoResult(instance, result) {
- if (result.ErrorCode) {
- showPlaybackInfoErrorMessage(instance, result.ErrorCode);
- return false;
- }
-
- return true;
- }
-
- function showPlaybackInfoErrorMessage(instance, errorCode, playNextTrack) {
- require(['alert'], function (alert) {
- alert.default({
- text: globalize.translate('PlaybackError' + errorCode),
- title: globalize.translate('HeaderPlaybackError')
- }).then(function () {
- if (playNextTrack) {
- instance.nextTrack();
- }
});
+ }
+ }
+
+ return Promise.resolve(false);
+}
+
+function validatePlaybackInfoResult(instance, result) {
+ if (result.ErrorCode) {
+ showPlaybackInfoErrorMessage(instance, result.ErrorCode);
+ return false;
+ }
+
+ return true;
+}
+
+function showPlaybackInfoErrorMessage(instance, errorCode, playNextTrack) {
+ import('alert').then(({ default: alert }) => {
+ alert({
+ text: globalize.translate('PlaybackError' + errorCode),
+ title: globalize.translate('HeaderPlaybackError')
+ }).then(function () {
+ if (playNextTrack) {
+ instance.nextTrack();
+ }
});
+ });
+}
+
+function normalizePlayOptions(playOptions) {
+ playOptions.fullscreen = playOptions.fullscreen !== false;
+}
+
+function truncatePlayOptions(playOptions) {
+ return {
+ fullscreen: playOptions.fullscreen,
+ mediaSourceId: playOptions.mediaSourceId,
+ audioStreamIndex: playOptions.audioStreamIndex,
+ subtitleStreamIndex: playOptions.subtitleStreamIndex,
+ startPositionTicks: playOptions.startPositionTicks
+ };
+}
+
+function getNowPlayingItemForReporting(player, item, mediaSource) {
+ const nowPlayingItem = Object.assign({}, item);
+
+ if (mediaSource) {
+ nowPlayingItem.RunTimeTicks = mediaSource.RunTimeTicks;
+ nowPlayingItem.MediaStreams = mediaSource.MediaStreams;
+
+ // not needed
+ nowPlayingItem.MediaSources = null;
}
- function normalizePlayOptions(playOptions) {
- playOptions.fullscreen = playOptions.fullscreen !== false;
+ nowPlayingItem.RunTimeTicks = nowPlayingItem.RunTimeTicks || player.duration() * 10000;
+
+ return nowPlayingItem;
+}
+
+function displayPlayerIndividually(player) {
+ return !player.isLocalPlayer;
+}
+
+function createTarget(instance, player) {
+ return {
+ name: player.name,
+ id: player.id,
+ playerName: player.name,
+ playableMediaTypes: ['Audio', 'Video', 'Photo', 'Book'].map(player.canPlayMediaType),
+ isLocalPlayer: player.isLocalPlayer,
+ supportedCommands: instance.getSupportedCommands(player)
+ };
+}
+
+function getPlayerTargets(player) {
+ if (player.getTargets) {
+ return player.getTargets();
}
- function truncatePlayOptions(playOptions) {
- return {
- fullscreen: playOptions.fullscreen,
- mediaSourceId: playOptions.mediaSourceId,
- audioStreamIndex: playOptions.audioStreamIndex,
- subtitleStreamIndex: playOptions.subtitleStreamIndex,
- startPositionTicks: playOptions.startPositionTicks
- };
- }
+ return Promise.resolve([createTarget(player)]);
+}
- function getNowPlayingItemForReporting(player, item, mediaSource) {
- var nowPlayingItem = Object.assign({}, item);
+function sortPlayerTargets(a, b) {
+ let aVal = a.isLocalPlayer ? 0 : 1;
+ let bVal = b.isLocalPlayer ? 0 : 1;
- if (mediaSource) {
- nowPlayingItem.RunTimeTicks = mediaSource.RunTimeTicks;
- nowPlayingItem.MediaStreams = mediaSource.MediaStreams;
+ aVal = aVal.toString() + a.name;
+ bVal = bVal.toString() + b.name;
- // not needed
- nowPlayingItem.MediaSources = null;
- }
+ return aVal.localeCompare(bVal);
+}
- nowPlayingItem.RunTimeTicks = nowPlayingItem.RunTimeTicks || player.duration() * 10000;
+class PlaybackManager {
+ constructor() {
+ const self = this;
- return nowPlayingItem;
- }
-
- function displayPlayerIndividually(player) {
- return !player.isLocalPlayer;
- }
-
- function createTarget(instance, player) {
- return {
- name: player.name,
- id: player.id,
- playerName: player.name,
- playableMediaTypes: ['Audio', 'Video', 'Photo', 'Book'].map(player.canPlayMediaType),
- isLocalPlayer: player.isLocalPlayer,
- supportedCommands: instance.getSupportedCommands(player)
- };
- }
-
- function getPlayerTargets(player) {
- if (player.getTargets) {
- return player.getTargets();
- }
-
- return Promise.resolve([createTarget(player)]);
- }
-
- function sortPlayerTargets(a, b) {
- var aVal = a.isLocalPlayer ? 0 : 1;
- var bVal = b.isLocalPlayer ? 0 : 1;
-
- aVal = aVal.toString() + a.name;
- bVal = bVal.toString() + b.name;
-
- return aVal.localeCompare(bVal);
- }
-
- function PlaybackManager() {
- var self = this;
-
- var players = [];
- var currentTargetInfo;
- var currentPairingId = null;
+ const players = [];
+ let currentTargetInfo;
+ let currentPairingId = null;
this._playNextAfterEnded = true;
- var playerStates = {};
+ const playerStates = {};
this._playQueueManager = new PlayQueueManager();
@@ -736,7 +745,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.currentItem();
}
- var data = getPlayerData(player);
+ const data = getPlayerData(player);
return data.streamInfo ? data.streamInfo.item : null;
};
@@ -749,7 +758,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.currentMediaSource();
}
- var data = getPlayerData(player);
+ const data = getPlayerData(player);
return data.streamInfo ? data.streamInfo.mediaSource : null;
};
@@ -762,7 +771,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.playMethod();
}
- var data = getPlayerData(player);
+ const data = getPlayerData(player);
return data.streamInfo ? data.streamInfo.playMethod : null;
};
@@ -775,21 +784,20 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.playSessionId();
}
- var data = getPlayerData(player);
+ const data = getPlayerData(player);
return data.streamInfo ? data.streamInfo.playSessionId : null;
};
self.getPlayerInfo = function () {
- var player = self._currentPlayer;
+ const player = self._currentPlayer;
if (!player) {
return null;
}
- var target = currentTargetInfo || {};
+ const target = currentTargetInfo || {};
return {
-
name: player.name,
isLocalPlayer: player.isLocalPlayer,
id: target.id,
@@ -845,7 +853,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
currentPairingId = targetInfo.id;
- var promise = player.tryPair ?
+ const promise = player.tryPair ?
player.tryPair(targetInfo) :
Promise.resolve();
@@ -863,11 +871,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
};
self.getTargets = function () {
- var promises = players.filter(displayPlayerIndividually).map(getPlayerTargets);
+ const promises = players.filter(displayPlayerIndividually).map(getPlayerTargets);
return Promise.all(promises).then(function (responses) {
return connectionManager.currentApiClient().getCurrentUser().then(function (user) {
- var targets = [];
+ const targets = [];
targets.push({
name: globalize.translate('HeaderMyDevice'),
@@ -881,10 +889,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
user: user
});
- for (var i = 0; i < responses.length; i++) {
- var subTargets = responses[i];
+ for (let i = 0; i < responses.length; i++) {
+ const subTargets = responses[i];
- for (var j = 0; j < subTargets.length; j++) {
+ for (let j = 0; j < subTargets.length; j++) {
targets.push(subTargets[j]);
}
}
@@ -899,7 +907,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
throw new Error('player cannot be null');
}
- var index = getPlayerData(player).subtitleStreamIndex;
+ const index = getPlayerData(player).subtitleStreamIndex;
if (index == null || index === -1) {
return null;
@@ -928,7 +936,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
};
function removeCurrentPlayer(player) {
- var previousPlayer = self._currentPlayer;
+ const previousPlayer = self._currentPlayer;
if (!previousPlayer || player.id === previousPlayer.id) {
setCurrentPlayerInternal(null);
@@ -936,8 +944,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function setCurrentPlayerInternal(player, targetInfo) {
- var previousPlayer = self._currentPlayer;
- var previousTargetInfo = currentTargetInfo;
+ const previousPlayer = self._currentPlayer;
+ const previousTargetInfo = currentTargetInfo;
if (player && !targetInfo && player.isLocalPlayer) {
targetInfo = createTarget(self, player);
@@ -988,7 +996,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
if (self.isPlaying(player)) {
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
return playerData.streamInfo.mediaType === mediaType;
}
@@ -1027,7 +1035,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
self.canPlay = function (item) {
- var itemType = item.Type;
+ const itemType = item.Type;
if (itemType === 'PhotoAlbum' || itemType === 'MusicGenre' || itemType === 'Season' || itemType === 'Series' || itemType === 'BoxSet' || itemType === 'MusicAlbum' || itemType === 'MusicArtist' || itemType === 'Playlist') {
return true;
@@ -1057,12 +1065,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
player = player || self._currentPlayer;
if (player) {
- var current = self.getAspectRatio(player);
+ const current = self.getAspectRatio(player);
- var supported = self.getSupportedAspectRatios(player);
+ const supported = self.getSupportedAspectRatios(player);
- var index = -1;
- for (var i = 0, length = supported.length; i < length; i++) {
+ let index = -1;
+ for (let i = 0, length = supported.length; i < length; i++) {
if (supported[i].id === current) {
index = i;
break;
@@ -1104,7 +1112,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
};
- var brightnessOsdLoaded;
+ let brightnessOsdLoaded;
self.setBrightness = function (val, player) {
player = player || self._currentPlayer;
@@ -1112,7 +1120,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
if (!brightnessOsdLoaded) {
brightnessOsdLoaded = true;
// TODO: Have this trigger an event instead to get the osd out of here
- require(['brightnessOsd']);
+ import('brightnessOsd').then();
}
player.setBrightness(val);
}
@@ -1168,11 +1176,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return;
}
- var currentMediaSource = self.currentMediaSource(player);
- var mediaStreams = [];
- var i;
- var length;
- for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
+ const currentMediaSource = self.currentMediaSource(player);
+ const mediaStreams = [];
+ for (let i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
if (currentMediaSource.MediaStreams[i].Type === 'Audio') {
mediaStreams.push(currentMediaSource.MediaStreams[i]);
}
@@ -1183,16 +1189,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return;
}
- var currentStreamIndex = self.getAudioStreamIndex(player);
- var indexInList = -1;
- for (i = 0, length = mediaStreams.length; i < length; i++) {
+ const currentStreamIndex = self.getAudioStreamIndex(player);
+ let indexInList = -1;
+ for (let i = 0, length = mediaStreams.length; i < length; i++) {
if (mediaStreams[i].Index === currentStreamIndex) {
indexInList = i;
break;
}
}
- var nextIndex = indexInList + 1;
+ let nextIndex = indexInList + 1;
if (nextIndex >= mediaStreams.length) {
nextIndex = 0;
}
@@ -1212,11 +1218,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return;
}
- var currentMediaSource = self.currentMediaSource(player);
- var mediaStreams = [];
- var i;
- var length;
- for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
+ const currentMediaSource = self.currentMediaSource(player);
+ const mediaStreams = [];
+ for (let i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
if (currentMediaSource.MediaStreams[i].Type === 'Subtitle') {
mediaStreams.push(currentMediaSource.MediaStreams[i]);
}
@@ -1227,16 +1231,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return;
}
- var currentStreamIndex = self.getSubtitleStreamIndex(player);
- var indexInList = -1;
- for (i = 0, length = mediaStreams.length; i < length; i++) {
+ const currentStreamIndex = self.getSubtitleStreamIndex(player);
+ let indexInList = -1;
+ for (let i = 0, length = mediaStreams.length; i < length; i++) {
if (mediaStreams[i].Index === currentStreamIndex) {
indexInList = i;
break;
}
}
- var nextIndex = indexInList + 1;
+ let nextIndex = indexInList + 1;
if (nextIndex >= mediaStreams.length) {
nextIndex = -1;
}
@@ -1256,12 +1260,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
};
function isAudioStreamSupported(mediaSource, index, deviceProfile) {
- var mediaStream;
- var i;
- var length;
- var mediaStreams = mediaSource.MediaStreams;
+ let mediaStream;
+ const mediaStreams = mediaSource.MediaStreams;
- for (i = 0, length = mediaStreams.length; i < length; i++) {
+ for (let i = 0, length = mediaStreams.length; i < length; i++) {
if (mediaStreams[i].Type === 'Audio' && mediaStreams[i].Index === index) {
mediaStream = mediaStreams[i];
break;
@@ -1272,13 +1274,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return false;
}
- var codec = (mediaStream.Codec || '').toLowerCase();
+ const codec = (mediaStream.Codec || '').toLowerCase();
if (!codec) {
return false;
}
- var profiles = deviceProfile.DirectPlayProfiles || [];
+ const profiles = deviceProfile.DirectPlayProfiles || [];
return profiles.filter(function (p) {
if (p.Type === 'Video') {
@@ -1327,7 +1329,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
apiClient = connectionManager.currentApiClient();
}
- var endpointInfo = apiClient.getSavedEndpointInfo() || {};
+ const endpointInfo = apiClient.getSavedEndpointInfo() || {};
return appSettings.maxStreamingBitrate(endpointInfo.IsInNetwork, mediaType);
}
@@ -1338,16 +1340,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.getMaxStreamingBitrate();
}
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
if (playerData.maxStreamingBitrate) {
return playerData.maxStreamingBitrate;
}
- var mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
- var currentItem = self.currentItem(player);
+ const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
+ const currentItem = self.currentItem(player);
- var apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient();
+ const apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient();
return getSavedMaxStreamingBitrate(apiClient, mediaType);
};
@@ -1357,12 +1359,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.enableAutomaticBitrateDetection();
}
- var playerData = getPlayerData(player);
- var mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
- var currentItem = self.currentItem(player);
+ const playerData = getPlayerData(player);
+ const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
+ const currentItem = self.currentItem(player);
- var apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient();
- var endpointInfo = apiClient.getSavedEndpointInfo() || {};
+ const apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient();
+ const endpointInfo = apiClient.getSavedEndpointInfo() || {};
return appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType);
};
@@ -1373,13 +1375,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.setMaxStreamingBitrate(options);
}
- var apiClient = connectionManager.getApiClient(self.currentItem(player).ServerId);
+ const apiClient = connectionManager.getApiClient(self.currentItem(player).ServerId);
apiClient.getEndpointInfo().then(function (endpointInfo) {
- var playerData = getPlayerData(player);
- var mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
+ const playerData = getPlayerData(player);
+ const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
- var promise;
+ let promise;
if (options.enableAutomaticBitrateDetection) {
appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType, true);
promise = apiClient.detectBitrate(true);
@@ -1472,17 +1474,17 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.setSubtitleStreamIndex(index);
}
- var currentStream = getCurrentSubtitleStream(player);
+ const currentStream = getCurrentSubtitleStream(player);
- var newStream = getSubtitleStream(player, index);
+ const newStream = getSubtitleStream(player, index);
if (!currentStream && !newStream) {
return;
}
- var selectedTrackElementIndex = -1;
+ let selectedTrackElementIndex = -1;
- var currentPlayMethod = self.playMethod(player);
+ const currentPlayMethod = self.playMethod(player);
if (currentStream && !newStream) {
if (getDeliveryMethod(currentStream) === 'Encode' || (getDeliveryMethod(currentStream) === 'Embed' && currentPlayMethod === 'Transcode')) {
@@ -1519,30 +1521,30 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
getPlayerData(player).subtitleStreamIndex = index;
};
- self.supportSubtitleOffset = function(player) {
+ self.supportSubtitleOffset = function (player) {
player = player || self._currentPlayer;
return player && 'setSubtitleOffset' in player;
};
- self.enableShowingSubtitleOffset = function(player) {
+ self.enableShowingSubtitleOffset = function (player) {
player = player || self._currentPlayer;
player.enableShowingSubtitleOffset();
};
- self.disableShowingSubtitleOffset = function(player) {
+ self.disableShowingSubtitleOffset = function (player) {
player = player || self._currentPlayer;
if (player.disableShowingSubtitleOffset) {
player.disableShowingSubtitleOffset();
}
};
- self.isShowingSubtitleOffsetEnabled = function(player) {
+ self.isShowingSubtitleOffsetEnabled = function (player) {
player = player || self._currentPlayer;
return player.isShowingSubtitleOffsetEnabled();
};
- self.isSubtitleStreamExternal = function(index, player) {
- var stream = getSubtitleStream(player, index);
+ self.isSubtitleStreamExternal = function (index, player) {
+ const stream = getSubtitleStream(player, index);
return stream ? getDeliveryMethod(stream) === 'External' : false;
};
@@ -1553,15 +1555,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
};
- self.getPlayerSubtitleOffset = function(player) {
+ self.getPlayerSubtitleOffset = function (player) {
player = player || self._currentPlayer;
if (player.getSubtitleOffset) {
return player.getSubtitleOffset();
}
};
- self.canHandleOffsetOnCurrentSubtitle = function(player) {
- var index = self.getSubtitleStreamIndex(player);
+ self.canHandleOffsetOnCurrentSubtitle = function (player) {
+ const index = self.getSubtitleStreamIndex(player);
return index !== -1 && self.isSubtitleStreamExternal(index, player);
};
@@ -1590,7 +1592,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
}
- var ticks = getCurrentTicks(player) + offsetTicks;
+ const ticks = getCurrentTicks(player) + offsetTicks;
return this.seek(ticks, player);
};
@@ -1600,9 +1602,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
throw new Error('player cannot be null');
}
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
- var currentSrc = (playerData.streamInfo.url || '').toLowerCase();
+ const currentSrc = (playerData.streamInfo.url || '').toLowerCase();
if (currentSrc.indexOf('.m3u8') !== -1) {
return true;
@@ -1612,7 +1614,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.seekable();
}
- var isPlayMethodTranscode = self.playMethod(player) === 'Transcode';
+ const isPlayMethodTranscode = self.playMethod(player) === 'Transcode';
if (isPlayMethodTranscode) {
return false;
@@ -1629,37 +1631,35 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
params = params || {};
- var liveStreamId = getPlayerData(player).streamInfo.liveStreamId;
- var lastMediaInfoQuery = getPlayerData(player).streamInfo.lastMediaInfoQuery;
+ const liveStreamId = getPlayerData(player).streamInfo.liveStreamId;
+ const lastMediaInfoQuery = getPlayerData(player).streamInfo.lastMediaInfoQuery;
- var playSessionId = self.playSessionId(player);
+ const playSessionId = self.playSessionId(player);
- var currentItem = self.currentItem(player);
+ const currentItem = self.currentItem(player);
player.getDeviceProfile(currentItem, {
-
isRetry: params.EnableDirectPlay === false
-
}).then(function (deviceProfile) {
- var audioStreamIndex = params.AudioStreamIndex == null ? getPlayerData(player).audioStreamIndex : params.AudioStreamIndex;
- var subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex;
+ const audioStreamIndex = params.AudioStreamIndex == null ? getPlayerData(player).audioStreamIndex : params.AudioStreamIndex;
+ const subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex;
- var currentMediaSource = self.currentMediaSource(player);
- var apiClient = connectionManager.getApiClient(currentItem.ServerId);
+ let currentMediaSource = self.currentMediaSource(player);
+ const apiClient = connectionManager.getApiClient(currentItem.ServerId);
if (ticks) {
ticks = parseInt(ticks);
}
- var maxBitrate = params.MaxStreamingBitrate || self.getMaxStreamingBitrate(player);
+ const maxBitrate = params.MaxStreamingBitrate || self.getMaxStreamingBitrate(player);
- var currentPlayOptions = currentItem.playOptions || getDefaultPlayOptions();
+ const currentPlayOptions = currentItem.playOptions || getDefaultPlayOptions();
getPlaybackInfo(player, apiClient, currentItem, deviceProfile, maxBitrate, ticks, true, currentMediaSource.Id, audioStreamIndex, subtitleStreamIndex, liveStreamId, params.EnableDirectPlay, params.EnableDirectStream, params.AllowVideoStreamCopy, params.AllowAudioStreamCopy).then(function (result) {
if (validatePlaybackInfoResult(self, result)) {
currentMediaSource = result.MediaSources[0];
- var streamInfo = createStreamInfo(apiClient, currentItem.MediaType, currentItem, currentMediaSource, ticks);
+ const streamInfo = createStreamInfo(apiClient, currentItem.MediaType, currentItem, currentMediaSource, ticks);
streamInfo.fullscreen = currentPlayOptions.fullscreen;
streamInfo.lastMediaInfoQuery = lastMediaInfoQuery;
@@ -1679,14 +1679,14 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function changeStreamToUrl(apiClient, player, playSessionId, streamInfo, newPositionTicks) {
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
playerData.isChangingStream = true;
if (playerData.streamInfo && playSessionId) {
apiClient.stopActiveEncodings(playSessionId).then(function () {
// Stop the first transcoding afterwards because the player may still send requests to the original url
- var afterSetSrc = function () {
+ const afterSetSrc = function () {
apiClient.stopActiveEncodings(playSessionId);
};
setSrcIntoPlayer(apiClient, player, streamInfo).then(afterSetSrc, afterSetSrc);
@@ -1698,7 +1698,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
function setSrcIntoPlayer(apiClient, player, streamInfo) {
return player.play(streamInfo).then(function () {
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
playerData.isChangingStream = false;
playerData.streamInfo = streamInfo;
@@ -1707,7 +1707,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
sendProgressUpdate(player, 'timeupdate');
}, function (e) {
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
playerData.isChangingStream = false;
onPlaybackError.call(player, e, {
@@ -1725,12 +1725,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
});
}
- var firstItem = items[0];
- var promise;
+ const firstItem = items[0];
+ let promise;
- var serverId = firstItem.ServerId;
+ const serverId = firstItem.ServerId;
- var queryOptions = options.queryOptions || {};
+ const queryOptions = options.queryOptions || {};
if (firstItem.Type === 'Program') {
promise = getItemsForPlayback(serverId, {
@@ -1758,9 +1758,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
SortBy: options.shuffle ? 'Random' : 'SortName',
MediaTypes: 'Photo,Video'
}).then(function (result) {
- var items = result.Items;
+ const items = result.Items;
- var index = items.map(function (i) {
+ let index = items.map(function (i) {
return i.Id;
}).indexOf(firstItem.Id);
@@ -1781,7 +1781,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
SortBy: options.shuffle ? 'Random' : 'SortName',
MediaTypes: 'Photo,Video',
Limit: 1000
-
});
} else if (firstItem.Type === 'MusicGenre') {
promise = getItemsForPlayback(serverId, {
@@ -1793,18 +1792,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
});
} else if (firstItem.IsFolder) {
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
-
ParentId: firstItem.Id,
Filters: 'IsNotFolder',
Recursive: true,
// These are pre-sorted
SortBy: options.shuffle ? 'Random' : (['BoxSet'].indexOf(firstItem.Type) === -1 ? 'SortName' : null),
MediaTypes: 'Audio,Video'
-
}, queryOptions));
} else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
promise = new Promise(function (resolve, reject) {
- var apiClient = connectionManager.getApiClient(firstItem.ServerId);
+ const apiClient = connectionManager.getApiClient(firstItem.ServerId);
apiClient.getCurrentUser().then(function (user) {
if (!user.Configuration.EnableNextEpisodeAutoPlay || !firstItem.SeriesId) {
@@ -1817,9 +1814,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
IsMissing: false,
UserId: apiClient.getCurrentUserId(),
Fields: 'Chapters'
-
}).then(function (episodesResult) {
- var foundItem = false;
+ let foundItem = false;
episodesResult.Items = episodesResult.Items.filter(function (e) {
if (foundItem) {
return true;
@@ -1874,9 +1870,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
return getItemsForPlayback(options.serverId, {
-
Ids: options.ids.join(',')
-
}).then(function (result) {
return translateItemsForPlayback(result.Items, options).then(function (items) {
return playWithIntros(items, options);
@@ -1892,7 +1886,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
if (!player.name) {
throw new Error('player name cannot be null');
}
- var state = playerStates[player.name];
+ let state = playerStates[player.name];
if (!state) {
playerStates[player.name] = {};
@@ -1916,7 +1910,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
item = item || self.currentItem(player);
mediaSource = mediaSource || self.currentMediaSource(player);
- var state = {
+ const state = {
PlayState: {}
};
@@ -1974,13 +1968,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
throw new Error('player cannot be null');
}
- var mediaSource = self.currentMediaSource(player);
+ const mediaSource = self.currentMediaSource(player);
if (mediaSource && mediaSource.RunTimeTicks) {
return mediaSource.RunTimeTicks;
}
- var playerDuration = player.duration();
+ let playerDuration = player.duration();
if (playerDuration) {
playerDuration *= 10000;
@@ -1994,9 +1988,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
throw new Error('player cannot be null');
}
- var playerTime = Math.floor(10000 * (player || self._currentPlayer).currentTime());
+ let playerTime = Math.floor(10000 * (player).currentTime());
- var streamInfo = getPlayerData(player).streamInfo;
+ const streamInfo = getPlayerData(player).streamInfo;
if (streamInfo) {
playerTime += getPlayerData(player).streamInfo.transcodingOffsetTicks || 0;
}
@@ -2008,8 +2002,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
self.getCurrentTicks = getCurrentTicks;
function playOther(items, options, user) {
- var playStartIndex = options.startIndex || 0;
- var player = getPlayer(items[playStartIndex], options);
+ const playStartIndex = options.startIndex || 0;
+ const player = getPlayer(items[playStartIndex], options);
loading.hide();
@@ -2019,8 +2013,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function playWithIntros(items, options, user) {
- var playStartIndex = options.startIndex || 0;
- var firstItem = items[playStartIndex];
+ let playStartIndex = options.startIndex || 0;
+ let firstItem = items[playStartIndex];
// If index was bad, reset it
if (!firstItem) {
@@ -2038,11 +2032,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return playOther(items, options, user);
}
- var apiClient = connectionManager.getApiClient(firstItem.ServerId);
+ const apiClient = connectionManager.getApiClient(firstItem.ServerId);
return getIntros(firstItem, apiClient, options).then(function (introsResult) {
- var introItems = introsResult.Items;
- var introPlayOptions;
+ const introItems = introsResult.Items;
+ let introPlayOptions;
firstItem.playOptions = truncatePlayOptions(options);
@@ -2098,9 +2092,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
// TODO: This should be the media type requested, not the original media type
- var mediaType = item.MediaType;
+ const mediaType = item.MediaType;
- var onBitrateDetectionFailure = function () {
+ const onBitrateDetectionFailure = function () {
return playAfterBitrateDetect(getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn);
};
@@ -2108,7 +2102,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return onBitrateDetectionFailure();
}
- var apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = connectionManager.getApiClient(item.ServerId);
apiClient.getEndpointInfo().then(function (endpointInfo) {
if ((mediaType === 'Video' || mediaType === 'Audio') && appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType)) {
return apiClient.detectBitrate().then(function (bitrate) {
@@ -2124,7 +2118,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onInterceptorRejection() {
- var player = self._currentPlayer;
+ const player = self._currentPlayer;
if (player) {
destroyPlayer(player);
@@ -2142,7 +2136,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
function runInterceptors(item, playOptions) {
return new Promise(function (resolve, reject) {
- var interceptors = pluginManager.ofType('preplayintercept');
+ const interceptors = pluginManager.ofType('preplayintercept');
interceptors.sort(function (a, b) {
return (a.order || 0) - (b.order || 0);
@@ -2155,7 +2149,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
loading.hide();
- var options = Object.assign({}, playOptions);
+ const options = Object.assign({}, playOptions);
options.mediaType = item.MediaType;
options.item = item;
@@ -2170,7 +2164,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return;
}
- var interceptor = interceptors[index];
+ const interceptor = interceptors[index];
interceptor.intercept(options).then(function () {
runNextPrePlay(interceptors, index + 1, options, resolve, reject);
@@ -2193,12 +2187,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function playAfterBitrateDetect(maxBitrate, item, playOptions, onPlaybackStartedFn) {
- var startPosition = playOptions.startPositionTicks;
+ const startPosition = playOptions.startPositionTicks;
- var player = getPlayer(item, playOptions);
- var activePlayer = self._currentPlayer;
+ const player = getPlayer(item, playOptions);
+ const activePlayer = self._currentPlayer;
- var promise;
+ let promise;
if (activePlayer) {
// TODO: if changing players within the same playlist, this will cause nextItem to be null
@@ -2210,7 +2204,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
if (!isServerItem(item) || item.MediaType === 'Book') {
return promise.then(function () {
- var streamInfo = createStreamInfoFromUrlItem(item);
+ const streamInfo = createStreamInfoFromUrlItem(item);
streamInfo.fullscreen = playOptions.fullscreen;
getPlayerData(player).isChangingStream = false;
return player.play(streamInfo).then(function () {
@@ -2225,13 +2219,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
return Promise.all([promise, player.getDeviceProfile(item)]).then(function (responses) {
- var deviceProfile = responses[1];
+ const deviceProfile = responses[1];
- var apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = connectionManager.getApiClient(item.ServerId);
- var mediaSourceId = playOptions.mediaSourceId;
- var audioStreamIndex = playOptions.audioStreamIndex;
- var subtitleStreamIndex = playOptions.subtitleStreamIndex;
+ const mediaSourceId = playOptions.mediaSourceId;
+ const audioStreamIndex = playOptions.audioStreamIndex;
+ const subtitleStreamIndex = playOptions.subtitleStreamIndex;
if (player && !enableLocalPlaylistManagement(player)) {
return sendPlaybackListToPlayer(player, playOptions.items, deviceProfile, maxBitrate, apiClient, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex, playOptions.startIndex);
@@ -2241,7 +2235,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
playOptions.items = null;
return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(function (mediaSource) {
- var streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition);
+ const streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition);
streamInfo.fullscreen = playOptions.fullscreen;
@@ -2269,14 +2263,14 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
self.getPlaybackInfo = function (item, options) {
options = options || {};
- var startPosition = options.startPositionTicks || 0;
- var mediaType = options.mediaType || item.MediaType;
- var player = getPlayer(item, options);
- var apiClient = connectionManager.getApiClient(item.ServerId);
+ const startPosition = options.startPositionTicks || 0;
+ const mediaType = options.mediaType || item.MediaType;
+ const player = getPlayer(item, options);
+ const apiClient = connectionManager.getApiClient(item.ServerId);
// Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate
return apiClient.getEndpointInfo().then(function () {
- var maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType);
+ const maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType);
return player.getDeviceProfile(item).then(function (deviceProfile) {
return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, options.mediaSourceId, options.audioStreamIndex, options.subtitleStreamIndex).then(function (mediaSource) {
@@ -2288,15 +2282,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
self.getPlaybackMediaSources = function (item, options) {
options = options || {};
- var startPosition = options.startPositionTicks || 0;
- var mediaType = options.mediaType || item.MediaType;
+ const startPosition = options.startPositionTicks || 0;
+ const mediaType = options.mediaType || item.MediaType;
// TODO: Remove the true forceLocalPlayer hack
- var player = getPlayer(item, options, true);
- var apiClient = connectionManager.getApiClient(item.ServerId);
+ const player = getPlayer(item, options, true);
+ const apiClient = connectionManager.getApiClient(item.ServerId);
// Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate
return apiClient.getEndpointInfo().then(function () {
- var maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType);
+ const maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType);
return player.getDeviceProfile(item).then(function (deviceProfile) {
return getPlaybackInfo(player, apiClient, item, deviceProfile, maxBitrate, startPosition, false, null, null, null, null).then(function (playbackInfoResult) {
@@ -2307,16 +2301,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
};
function createStreamInfo(apiClient, type, item, mediaSource, startPosition) {
- var mediaUrl;
- var contentType;
- var transcodingOffsetTicks = 0;
- var playerStartPositionTicks = startPosition;
- var liveStreamId = mediaSource.LiveStreamId;
+ let mediaUrl;
+ let contentType;
+ let transcodingOffsetTicks = 0;
+ const playerStartPositionTicks = startPosition;
+ const liveStreamId = mediaSource.LiveStreamId;
- var playMethod = 'Transcode';
+ let playMethod = 'Transcode';
- var mediaSourceContainer = (mediaSource.Container || '').toLowerCase();
- var directOptions;
+ const mediaSourceContainer = (mediaSource.Container || '').toLowerCase();
+ let directOptions;
if (type === 'Video' || type === 'Audio') {
contentType = getMimeType(type.toLowerCase(), mediaSourceContainer);
@@ -2345,7 +2339,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
directOptions.LiveStreamId = mediaSource.LiveStreamId;
}
- var prefix = type === 'Video' ? 'Videos' : 'Audio';
+ const prefix = type === 'Video' ? 'Videos' : 'Audio';
mediaUrl = apiClient.getUrl(prefix + '/' + item.Id + '/stream.' + mediaSourceContainer, directOptions);
playMethod = 'DirectStream';
@@ -2374,7 +2368,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
playMethod = 'DirectPlay';
}
- var resultInfo = {
+ const resultInfo = {
url: mediaUrl,
mimeType: contentType,
transcodingOffsetTicks: transcodingOffsetTicks,
@@ -2391,7 +2385,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
title: item.Name
};
- var backdropUrl = backdropImageUrl(apiClient, item, {});
+ const backdropUrl = backdropImageUrl(apiClient, item, {});
if (backdropUrl) {
resultInfo.backdropUrl = backdropUrl;
}
@@ -2400,19 +2394,19 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function getTextTracks(apiClient, item, mediaSource) {
- var subtitleStreams = mediaSource.MediaStreams.filter(function (s) {
+ const subtitleStreams = mediaSource.MediaStreams.filter(function (s) {
return s.Type === 'Subtitle';
});
- var textStreams = subtitleStreams.filter(function (s) {
+ const textStreams = subtitleStreams.filter(function (s) {
return s.DeliveryMethod === 'External';
});
- var tracks = [];
+ const tracks = [];
- for (var i = 0, length = textStreams.length; i < length; i++) {
- var textStream = textStreams[i];
- var textStreamUrl;
+ for (let i = 0, length = textStreams.length; i < length; i++) {
+ const textStream = textStreams[i];
+ let textStreamUrl;
if (itemHelper.isLocalItem(item)) {
textStreamUrl = textStream.Path;
@@ -2459,7 +2453,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function getPlayer(item, playOptions, forceLocalPlayers) {
- var serverItem = isServerItem(item);
+ const serverItem = isServerItem(item);
return getAutomaticPlayers(self, forceLocalPlayers).filter(function (p) {
if (p.canPlayMediaType(item.MediaType)) {
if (serverItem) {
@@ -2482,11 +2476,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.setCurrentPlaylistItem(playlistItemId);
}
- var newItem;
- var newItemIndex;
- var playlist = self._playQueueManager.getPlaylist();
+ let newItem;
+ let newItemIndex;
+ const playlist = self._playQueueManager.getPlaylist();
- for (var i = 0, length = playlist.length; i < length; i++) {
+ for (let i = 0, length = playlist.length; i < length; i++) {
if (playlist[i].PlaylistItemId === playlistItemId) {
newItem = playlist[i];
newItemIndex = i;
@@ -2495,7 +2489,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
if (newItem) {
- var newItemPlayOptions = newItem.playOptions || getDefaultPlayOptions();
+ const newItemPlayOptions = newItem.playOptions || getDefaultPlayOptions();
playInternal(newItem, newItemPlayOptions, function () {
setPlaylistState(newItem.PlaylistItemId, newItemIndex);
@@ -2513,18 +2507,19 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.removeFromPlaylist(playlistItemIds);
}
- var removeResult = self._playQueueManager.removeFromPlaylist(playlistItemIds);
+ const removeResult = self._playQueueManager.removeFromPlaylist(playlistItemIds);
if (removeResult.result === 'empty') {
return self.stop(player);
}
- var isCurrentIndex = removeResult.isCurrentIndex;
+ const isCurrentIndex = removeResult.isCurrentIndex;
events.trigger(player, 'playlistitemremove', [
{
playlistItemIds: playlistItemIds
- }]);
+ }
+ ]);
if (isCurrentIndex) {
return self.setCurrentPlaylistItem(self._playQueueManager.getPlaylist()[0].PlaylistItemId, player);
@@ -2539,7 +2534,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.movePlaylistItem(playlistItemId, newIndex);
}
- var moveResult = self._playQueueManager.movePlaylistItem(playlistItemId, newIndex);
+ const moveResult = self._playQueueManager.movePlaylistItem(playlistItemId, newIndex);
if (moveResult.result === 'noop') {
return;
@@ -2549,7 +2544,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
{
playlistItemId: moveResult.playlistItemId,
newIndex: moveResult.newIndex
- }]);
+ }
+ ]);
};
self.getCurrentPlaylistIndex = function (player) {
@@ -2586,12 +2582,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.nextTrack();
}
- var newItemInfo = self._playQueueManager.getNextItemInfo();
+ const newItemInfo = self._playQueueManager.getNextItemInfo();
if (newItemInfo) {
console.debug('playing next track');
- var newItemPlayOptions = newItemInfo.item.playOptions || getDefaultPlayOptions();
+ const newItemPlayOptions = newItemInfo.item.playOptions || getDefaultPlayOptions();
playInternal(newItemInfo.item, newItemPlayOptions, function () {
setPlaylistState(newItemInfo.item.PlaylistItemId, newItemInfo.index);
@@ -2605,13 +2601,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.previousTrack();
}
- var newIndex = self.getCurrentPlaylistIndex(player) - 1;
+ const newIndex = self.getCurrentPlaylistIndex(player) - 1;
if (newIndex >= 0) {
- var playlist = self._playQueueManager.getPlaylist();
- var newItem = playlist[newIndex];
+ const playlist = self._playQueueManager.getPlaylist();
+ const newItem = playlist[newIndex];
if (newItem) {
- var newItemPlayOptions = newItem.playOptions || getDefaultPlayOptions();
+ const newItemPlayOptions = newItem.playOptions || getDefaultPlayOptions();
newItemPlayOptions.startPositionTicks = 0;
playInternal(newItem, newItemPlayOptions, function () {
@@ -2647,9 +2643,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
return getItemsForPlayback(options.serverId, {
-
Ids: options.ids.join(',')
-
}).then(function (result) {
return translateItemsForPlayback(result.Items, options).then(function (items) {
// TODO: Handle options.startIndex for photos
@@ -2677,10 +2671,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return;
}
- var queueDirectToPlayer = player && !enableLocalPlaylistManagement(player);
+ const queueDirectToPlayer = player && !enableLocalPlaylistManagement(player);
if (queueDirectToPlayer) {
- var apiClient = connectionManager.getApiClient(items[0].ServerId);
+ const apiClient = connectionManager.getApiClient(items[0].ServerId);
player.getDeviceProfile(items[0]).then(function (profile) {
setStreamUrls(items, profile, self.getMaxStreamingBitrate(player), apiClient, 0).then(function () {
@@ -2704,7 +2698,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onPlayerProgressInterval() {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'timeupdate');
}
@@ -2728,7 +2722,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
setCurrentPlayerInternal(player);
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
playerData.streamInfo = streamInfo;
@@ -2743,10 +2737,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
self._playNextAfterEnded = true;
- var isFirstItem = playOptions.isFirstItem;
- var fullscreen = playOptions.fullscreen;
+ const isFirstItem = playOptions.isFirstItem;
+ const fullscreen = playOptions.fullscreen;
- var state = self.getPlayerState(player, streamInfo.item, streamInfo.mediaSource);
+ const state = self.getPlayerState(player, streamInfo.item, streamInfo.mediaSource);
reportPlayback(self, state, player, true, state.NowPlayingItem.ServerId, 'reportPlaybackStart');
@@ -2762,22 +2756,22 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onPlaybackStartedFromSelfManagingPlayer(e, item, mediaSource) {
- var player = this;
+ const player = this;
setCurrentPlayerInternal(player);
- var playOptions = item.playOptions || getDefaultPlayOptions();
- var isFirstItem = playOptions.isFirstItem;
- var fullscreen = playOptions.fullscreen;
+ const playOptions = item.playOptions || getDefaultPlayOptions();
+ const isFirstItem = playOptions.isFirstItem;
+ const fullscreen = playOptions.fullscreen;
playOptions.isFirstItem = false;
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
playerData.streamInfo = {};
- var streamInfo = playerData.streamInfo;
+ const streamInfo = playerData.streamInfo;
streamInfo.playbackStartTimeTicks = new Date().getTime() * 10000;
- var state = self.getPlayerState(player, item, mediaSource);
+ const state = self.getPlayerState(player, item, mediaSource);
reportPlayback(self, state, player, true, state.NowPlayingItem.ServerId, 'reportPlaybackStart');
@@ -2793,15 +2787,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onPlaybackStoppedFromSelfManagingPlayer(e, playerStopInfo) {
- var player = this;
+ const player = this;
stopPlaybackProgressTimer(player);
- var state = self.getPlayerState(player, playerStopInfo.item, playerStopInfo.mediaSource);
+ const state = self.getPlayerState(player, playerStopInfo.item, playerStopInfo.mediaSource);
- var nextItem = playerStopInfo.nextItem;
- var nextMediaType = playerStopInfo.nextMediaType;
+ const nextItem = playerStopInfo.nextItem;
+ const nextMediaType = playerStopInfo.nextMediaType;
- var playbackStopInfo = {
+ const playbackStopInfo = {
player: player,
state: state,
nextItem: (nextItem ? nextItem.item : null),
@@ -2810,7 +2804,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
state.NextMediaType = nextMediaType;
- var streamInfo = getPlayerData(player).streamInfo;
+ const streamInfo = getPlayerData(player).streamInfo;
// only used internally as a safeguard to avoid reporting other events to the server after playback stopped
streamInfo.ended = true;
@@ -2826,8 +2820,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
events.trigger(player, 'playbackstop', [state]);
events.trigger(self, 'playbackstop', [playbackStopInfo]);
- var nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions();
- var newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null;
+ const nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions();
+ const newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null;
if (newPlayer !== player) {
destroyPlayer(player);
@@ -2837,7 +2831,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
function enablePlaybackRetryWithTranscoding(streamInfo, errorType, currentlyPreventsVideoStreamCopy, currentlyPreventsAudioStreamCopy) {
// mediadecodeerror, medianotsupported, network, servererror
-
if (streamInfo.mediaSource.SupportsTranscoding && (!currentlyPreventsVideoStreamCopy || !currentlyPreventsAudioStreamCopy)) {
return true;
}
@@ -2846,46 +2839,44 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onPlaybackError(e, error) {
- var player = this;
+ const player = this;
error = error || {};
// network
// mediadecodeerror
// medianotsupported
- var errorType = error.type;
+ const errorType = error.type;
console.debug('playbackmanager playback error type: ' + (errorType || ''));
- var streamInfo = error.streamInfo || getPlayerData(player).streamInfo;
+ const streamInfo = error.streamInfo || getPlayerData(player).streamInfo;
if (streamInfo) {
- var currentlyPreventsVideoStreamCopy = streamInfo.url.toLowerCase().indexOf('allowvideostreamcopy=false') !== -1;
- var currentlyPreventsAudioStreamCopy = streamInfo.url.toLowerCase().indexOf('allowaudiostreamcopy=false') !== -1;
+ const currentlyPreventsVideoStreamCopy = streamInfo.url.toLowerCase().indexOf('allowvideostreamcopy=false') !== -1;
+ const currentlyPreventsAudioStreamCopy = streamInfo.url.toLowerCase().indexOf('allowaudiostreamcopy=false') !== -1;
// Auto switch to transcoding
if (enablePlaybackRetryWithTranscoding(streamInfo, errorType, currentlyPreventsVideoStreamCopy, currentlyPreventsAudioStreamCopy)) {
- var startTime = getCurrentTicks(player) || streamInfo.playerStartPositionTicks;
+ const startTime = getCurrentTicks(player) || streamInfo.playerStartPositionTicks;
changeStream(player, startTime, {
-
// force transcoding
EnableDirectPlay: false,
EnableDirectStream: false,
AllowVideoStreamCopy: false,
AllowAudioStreamCopy: currentlyPreventsAudioStreamCopy || currentlyPreventsVideoStreamCopy ? false : null
-
});
return;
}
}
- var displayErrorCode = 'NoCompatibleStream';
+ const displayErrorCode = 'NoCompatibleStream';
onPlaybackStopped.call(player, e, displayErrorCode);
}
function onPlaybackStopped(e, displayErrorCode) {
- var player = this;
+ const player = this;
if (getPlayerData(player).isChangingStream) {
return;
@@ -2894,15 +2885,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
stopPlaybackProgressTimer(player);
// User clicked stop or content ended
- var state = self.getPlayerState(player);
- var data = getPlayerData(player);
- var streamInfo = data.streamInfo;
+ const state = self.getPlayerState(player);
+ const data = getPlayerData(player);
+ const streamInfo = data.streamInfo;
- var nextItem = self._playNextAfterEnded ? self._playQueueManager.getNextItemInfo() : null;
+ const nextItem = self._playNextAfterEnded ? self._playQueueManager.getNextItemInfo() : null;
- var nextMediaType = (nextItem ? nextItem.item.MediaType : null);
+ const nextMediaType = (nextItem ? nextItem.item.MediaType : null);
- var playbackStopInfo = {
+ const playbackStopInfo = {
player: player,
state: state,
nextItem: (nextItem ? nextItem.item : null),
@@ -2931,8 +2922,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
events.trigger(player, 'playbackstop', [state]);
events.trigger(self, 'playbackstop', [playbackStopInfo]);
- var nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions();
- var newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null;
+ const nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions();
+ const newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null;
if (newPlayer !== player) {
destroyPlayer(player);
@@ -2950,12 +2941,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onPlaybackChanging(activePlayer, newPlayer, newItem) {
- var state = self.getPlayerState(activePlayer);
+ const state = self.getPlayerState(activePlayer);
- var serverId = self.currentItem(activePlayer).ServerId;
+ const serverId = self.currentItem(activePlayer).ServerId;
// User started playing something new while existing content is playing
- var promise;
+ let promise;
stopPlaybackProgressTimer(activePlayer);
unbindStopped(activePlayer);
@@ -2992,47 +2983,47 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onPlaybackTimeUpdate(e) {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'timeupdate');
}
function onPlaybackPause(e) {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'pause');
}
function onPlaybackUnpause(e) {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'unpause');
}
function onPlaybackVolumeChange(e) {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'volumechange');
}
function onRepeatModeChange(e) {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'repeatmodechange');
}
function onShuffleQueueModeChange() {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'shufflequeuemodechange');
}
function onPlaylistItemMove(e) {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'playlistitemmove', true);
}
function onPlaylistItemRemove(e) {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'playlistitemremove', true);
}
function onPlaylistItemAdd(e) {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'playlistitemadd', true);
}
@@ -3109,12 +3100,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
throw new Error('player cannot be null');
}
- var state = self.getPlayerState(player);
+ const state = self.getPlayerState(player);
if (state.NowPlayingItem) {
- var serverId = state.NowPlayingItem.ServerId;
+ const serverId = state.NowPlayingItem.ServerId;
- var streamInfo = getPlayerData(player).streamInfo;
+ const streamInfo = getPlayerData(player).streamInfo;
if (streamInfo && streamInfo.started && !streamInfo.ended) {
reportPlayback(self, state, player, reportPlaylist, serverId, 'reportPlaybackProgress', progressEventName);
@@ -3133,7 +3124,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
streamInfo.lastMediaInfoQuery = new Date().getTime();
- var apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = connectionManager.getApiClient(serverId);
if (!apiClient.isMinServerVersion('3.2.70.7')) {
return;
@@ -3143,12 +3134,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
mediaSource.MediaStreams = info.MediaStreams;
events.trigger(player, 'mediastreamschange');
}, function () {
-
});
}
self.onAppClose = function () {
- var player = this._currentPlayer;
+ const player = this._currentPlayer;
// Try to report playback stopped before the app closes
if (player && this.isPlaying(player)) {
@@ -3157,89 +3147,80 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
};
- self.playbackStartTime = function (player) {
- player = player || this._currentPlayer;
+ self.playbackStartTime = function (player = this._currentPlayer) {
if (player && !enableLocalPlaylistManagement(player) && !player.isLocalPlayer) {
return player.playbackStartTime();
}
- var streamInfo = getPlayerData(player).streamInfo;
+ const streamInfo = getPlayerData(player).streamInfo;
return streamInfo ? streamInfo.playbackStartTimeTicks : null;
};
if (apphost.supports('remotecontrol')) {
- require(['serverNotifications'], function (serverNotifications) {
+ import('serverNotifications').then(({ default: serverNotifications }) => {
events.on(serverNotifications, 'ServerShuttingDown', self.setDefaultPlayerActive.bind(self));
events.on(serverNotifications, 'ServerRestarting', self.setDefaultPlayerActive.bind(self));
});
}
}
- PlaybackManager.prototype.getCurrentPlayer = function () {
+ getCurrentPlayer() {
return this._currentPlayer;
- };
+ }
- PlaybackManager.prototype.currentTime = function (player) {
- player = player || this._currentPlayer;
+ currentTime(player = this._currentPlayer) {
if (player && !enableLocalPlaylistManagement(player) && !player.isLocalPlayer) {
return player.currentTime();
}
return this.getCurrentTicks(player);
- };
-
- PlaybackManager.prototype.nextItem = function (player) {
- player = player || this._currentPlayer;
+ }
+ nextItem(player = this._currentPlayer) {
if (player && !enableLocalPlaylistManagement(player)) {
return player.nextItem();
}
- var nextItem = this._playQueueManager.getNextItemInfo();
+ const nextItem = this._playQueueManager.getNextItemInfo();
if (!nextItem || !nextItem.item) {
return Promise.reject();
}
- var apiClient = connectionManager.getApiClient(nextItem.item.ServerId);
+ const apiClient = connectionManager.getApiClient(nextItem.item.ServerId);
return apiClient.getItem(apiClient.getCurrentUserId(), nextItem.item.Id);
- };
+ }
- PlaybackManager.prototype.canQueue = function (item) {
+ canQueue(item) {
if (item.Type === 'MusicAlbum' || item.Type === 'MusicArtist' || item.Type === 'MusicGenre') {
return this.canQueueMediaType('Audio');
}
return this.canQueueMediaType(item.MediaType);
- };
+ }
- PlaybackManager.prototype.canQueueMediaType = function (mediaType) {
+ canQueueMediaType(mediaType) {
if (this._currentPlayer) {
return this._currentPlayer.canPlayMediaType(mediaType);
}
return false;
- };
-
- PlaybackManager.prototype.isMuted = function (player) {
- player = player || this._currentPlayer;
+ }
+ isMuted(player = this._currentPlayer) {
if (player) {
return player.isMuted();
}
return false;
- };
-
- PlaybackManager.prototype.setMute = function (mute, player) {
- player = player || this._currentPlayer;
+ }
+ setMute(mute, player = this._currentPlayer) {
if (player) {
player.setMute(mute);
}
- };
+ }
- PlaybackManager.prototype.toggleMute = function (mute, player) {
- player = player || this._currentPlayer;
+ toggleMute(mute, player = this._currentPlayer) {
if (player) {
if (player.toggleMute) {
player.toggleMute();
@@ -3247,29 +3228,28 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
player.setMute(!player.isMuted());
}
}
- };
+ }
- PlaybackManager.prototype.toggleDisplayMirroring = function () {
+ toggleDisplayMirroring() {
this.enableDisplayMirroring(!this.enableDisplayMirroring());
- };
+ }
- PlaybackManager.prototype.enableDisplayMirroring = function (enabled) {
+ enableDisplayMirroring(enabled) {
if (enabled != null) {
- var val = enabled ? '1' : '0';
+ const val = enabled ? '1' : '0';
appSettings.set('displaymirror', val);
return;
}
return (appSettings.get('displaymirror') || '') !== '0';
- };
+ }
- PlaybackManager.prototype.nextChapter = function (player) {
- player = player || this._currentPlayer;
- var item = this.currentItem(player);
+ nextChapter(player = this._currentPlayer) {
+ const item = this.currentItem(player);
- var ticks = this.getCurrentTicks(player);
+ const ticks = this.getCurrentTicks(player);
- var nextChapter = (item.Chapters || []).filter(function (i) {
+ const nextChapter = (item.Chapters || []).filter(function (i) {
return i.StartPositionTicks > ticks;
})[0];
@@ -3278,13 +3258,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
} else {
this.nextTrack(player);
}
- };
+ }
- PlaybackManager.prototype.previousChapter = function (player) {
- player = player || this._currentPlayer;
- var item = this.currentItem(player);
+ previousChapter(player = this._currentPlayer) {
+ const item = this.currentItem(player);
- var ticks = this.getCurrentTicks(player);
+ let ticks = this.getCurrentTicks(player);
// Go back 10 seconds
ticks -= 100000000;
@@ -3294,7 +3273,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
ticks = Math.max(ticks, 0);
}
- var previousChapters = (item.Chapters || []).filter(function (i) {
+ const previousChapters = (item.Chapters || []).filter(function (i) {
return i.StartPositionTicks <= ticks;
});
@@ -3303,63 +3282,55 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
} else {
this.previousTrack(player);
}
- };
-
- PlaybackManager.prototype.fastForward = function (player) {
- player = player || this._currentPlayer;
+ }
+ fastForward(player = this._currentPlayer) {
if (player.fastForward != null) {
player.fastForward(userSettings.skipForwardLength());
return;
}
// Go back 15 seconds
- var offsetTicks = userSettings.skipForwardLength() * 10000;
+ const offsetTicks = userSettings.skipForwardLength() * 10000;
this.seekRelative(offsetTicks, player);
- };
-
- PlaybackManager.prototype.rewind = function (player) {
- player = player || this._currentPlayer;
+ }
+ rewind(player = this._currentPlayer) {
if (player.rewind != null) {
player.rewind(userSettings.skipBackLength());
return;
}
// Go back 15 seconds
- var offsetTicks = 0 - (userSettings.skipBackLength() * 10000);
+ const offsetTicks = 0 - (userSettings.skipBackLength() * 10000);
this.seekRelative(offsetTicks, player);
- };
+ }
- PlaybackManager.prototype.seekPercent = function (percent, player) {
- player = player || this._currentPlayer;
-
- var ticks = this.duration(player) || 0;
+ seekPercent(percent, player = this._currentPlayer) {
+ let ticks = this.duration(player) || 0;
percent /= 100;
ticks *= percent;
this.seek(parseInt(ticks), player);
- };
+ }
- PlaybackManager.prototype.seekMs = function (ms, player) {
- player = player || this._currentPlayer;
-
- var ticks = ms * 10000;
+ seekMs(ms, player = this._currentPlayer) {
+ const ticks = ms * 10000;
this.seek(ticks, player);
- };
+ }
- PlaybackManager.prototype.playTrailers = function (item) {
- var player = this._currentPlayer;
+ playTrailers(item) {
+ const player = this._currentPlayer;
if (player && player.playTrailers) {
return player.playTrailers(item);
}
- var apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = connectionManager.getApiClient(item.ServerId);
- var instance = this;
+ const instance = this;
if (item.LocalTrailerCount) {
return apiClient.getLocalTrailers(apiClient.getCurrentUserId(), item.Id).then(function (result) {
@@ -3368,7 +3339,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
});
});
} else {
- var remoteTrailers = item.RemoteTrailers || [];
+ const remoteTrailers = item.RemoteTrailers || [];
if (!remoteTrailers.length) {
return Promise.reject();
@@ -3386,17 +3357,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
})
});
}
- };
+ }
- PlaybackManager.prototype.getSubtitleUrl = function (textStream, serverId) {
- var apiClient = connectionManager.getApiClient(serverId);
+ getSubtitleUrl(textStream, serverId) {
+ const apiClient = connectionManager.getApiClient(serverId);
return !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl;
- };
+ }
- PlaybackManager.prototype.stop = function (player) {
+ stop(player) {
player = player || this._currentPlayer;
-
if (player) {
if (enableLocalPlaylistManagement(player)) {
this._playNextAfterEnded = false;
@@ -3407,11 +3377,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
return Promise.resolve();
- };
-
- PlaybackManager.prototype.getBufferedRanges = function (player) {
- player = player || this._currentPlayer;
+ }
+ getBufferedRanges(player = this._currentPlayer) {
if (player) {
if (player.getBufferedRanges) {
return player.getBufferedRanges();
@@ -3419,11 +3387,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
return [];
- };
-
- PlaybackManager.prototype.playPause = function (player) {
- player = player || this._currentPlayer;
+ }
+ playPause(player = this._currentPlayer) {
if (player) {
if (player.playPause) {
return player.playPause();
@@ -3435,115 +3401,105 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return this.pause(player);
}
}
- };
-
- PlaybackManager.prototype.paused = function (player) {
- player = player || this._currentPlayer;
+ }
+ paused(player = this._currentPlayer) {
if (player) {
return player.paused();
}
- };
-
- PlaybackManager.prototype.pause = function (player) {
- player = player || this._currentPlayer;
+ }
+ pause(player = this._currentPlayer) {
if (player) {
player.pause();
}
- };
-
- PlaybackManager.prototype.unpause = function (player) {
- player = player || this._currentPlayer;
+ }
+ unpause(player = this._currentPlayer) {
if (player) {
player.unpause();
}
- };
+ }
- PlaybackManager.prototype.setPlaybackRate = function (value, player = this._currentPlayer) {
+ setPlaybackRate(value, player = this._currentPlayer) {
if (player && player.setPlaybackRate) {
player.setPlaybackRate(value);
}
- };
+ }
- PlaybackManager.prototype.getPlaybackRate = function (player = this._currentPlayer) {
+ getPlaybackRate(player = this._currentPlayer) {
if (player && player.getPlaybackRate) {
return player.getPlaybackRate();
}
return null;
- };
+ }
- PlaybackManager.prototype.instantMix = function (item, player) {
- player = player || this._currentPlayer;
+ instantMix(item, player = this._currentPlayer) {
if (player && player.instantMix) {
return player.instantMix(item);
}
- var apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = connectionManager.getApiClient(item.ServerId);
- var options = {};
+ const options = {};
options.UserId = apiClient.getCurrentUserId();
options.Limit = 200;
- var instance = this;
+ const instance = this;
apiClient.getInstantMixFromItem(item.Id, options).then(function (result) {
instance.play({
items: result.Items
});
});
- };
+ }
- PlaybackManager.prototype.shuffle = function (shuffleItem, player) {
- player = player || this._currentPlayer;
+ shuffle(shuffleItem, player = this._currentPlayer) {
if (player && player.shuffle) {
return player.shuffle(shuffleItem);
}
return this.play({ items: [shuffleItem], shuffle: true });
- };
+ }
- PlaybackManager.prototype.audioTracks = function (player) {
- player = player || this._currentPlayer;
+ audioTracks(player = this._currentPlayer) {
if (player.audioTracks) {
- var result = player.audioTracks();
+ const result = player.audioTracks();
if (result) {
return result;
}
}
- var mediaSource = this.currentMediaSource(player);
+ const mediaSource = this.currentMediaSource(player);
- var mediaStreams = (mediaSource || {}).MediaStreams || [];
+ const mediaStreams = (mediaSource || {}).MediaStreams || [];
return mediaStreams.filter(function (s) {
return s.Type === 'Audio';
});
- };
+ }
- PlaybackManager.prototype.subtitleTracks = function (player) {
- player = player || this._currentPlayer;
+ subtitleTracks(player = this._currentPlayer) {
if (player.subtitleTracks) {
- var result = player.subtitleTracks();
+ const result = player.subtitleTracks();
if (result) {
return result;
}
}
- var mediaSource = this.currentMediaSource(player);
+ const mediaSource = this.currentMediaSource(player);
- var mediaStreams = (mediaSource || {}).MediaStreams || [];
+ const mediaStreams = (mediaSource || {}).MediaStreams || [];
return mediaStreams.filter(function (s) {
return s.Type === 'Subtitle';
});
- };
+ }
- PlaybackManager.prototype.getSupportedCommands = function (player) {
+ getSupportedCommands(player) {
player = player || this._currentPlayer || { isLocalPlayer: true };
if (player.isLocalPlayer) {
- var list = [
+ const list = [
'GoHome',
'GoToSettings',
'VolumeUp',
@@ -3589,45 +3545,45 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return list;
}
- var info = this.getPlayerInfo();
+ const info = this.getPlayerInfo();
return info ? info.supportedCommands : [];
- };
+ }
- PlaybackManager.prototype.setRepeatMode = function (value, player = this._currentPlayer) {
+ setRepeatMode(value, player = this._currentPlayer) {
if (player && !enableLocalPlaylistManagement(player)) {
return player.setRepeatMode(value);
}
this._playQueueManager.setRepeatMode(value);
events.trigger(player, 'repeatmodechange');
- };
+ }
- PlaybackManager.prototype.getRepeatMode = function (player = this._currentPlayer) {
+ getRepeatMode(player = this._currentPlayer) {
if (player && !enableLocalPlaylistManagement(player)) {
return player.getRepeatMode();
}
return this._playQueueManager.getRepeatMode();
- };
+ }
- PlaybackManager.prototype.setQueueShuffleMode = function (value, player = this._currentPlayer) {
+ setQueueShuffleMode(value, player = this._currentPlayer) {
if (player && !enableLocalPlaylistManagement(player)) {
return player.setQueueShuffleMode(value);
}
this._playQueueManager.setShuffleMode(value);
events.trigger(player, 'shufflequeuemodechange');
- };
+ }
- PlaybackManager.prototype.getQueueShuffleMode = function (player = this._currentPlayer) {
+ getQueueShuffleMode(player = this._currentPlayer) {
if (player && !enableLocalPlaylistManagement(player)) {
return player.getQueueShuffleMode();
}
return this._playQueueManager.getShuffleMode();
- };
+ }
- PlaybackManager.prototype.toggleQueueShuffleMode = function (player = this._currentPlayer) {
+ toggleQueueShuffleMode(player = this._currentPlayer) {
let currentvalue;
if (player && !enableLocalPlaylistManagement(player)) {
currentvalue = player.getQueueShuffleMode();
@@ -3645,23 +3601,23 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
this._playQueueManager.toggleShuffleMode();
}
events.trigger(player, 'shufflequeuemodechange');
- };
+ }
- PlaybackManager.prototype.clearQueue = function (clearCurrentItem = false, player = this._currentPlayer) {
+ clearQueue(clearCurrentItem = false, player = this._currentPlayer) {
if (player && !enableLocalPlaylistManagement(player)) {
return player.clearQueue(clearCurrentItem);
}
this._playQueueManager.clearPlaylist(clearCurrentItem);
events.trigger(player, 'playlistitemremove');
- };
+ }
- PlaybackManager.prototype.trySetActiveDeviceName = function (name) {
+ trySetActiveDeviceName(name) {
name = normalizeName(name);
- var instance = this;
+ const instance = this;
instance.getTargets().then(function (result) {
- var target = result.filter(function (p) {
+ const target = result.filter(function (p) {
return normalizeName(p.name) === name;
})[0];
@@ -3669,50 +3625,49 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
instance.trySetActivePlayer(target.playerName, target);
}
});
- };
+ }
- PlaybackManager.prototype.displayContent = function (options, player) {
- player = player || this._currentPlayer;
+ displayContent(options, player = this._currentPlayer) {
if (player && player.displayContent) {
player.displayContent(options);
}
- };
+ }
- PlaybackManager.prototype.beginPlayerUpdates = function (player) {
+ beginPlayerUpdates(player) {
if (player.beginPlayerUpdates) {
player.beginPlayerUpdates();
}
- };
+ }
- PlaybackManager.prototype.endPlayerUpdates = function (player) {
+ endPlayerUpdates(player) {
if (player.endPlayerUpdates) {
player.endPlayerUpdates();
}
- };
+ }
- PlaybackManager.prototype.setDefaultPlayerActive = function () {
+ setDefaultPlayerActive() {
this.setActivePlayer('localplayer');
- };
+ }
- PlaybackManager.prototype.removeActivePlayer = function (name) {
- var playerInfo = this.getPlayerInfo();
+ removeActivePlayer(name) {
+ const playerInfo = this.getPlayerInfo();
if (playerInfo) {
if (playerInfo.name === name) {
this.setDefaultPlayerActive();
}
}
- };
+ }
- PlaybackManager.prototype.removeActiveTarget = function (id) {
- var playerInfo = this.getPlayerInfo();
+ removeActiveTarget(id) {
+ const playerInfo = this.getPlayerInfo();
if (playerInfo) {
if (playerInfo.id === id) {
this.setDefaultPlayerActive();
}
}
- };
+ }
- PlaybackManager.prototype.sendCommand = function (cmd, player) {
+ sendCommand(cmd, player) {
console.debug('MediaController received command: ' + cmd.Name);
switch (cmd.Name) {
case 'SetRepeatMode':
@@ -3763,7 +3718,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
break;
}
- };
+ }
+}
- return new PlaybackManager();
-});
+export default new PlaybackManager();
diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js
index f330e54156..ca5c475829 100644
--- a/src/components/recordingcreator/recordingcreator.js
+++ b/src/components/recordingcreator/recordingcreator.js
@@ -104,7 +104,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
var apiClient = connectionManager.getApiClient(serverId);
apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) {
- playbackManager.play({
+ playbackManager.default.play({
ids: [item.ChannelId],
serverId: serverId
});
diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js
index 3797cde370..2086129a9e 100644
--- a/src/components/recordingcreator/recordingeditor.js
+++ b/src/components/recordingcreator/recordingeditor.js
@@ -1,6 +1,8 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) {
'use strict';
+ loading = loading.default || loading;
+
var currentDialog;
var recordingDeleted = false;
var currentItemId;
diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js
index 2534eafe6a..e3739f1cfe 100644
--- a/src/components/recordingcreator/recordingfields.js
+++ b/src/components/recordingcreator/recordingfields.js
@@ -1,6 +1,8 @@
define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields', 'flexStyles'], function (globalize, connectionManager, serverNotifications, require, loading, appHost, dom, recordingHelper, events) {
'use strict';
+ loading = loading.default || loading;
+
function loadData(parent, program, apiClient) {
if (program.IsSeries) {
parent.querySelector('.recordSeriesContainer').classList.remove('hide');
diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js
index 4a0bdd9b01..5d72394282 100644
--- a/src/components/recordingcreator/recordinghelper.js
+++ b/src/components/recordingcreator/recordinghelper.js
@@ -1,6 +1,8 @@
define(['globalize', 'loading', 'connectionManager'], function (globalize, loading, connectionManager) {
'use strict';
+ loading = loading.default || loading;
+
function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) {
loading.show();
diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js
index ea20c7267d..b115e273e6 100644
--- a/src/components/recordingcreator/seriesrecordingeditor.js
+++ b/src/components/recordingcreator/seriesrecordingeditor.js
@@ -1,6 +1,8 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'datetime', 'scrollStyles', 'emby-button', 'emby-checkbox', 'emby-input', 'emby-select', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader, datetime) {
'use strict';
+ loading = loading.default || loading;
+
var currentDialog;
var recordingUpdated = false;
var recordingDeleted = false;
diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js
index 54e09def84..b5ac4c9a8b 100644
--- a/src/components/remotecontrol/remotecontrol.js
+++ b/src/components/remotecontrol/remotecontrol.js
@@ -1,5 +1,8 @@
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';
+
+ playbackManager = playbackManager.default || playbackManager;
+
var showMuteButton = true;
var showVolumeSlider = true;
@@ -119,9 +122,9 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
var nowPlayingServerId = (item.ServerId || serverId);
if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') {
var songName = item.Name;
- if (item.Album != null && item.Artists != null) {
- var artistsSeries = '';
- var albumName = item.Album;
+ var artistsSeries = '';
+ var albumName = '';
+ if (item.Artists != null) {
if (item.ArtistItems != null) {
for (const artist of item.ArtistItems) {
let artistName = artist.Name;
@@ -142,9 +145,12 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
}
}
}
- context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries;
- context.querySelector('.nowPlayingAlbum').innerHTML = '
${albumName}`;
}
+ 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) {
diff --git a/src/components/skinManager.js b/src/components/skinManager.js
deleted file mode 100644
index faa1a1f306..0000000000
--- a/src/components/skinManager.js
+++ /dev/null
@@ -1,184 +0,0 @@
-define(['apphost', 'userSettings', 'browser', 'events', 'backdrop', 'globalize', 'require', 'appSettings'], function (appHost, userSettings, browser, events, backdrop, globalize, require, appSettings) {
- 'use strict';
-
- var themeStyleElement;
- var currentThemeId;
-
- function unloadTheme() {
- var elem = themeStyleElement;
- if (elem) {
- elem.parentNode.removeChild(elem);
- themeStyleElement = null;
- currentThemeId = null;
- }
- }
-
- function loadUserSkin(options) {
- options = options || {};
- if (options.start) {
- Emby.Page.invokeShortcut(options.start);
- } else {
- Emby.Page.goHome();
- }
- }
-
- function getThemes() {
- return [{
- name: 'Apple TV',
- id: 'appletv'
- }, {
- name: 'Blue Radiance',
- id: 'blueradiance'
- }, {
- name: 'Dark',
- id: 'dark',
- isDefault: true,
- isDefaultServerDashboard: true
- }, {
- name: 'Light',
- id: 'light'
- }, {
- name: 'Purple Haze',
- id: 'purplehaze'
- }, {
- name: 'Windows Media Center',
- id: 'wmc'
- }];
- }
-
- var skinManager = {
- getThemes: getThemes,
- loadUserSkin: loadUserSkin
- };
-
- function getThemeStylesheetInfo(id, isDefaultProperty) {
- var themes = skinManager.getThemes();
- var defaultTheme;
- var selectedTheme;
-
- for (var i = 0, length = themes.length; i < length; i++) {
- var theme = themes[i];
- if (theme[isDefaultProperty]) {
- defaultTheme = theme;
- }
- if (id === theme.id) {
- selectedTheme = theme;
- }
- }
-
- selectedTheme = selectedTheme || defaultTheme;
- return {
- stylesheetPath: require.toUrl('themes/' + selectedTheme.id + '/theme.css'),
- themeId: selectedTheme.id
- };
- }
-
- var themeResources = {};
- var lastSound = 0;
- var currentSound;
-
- function loadThemeResources(id) {
- lastSound = 0;
- if (currentSound) {
- currentSound.stop();
- currentSound = null;
- }
-
- backdrop.clearBackdrop();
- }
-
- function onThemeLoaded() {
- document.documentElement.classList.remove('preload');
- try {
- var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue('background-color');
- if (color) {
- appHost.setThemeColor(color);
- }
- } catch (err) {
- console.error('error setting theme color: ' + err);
- }
- }
-
- skinManager.setTheme = function (id, context) {
- return new Promise(function (resolve, reject) {
- if (currentThemeId && currentThemeId === id) {
- resolve();
- return;
- }
-
- var isDefaultProperty = context === 'serverdashboard' ? 'isDefaultServerDashboard' : 'isDefault';
- var info = getThemeStylesheetInfo(id, isDefaultProperty);
- if (currentThemeId && currentThemeId === info.themeId) {
- resolve();
- return;
- }
-
- var linkUrl = info.stylesheetPath;
- unloadTheme();
-
- var link = document.createElement('link');
- link.setAttribute('rel', 'stylesheet');
- link.setAttribute('type', 'text/css');
- link.onload = function () {
- onThemeLoaded();
- resolve();
- };
-
- link.setAttribute('href', linkUrl);
- document.head.appendChild(link);
- themeStyleElement = link;
- currentThemeId = info.themeId;
- loadThemeResources(info.themeId);
-
- onViewBeforeShow({});
- });
- };
-
- function onViewBeforeShow(e) {
- if (e.detail && e.detail.type === 'video-osd') {
- // This removes the space that the scrollbar takes while playing a video
- document.body.classList.remove('force-scroll');
- return;
- }
-
- if (themeResources.backdrop) {
- backdrop.setBackdrop(themeResources.backdrop);
- }
-
- if (!browser.mobile && userSettings.enableThemeSongs()) {
- if (lastSound === 0) {
- if (themeResources.themeSong) {
- playSound(themeResources.themeSong);
- }
- } else if ((new Date().getTime() - lastSound) > 30000) {
- if (themeResources.effect) {
- playSound(themeResources.effect);
- }
- }
- }
- // This keeps the scrollbar always present in all pages, so we avoid clipping while switching between pages
- // that need the scrollbar and pages that don't.
- document.body.classList.add('force-scroll');
- }
-
- document.addEventListener('viewshow', onViewBeforeShow);
-
- function playSound(path, volume) {
- lastSound = new Date().getTime();
- require(['howler'], function (howler) {
- /* globals Howl */
- try {
- var sound = new Howl({
- src: [path],
- volume: volume || 0.1
- });
- sound.play();
- currentSound = sound;
- } catch (err) {
- console.error('error playing sound: ' + err);
- }
- });
- }
-
- return skinManager;
-});
diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js
index 56327312f6..60c458e234 100644
--- a/src/components/slideshow/slideshow.js
+++ b/src/components/slideshow/slideshow.js
@@ -5,6 +5,8 @@
define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'dom', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost, dom) {
'use strict';
+ browser = browser.default || browser;
+
/**
* Name of transition event.
*/
diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js
index 37f767524e..7df24b5da8 100644
--- a/src/components/subtitleeditor/subtitleeditor.js
+++ b/src/components/subtitleeditor/subtitleeditor.js
@@ -1,6 +1,8 @@
define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'css!./subtitleeditor', 'emby-button', 'flexStyles'], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) {
'use strict';
+ loading = loading.default || loading;
+
var currentItem;
var hasChanges;
diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js
index e825e8e0a2..203d88535f 100644
--- a/src/components/subtitlesync/subtitlesync.js
+++ b/src/components/subtitlesync/subtitlesync.js
@@ -1,6 +1,8 @@
define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, layoutManager, template, css) {
'use strict';
+ playbackManager = playbackManager.default || playbackManager;
+
var player;
var subtitleSyncSlider;
var subtitleSyncTextField;
diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js
index dd04f384aa..60f0986884 100644
--- a/src/components/themeMediaPlayer.js
+++ b/src/components/themeMediaPlayer.js
@@ -1,6 +1,8 @@
define(['playbackManager', 'userSettings', 'connectionManager'], function (playbackManager, userSettings, connectionManager) {
'use strict';
+ playbackManager = playbackManager.default || playbackManager;
+
var currentOwnerId;
var currentThemeIds = [];
diff --git a/src/components/toast/toast.js b/src/components/toast/toast.js
index d14abffce4..d971880672 100644
--- a/src/components/toast/toast.js
+++ b/src/components/toast/toast.js
@@ -1,36 +1,34 @@
-define(['css!./toast'], function () {
- 'use strict';
+import 'css!./toast';
- function remove(elem) {
- setTimeout(function () {
- elem.parentNode.removeChild(elem);
- }, 300);
+function remove(elem) {
+ setTimeout(function () {
+ elem.parentNode.removeChild(elem);
+ }, 300);
+}
+
+function animateRemove(elem) {
+ setTimeout(function () {
+ elem.classList.remove('toastVisible');
+ remove(elem);
+ }, 3300);
+}
+
+export default function (options) {
+ if (typeof options === 'string') {
+ options = {
+ text: options
+ };
}
- function animateRemove(elem) {
- setTimeout(function () {
- elem.classList.remove('toastVisible');
- remove(elem);
- }, 3300);
- }
+ const elem = document.createElement('div');
+ elem.classList.add('toast');
+ elem.innerHTML = options.text;
- return function (options) {
- if (typeof options === 'string') {
- options = {
- text: options
- };
- }
+ document.body.appendChild(elem);
- var elem = document.createElement('div');
- elem.classList.add('toast');
- elem.innerHTML = options.text;
+ setTimeout(function () {
+ elem.classList.add('toastVisible');
- document.body.appendChild(elem);
-
- setTimeout(function () {
- elem.classList.add('toastVisible');
-
- animateRemove(elem);
- }, 300);
- };
-});
+ animateRemove(elem);
+ }, 300);
+}
diff --git a/src/components/tunerPicker.js b/src/components/tunerPicker.js
index e7c92851a4..5bc9386053 100644
--- a/src/components/tunerPicker.js
+++ b/src/components/tunerPicker.js
@@ -1,6 +1,9 @@
define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize', 'loading', 'browser', 'focusManager', 'scrollHelper', 'material-icons', 'formDialogStyle', 'emby-button', 'emby-itemscontainer', 'cardStyle'], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser, focusManager, scrollHelper) {
'use strict';
+ browser = browser.default || browser;
+ loading = loading.default || loading;
+
var enableFocusTransform = !browser.slow && !browser.edge;
function getEditorHtml() {
diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js
index 6f89702012..a0c29f48b8 100644
--- a/src/components/tvproviders/schedulesdirect.js
+++ b/src/components/tvproviders/schedulesdirect.js
@@ -1,6 +1,8 @@
define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emby-input', 'emby-select', 'emby-button', 'flexStyles'], function ($, loading, globalize) {
'use strict';
+ loading = loading.default || loading;
+
return function (page, providerId, options) {
function reload() {
loading.show();
diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js
index 5c75a09cdd..2203bc1fea 100644
--- a/src/components/tvproviders/xmltv.js
+++ b/src/components/tvproviders/xmltv.js
@@ -1,6 +1,8 @@
define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) {
'use strict';
+ loading = loading.default || loading;
+
return function (page, providerId, options) {
function getListingProvider(config, id) {
if (config && id) {
diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js
index 1dbe71c632..e28bb03abe 100644
--- a/src/components/upnextdialog/upnextdialog.js
+++ b/src/components/upnextdialog/upnextdialog.js
@@ -1,7 +1,19 @@
-define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'layoutManager', 'focusManager', 'globalize', 'itemHelper', 'css!./upnextdialog', 'emby-button', 'flexStyles'], function (dom, playbackManager, connectionManager, events, mediaInfo, layoutManager, focusManager, globalize, itemHelper) {
- 'use strict';
+import dom from 'dom';
+import playbackManager from 'playbackManager';
+import connectionManager from 'connectionManager';
+import events from 'events';
+import mediaInfo from 'mediaInfo';
+import layoutManager from 'layoutManager';
+import focusManager from 'focusManager';
+import globalize from 'globalize';
+import itemHelper from 'itemHelper';
+import 'css!./upnextdialog';
+import 'emby-button';
+import 'flexStyles';
- var transitionEndEventName = dom.whichTransitionEvent();
+/* eslint-disable indent */
+
+ const transitionEndEventName = dom.whichTransitionEvent();
function seriesImageUrl(item, options) {
if (item.Type !== 'Episode') {
@@ -56,7 +68,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
function setPoster(osdPoster, item, secondaryItem) {
if (item) {
- var imgUrl = seriesImageUrl(item, { type: 'Primary' }) ||
+ let imgUrl = seriesImageUrl(item, { type: 'Primary' }) ||
seriesImageUrl(item, { type: 'Thumb' }) ||
imageUrl(item, { type: 'Primary' });
@@ -76,7 +88,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function getHtml() {
- var html = '';
+ let html = '';
html += '
';
html += '
';
@@ -112,17 +124,17 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function setNextVideoText() {
- var instance = this;
+ const instance = this;
- var elem = instance.options.parent;
+ const elem = instance.options.parent;
- var secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0);
+ const secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0);
console.debug('up next seconds remaining: ' + secondsRemaining);
- var timeText = '
' + globalize.translate('HeaderSecondsValue', secondsRemaining) + '';
+ const timeText = '
' + globalize.translate('HeaderSecondsValue', secondsRemaining) + '';
- var nextVideoText = instance.itemType === 'Episode' ?
+ const nextVideoText = instance.itemType === 'Episode' ?
globalize.translate('HeaderNextEpisodePlayingInValue', timeText) :
globalize.translate('HeaderNextVideoPlayingInValue', timeText);
@@ -130,9 +142,9 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function fillItem(item) {
- var instance = this;
+ const instance = this;
- var elem = instance.options.parent;
+ const elem = instance.options.parent;
setPoster(elem.querySelector('.upNextDialog-poster'), item);
@@ -141,7 +153,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
elem.querySelector('.upNextDialog-mediainfo').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(item, {
});
- var title = itemHelper.getDisplayName(item);
+ let title = itemHelper.getDisplayName(item);
if (item.SeriesName) {
title = item.SeriesName + ' - ' + title;
}
@@ -161,10 +173,10 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function onStartNowClick() {
- var options = this.options;
+ const options = this.options;
if (options) {
- var player = options.player;
+ const player = options.player;
this.hide();
@@ -186,7 +198,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function clearHideAnimationEventListeners(instance, elem) {
- var fn = instance._onHideAnimationComplete;
+ const fn = instance._onHideAnimationComplete;
if (fn) {
dom.removeEventListener(elem, transitionEndEventName, fn, {
@@ -196,8 +208,8 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function onHideAnimationComplete(e) {
- var instance = this;
- var elem = e.target;
+ const instance = this;
+ const elem = e.target;
elem.classList.add('hide');
@@ -206,14 +218,14 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function hideComingUpNext() {
- var instance = this;
+ const instance = this;
clearCountdownTextTimeout(this);
if (!instance.options) {
return;
}
- var elem = instance.options.parent;
+ const elem = instance.options.parent;
if (!elem) {
return;
@@ -230,7 +242,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
elem.classList.add('upNextDialog-hidden');
- var fn = onHideAnimationComplete.bind(instance);
+ const fn = onHideAnimationComplete.bind(instance);
instance._onHideAnimationComplete = fn;
dom.addEventListener(elem, transitionEndEventName, fn, {
@@ -239,12 +251,12 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function getTimeRemainingMs(instance) {
- var options = instance.options;
+ const options = instance.options;
if (options) {
- var runtimeTicks = playbackManager.duration(options.player);
+ const runtimeTicks = playbackManager.duration(options.player);
if (runtimeTicks) {
- var timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player);
+ const timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player);
return Math.round(timeRemainingTicks / 10000);
}
@@ -254,7 +266,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
function startComingUpNextHideTimer(instance) {
- var timeRemainingMs = getTimeRemainingMs(instance);
+ const timeRemainingMs = getTimeRemainingMs(instance);
if (timeRemainingMs <= 0) {
return;
@@ -266,14 +278,14 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
instance._countdownTextTimeout = setInterval(setNextVideoText.bind(instance), 400);
}
- function UpNextDialog(options) {
+class UpNextDialog {
+ constructor(options) {
this.options = options;
init(this, options);
}
-
- UpNextDialog.prototype.show = function () {
- var elem = this.options.parent;
+ show() {
+ const elem = this.options.parent;
clearHideAnimationEventListeners(this, elem);
@@ -291,18 +303,18 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
}
startComingUpNextHideTimer(this);
- };
-
- UpNextDialog.prototype.hide = function () {
+ }
+ hide() {
hideComingUpNext.call(this);
- };
-
- UpNextDialog.prototype.destroy = function () {
+ }
+ destroy() {
hideComingUpNext.call(this);
this.options = null;
this.itemType = null;
- };
+ }
+}
- return UpNextDialog;
-});
+export default UpNextDialog;
+
+/* eslint-enable indent */
diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js
index d1b0df6fbb..9d64130cdb 100644
--- a/src/components/viewContainer.js
+++ b/src/components/viewContainer.js
@@ -1,12 +1,12 @@
-define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewContainer'], function (browser, dom, layoutManager) {
- 'use strict';
+import 'css!components/viewManager/viewContainer';
+/* eslint-disable indent */
function setControllerClass(view, options) {
if (options.controllerFactory) {
return Promise.resolve();
}
- var controllerUrl = view.getAttribute('data-controller');
+ let controllerUrl = view.getAttribute('data-controller');
if (controllerUrl) {
if (controllerUrl.indexOf('__plugin/') === 0) {
@@ -14,7 +14,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
}
controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl);
- return getRequirePromise([controllerUrl]).then(function (ControllerFactory) {
+ return import(controllerUrl).then((ControllerFactory) => {
options.controllerFactory = ControllerFactory;
});
}
@@ -22,94 +22,85 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
return Promise.resolve();
}
- function getRequirePromise(deps) {
- return new Promise(function (resolve, reject) {
- require(deps, resolve);
- });
- }
-
- function loadView(options) {
+ export function loadView(options) {
if (!options.cancel) {
- var selected = selectedPageIndex;
- var previousAnimatable = selected === -1 ? null : allPages[selected];
- var pageIndex = selected + 1;
+ const selected = selectedPageIndex;
+ const previousAnimatable = selected === -1 ? null : allPages[selected];
+ let pageIndex = selected + 1;
if (pageIndex >= pageContainerCount) {
pageIndex = 0;
}
- var isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1;
- var newViewInfo = normalizeNewView(options, isPluginpage);
- var newView = newViewInfo.elem;
- var modulesToLoad = [];
+ const isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1;
+ const newViewInfo = normalizeNewView(options, isPluginpage);
+ const newView = newViewInfo.elem;
- return new Promise(function (resolve) {
- require(modulesToLoad, function () {
- var currentPage = allPages[pageIndex];
+ return new Promise((resolve) => {
+ const currentPage = allPages[pageIndex];
- if (currentPage) {
- triggerDestroy(currentPage);
- }
+ if (currentPage) {
+ triggerDestroy(currentPage);
+ }
- var view = newView;
+ let view = newView;
- if (typeof view == 'string') {
- view = document.createElement('div');
- view.innerHTML = newView;
- }
+ if (typeof view == 'string') {
+ view = document.createElement('div');
+ view.innerHTML = newView;
+ }
- view.classList.add('mainAnimatedPage');
+ view.classList.add('mainAnimatedPage');
- if (currentPage) {
- if (newViewInfo.hasScript && window.$) {
- view = $(view).appendTo(mainAnimatedPages)[0];
- mainAnimatedPages.removeChild(currentPage);
- } else {
- mainAnimatedPages.replaceChild(view, currentPage);
- }
+ if (currentPage) {
+ if (newViewInfo.hasScript && window.$) {
+ mainAnimatedPages.removeChild(currentPage);
+ view = $(view).appendTo(mainAnimatedPages)[0];
} else {
- if (newViewInfo.hasScript && window.$) {
- view = $(view).appendTo(mainAnimatedPages)[0];
- } else {
- mainAnimatedPages.appendChild(view);
- }
+ mainAnimatedPages.replaceChild(view, currentPage);
+ }
+ } else {
+ if (newViewInfo.hasScript && window.$) {
+ view = $(view).appendTo(mainAnimatedPages)[0];
+ } else {
+ mainAnimatedPages.appendChild(view);
+ }
+ }
+
+ if (options.type) {
+ view.setAttribute('data-type', options.type);
+ }
+
+ const properties = [];
+
+ if (options.fullscreen) {
+ properties.push('fullscreen');
+ }
+
+ if (properties.length) {
+ view.setAttribute('data-properties', properties.join(','));
+ }
+
+ allPages[pageIndex] = view;
+ setControllerClass(view, options).then(() => {
+ if (onBeforeChange) {
+ onBeforeChange(view, false, options);
}
- if (options.type) {
- view.setAttribute('data-type', options.type);
+ beforeAnimate(allPages, pageIndex, selected);
+ selectedPageIndex = pageIndex;
+ currentUrls[pageIndex] = options.url;
+
+ if (!options.cancel && previousAnimatable) {
+ afterAnimate(allPages, pageIndex);
}
- var properties = [];
-
- if (options.fullscreen) {
- properties.push('fullscreen');
+ if (window.$) {
+ $.mobile = $.mobile || {};
+ $.mobile.activePage = view;
}
- if (properties.length) {
- view.setAttribute('data-properties', properties.join(','));
- }
-
- allPages[pageIndex] = view;
- setControllerClass(view, options).then(function () {
- if (onBeforeChange) {
- onBeforeChange(view, false, options);
- }
-
- beforeAnimate(allPages, pageIndex, selected);
- selectedPageIndex = pageIndex;
- currentUrls[pageIndex] = options.url;
-
- if (!options.cancel && previousAnimatable) {
- afterAnimate(allPages, pageIndex);
- }
-
- if (window.$) {
- $.mobile = $.mobile || {};
- $.mobile.activePage = view;
- }
-
- resolve(view);
- });
+ resolve(view);
});
});
}
@@ -125,28 +116,28 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
html = replaceAll(html, '<\/script>--\x3e', '<\/script>');
}
- var wrapper = document.createElement('div');
+ const wrapper = document.createElement('div');
wrapper.innerHTML = html;
return wrapper.querySelector('div[data-role="page"]');
}
function normalizeNewView(options, isPluginpage) {
- var viewHtml = options.view;
+ const viewHtml = options.view;
if (viewHtml.indexOf('data-role="page"') === -1) {
return viewHtml;
}
- var hasScript = viewHtml.indexOf('