diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js
index 358bf04112..7a94b07454 100644
--- a/src/components/favoriteitems.js
+++ b/src/components/favoriteitems.js
@@ -1,5 +1,14 @@
-define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoader', 'globalize', 'layoutManager', 'scrollStyles', 'emby-itemscontainer'], function (loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) {
- 'use strict';
+import loading from 'loading';
+import cardBuilder from 'cardBuilder';
+import dom from 'dom';
+import appHost from 'apphost';
+import imageLoader from 'imageLoader';
+import globalize from 'globalize';
+import layoutManager from 'layoutManager';
+import 'scrollStyles';
+import 'emby-itemscontainer';
+
+/* eslint-disable indent */
function enableScrollX() {
return !layoutManager.desktop;
@@ -94,8 +103,8 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
}
function loadSection(elem, userId, topParentId, section, isSingleSection) {
- var screenWidth = dom.getWindowSize().innerWidth;
- var options = {
+ const screenWidth = dom.getWindowSize().innerWidth;
+ const options = {
SortBy: 'SortName',
SortOrder: 'Ascending',
Filters: 'IsFavorite',
@@ -118,9 +127,9 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
}
}
- var promise;
+ let promise;
- if ('MusicArtist' === section.types) {
+ if (section.types === 'MusicArtist') {
promise = ApiClient.getArtists(userId, options);
} else {
options.IncludeItemTypes = section.types;
@@ -128,7 +137,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
}
return promise.then(function (result) {
- var html = '';
+ let html = '';
if (result.Items.length) {
if (html += '
', !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,13 +163,13 @@ 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,
shape: section.shape,
centerText: section.centerText && !cardLayout,
- overlayText: false !== section.overlayText,
+ overlayText: section.overlayText !== false,
showTitle: section.showTitle,
showParentTitle: section.showParentTitle,
scalable: true,
@@ -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) {
@@ -192,30 +201,28 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
if (types) {
sections = sections.filter(function (s) {
- return -1 !== types.indexOf(s.id);
+ return types.indexOf(s.id) !== -1;
});
}
- 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, 1 === sections.length));
+ promises.push(loadSection(elem, userId, topParentId, section, sections.length === 1));
}
Promise.all(promises).then(function () {
@@ -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/groupedcards.js b/src/components/groupedcards.js
index 8ac3cc799c..3361db5f02 100644
--- a/src/components/groupedcards.js
+++ b/src/components/groupedcards.js
@@ -21,7 +21,7 @@ import connectionManager from 'connectionManager';
if (!actionableParent || actionableParent.classList.contains('cardContent')) {
apiClient.getJSON(apiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) {
- if (1 === items.length) {
+ if (items.length === 1) {
return void appRouter.showItem(items[0]);
}
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/imageOptionsEditor/imageOptionsEditor.js b/src/components/imageOptionsEditor/imageOptionsEditor.js
index 6660ecf74c..41fe9b4c94 100644
--- a/src/components/imageOptionsEditor/imageOptionsEditor.js
+++ b/src/components/imageOptionsEditor/imageOptionsEditor.js
@@ -16,7 +16,7 @@ import 'emby-input';
return {
Type: type,
MinWidth: 0,
- Limit: 'Primary' === type ? 1 : 0
+ Limit: type === 'Primary' ? 1 : 0
};
}
diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js
index 78c35bb15f..46e2dae999 100644
--- a/src/components/imageeditor/imageeditor.js
+++ b/src/components/imageeditor/imageeditor.js
@@ -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/itemHelper.js b/src/components/itemHelper.js
index 55e9e10062..7d1ac0e110 100644
--- a/src/components/itemHelper.js
+++ b/src/components/itemHelper.js
@@ -1,342 +1,350 @@
-define(['apphost', 'globalize'], function (appHost, globalize) {
- 'use strict';
+import appHost from 'apphost';
+import globalize from 'globalize';
- function getDisplayName(item, options = {}) {
- if (!item) {
- throw new Error('null item passed into getDisplayName');
+export function getDisplayName(item, options = {}) {
+ if (!item) {
+ throw new Error('null item passed into getDisplayName');
+ }
+
+ if (item.Type === 'Timer') {
+ item = item.ProgramInfo || item;
+ }
+
+ let name = ((item.Type === 'Program' || item.Type === 'Recording') && (item.IsSeries || item.EpisodeTitle) ? item.EpisodeTitle : item.Name) || '';
+
+ if (item.Type === 'TvChannel') {
+ if (item.ChannelNumber) {
+ return item.ChannelNumber + ' ' + name;
}
-
- if (item.Type === 'Timer') {
- item = item.ProgramInfo || item;
- }
-
- var name = ((item.Type === 'Program' || item.Type === 'Recording') && (item.IsSeries || item.EpisodeTitle) ? item.EpisodeTitle : item.Name) || '';
-
- if (item.Type === 'TvChannel') {
- if (item.ChannelNumber) {
- return item.ChannelNumber + ' ' + name;
- }
- return name;
- }
- if (item.Type === 'Episode' && item.ParentIndexNumber === 0) {
- name = globalize.translate('ValueSpecialEpisodeName', name);
- } else if ((item.Type === 'Episode' || item.Type === 'Program') && item.IndexNumber != null && item.ParentIndexNumber != null && options.includeIndexNumber !== false) {
- var displayIndexNumber = item.IndexNumber;
-
- var number = displayIndexNumber;
- var nameSeparator = ' - ';
-
- if (options.includeParentInfo !== false) {
- number = 'S' + item.ParentIndexNumber + ':E' + number;
- } else {
- nameSeparator = '. ';
- }
-
- if (item.IndexNumberEnd) {
- displayIndexNumber = item.IndexNumberEnd;
- number += '-' + displayIndexNumber;
- }
-
- if (number) {
- name = name ? (number + nameSeparator + name) : number;
- }
- }
-
return name;
}
+ if (item.Type === 'Episode' && item.ParentIndexNumber === 0) {
+ name = globalize.translate('ValueSpecialEpisodeName', name);
+ } else if ((item.Type === 'Episode' || item.Type === 'Program') && item.IndexNumber != null && item.ParentIndexNumber != null && options.includeIndexNumber !== false) {
+ let displayIndexNumber = item.IndexNumber;
- function supportsAddingToCollection(item) {
- var invalidTypes = ['Genre', 'MusicGenre', 'Studio', 'UserView', 'CollectionFolder', 'Audio', 'Program', 'Timer', 'SeriesTimer'];
+ let number = displayIndexNumber;
+ let nameSeparator = ' - ';
- if (item.Type === 'Recording') {
- if (item.Status !== 'Completed') {
- return false;
- }
+ if (options.includeParentInfo !== false) {
+ number = 'S' + item.ParentIndexNumber + ':E' + number;
+ } else {
+ nameSeparator = '. ';
}
- return !item.CollectionType && invalidTypes.indexOf(item.Type) === -1 && item.MediaType !== 'Photo' && !isLocalItem(item);
+ if (item.IndexNumberEnd) {
+ displayIndexNumber = item.IndexNumberEnd;
+ number += '-' + displayIndexNumber;
+ }
+
+ if (number) {
+ name = name ? (number + nameSeparator + name) : number;
+ }
}
- function supportsAddingToPlaylist(item) {
- if (item.Type === 'Program') {
- return false;
- }
- if (item.Type === 'TvChannel') {
- return false;
- }
- if (item.Type === 'Timer') {
- return false;
- }
- if (item.Type === 'SeriesTimer') {
- return false;
- }
- if (item.MediaType === 'Photo') {
- return false;
- }
+ return name;
+}
- if (item.Type === 'Recording') {
- if (item.Status !== 'Completed') {
- return false;
- }
- }
+export function supportsAddingToCollection(item) {
+ const invalidTypes = ['Genre', 'MusicGenre', 'Studio', 'UserView', 'CollectionFolder', 'Audio', 'Program', 'Timer', 'SeriesTimer'];
- if (isLocalItem(item)) {
+ if (item.Type === 'Recording') {
+ if (item.Status !== 'Completed') {
return false;
}
- if (item.CollectionType === 'livetv') {
- return false;
- }
-
- return item.MediaType || item.IsFolder || item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'MusicArtist';
}
- function canEdit(user, item) {
- var itemType = item.Type;
+ return !item.CollectionType && invalidTypes.indexOf(item.Type) === -1 && item.MediaType !== 'Photo' && !isLocalItem(item);
+}
- if (itemType === 'UserRootFolder' || itemType === 'UserView') {
- return false;
- }
-
- if (itemType === 'Program') {
- return false;
- }
-
- if (itemType === 'Timer') {
- return false;
- }
-
- if (itemType === 'SeriesTimer') {
- return false;
- }
-
- if (item.Type === 'Recording') {
- if (item.Status !== 'Completed') {
- return false;
- }
- }
-
- if (isLocalItem(item)) {
- return false;
- }
-
- return user.Policy.IsAdministrator;
+export function supportsAddingToPlaylist(item) {
+ if (item.Type === 'Program') {
+ return false;
+ }
+ if (item.Type === 'TvChannel') {
+ return false;
+ }
+ if (item.Type === 'Timer') {
+ return false;
+ }
+ if (item.Type === 'SeriesTimer') {
+ return false;
+ }
+ if (item.MediaType === 'Photo') {
+ return false;
}
- function isLocalItem(item) {
- if (item && item.Id && item.Id.indexOf('local') === 0) {
+ if (item.Type === 'Recording') {
+ if (item.Status !== 'Completed') {
+ return false;
+ }
+ }
+
+ if (isLocalItem(item)) {
+ return false;
+ }
+ if (item.CollectionType === 'livetv') {
+ return false;
+ }
+
+ return item.MediaType || item.IsFolder || item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'MusicArtist';
+}
+
+export function canEdit(user, item) {
+ const itemType = item.Type;
+
+ if (itemType === 'UserRootFolder' || itemType === 'UserView') {
+ return false;
+ }
+
+ if (itemType === 'Program') {
+ return false;
+ }
+
+ if (itemType === 'Timer') {
+ return false;
+ }
+
+ if (itemType === 'SeriesTimer') {
+ return false;
+ }
+
+ if (item.Type === 'Recording') {
+ if (item.Status !== 'Completed') {
+ return false;
+ }
+ }
+
+ if (isLocalItem(item)) {
+ return false;
+ }
+
+ return user.Policy.IsAdministrator;
+}
+
+export function isLocalItem(item) {
+ if (item && item.Id && item.Id.indexOf('local') === 0) {
+ return true;
+ }
+
+ return false;
+}
+
+export function canIdentify (user, item) {
+ const itemType = item.Type;
+
+ if (itemType === 'Movie' ||
+ itemType === 'Trailer' ||
+ itemType === 'Series' ||
+ itemType === 'BoxSet' ||
+ itemType === 'Person' ||
+ itemType === 'Book' ||
+ itemType === 'MusicAlbum' ||
+ itemType === 'MusicArtist' ||
+ itemType === 'MusicVideo') {
+ if (user.Policy.IsAdministrator) {
+ if (!isLocalItem(item)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+export function canEditImages (user, item) {
+ const itemType = item.Type;
+
+ if (item.MediaType === 'Photo') {
+ return false;
+ }
+
+ if (itemType === 'UserView') {
+ if (user.Policy.IsAdministrator) {
return true;
}
return false;
}
- return {
- getDisplayName: getDisplayName,
- supportsAddingToCollection: supportsAddingToCollection,
- supportsAddingToPlaylist: supportsAddingToPlaylist,
- isLocalItem: isLocalItem,
-
- canIdentify: function (user, item) {
- var itemType = item.Type;
-
- if (itemType === 'Movie' ||
- itemType === 'Trailer' ||
- itemType === 'Series' ||
- itemType === 'BoxSet' ||
- itemType === 'Person' ||
- itemType === 'Book' ||
- itemType === 'MusicAlbum' ||
- itemType === 'MusicArtist' ||
- itemType === 'MusicVideo') {
- if (user.Policy.IsAdministrator) {
- if (!isLocalItem(item)) {
- return true;
- }
- }
- }
-
+ if (item.Type === 'Recording') {
+ if (item.Status !== 'Completed') {
return false;
- },
+ }
+ }
- canEdit: canEdit,
+ return itemType !== 'Timer' && itemType !== 'SeriesTimer' && canEdit(user, item) && !isLocalItem(item);
+}
- canEditImages: function (user, item) {
- var itemType = item.Type;
+export function canSync (user, item) {
+ if (user && !user.Policy.EnableContentDownloading) {
+ return false;
+ }
- if (item.MediaType === 'Photo') {
- return false;
- }
+ if (isLocalItem(item)) {
+ return false;
+ }
- if (itemType === 'UserView') {
- if (user.Policy.IsAdministrator) {
- return true;
- }
-
- return false;
- }
-
- if (item.Type === 'Recording') {
- if (item.Status !== 'Completed') {
- return false;
- }
- }
-
- return itemType !== 'Timer' && itemType !== 'SeriesTimer' && canEdit(user, item) && !isLocalItem(item);
- },
-
- canSync: function (user, item) {
- if (user && !user.Policy.EnableContentDownloading) {
- return false;
- }
-
- if (isLocalItem(item)) {
- return false;
- }
-
- return item.SupportsSync;
- },
-
- canShare: function (item, user) {
- if (item.Type === 'Program') {
- return false;
- }
- if (item.Type === 'TvChannel') {
- return false;
- }
- if (item.Type === 'Timer') {
- return false;
- }
- if (item.Type === 'SeriesTimer') {
- return false;
- }
- if (item.Type === 'Recording') {
- if (item.Status !== 'Completed') {
- return false;
- }
- }
- if (isLocalItem(item)) {
- return false;
- }
- return user.Policy.EnablePublicSharing && appHost.supports('sharing');
- },
-
- enableDateAddedDisplay: function (item) {
- return !item.IsFolder && item.MediaType && item.Type !== 'Program' && item.Type !== 'TvChannel' && item.Type !== 'Trailer';
- },
-
- canMarkPlayed: function (item) {
- if (item.Type === 'Program') {
- return false;
- }
-
- if (item.MediaType === 'Video') {
- if (item.Type !== 'TvChannel') {
- return true;
- }
- } else if (item.MediaType === 'Audio') {
- if (item.Type === 'AudioPodcast') {
- return true;
- }
- if (item.Type === 'AudioBook') {
- return true;
- }
- }
-
- if (item.Type === 'Series' ||
- item.Type === 'Season' ||
- item.Type === 'BoxSet' ||
- item.MediaType === 'Book' ||
- item.MediaType === 'Recording') {
- return true;
- }
+ return item.SupportsSync;
+}
+export function canShare (item, user) {
+ if (item.Type === 'Program') {
+ return false;
+ }
+ if (item.Type === 'TvChannel') {
+ return false;
+ }
+ if (item.Type === 'Timer') {
+ return false;
+ }
+ if (item.Type === 'SeriesTimer') {
+ return false;
+ }
+ if (item.Type === 'Recording') {
+ if (item.Status !== 'Completed') {
return false;
- },
+ }
+ }
+ if (isLocalItem(item)) {
+ return false;
+ }
+ return user.Policy.EnablePublicSharing && appHost.supports('sharing');
+}
- canRate: function (item) {
- if (item.Type === 'Program'
- || item.Type === 'Timer'
- || item.Type === 'SeriesTimer'
- || item.Type === 'CollectionFolder'
- || item.Type === 'UserView'
- || item.Type === 'Channel'
- || !item.UserData) {
- return false;
- }
+export function enableDateAddedDisplay (item) {
+ return !item.IsFolder && item.MediaType && item.Type !== 'Program' && item.Type !== 'TvChannel' && item.Type !== 'Trailer';
+}
- return true;
- },
-
- canConvert: function (item, user) {
- if (!user.Policy.EnableMediaConversion) {
- return false;
- }
-
- if (isLocalItem(item)) {
- return false;
- }
-
- var mediaType = item.MediaType;
- if (mediaType === 'Book' || mediaType === 'Photo' || mediaType === 'Audio') {
- return false;
- }
-
- var collectionType = item.CollectionType;
- if (collectionType === 'livetv') {
- return false;
- }
-
- var type = item.Type;
- if (type === 'Channel' || type === 'Person' || type === 'Year' || type === 'Program' || type === 'Timer' || type === 'SeriesTimer') {
- return false;
- }
-
- if (item.LocationType === 'Virtual' && !item.IsFolder) {
- return false;
- }
-
- if (item.IsPlaceHolder) {
- return false;
- }
-
- return true;
- },
-
- canRefreshMetadata: function (item, user) {
- if (user.Policy.IsAdministrator) {
- var collectionType = item.CollectionType;
- if (collectionType === 'livetv') {
- return false;
- }
-
- if (item.Type !== 'Timer' && item.Type !== 'SeriesTimer' && item.Type !== 'Program' && item.Type !== 'TvChannel' && !(item.Type === 'Recording' && item.Status !== 'Completed')) {
- if (!isLocalItem(item)) {
- return true;
- }
- }
- }
-
- return false;
- },
-
- supportsMediaSourceSelection: function (item) {
- if (item.MediaType !== 'Video') {
- return false;
- }
- if (item.Type === 'TvChannel') {
- return false;
- }
- if (!item.MediaSources || (item.MediaSources.length === 1 && item.MediaSources[0].Type === 'Placeholder')) {
- return false;
- }
- if (item.EnableMediaSourceDisplay === false) {
- return false;
- }
- if (item.EnableMediaSourceDisplay == null && item.SourceType && item.SourceType !== 'Library') {
- return false;
- }
+export function canMarkPlayed (item) {
+ if (item.Type === 'Program') {
+ return false;
+ }
+ if (item.MediaType === 'Video') {
+ if (item.Type !== 'TvChannel') {
return true;
}
- };
-});
+ } else if (item.MediaType === 'Audio') {
+ if (item.Type === 'AudioPodcast') {
+ return true;
+ }
+ if (item.Type === 'AudioBook') {
+ return true;
+ }
+ }
+
+ if (item.Type === 'Series' ||
+ item.Type === 'Season' ||
+ item.Type === 'BoxSet' ||
+ item.MediaType === 'Book' ||
+ item.MediaType === 'Recording') {
+ return true;
+ }
+
+ return false;
+}
+
+export function canRate (item) {
+ if (item.Type === 'Program'
+ || item.Type === 'Timer'
+ || item.Type === 'SeriesTimer'
+ || item.Type === 'CollectionFolder'
+ || item.Type === 'UserView'
+ || item.Type === 'Channel'
+ || !item.UserData) {
+ return false;
+ }
+
+ return true;
+}
+
+export function canConvert (item, user) {
+ if (!user.Policy.EnableMediaConversion) {
+ return false;
+ }
+
+ if (isLocalItem(item)) {
+ return false;
+ }
+
+ const mediaType = item.MediaType;
+ if (mediaType === 'Book' || mediaType === 'Photo' || mediaType === 'Audio') {
+ return false;
+ }
+
+ const collectionType = item.CollectionType;
+ if (collectionType === 'livetv') {
+ return false;
+ }
+
+ const type = item.Type;
+ if (type === 'Channel' || type === 'Person' || type === 'Year' || type === 'Program' || type === 'Timer' || type === 'SeriesTimer') {
+ return false;
+ }
+
+ if (item.LocationType === 'Virtual' && !item.IsFolder) {
+ return false;
+ }
+
+ if (item.IsPlaceHolder) {
+ return false;
+ }
+
+ return true;
+}
+
+export function canRefreshMetadata (item, user) {
+ if (user.Policy.IsAdministrator) {
+ const collectionType = item.CollectionType;
+ if (collectionType === 'livetv') {
+ return false;
+ }
+
+ if (item.Type !== 'Timer' && item.Type !== 'SeriesTimer' && item.Type !== 'Program' && item.Type !== 'TvChannel' && !(item.Type === 'Recording' && item.Status !== 'Completed')) {
+ if (!isLocalItem(item)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+export function supportsMediaSourceSelection (item) {
+ if (item.MediaType !== 'Video') {
+ return false;
+ }
+ if (item.Type === 'TvChannel') {
+ return false;
+ }
+ if (!item.MediaSources || (item.MediaSources.length === 1 && item.MediaSources[0].Type === 'Placeholder')) {
+ return false;
+ }
+ if (item.EnableMediaSourceDisplay === false) {
+ return false;
+ }
+ if (item.EnableMediaSourceDisplay == null && item.SourceType && item.SourceType !== 'Library') {
+ return false;
+ }
+
+ return true;
+}
+
+export default {
+ getDisplayName: getDisplayName,
+ supportsAddingToCollection: supportsAddingToCollection,
+ supportsAddingToPlaylist: supportsAddingToPlaylist,
+ isLocalItem: isLocalItem,
+ canIdentify: canIdentify,
+ canEdit: canEdit,
+ canEditImages: canEditImages,
+ canSync: canSync,
+ canShare: canShare,
+ enableDateAddedDisplay: enableDateAddedDisplay,
+ canMarkPlayed: canMarkPlayed,
+ canRate: canRate,
+ canConvert: canConvert,
+ canRefreshMetadata: canRefreshMetadata,
+ supportsMediaSourceSelection: supportsMediaSourceSelection
+};
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/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js
index a6256de24c..ab193c264e 100644
--- a/src/components/libraryoptionseditor/libraryoptionseditor.js
+++ b/src/components/libraryoptionseditor/libraryoptionseditor.js
@@ -219,7 +219,7 @@ import 'emby-input';
html += '
';
html += '
' + globalize.translate('HeaderTypeImageFetchers', availableTypeOptions.Type) + '
';
const supportedImageTypes = availableTypeOptions.SupportedImageTypes || [];
- if (supportedImageTypes.length > 1 || 1 === supportedImageTypes.length && 'Primary' !== supportedImageTypes[0]) {
+ if (supportedImageTypes.length > 1 || supportedImageTypes.length === 1 && supportedImageTypes[0] !== 'Primary') {
html += '';
}
html += '';
@@ -362,7 +362,7 @@ import 'emby-input';
TypeOptions: []
};
currentAvailableOptions = null;
- const isNewLibrary = null === libraryOptions;
+ const isNewLibrary = libraryOptions === null;
isNewLibrary && parent.classList.add('newlibrary');
const response = await fetch('components/libraryoptionseditor/libraryoptionseditor.template.html');
const template = await response.text();
@@ -578,7 +578,7 @@ import 'emby-input';
parent.querySelector('#chkSkipIfAudioTrackPresent').checked = options.SkipSubtitlesIfAudioTrackMatches;
parent.querySelector('#chkRequirePerfectMatch').checked = options.RequirePerfectSubtitleMatch;
Array.prototype.forEach.call(parent.querySelectorAll('.chkMetadataSaver'), elem => {
- elem.checked = options.MetadataSavers ? options.MetadataSavers.includes(elem.getAttribute('data-pluginname')) : 'true' === elem.getAttribute('data-defaultenabled');
+ elem.checked = options.MetadataSavers ? options.MetadataSavers.includes(elem.getAttribute('data-pluginname')) : elem.getAttribute('data-defaultenabled') === 'true';
});
Array.prototype.forEach.call(parent.querySelectorAll('.chkSubtitleLanguage'), elem => {
elem.checked = !!options.SubtitleDownloadLanguages && options.SubtitleDownloadLanguages.includes(elem.getAttribute('data-lang'));
diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js
index 6b20159130..11e8e953ae 100644
--- a/src/components/listview/listview.js
+++ b/src/components/listview/listview.js
@@ -81,7 +81,7 @@ import 'emby-playstatebutton';
let itemId;
const options = {
- maxWidth: width * 2,
+ maxWidth: width,
type: 'Primary'
};
@@ -108,7 +108,7 @@ import 'emby-playstatebutton';
function getChannelImageUrl(item, width) {
const apiClient = connectionManager.getApiClient(item.ServerId);
const options = {
- maxWidth: width * 2,
+ maxWidth: width,
type: 'Primary'
};
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 1cee6984d9..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'));
});
});
});
@@ -98,8 +98,8 @@ import 'flexStyles';
if (listItem) {
const index = parseInt(listItem.getAttribute('data-index'));
const pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || [];
- const pathInfo = null == index ? {} : pathInfos[index] || {};
- const originalPath = pathInfo.Path || (null == index ? null : currentOptions.library.Locations[index]);
+ const pathInfo = index == null ? {} : pathInfos[index] || {};
+ const originalPath = pathInfo.Path || (index == null ? null : currentOptions.library.Locations[index]);
const btnRemovePath = dom.parentWithClass(e.target, 'btnRemovePath');
if (btnRemovePath) {
@@ -171,7 +171,7 @@ import 'flexStyles';
const picker = new directoryBrowser();
picker.show({
enableNetworkSharePath: true,
- pathReadOnly: null != originalPath,
+ pathReadOnly: originalPath != null,
path: originalPath,
networkSharePath: networkPath,
callback: function (path, networkSharePath) {
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 829cd38f2c..437127be18 100644
--- a/src/components/playback/playbackmanager.js
+++ b/src/components/playback/playbackmanager.js
@@ -1,722 +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';
-
- 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');
- });
- }
- }
-
- 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();
@@ -729,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;
};
@@ -742,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;
};
@@ -755,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;
};
@@ -768,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,
@@ -838,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();
@@ -856,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'),
@@ -874,17 +889,15 @@ 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]);
}
}
- targets = targets.sort(sortPlayerTargets);
-
- return targets;
+ return targets.sort(sortPlayerTargets);
});
});
};
@@ -894,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;
@@ -923,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);
@@ -931,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);
@@ -983,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;
}
@@ -1022,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;
@@ -1052,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;
@@ -1099,7 +1112,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
};
- var brightnessOsdLoaded;
+ let brightnessOsdLoaded;
self.setBrightness = function (val, player) {
player = player || self._currentPlayer;
@@ -1107,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);
}
@@ -1163,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]);
}
@@ -1178,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;
}
@@ -1207,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]);
}
@@ -1222,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;
}
@@ -1251,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;
@@ -1267,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') {
@@ -1322,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);
}
@@ -1333,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);
};
@@ -1352,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);
};
@@ -1368,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);
@@ -1399,6 +1406,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.isFullscreen();
}
+ if (!screenfull.isEnabled) {
+ // iOS Safari
+ return document.webkitIsFullScreen;
+ }
+
return screenfull.isFullscreen;
};
@@ -1410,6 +1422,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
if (screenfull.isEnabled) {
screenfull.toggle();
+ } else {
+ // iOS Safari
+ if (document.webkitIsFullScreen && document.webkitCancelFullscreen) {
+ document.webkitCancelFullscreen();
+ } else {
+ const elem = document.querySelector('video');
+ if (elem && elem.webkitEnterFullscreen) {
+ elem.webkitEnterFullscreen();
+ }
+ }
}
};
@@ -1452,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')) {
@@ -1499,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;
};
@@ -1533,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);
};
@@ -1570,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);
};
@@ -1580,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;
@@ -1592,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;
@@ -1609,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;
@@ -1659,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);
@@ -1678,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;
@@ -1687,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, {
@@ -1705,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, {
@@ -1738,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);
@@ -1761,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, {
@@ -1773,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) {
@@ -1797,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;
@@ -1854,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);
@@ -1872,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] = {};
@@ -1896,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: {}
};
@@ -1954,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;
@@ -1974,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;
}
@@ -1988,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();
@@ -1999,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) {
@@ -2018,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);
@@ -2078,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);
};
@@ -2088,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) {
@@ -2104,7 +2118,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onInterceptorRejection() {
- var player = self._currentPlayer;
+ const player = self._currentPlayer;
if (player) {
destroyPlayer(player);
@@ -2122,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);
@@ -2135,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;
@@ -2150,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);
@@ -2173,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
@@ -2190,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 () {
@@ -2205,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);
@@ -2221,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;
@@ -2249,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) {
@@ -2268,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) {
@@ -2287,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);
@@ -2325,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';
@@ -2354,7 +2368,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
playMethod = 'DirectPlay';
}
- var resultInfo = {
+ const resultInfo = {
url: mediaUrl,
mimeType: contentType,
transcodingOffsetTicks: transcodingOffsetTicks,
@@ -2371,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;
}
@@ -2380,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;
@@ -2439,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) {
@@ -2462,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;
@@ -2475,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);
@@ -2493,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);
@@ -2519,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;
@@ -2529,7 +2544,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
{
playlistItemId: moveResult.playlistItemId,
newIndex: moveResult.newIndex
- }]);
+ }
+ ]);
};
self.getCurrentPlaylistIndex = function (player) {
@@ -2566,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);
@@ -2585,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 () {
@@ -2627,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
@@ -2657,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 () {
@@ -2684,7 +2698,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function onPlayerProgressInterval() {
- var player = this;
+ const player = this;
sendProgressUpdate(player, 'timeupdate');
}
@@ -2708,7 +2722,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
setCurrentPlayerInternal(player);
- var playerData = getPlayerData(player);
+ const playerData = getPlayerData(player);
playerData.streamInfo = streamInfo;
@@ -2723,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');
@@ -2742,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');
@@ -2773,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),
@@ -2790,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;
@@ -2806,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);
@@ -2817,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;
}
@@ -2826,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;
@@ -2874,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),
@@ -2911,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);
@@ -2930,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);
@@ -2972,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);
}
@@ -3089,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);
@@ -3113,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;
@@ -3123,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)) {
@@ -3137,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();
@@ -3227,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];
@@ -3258,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;
@@ -3274,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;
});
@@ -3283,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) {
@@ -3348,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();
@@ -3366,17 +3357,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
})
});
}
- };
+ }
- PlaybackManager.prototype.getSubtitleUrl = function (textStream, serverId) {
- var apiClient = connectionManager.getApiClient(serverId);
- var textStreamUrl = !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl;
- return textStreamUrl;
- };
+ getSubtitleUrl(textStream, serverId) {
+ const apiClient = connectionManager.getApiClient(serverId);
- PlaybackManager.prototype.stop = function (player) {
+ return !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl;
+ }
+
+ stop(player) {
player = player || this._currentPlayer;
-
if (player) {
if (enableLocalPlaylistManagement(player)) {
this._playNextAfterEnded = false;
@@ -3387,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();
@@ -3399,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();
@@ -3415,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',
@@ -3569,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();
@@ -3625,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];
@@ -3649,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':
@@ -3743,7 +3718,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
break;
}
- };
+ }
+}
- return new PlaybackManager();
-});
+export default new PlaybackManager();
diff --git a/src/components/playback/playqueuemanager.js b/src/components/playback/playqueuemanager.js
index 696075b344..fbe1ceabfe 100644
--- a/src/components/playback/playqueuemanager.js
+++ b/src/components/playback/playqueuemanager.js
@@ -1,56 +1,56 @@
-define([], function () {
- 'use strict';
+/*eslint prefer-const: "error"*/
- var currentId = 0;
- function addUniquePlaylistItemId(item) {
- if (!item.PlaylistItemId) {
- item.PlaylistItemId = 'playlistItem' + currentId;
- currentId++;
+let currentId = 0;
+function addUniquePlaylistItemId(item) {
+ if (!item.PlaylistItemId) {
+ item.PlaylistItemId = 'playlistItem' + currentId;
+ currentId++;
+ }
+}
+
+function findPlaylistIndex(playlistItemId, list) {
+ for (let i = 0, length = list.length; i < length; i++) {
+ if (list[i].PlaylistItemId === playlistItemId) {
+ return i;
}
}
- function findPlaylistIndex(playlistItemId, list) {
- for (var i = 0, length = list.length; i < length; i++) {
- if (list[i].PlaylistItemId === playlistItemId) {
- return i;
- }
- }
+ return -1;
+}
- return -1;
- }
-
- function PlayQueueManager() {
+class PlayQueueManager {
+ constructor() {
this._sortedPlaylist = [];
this._playlist = [];
this._repeatMode = 'RepeatNone';
this._shuffleMode = 'Sorted';
}
- PlayQueueManager.prototype.getPlaylist = function () {
+ getPlaylist() {
return this._playlist.slice(0);
- };
+ }
- PlayQueueManager.prototype.setPlaylist = function (items) {
+ setPlaylist(items) {
items = items.slice(0);
- for (var i = 0, length = items.length; i < length; i++) {
+ for (let i = 0, length = items.length; i < length; i++) {
addUniquePlaylistItemId(items[i]);
}
this._currentPlaylistItemId = null;
this._playlist = items;
this._repeatMode = 'RepeatNone';
- };
+ }
- PlayQueueManager.prototype.queue = function (items) {
- for (var i = 0, length = items.length; i < length; i++) {
+ queue(items) {
+ for (let i = 0, length = items.length; i < length; i++) {
addUniquePlaylistItemId(items[i]);
this._playlist.push(items[i]);
}
- };
+ }
- PlayQueueManager.prototype.shufflePlaylist = function () {
+ shufflePlaylist() {
this._sortedPlaylist = [];
for (const item of this._playlist) {
this._sortedPlaylist.push(item);
@@ -65,42 +65,31 @@ define([], function () {
}
this._playlist.unshift(currentPlaylistItem);
this._shuffleMode = 'Shuffle';
- };
+ }
- PlayQueueManager.prototype.sortShuffledPlaylist = function () {
+ sortShuffledPlaylist() {
this._playlist = [];
- for (let item of this._sortedPlaylist) {
+ for (const item of this._sortedPlaylist) {
this._playlist.push(item);
}
this._sortedPlaylist = [];
this._shuffleMode = 'Sorted';
- };
+ }
- PlayQueueManager.prototype.clearPlaylist = function (clearCurrentItem = false) {
+ clearPlaylist(clearCurrentItem = false) {
const currentPlaylistItem = this._playlist.splice(this.getCurrentPlaylistIndex(), 1)[0];
this._playlist = [];
if (!clearCurrentItem) {
this._playlist.push(currentPlaylistItem);
}
- };
-
- function arrayInsertAt(destArray, pos, arrayToInsert) {
- var args = [];
- args.push(pos); // where to insert
- args.push(0); // nothing to remove
- args = args.concat(arrayToInsert); // add on array to insert
- destArray.splice.apply(destArray, args); // splice it in
}
- PlayQueueManager.prototype.queueNext = function (items) {
- var i;
- var length;
-
- for (i = 0, length = items.length; i < length; i++) {
+ queueNext(items) {
+ for (let i = 0, length = items.length; i < length; i++) {
addUniquePlaylistItemId(items[i]);
}
- var currentIndex = this.getCurrentPlaylistIndex();
+ let currentIndex = this.getCurrentPlaylistIndex();
if (currentIndex === -1) {
currentIndex = this._playlist.length;
@@ -109,43 +98,43 @@ define([], function () {
}
arrayInsertAt(this._playlist, currentIndex, items);
- };
+ }
- PlayQueueManager.prototype.getCurrentPlaylistIndex = function () {
+ getCurrentPlaylistIndex() {
return findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist);
- };
+ }
- PlayQueueManager.prototype.getCurrentItem = function () {
- var index = findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist);
+ getCurrentItem() {
+ const index = findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist);
return index === -1 ? null : this._playlist[index];
- };
+ }
- PlayQueueManager.prototype.getCurrentPlaylistItemId = function () {
+ getCurrentPlaylistItemId() {
return this._currentPlaylistItemId;
- };
+ }
- PlayQueueManager.prototype.setPlaylistState = function (playlistItemId, playlistIndex) {
+ setPlaylistState(playlistItemId, playlistIndex) {
this._currentPlaylistItemId = playlistItemId;
- };
+ }
- PlayQueueManager.prototype.setPlaylistIndex = function (playlistIndex) {
+ setPlaylistIndex(playlistIndex) {
if (playlistIndex < 0) {
this.setPlaylistState(null);
} else {
this.setPlaylistState(this._playlist[playlistIndex].PlaylistItemId);
}
- };
+ }
- PlayQueueManager.prototype.removeFromPlaylist = function (playlistItemIds) {
+ removeFromPlaylist(playlistItemIds) {
if (this._playlist.length <= playlistItemIds.length) {
return {
result: 'empty'
};
}
- var currentPlaylistItemId = this.getCurrentPlaylistItemId();
- var isCurrentIndex = playlistItemIds.indexOf(currentPlaylistItemId) !== -1;
+ const currentPlaylistItemId = this.getCurrentPlaylistItemId();
+ const isCurrentIndex = playlistItemIds.indexOf(currentPlaylistItemId) !== -1;
this._sortedPlaylist = this._sortedPlaylist.filter(function (item) {
return !playlistItemIds.includes(item.PlaylistItemId);
@@ -159,17 +148,13 @@ define([], function () {
result: 'removed',
isCurrentIndex: isCurrentIndex
};
- };
-
- function moveInArray(array, from, to) {
- array.splice(to, 0, array.splice(from, 1)[0]);
}
- PlayQueueManager.prototype.movePlaylistItem = function (playlistItemId, newIndex) {
- var playlist = this.getPlaylist();
+ movePlaylistItem(playlistItemId, newIndex) {
+ const playlist = this.getPlaylist();
- var oldIndex;
- for (var i = 0, length = playlist.length; i < length; i++) {
+ let oldIndex;
+ for (let i = 0, length = playlist.length; i < length; i++) {
if (playlist[i].PlaylistItemId === playlistItemId) {
oldIndex = i;
break;
@@ -195,30 +180,30 @@ define([], function () {
playlistItemId: playlistItemId,
newIndex: newIndex
};
- };
+ }
- PlayQueueManager.prototype.reset = function () {
+ reset() {
this._sortedPlaylist = [];
this._playlist = [];
this._currentPlaylistItemId = null;
this._repeatMode = 'RepeatNone';
this._shuffleMode = 'Sorted';
- };
+ }
- PlayQueueManager.prototype.setRepeatMode = function (value) {
+ setRepeatMode(value) {
const repeatModes = ['RepeatOne', 'RepeatAll', 'RepeatNone'];
if (repeatModes.includes(value)) {
this._repeatMode = value;
} else {
throw new TypeError('invalid value provided for setRepeatMode');
}
- };
+ }
- PlayQueueManager.prototype.getRepeatMode = function () {
+ getRepeatMode() {
return this._repeatMode;
- };
+ }
- PlayQueueManager.prototype.setShuffleMode = function (value) {
+ setShuffleMode(value) {
switch (value) {
case 'Shuffle':
this.shufflePlaylist();
@@ -229,9 +214,9 @@ define([], function () {
default:
throw new TypeError('invalid value provided to setShuffleMode');
}
- };
+ }
- PlayQueueManager.prototype.toggleShuffleMode = function () {
+ toggleShuffleMode() {
switch (this._shuffleMode) {
case 'Shuffle':
this.setShuffleMode('Sorted');
@@ -242,16 +227,16 @@ define([], function () {
default:
throw new TypeError('current value for shufflequeue is invalid');
}
- };
+ }
- PlayQueueManager.prototype.getShuffleMode = function () {
+ getShuffleMode() {
return this._shuffleMode;
- };
+ }
- PlayQueueManager.prototype.getNextItemInfo = function () {
- var newIndex;
- var playlist = this.getPlaylist();
- var playlistLength = playlist.length;
+ getNextItemInfo() {
+ let newIndex;
+ const playlist = this.getPlaylist();
+ const playlistLength = playlist.length;
switch (this.getRepeatMode()) {
case 'RepeatOne':
@@ -272,7 +257,7 @@ define([], function () {
return null;
}
- var item = playlist[newIndex];
+ const item = playlist[newIndex];
if (!item) {
return null;
@@ -282,7 +267,19 @@ define([], function () {
item: item,
index: newIndex
};
- };
+ }
+}
- return PlayQueueManager;
-});
+function arrayInsertAt(destArray, pos, arrayToInsert) {
+ let args = [];
+ args.push(pos); // where to insert
+ args.push(0); // nothing to remove
+ args = args.concat(arrayToInsert); // add on array to insert
+ destArray.splice.apply(destArray, args); // splice it in
+}
+
+function moveInArray(array, from, to) {
+ array.splice(to, 0, array.splice(from, 1)[0]);
+}
+
+export default PlayQueueManager;
diff --git a/src/components/playbackSettings/playbackSettings.template.html b/src/components/playbackSettings/playbackSettings.template.html
index 03af5d6faa..700215223d 100644
--- a/src/components/playbackSettings/playbackSettings.template.html
+++ b/src/components/playbackSettings/playbackSettings.template.html
@@ -85,7 +85,7 @@
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/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js
index 40e1183502..1ec0517448 100644
--- a/src/components/refreshdialog/refreshdialog.js
+++ b/src/components/refreshdialog/refreshdialog.js
@@ -1,94 +1,108 @@
-define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (dom, shell, dialogHelper, loading, layoutManager, connectionManager, appRouter, globalize) {
- 'use strict';
+import dom from 'dom';
+import dialogHelper from 'dialogHelper';
+import loading from 'loading';
+import layoutManager from 'layoutManager';
+import connectionManager from 'connectionManager';
+import globalize from 'globalize';
+import 'emby-input';
+import 'emby-checkbox';
+import 'paper-icon-button-light';
+import 'emby-select';
+import 'material-icons';
+import 'css!./../formdialog';
+import 'emby-button';
- function getEditorHtml() {
- var html = '';
+/*eslint prefer-const: "error"*/
- html += '
';
- html += '
';
- html += '
';
+ html += '
';
+ html += '
';
- function centerFocus(elem, horiz, on) {
- require(['scrollHelper'], function (scrollHelper) {
- var fn = on ? 'on' : 'off';
- scrollHelper.centerFocus[fn](elem, horiz);
+ return html;
+}
+
+function centerFocus(elem, horiz, on) {
+ import('scrollHelper').then(({default: scrollHelper}) => {
+ const fn = on ? 'on' : 'off';
+ scrollHelper.centerFocus[fn](elem, horiz);
+ });
+}
+
+function onSubmit(e) {
+ loading.show();
+
+ const instance = this;
+ const dlg = dom.parentWithClass(e.target, 'dialog');
+ const options = instance.options;
+
+ const apiClient = connectionManager.getApiClient(options.serverId);
+
+ const replaceAllMetadata = dlg.querySelector('#selectMetadataRefreshMode').value === 'all';
+
+ const mode = dlg.querySelector('#selectMetadataRefreshMode').value === 'scan' ? 'Default' : 'FullRefresh';
+ const replaceAllImages = mode === 'FullRefresh' && dlg.querySelector('.chkReplaceImages').checked;
+
+ options.itemIds.forEach(function (itemId) {
+ apiClient.refreshItem(itemId, {
+
+ Recursive: true,
+ ImageRefreshMode: mode,
+ MetadataRefreshMode: mode,
+ ReplaceAllImages: replaceAllImages,
+ ReplaceAllMetadata: replaceAllMetadata
});
- }
+ });
- function onSubmit(e) {
- loading.show();
+ dialogHelper.close(dlg);
- var instance = this;
- var dlg = dom.parentWithClass(e.target, 'dialog');
- var options = instance.options;
+ import('toast').then(({default: toast}) => {
+ toast(globalize.translate('RefreshQueued'));
+ });
- var apiClient = connectionManager.getApiClient(options.serverId);
+ loading.hide();
- var replaceAllMetadata = dlg.querySelector('#selectMetadataRefreshMode').value === 'all';
+ e.preventDefault();
+ return false;
+}
- var mode = dlg.querySelector('#selectMetadataRefreshMode').value === 'scan' ? 'Default' : 'FullRefresh';
- var replaceAllImages = mode === 'FullRefresh' && dlg.querySelector('.chkReplaceImages').checked;
-
- options.itemIds.forEach(function (itemId) {
- apiClient.refreshItem(itemId, {
-
- Recursive: true,
- ImageRefreshMode: mode,
- MetadataRefreshMode: mode,
- ReplaceAllImages: replaceAllImages,
- ReplaceAllMetadata: replaceAllMetadata
- });
- });
-
- dialogHelper.close(dlg);
-
- require(['toast'], function (toast) {
- toast(globalize.translate('RefreshQueued'));
- });
-
- loading.hide();
-
- e.preventDefault();
- return false;
- }
-
- function RefreshDialog(options) {
+class RefreshDialog {
+ constructor(options) {
this.options = options;
}
- RefreshDialog.prototype.show = function () {
- var dialogOptions = {
+ show() {
+ const dialogOptions = {
removeOnClose: true,
scrollY: false
};
@@ -99,12 +113,12 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionM
dialogOptions.size = 'small';
}
- var dlg = dialogHelper.createDialog(dialogOptions);
+ const dlg = dialogHelper.createDialog(dialogOptions);
dlg.classList.add('formDialog');
- var html = '';
- var title = globalize.translate('RefreshMetadata');
+ let html = '';
+ const title = globalize.translate('RefreshMetadata');
html += '