';
- const displayType = globalize.translate(`MediaInfoStreamType${stream.Type}`);
+ let translateString;
+ switch (stream.Type) {
+ case 'Audio':
+ case 'Data':
+ case 'Subtitle':
+ case 'Video':
+ translateString = stream.Type;
+ break;
+ case 'EmbeddedImage':
+ translateString = 'Image';
+ break;
+ }
+
+ const displayType = globalize.translate(translateString);
html += ``;
const attributes = [];
if (stream.DisplayTitle) {
@@ -137,7 +150,7 @@ import 'flexStyles';
}
function loadMediaInfo(itemId, serverId, template) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(item => {
const dialogOptions = {
size: 'small',
diff --git a/src/components/itemMediaInfo/itemMediaInfo.template.html b/src/components/itemMediaInfo/itemMediaInfo.template.html
index bc8ce59680..c2ec8942ef 100644
--- a/src/components/itemMediaInfo/itemMediaInfo.template.html
+++ b/src/components/itemMediaInfo/itemMediaInfo.template.html
@@ -2,7 +2,7 @@
-
+
diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js
index 5630680fbf..956cbb4f64 100644
--- a/src/components/itemidentifier/itemidentifier.js
+++ b/src/components/itemidentifier/itemidentifier.js
@@ -7,7 +7,6 @@
import dialogHelper from 'dialogHelper';
import loading from 'loading';
-import connectionManager from 'connectionManager';
import globalize from 'globalize';
import scrollHelper from 'scrollHelper';
import layoutManager from 'layoutManager';
@@ -31,7 +30,7 @@ import 'cardStyle';
let currentSearchResult;
function getApiClient() {
- return connectionManager.getApiClient(currentServerId);
+ return window.connectionManager.getApiClient(currentServerId);
}
function searchForIdentificationResults(page) {
diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.template.html b/src/components/libraryoptionseditor/libraryoptionseditor.template.html
index 92cebc9da4..3aa57f2432 100644
--- a/src/components/libraryoptionseditor/libraryoptionseditor.template.html
+++ b/src/components/libraryoptionseditor/libraryoptionseditor.template.html
@@ -88,7 +88,7 @@
diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js
index 11e8e953ae..7837003250 100644
--- a/src/components/listview/listview.js
+++ b/src/components/listview/listview.js
@@ -8,7 +8,6 @@
import itemHelper from 'itemHelper';
import mediaInfo from 'mediaInfo';
import indicators from 'indicators';
-import connectionManager from 'connectionManager';
import layoutManager from 'layoutManager';
import globalize from 'globalize';
import datetime from 'datetime';
@@ -77,7 +76,7 @@ import 'emby-playstatebutton';
}
function getImageUrl(item, width) {
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
let itemId;
const options = {
@@ -106,7 +105,7 @@ import 'emby-playstatebutton';
}
function getChannelImageUrl(item, width) {
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
const options = {
maxWidth: width,
type: 'Primary'
@@ -370,18 +369,8 @@ import 'emby-playstatebutton';
}
}
} else {
- let showArtist = options.artist === true;
- const artistItems = item.ArtistItems;
-
- if (!showArtist && options.artist !== false) {
- if (!artistItems || !artistItems.length) {
- showArtist = true;
- } else if (artistItems.length > 1 || !containerAlbumArtistIds.includes(artistItems[0].Id)) {
- showArtist = true;
- }
- }
-
- if (showArtist) {
+ if (options.artist) {
+ const artistItems = item.ArtistItems;
if (artistItems && item.Type !== 'MusicAlbum') {
textlines.push(artistItems.map(a => {
return a.Name;
diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js
index 82b3c66f53..e2ff2a6b56 100644
--- a/src/components/metadataEditor/metadataEditor.js
+++ b/src/components/metadataEditor/metadataEditor.js
@@ -4,7 +4,6 @@ import dialogHelper from 'dialogHelper';
import datetime from 'datetime';
import loading from 'loading';
import focusManager from 'focusManager';
-import connectionManager from 'connectionManager';
import globalize from 'globalize';
import shell from 'shell';
import 'emby-checkbox';
@@ -290,7 +289,7 @@ import 'flexStyles';
}
function getApiClient() {
- return connectionManager.getApiClient(currentItem.ServerId);
+ return window.connectionManager.getApiClient(currentItem.ServerId);
}
function bindAll(elems, eventName, fn) {
@@ -370,7 +369,7 @@ import 'flexStyles';
}
function getItem(itemId, serverId) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
if (itemId) {
return apiClient.getItem(apiClient.getCurrentUserId(), itemId);
@@ -380,7 +379,7 @@ import 'flexStyles';
}
function getEditorConfig(itemId, serverId) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
if (itemId) {
return apiClient.getJSON(apiClient.getUrl('Items/' + itemId + '/MetadataEditor'));
@@ -1068,7 +1067,7 @@ import 'flexStyles';
currentContext = dlg;
- init(dlg, connectionManager.getApiClient(serverId));
+ init(dlg, window.connectionManager.getApiClient(serverId));
reload(dlg, itemId, serverId);
});
@@ -1095,7 +1094,7 @@ import 'flexStyles';
currentContext = elem;
- init(elem, connectionManager.getApiClient(serverId));
+ init(elem, window.connectionManager.getApiClient(serverId));
reload(elem, itemId, serverId);
focusManager.autoFocus(elem);
diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js
index fdce40ab86..e7ce440f06 100644
--- a/src/components/multiSelect/multiSelect.js
+++ b/src/components/multiSelect/multiSelect.js
@@ -1,7 +1,6 @@
import browser from 'browser';
import appHost from 'apphost';
import loading from 'loading';
-import connectionManager from 'connectionManager';
import globalize from 'globalize';
import dom from 'dom';
import 'css!./multiSelect';
@@ -170,7 +169,7 @@ import 'css!./multiSelect';
}
function showMenuForSelectedItems(e) {
- const apiClient = connectionManager.currentApiClient();
+ const apiClient = window.connectionManager.currentApiClient();
apiClient.getCurrentUser().then(user => {
const menuItems = [];
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index 020d9953ef..cf3ae88345 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -248,7 +248,7 @@ events.on(serverNotifications, 'RestartRequired', function (e, apiClient) {
[
{
action: 'restart',
- title: globalize.translate('ButtonRestart'),
+ title: globalize.translate('Restart'),
icon: getIconUrl()
}
];
diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js
index 7aa8c623b3..d9521c4c9e 100644
--- a/src/components/nowPlayingBar/nowPlayingBar.js
+++ b/src/components/nowPlayingBar/nowPlayingBar.js
@@ -7,7 +7,6 @@ import playbackManager from 'playbackManager';
import nowPlayingHelper from 'nowPlayingHelper';
import appHost from 'apphost';
import dom from 'dom';
-import connectionManager from 'connectionManager';
import itemContextMenu from 'itemContextMenu';
import 'paper-icon-button-light';
import 'emby-ratingbutton';
@@ -452,7 +451,7 @@ import 'emby-ratingbutton';
if (item.SeriesPrimaryImageTag) {
options.tag = item.SeriesPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
}
@@ -460,12 +459,12 @@ import 'emby-ratingbutton';
if (item.SeriesThumbImageTag) {
options.tag = item.SeriesThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
if (item.ParentThumbImageTag) {
options.tag = item.ParentThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
}
}
@@ -482,12 +481,12 @@ import 'emby-ratingbutton';
if (item.ImageTags && item.ImageTags[options.type]) {
options.tag = item.ImageTags[options.type];
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
}
if (item.AlbumId && item.AlbumPrimaryImageTag) {
options.tag = item.AlbumPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
}
return null;
@@ -548,7 +547,7 @@ import 'emby-ratingbutton';
if (nowPlayingItem.Id) {
if (isRefreshing) {
- const apiClient = connectionManager.getApiClient(nowPlayingItem.ServerId);
+ const apiClient = window.connectionManager.getApiClient(nowPlayingItem.ServerId);
apiClient.getItem(apiClient.getCurrentUserId(), nowPlayingItem.Id).then(function (item) {
const userData = item.UserData || {};
const likes = userData.Likes == null ? '' : userData.Likes;
@@ -701,7 +700,7 @@ import 'emby-ratingbutton';
const player = this;
currentRuntimeTicks = playbackManager.duration(player);
- updateTimeDisplay(playbackManager.currentTime(player), currentRuntimeTicks, playbackManager.getBufferedRanges(player));
+ updateTimeDisplay(playbackManager.currentTime(player) * 10000, currentRuntimeTicks, playbackManager.getBufferedRanges(player));
}
function releaseCurrentPlayer() {
diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js
index 5c7ddf45dd..2478c52d6e 100644
--- a/src/components/playback/mediasession.js
+++ b/src/components/playback/mediasession.js
@@ -1,7 +1,6 @@
import playbackManager from 'playbackManager';
import nowPlayingHelper from 'nowPlayingHelper';
import events from 'events';
-import connectionManager from 'connectionManager';
/* eslint-disable indent */
// Reports media playback to the device for lock screen control
@@ -16,16 +15,16 @@ import connectionManager from 'connectionManager';
} else if (options.type === 'Primary' && item.SeriesPrimaryImageTag) {
options.tag = item.SeriesPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
} else if (options.type === 'Thumb') {
if (item.SeriesThumbImageTag) {
options.tag = item.SeriesThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
} else if (item.ParentThumbImageTag) {
options.tag = item.ParentThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
}
}
@@ -38,11 +37,11 @@ import connectionManager from 'connectionManager';
if (item.ImageTags && item.ImageTags[options.type]) {
options.tag = item.ImageTags[options.type];
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.Id, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.Id, options);
} else if (item.AlbumId && item.AlbumPrimaryImageTag) {
options.tag = item.AlbumPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
}
return null;
diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js
index 3b4099d540..82bce8075e 100644
--- a/src/components/playback/playbackmanager.js
+++ b/src/components/playback/playbackmanager.js
@@ -6,7 +6,6 @@ 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';
@@ -69,7 +68,7 @@ function reportPlayback(playbackManagerInstance, state, player, reportPlaylist,
addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId);
}
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
const reportPlaybackPromise = apiClient[method](info);
// Notify that report has been sent
reportPlaybackPromise.then(() => {
@@ -106,7 +105,7 @@ function normalizeName(t) {
}
function getItemsForPlayback(serverId, query) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
if (query.Ids && query.Ids.split(',').length === 1) {
const itemId = query.Ids.split(',');
@@ -640,22 +639,18 @@ function supportsDirectPlay(apiClient, item, mediaSource) {
function validatePlaybackInfoResult(instance, result) {
if (result.ErrorCode) {
- showPlaybackInfoErrorMessage(instance, result.ErrorCode);
+ showPlaybackInfoErrorMessage(instance, 'PlaybackError' + result.ErrorCode);
return false;
}
return true;
}
-function showPlaybackInfoErrorMessage(instance, errorCode, playNextTrack) {
+function showPlaybackInfoErrorMessage(instance, errorCode) {
import('alert').then(({ default: alert }) => {
alert({
- text: globalize.translate('PlaybackError' + errorCode),
+ text: globalize.translate(errorCode),
title: globalize.translate('HeaderPlaybackError')
- }).then(function () {
- if (playNextTrack) {
- instance.nextTrack();
- }
});
});
}
@@ -874,7 +869,7 @@ class PlaybackManager {
const promises = players.filter(displayPlayerIndividually).map(getPlayerTargets);
return Promise.all(promises).then(function (responses) {
- return connectionManager.currentApiClient().getCurrentUser().then(function (user) {
+ return window.connectionManager.currentApiClient().getCurrentUser().then(function (user) {
const targets = [];
targets.push({
@@ -1372,7 +1367,7 @@ class PlaybackManager {
function getSavedMaxStreamingBitrate(apiClient, mediaType) {
if (!apiClient) {
// This should hopefully never happen
- apiClient = connectionManager.currentApiClient();
+ apiClient = window.connectionManager.currentApiClient();
}
const endpointInfo = apiClient.getSavedEndpointInfo() || {};
@@ -1395,7 +1390,7 @@ class PlaybackManager {
const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
const currentItem = self.currentItem(player);
- const apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient();
+ const apiClient = currentItem ? window.connectionManager.getApiClient(currentItem.ServerId) : window.connectionManager.currentApiClient();
return getSavedMaxStreamingBitrate(apiClient, mediaType);
};
@@ -1409,7 +1404,7 @@ class PlaybackManager {
const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
const currentItem = self.currentItem(player);
- const apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient();
+ const apiClient = currentItem ? window.connectionManager.getApiClient(currentItem.ServerId) : window.connectionManager.currentApiClient();
const endpointInfo = apiClient.getSavedEndpointInfo() || {};
return appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType);
@@ -1421,7 +1416,7 @@ class PlaybackManager {
return player.setMaxStreamingBitrate(options);
}
- const apiClient = connectionManager.getApiClient(self.currentItem(player).ServerId);
+ const apiClient = window.connectionManager.getApiClient(self.currentItem(player).ServerId);
apiClient.getEndpointInfo().then(function (endpointInfo) {
const playerData = getPlayerData(player);
@@ -1618,11 +1613,7 @@ class PlaybackManager {
player = player || self._currentPlayer;
if (player && !enableLocalPlaylistManagement(player)) {
- if (player.isLocalPlayer) {
- return player.seek((ticks || 0) / 10000);
- } else {
- return player.seek(ticks);
- }
+ return player.seek(ticks);
}
changeStream(player, ticks);
@@ -1631,11 +1622,7 @@ class PlaybackManager {
self.seekRelative = function (offsetTicks, player) {
player = player || self._currentPlayer;
if (player && !enableLocalPlaylistManagement(player) && player.seekRelative) {
- if (player.isLocalPlayer) {
- return player.seekRelative((ticks || 0) / 10000);
- } else {
- return player.seekRelative(ticks);
- }
+ return player.seekRelative(ticks);
}
const ticks = getCurrentTicks(player) + offsetTicks;
@@ -1691,7 +1678,7 @@ class PlaybackManager {
const subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex;
let currentMediaSource = self.currentMediaSource(player);
- const apiClient = connectionManager.getApiClient(currentItem.ServerId);
+ const apiClient = window.connectionManager.getApiClient(currentItem.ServerId);
if (ticks) {
ticks = parseInt(ticks);
@@ -1710,7 +1697,7 @@ class PlaybackManager {
streamInfo.lastMediaInfoQuery = lastMediaInfoQuery;
if (!streamInfo.url) {
- showPlaybackInfoErrorMessage(self, 'NoCompatibleStream', true);
+ showPlaybackInfoErrorMessage(self, 'PlaybackErrorNoCompatibleStream');
return;
}
@@ -1847,7 +1834,7 @@ class PlaybackManager {
}, queryOptions));
} else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
promise = new Promise(function (resolve, reject) {
- const apiClient = connectionManager.getApiClient(firstItem.ServerId);
+ const apiClient = window.connectionManager.getApiClient(firstItem.ServerId);
apiClient.getCurrentUser().then(function (user) {
if (!user.Configuration.EnableNextEpisodeAutoPlay || !firstItem.SeriesId) {
@@ -2070,7 +2057,7 @@ class PlaybackManager {
// If it's still null then there's nothing to play
if (!firstItem) {
- showPlaybackInfoErrorMessage(self, 'NoCompatibleStream', false);
+ showPlaybackInfoErrorMessage(self, 'PlaybackErrorNoCompatibleStream');
return Promise.reject();
}
@@ -2078,7 +2065,7 @@ class PlaybackManager {
return playOther(items, options, user);
}
- const apiClient = connectionManager.getApiClient(firstItem.ServerId);
+ const apiClient = window.connectionManager.getApiClient(firstItem.ServerId);
return getIntros(firstItem, apiClient, options).then(function (introsResult) {
const introItems = introsResult.Items;
@@ -2119,7 +2106,7 @@ class PlaybackManager {
function playInternal(item, playOptions, onPlaybackStartedFn) {
if (item.IsPlaceHolder) {
loading.hide();
- showPlaybackInfoErrorMessage(self, 'PlaceHolder', true);
+ showPlaybackInfoErrorMessage(self, 'PlaybackErrorPlaceHolder');
return Promise.reject();
}
@@ -2141,14 +2128,14 @@ class PlaybackManager {
const mediaType = item.MediaType;
const onBitrateDetectionFailure = function () {
- return playAfterBitrateDetect(getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn);
+ return playAfterBitrateDetect(getSavedMaxStreamingBitrate(window.connectionManager.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn);
};
if (!isServerItem(item) || itemHelper.isLocalItem(item)) {
return onBitrateDetectionFailure();
}
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.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) {
@@ -2267,7 +2254,7 @@ class PlaybackManager {
return Promise.all([promise, player.getDeviceProfile(item)]).then(function (responses) {
const deviceProfile = responses[1];
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
const mediaSourceId = playOptions.mediaSourceId;
const audioStreamIndex = playOptions.audioStreamIndex;
@@ -2312,11 +2299,11 @@ class PlaybackManager {
const startPosition = options.startPositionTicks || 0;
const mediaType = options.mediaType || item.MediaType;
const player = getPlayer(item, options);
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
// Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate
return apiClient.getEndpointInfo().then(function () {
- const maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType);
+ const maxBitrate = getSavedMaxStreamingBitrate(window.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) {
@@ -2332,11 +2319,11 @@ class PlaybackManager {
const mediaType = options.mediaType || item.MediaType;
// TODO: Remove the true forceLocalPlayer hack
const player = getPlayer(item, options, true);
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
// Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate
return apiClient.getEndpointInfo().then(function () {
- const maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType);
+ const maxBitrate = getSavedMaxStreamingBitrate(window.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) {
@@ -2488,7 +2475,7 @@ class PlaybackManager {
return mediaSource;
}
} else {
- showPlaybackInfoErrorMessage(self, 'NoCompatibleStream');
+ showPlaybackInfoErrorMessage(self, 'PlaybackErrorNoCompatibleStream');
return Promise.reject();
}
});
@@ -2720,7 +2707,7 @@ class PlaybackManager {
const queueDirectToPlayer = player && !enableLocalPlaylistManagement(player);
if (queueDirectToPlayer) {
- const apiClient = connectionManager.getApiClient(items[0].ServerId);
+ const apiClient = window.connectionManager.getApiClient(items[0].ServerId);
player.getDeviceProfile(items[0]).then(function (profile) {
setStreamUrls(items, profile, self.getMaxStreamingBitrate(player), apiClient, 0).then(function () {
@@ -2977,7 +2964,7 @@ class PlaybackManager {
}
if (displayErrorCode && typeof (displayErrorCode) === 'string') {
- showPlaybackInfoErrorMessage(self, displayErrorCode, nextItem);
+ showPlaybackInfoErrorMessage(self, 'PlaybackError' + displayErrorCode);
} else if (nextItem) {
self.nextTrack();
} else {
@@ -3170,13 +3157,13 @@ class PlaybackManager {
streamInfo.lastMediaInfoQuery = new Date().getTime();
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
if (!apiClient.isMinServerVersion('3.2.70.7')) {
return;
}
- connectionManager.getApiClient(serverId).getLiveStreamMediaInfo(liveStreamId).then(function (info) {
+ window.connectionManager.getApiClient(serverId).getLiveStreamMediaInfo(liveStreamId).then(function (info) {
mediaSource.MediaStreams = info.MediaStreams;
events.trigger(player, 'mediastreamschange');
}, function () {
@@ -3219,7 +3206,7 @@ class PlaybackManager {
return player.currentTime();
}
- return this.getCurrentTicks(player);
+ return this.getCurrentTicks(player) / 10000;
}
nextItem(player = this._currentPlayer) {
@@ -3233,7 +3220,7 @@ class PlaybackManager {
return Promise.reject();
}
- const apiClient = connectionManager.getApiClient(nextItem.item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(nextItem.item.ServerId);
return apiClient.getItem(apiClient.getCurrentUserId(), nextItem.item.Id);
}
@@ -3374,7 +3361,7 @@ class PlaybackManager {
return player.playTrailers(item);
}
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
const instance = this;
@@ -3406,7 +3393,7 @@ class PlaybackManager {
}
getSubtitleUrl(textStream, serverId) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
return !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl;
}
@@ -3486,7 +3473,7 @@ class PlaybackManager {
return player.instantMix(item);
}
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
const options = {};
options.UserId = apiClient.getCurrentUserId();
diff --git a/src/components/playback/playbackorientation.js b/src/components/playback/playbackorientation.js
index 1aa939da04..b73377bade 100644
--- a/src/components/playback/playbackorientation.js
+++ b/src/components/playback/playbackorientation.js
@@ -18,7 +18,7 @@ events.on(playbackManager, 'playbackstart', function (e, player, state) {
if (isLocalVideo && layoutManager.mobile) {
/* eslint-disable-next-line compat/compat */
- var lockOrientation = screen.lockOrientation || screen.mozLockOrientation || screen.msLockOrientation || (screen.orientation && screen.orientation.lock);
+ var lockOrientation = window.screen.lockOrientation || window.screen.mozLockOrientation || window.screen.msLockOrientation || (window.screen.orientation && window.screen.orientation.lock);
if (lockOrientation) {
try {
@@ -39,7 +39,7 @@ events.on(playbackManager, 'playbackstart', function (e, player, state) {
events.on(playbackManager, 'playbackstop', function (e, playbackStopInfo) {
if (orientationLocked && !playbackStopInfo.nextMediaType) {
/* eslint-disable-next-line compat/compat */
- var unlockOrientation = screen.unlockOrientation || screen.mozUnlockOrientation || screen.msUnlockOrientation || (screen.orientation && screen.orientation.unlock);
+ var unlockOrientation = window.screen.unlockOrientation || window.screen.mozUnlockOrientation || window.screen.msUnlockOrientation || (window.screen.orientation && window.screen.orientation.unlock);
if (unlockOrientation) {
try {
diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js
index cd227afcb4..77f22b6b6c 100644
--- a/src/components/playback/playersettingsmenu.js
+++ b/src/components/playback/playersettingsmenu.js
@@ -1,4 +1,3 @@
-import connectionManager from 'connectionManager';
import actionsheet from 'actionsheet';
import playbackManager from 'playbackManager';
import globalize from 'globalize';
@@ -251,7 +250,7 @@ export function show(options) {
return showWithUser(options, player, null);
}
- var apiClient = connectionManager.getApiClient(currentItem.ServerId);
+ var apiClient = window.connectionManager.getApiClient(currentItem.ServerId);
return apiClient.getCurrentUser().then(function (user) {
return showWithUser(options, player, user);
});
diff --git a/src/components/playbackSettings/playbackSettings.js b/src/components/playbackSettings/playbackSettings.js
index 66e1ae777f..782e3d38e1 100644
--- a/src/components/playbackSettings/playbackSettings.js
+++ b/src/components/playbackSettings/playbackSettings.js
@@ -5,7 +5,6 @@ import focusManager from 'focusManager';
import qualityoptions from 'qualityoptions';
import globalize from 'globalize';
import loading from 'loading';
-import connectionManager from 'connectionManager';
import events from 'events';
import 'emby-select';
import 'emby-checkbox';
@@ -258,7 +257,7 @@ import 'emby-checkbox';
function onSubmit(e) {
const self = this;
- const apiClient = connectionManager.getApiClient(self.options.serverId);
+ const apiClient = window.connectionManager.getApiClient(self.options.serverId);
const userId = self.options.userId;
const userSettings = self.options.userSettings;
@@ -305,7 +304,7 @@ import 'emby-checkbox';
loading.show();
const userId = self.options.userId;
- const apiClient = connectionManager.getApiClient(self.options.serverId);
+ const apiClient = window.connectionManager.getApiClient(self.options.serverId);
const userSettings = self.options.userSettings;
apiClient.getUser(userId).then(user => {
diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js
index 23a84310fb..28181756a3 100644
--- a/src/components/playerstats/playerstats.js
+++ b/src/components/playerstats/playerstats.js
@@ -1,7 +1,6 @@
import events from 'events';
import globalize from 'globalize';
import playbackManager from 'playbackManager';
-import connectionManager from 'connectionManager';
import syncPlayManager from 'syncPlayManager';
import playMethodHelper from 'playMethodHelper';
import layoutManager from 'layoutManager';
@@ -95,7 +94,7 @@ import 'css!./playerstats';
return Promise.resolve(instance.lastSession);
}
- const apiClient = connectionManager.getApiClient(playbackManager.currentItem(player).ServerId);
+ const apiClient = window.connectionManager.getApiClient(playbackManager.currentItem(player).ServerId);
return apiClient.getSessions({
deviceId: apiClient.deviceId()
@@ -386,7 +385,7 @@ import 'css!./playerstats';
name: 'Original Media Info'
});
- var apiClient = connectionManager.getApiClient(playbackManager.currentItem(player).ServerId);
+ var apiClient = window.connectionManager.getApiClient(playbackManager.currentItem(player).ServerId);
if (syncPlayManager.isSyncPlayEnabled() && apiClient.isMinServerVersion('10.6.0')) {
categories.push({
stats: getSyncPlayStats(),
diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js
index 78f0cf3dec..dda9436a29 100644
--- a/src/components/playlisteditor/playlisteditor.js
+++ b/src/components/playlisteditor/playlisteditor.js
@@ -3,7 +3,6 @@ import dialogHelper from 'dialogHelper';
import loading from 'loading';
import layoutManager from 'layoutManager';
import playbackManager from 'playbackManager';
-import connectionManager from 'connectionManager';
import * as userSettings from 'userSettings';
import appRouter from 'appRouter';
import globalize from 'globalize';
@@ -22,7 +21,7 @@ import 'emby-button';
const panel = dom.parentWithClass(this, 'dialog');
const playlistId = panel.querySelector('#selectPlaylistToAddTo').value;
- const apiClient = connectionManager.getApiClient(currentServerId);
+ const apiClient = window.connectionManager.getApiClient(currentServerId);
if (playlistId) {
userSettings.set('playlisteditor-lastplaylistid', playlistId);
@@ -113,7 +112,7 @@ import 'emby-button';
EnableTotalRecordCount: false
};
- const apiClient = connectionManager.getApiClient(currentServerId);
+ const apiClient = window.connectionManager.getApiClient(currentServerId);
apiClient.getItems(apiClient.getCurrentUserId(), options).then(result => {
let html = '';
diff --git a/src/components/recordingcreator/recordingbutton.js b/src/components/recordingcreator/recordingbutton.js
index 9f102e2f9c..dc7da836da 100644
--- a/src/components/recordingcreator/recordingbutton.js
+++ b/src/components/recordingcreator/recordingbutton.js
@@ -1,4 +1,3 @@
-import connectionManager from 'connectionManager';
import dom from 'dom';
import recordingHelper from 'recordingHelper';
import 'paper-icon-button-light';
@@ -53,7 +52,7 @@ class RecordingButton {
}
refresh(serverId, itemId) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
const self = this;
apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) {
self.refreshItem(item);
diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js
index 9cb4e41d2e..27ad0584d5 100644
--- a/src/components/recordingcreator/recordingcreator.js
+++ b/src/components/recordingcreator/recordingcreator.js
@@ -2,7 +2,6 @@ import dialogHelper from 'dialogHelper';
import globalize from 'globalize';
import layoutManager from 'layoutManager';
import mediaInfo from 'mediaInfo';
-import connectionManager from 'connectionManager';
import require from 'require';
import loading from 'loading';
import scrollHelper from 'scrollHelper';
@@ -103,7 +102,7 @@ function renderRecording(context, defaultTimer, program, apiClient, refreshRecor
function reload(context, programId, serverId, refreshRecordingStateOnly) {
loading.show();
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
const promise1 = apiClient.getNewLiveTvTimerDefaults({ programId: programId });
const promise2 = apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId());
@@ -119,7 +118,7 @@ function reload(context, programId, serverId, refreshRecordingStateOnly) {
function executeCloseAction(action, programId, serverId) {
if (action === 'play') {
import('playbackManager').then(({ default: playbackManager }) => {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) {
playbackManager.play({
diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js
index 096ea3b62c..37b55e4eec 100644
--- a/src/components/recordingcreator/recordingeditor.js
+++ b/src/components/recordingcreator/recordingeditor.js
@@ -1,7 +1,6 @@
import dialogHelper from 'dialogHelper';
import globalize from 'globalize';
import layoutManager from 'layoutManager';
-import connectionManager from 'connectionManager';
import loading from 'loading';
import scrollHelper from 'scrollHelper';
import 'scrollStyles';
@@ -41,7 +40,7 @@ function closeDialog(isDeleted) {
function onSubmit(e) {
const form = this;
- const apiClient = connectionManager.getApiClient(currentServerId);
+ const apiClient = window.connectionManager.getApiClient(currentServerId);
apiClient.getLiveTvTimer(currentItemId).then(function (item) {
item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
@@ -61,7 +60,7 @@ function init(context) {
});
context.querySelector('.btnCancelRecording').addEventListener('click', function () {
- const apiClient = connectionManager.getApiClient(currentServerId);
+ const apiClient = window.connectionManager.getApiClient(currentServerId);
deleteTimer(apiClient, currentItemId).then(function () {
closeDialog(true);
@@ -75,7 +74,7 @@ function reload(context, id) {
loading.show();
currentItemId = id;
- const apiClient = connectionManager.getApiClient(currentServerId);
+ const apiClient = window.connectionManager.getApiClient(currentServerId);
apiClient.getLiveTvTimer(id).then(function (result) {
renderTimer(context, result, apiClient);
loading.hide();
diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js
index d9d7c0098c..9b3f0d16a3 100644
--- a/src/components/recordingcreator/recordingfields.js
+++ b/src/components/recordingcreator/recordingfields.js
@@ -1,5 +1,4 @@
import globalize from 'globalize';
-import connectionManager from 'connectionManager';
import serverNotifications from 'serverNotifications';
import loading from 'loading';
import dom from 'dom';
@@ -46,7 +45,7 @@ function loadData(parent, program, apiClient) {
function fetchData(instance) {
const options = instance.options;
- const apiClient = connectionManager.getApiClient(options.serverId);
+ const apiClient = window.connectionManager.getApiClient(options.serverId);
options.parent.querySelector('.recordingFields').classList.remove('hide');
return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) {
@@ -197,7 +196,7 @@ function onRecordChange(e) {
const self = this;
const options = this.options;
- const apiClient = connectionManager.getApiClient(options.serverId);
+ const apiClient = window.connectionManager.getApiClient(options.serverId);
const button = dom.parentWithTag(e.target, 'BUTTON');
const isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active');
@@ -236,7 +235,7 @@ function onRecordSeriesChange(e) {
const self = this;
const options = this.options;
- const apiClient = connectionManager.getApiClient(options.serverId);
+ const apiClient = window.connectionManager.getApiClient(options.serverId);
const button = dom.parentWithTag(e.target, 'BUTTON');
const isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active');
diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js
index 13359de2bc..495378106c 100644
--- a/src/components/recordingcreator/recordinghelper.js
+++ b/src/components/recordingcreator/recordinghelper.js
@@ -1,6 +1,5 @@
import globalize from 'globalize';
import loading from 'loading';
-import connectionManager from 'connectionManager';
/*eslint prefer-const: "error"*/
@@ -40,7 +39,7 @@ function cancelTimerWithConfirmation(timerId, serverId) {
}).then(function () {
loading.show();
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
cancelTimer(apiClient, timerId, true).then(resolve, reject);
}, reject);
});
@@ -60,7 +59,7 @@ function cancelSeriesTimerWithConfirmation(timerId, serverId) {
}).then(function () {
loading.show();
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
apiClient.cancelLiveTvSeriesTimer(timerId).then(function () {
import('toast').then(({default: toast}) => {
toast(globalize.translate('SeriesCancelled'));
@@ -141,7 +140,7 @@ function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus,
buttons: items
}).then(function (result) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
if (result === 'canceltimer') {
loading.show();
@@ -167,7 +166,7 @@ function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus,
}
function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
const hasTimer = timerId && timerStatus !== 'Cancelled';
if (seriesTimerId && hasTimer) {
// cancel
diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js
index 48fbbcf22c..e3a6ae6853 100644
--- a/src/components/recordingcreator/seriesrecordingeditor.js
+++ b/src/components/recordingcreator/seriesrecordingeditor.js
@@ -1,7 +1,6 @@
import dialogHelper from 'dialogHelper';
import globalize from 'globalize';
import layoutManager from 'layoutManager';
-import connectionManager from 'connectionManager';
import loading from 'loading';
import scrollHelper from 'scrollHelper';
import datetime from 'datetime';
@@ -64,7 +63,7 @@ function closeDialog(isDeleted) {
function onSubmit(e) {
const form = this;
- const apiClient = connectionManager.getApiClient(currentServerId);
+ const apiClient = window.connectionManager.getApiClient(currentServerId);
apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) {
item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
@@ -92,7 +91,7 @@ function init(context) {
});
context.querySelector('.btnCancelRecording').addEventListener('click', function () {
- const apiClient = connectionManager.getApiClient(currentServerId);
+ const apiClient = window.connectionManager.getApiClient(currentServerId);
deleteTimer(apiClient, currentItemId).then(function () {
closeDialog(true);
});
@@ -102,7 +101,7 @@ function init(context) {
}
function reload(context, id) {
- const apiClient = connectionManager.getApiClient(currentServerId);
+ const apiClient = window.connectionManager.getApiClient(currentServerId);
loading.show();
if (typeof id === 'string') {
diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js
index 1ec0517448..e5ceb1e6e0 100644
--- a/src/components/refreshdialog/refreshdialog.js
+++ b/src/components/refreshdialog/refreshdialog.js
@@ -2,7 +2,6 @@ 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';
@@ -66,7 +65,7 @@ function onSubmit(e) {
const dlg = dom.parentWithClass(e.target, 'dialog');
const options = instance.options;
- const apiClient = connectionManager.getApiClient(options.serverId);
+ const apiClient = window.connectionManager.getApiClient(options.serverId);
const replaceAllMetadata = dlg.querySelector('#selectMetadataRefreshMode').value === 'all';
diff --git a/src/components/remotecontrol/remotecontrol.css b/src/components/remotecontrol/remotecontrol.css
index c260799585..1c31b4382b 100644
--- a/src/components/remotecontrol/remotecontrol.css
+++ b/src/components/remotecontrol/remotecontrol.css
@@ -222,18 +222,10 @@
margin: 0;
}
-.layout-mobile .nowPlayingSecondaryButtons .btnShuffleQueue {
- display: none;
-}
-
.layout-mobile .nowPlayingSecondaryButtons .volumecontrol {
display: none;
}
-.layout-mobile .nowPlayingSecondaryButtons .btnRepeat {
- display: none;
-}
-
.layout-desktop .nowPlayingInfoButtons .btnRepeat,
.layout-tv .nowPlayingInfoButtons .btnRepeat {
display: none;
@@ -362,7 +354,8 @@
border-radius: 0;
}
- .nowPlayingInfoButtons .btnRepeat {
+ .nowPlayingInfoButtons .btnRepeat,
+ .nowPlayingInfoButtons .btnRewind {
position: absolute;
left: 0;
margin-left: 0;
@@ -370,7 +363,8 @@
font-size: smaller;
}
- .nowPlayingInfoButtons .btnShuffleQueue {
+ .nowPlayingInfoButtons .btnShuffleQueue,
+ .nowPlayingInfoButtons .btnFastForward {
position: absolute;
right: 0;
margin-right: 0;
@@ -468,7 +462,6 @@
}
@media all and (max-width: 63em) {
- .nowPlayingSecondaryButtons .repeatToggleButton,
.nowPlayingInfoButtons .playlist .listItemMediaInfo,
.nowPlayingInfoButtons .btnStop {
display: none !important;
diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js
index 6048c918c7..ac9ceaae00 100644
--- a/src/components/remotecontrol/remotecontrol.js
+++ b/src/components/remotecontrol/remotecontrol.js
@@ -5,7 +5,6 @@ import imageLoader from 'imageLoader';
import playbackManager from 'playbackManager';
import nowPlayingHelper from 'nowPlayingHelper';
import events from 'events';
-import connectionManager from 'connectionManager';
import appHost from 'apphost';
import globalize from 'globalize';
import layoutManager from 'layoutManager';
@@ -66,7 +65,7 @@ function showSubtitleMenu(context, player, button, item) {
});
menuItems.unshift({
id: -1,
- name: globalize.translate('ButtonOff'),
+ name: globalize.translate('Off'),
selected: currentIndex == null
});
@@ -96,18 +95,18 @@ function seriesImageUrl(item, options) {
options.type = options.type || 'Primary';
if (options.type === 'Primary' && item.SeriesPrimaryImageTag) {
options.tag = item.SeriesPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
if (options.type === 'Thumb') {
if (item.SeriesThumbImageTag) {
options.tag = item.SeriesThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
if (item.ParentThumbImageTag) {
options.tag = item.ParentThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
}
}
@@ -120,12 +119,12 @@ function imageUrl(item, options) {
if (item.ImageTags && item.ImageTags[options.type]) {
options.tag = item.ImageTags[options.type];
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
}
if (item.AlbumId && item.AlbumPrimaryImageTag) {
options.tag = item.AlbumPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
}
return null;
@@ -134,7 +133,7 @@ function imageUrl(item, options) {
function updateNowPlayingInfo(context, state, serverId) {
const item = state.NowPlayingItem;
const displayName = item ? getNowPlayingNameHtml(item).replace('
', ' - ') : '';
- if (typeof item !== 'undefined') {
+ if (item) {
const nowPlayingServerId = (item.ServerId || serverId);
if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') {
const songName = item.Name;
@@ -192,11 +191,11 @@ function updateNowPlayingInfo(context, state, serverId) {
context.querySelector('.nowPlayingPageTitle').classList.add('hide');
}
- const url = item ? seriesImageUrl(item, {
+ const url = seriesImageUrl(item, {
maxHeight: 300
}) || imageUrl(item, {
maxHeight: 300
- }) : null;
+ });
let contextButton = context.querySelector('.btnToggleContextMenu');
// We remove the previous event listener by replacing the item in each update event
@@ -216,7 +215,7 @@ function updateNowPlayingInfo(context, state, serverId) {
openAlbum: false,
positionTo: contextButton
};
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
apiClient.getCurrentUser().then(function (user) {
contextButton.addEventListener('click', function () {
@@ -228,18 +227,16 @@ function updateNowPlayingInfo(context, state, serverId) {
});
});
setImageUrl(context, state, url);
- if (item) {
- backdrop.setBackdrops([item]);
- apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
- const userData = fullItem.UserData || {};
- const likes = userData.Likes == null ? '' : userData.Likes;
- context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = '
';
- context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = '
';
- });
- } else {
- backdrop.clearBackdrop();
- context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = '';
- }
+ backdrop.setBackdrops([item]);
+ apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
+ const userData = fullItem.UserData || {};
+ const likes = userData.Likes == null ? '' : userData.Likes;
+ context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = '
';
+ context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = '
';
+ });
+ } else {
+ backdrop.clearBackdrop();
+ context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = '';
}
}
@@ -332,8 +329,14 @@ export default function () {
buttonVisible(context.querySelector('.btnNextTrack'), item != null);
buttonVisible(context.querySelector('.btnPreviousTrack'), item != null);
if (layoutManager.mobile) {
- buttonVisible(context.querySelector('.btnRewind'), false);
- buttonVisible(context.querySelector('.btnFastForward'), false);
+ const playingVideo = playbackManager.isPlayingVideo() && item !== null;
+ const playingAudio = !playbackManager.isPlayingVideo() && item !== null;
+ buttonVisible(context.querySelector('.btnRepeat'), playingAudio);
+ buttonVisible(context.querySelector('.btnShuffleQueue'), playingAudio);
+ buttonVisible(context.querySelector('.btnRewind'), playingVideo);
+ buttonVisible(context.querySelector('.btnFastForward'), playingVideo);
+ buttonVisible(context.querySelector('.nowPlayingSecondaryButtons .btnShuffleQueue'), playingVideo);
+ buttonVisible(context.querySelector('.nowPlayingSecondaryButtons .btnRepeat'), playingVideo);
} else {
buttonVisible(context.querySelector('.btnRewind'), item != null);
buttonVisible(context.querySelector('.btnFastForward'), item != null);
@@ -615,7 +618,7 @@ export default function () {
lastUpdateTime = now;
const player = this;
currentRuntimeTicks = playbackManager.duration(player);
- updateTimeDisplay(playbackManager.currentTime(player), currentRuntimeTicks);
+ updateTimeDisplay(playbackManager.currentTime(player) * 10000, currentRuntimeTicks);
}
}
diff --git a/src/components/require/requiretext.js b/src/components/require/requiretext.js
index 8c68daed92..28ddeb21c8 100644
--- a/src/components/require/requiretext.js
+++ b/src/components/require/requiretext.js
@@ -2,7 +2,7 @@ define(function () {
'use strict';
// hack to work around the server's auto-redirection feature
- var addRedirectPrevention = self.dashboardVersion != null && self.Dashboard && !self.AppInfo.isNativeApp;
+ var addRedirectPrevention = window.dashboardVersion != null && window.Dashboard && !window.AppInfo.isNativeApp;
return {
diff --git a/src/components/search/searchresults.js b/src/components/search/searchresults.js
index 64be0e3e87..d35868d433 100644
--- a/src/components/search/searchresults.js
+++ b/src/components/search/searchresults.js
@@ -1,6 +1,5 @@
import layoutManager from 'layoutManager';
import globalize from 'globalize';
-import connectionManager from 'connectionManager';
import cardBuilder from 'cardBuilder';
import appRouter from 'appRouter';
import 'emby-scroller';
@@ -606,7 +605,7 @@ class SearchResults {
embed(options.element, this, options);
}
search(value) {
- const apiClient = connectionManager.getApiClient(this.options.serverId);
+ const apiClient = window.connectionManager.getApiClient(this.options.serverId);
search(this, apiClient, this.options.element, value);
}
diff --git a/src/components/serviceworker/notifications.js b/src/components/serviceworker/notifications.js
index 5f96d01a4d..9b50553244 100644
--- a/src/components/serviceworker/notifications.js
+++ b/src/components/serviceworker/notifications.js
@@ -26,6 +26,7 @@
});
}
+ /* eslint-disable-next-line no-restricted-globals -- self is valid in a serviceworker environment */
self.addEventListener('notificationclick', function (event) {
var notification = event.notification;
notification.close();
diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js
index 5bd65ae1d9..2959fd3372 100644
--- a/src/components/shortcuts.js
+++ b/src/components/shortcuts.js
@@ -7,7 +7,6 @@
import playbackManager from 'playbackManager';
import inputManager from 'inputManager';
-import connectionManager from 'connectionManager';
import appRouter from 'appRouter';
import globalize from 'globalize';
import dom from 'dom';
@@ -81,7 +80,7 @@ import recordingHelper from 'recordingHelper';
const id = button.getAttribute('data-id');
const type = button.getAttribute('data-type');
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
if (type === 'Timer') {
return apiClient.getLiveTvTimer(id);
@@ -111,7 +110,7 @@ import recordingHelper from 'recordingHelper';
}
import('itemContextMenu').then(({default: itemContextMenu}) => {
- connectionManager.getApiClient(item.ServerId).getCurrentUser().then(user => {
+ window.connectionManager.getApiClient(item.ServerId).getCurrentUser().then(user => {
itemContextMenu.show(Object.assign({
item: item,
play: true,
@@ -280,7 +279,7 @@ import recordingHelper from 'recordingHelper';
}
function playTrailer(item) {
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
apiClient.getLocalTrailers(apiClient.getCurrentUserId(), item.Id).then(trailers => {
playbackManager.play({ items: trailers });
@@ -288,7 +287,7 @@ import recordingHelper from 'recordingHelper';
}
function editItem(item, serverId) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
return new Promise((resolve, reject) => {
const serverId = apiClient.serverInfo().Id;
diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js
index 82f541a116..028c21b221 100644
--- a/src/components/slideshow/slideshow.js
+++ b/src/components/slideshow/slideshow.js
@@ -4,7 +4,6 @@
*/
import dialogHelper from 'dialogHelper';
import inputManager from 'inputManager';
-import connectionManager from 'connectionManager';
import layoutManager from 'layoutManager';
import focusManager from 'focusManager';
import browser from 'browser';
@@ -85,7 +84,7 @@ function getBackdropImageUrl(item, options, apiClient) {
* @returns {string} URL of the item's image.
*/
function getImgUrl(item, user) {
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
const imageOptions = {};
if (item.BackdropImageTags && item.BackdropImageTags.length) {
@@ -256,7 +255,7 @@ export default function (options) {
/**
* Handles zoom changes.
*/
- function onZoomChange(scale, imageEl, slideEl) {
+ function onZoomChange(swiper, scale, imageEl, slideEl) {
const zoomImage = slideEl.querySelector('.swiper-zoom-fakeimg');
if (zoomImage) {
diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js
index dfd7f9446c..2ade9966cb 100644
--- a/src/components/subtitleeditor/subtitleeditor.js
+++ b/src/components/subtitleeditor/subtitleeditor.js
@@ -2,7 +2,6 @@ import dialogHelper from 'dialogHelper';
import layoutManager from 'layoutManager';
import globalize from 'globalize';
import * as userSettings from 'userSettings';
-import connectionManager from 'connectionManager';
import loading from 'loading';
import focusManager from 'focusManager';
import dom from 'dom';
@@ -21,7 +20,7 @@ let hasChanges;
function downloadRemoteSubtitles(context, id) {
let url = 'Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + id;
- let apiClient = connectionManager.getApiClient(currentItem.ServerId);
+ let apiClient = window.connectionManager.getApiClient(currentItem.ServerId);
apiClient.ajax({
type: 'POST',
@@ -55,7 +54,7 @@ function deleteLocalSubtitle(context, index) {
let itemId = currentItem.Id;
let url = 'Videos/' + itemId + '/Subtitles/' + index;
- let apiClient = connectionManager.getApiClient(currentItem.ServerId);
+ let apiClient = window.connectionManager.getApiClient(currentItem.ServerId);
apiClient.ajax({
@@ -243,7 +242,7 @@ function searchForSubtitles(context, language) {
loading.show();
- let apiClient = connectionManager.getApiClient(currentItem.ServerId);
+ let apiClient = window.connectionManager.getApiClient(currentItem.ServerId);
let url = apiClient.getUrl('Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + language);
apiClient.getJSON(url).then(function (results) {
@@ -356,7 +355,7 @@ function centerFocus(elem, horiz, on) {
function showEditorInternal(itemId, serverId, template) {
hasChanges = false;
- let apiClient = connectionManager.getApiClient(serverId);
+ let apiClient = window.connectionManager.getApiClient(serverId);
return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) {
let dialogOptions = {
removeOnClose: true,
diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js
index 46760be4c8..0e2c4e3661 100644
--- a/src/components/subtitlesettings/subtitlesettings.js
+++ b/src/components/subtitlesettings/subtitlesettings.js
@@ -4,7 +4,6 @@ import appSettings from 'appSettings';
import focusManager from 'focusManager';
import layoutManager from 'layoutManager';
import loading from 'loading';
-import connectionManager from 'connectionManager';
import subtitleAppearanceHelper from 'subtitleAppearanceHelper';
import settingsHelper from 'settingsHelper';
import dom from 'dom';
@@ -232,7 +231,7 @@ export class SubtitleSettings {
loading.show();
const userId = self.options.userId;
- const apiClient = connectionManager.getApiClient(self.options.serverId);
+ const apiClient = window.connectionManager.getApiClient(self.options.serverId);
const userSettings = self.options.userSettings;
apiClient.getUser(userId).then(function (user) {
@@ -256,7 +255,7 @@ export class SubtitleSettings {
onSubmit(e) {
const self = this;
- const apiClient = connectionManager.getApiClient(self.options.serverId);
+ const apiClient = window.connectionManager.getApiClient(self.options.serverId);
const userId = self.options.userId;
const userSettings = self.options.userSettings;
diff --git a/src/components/syncPlay/groupSelectionMenu.js b/src/components/syncPlay/groupSelectionMenu.js
index 360aa0b0c2..655dc76010 100644
--- a/src/components/syncPlay/groupSelectionMenu.js
+++ b/src/components/syncPlay/groupSelectionMenu.js
@@ -1,5 +1,4 @@
import events from 'events';
-import connectionManager from 'connectionManager';
import playbackManager from 'playbackManager';
import syncPlayManager from 'syncPlayManager';
import loading from 'loading';
@@ -172,8 +171,8 @@ export function show (button) {
});
});
- const apiClient = connectionManager.currentApiClient();
- connectionManager.user(apiClient).then((user) => {
+ const apiClient = window.connectionManager.currentApiClient();
+ window.connectionManager.user(apiClient).then((user) => {
if (syncPlayEnabled) {
showLeaveGroupSelection(button, user, apiClient);
} else {
diff --git a/src/components/syncPlay/syncPlayManager.js b/src/components/syncPlay/syncPlayManager.js
index 2366172a79..3be3a3cedf 100644
--- a/src/components/syncPlay/syncPlayManager.js
+++ b/src/components/syncPlay/syncPlayManager.js
@@ -4,7 +4,6 @@
*/
import events from 'events';
-import connectionManager from 'connectionManager';
import playbackManager from 'playbackManager';
import timeSyncManager from 'timeSyncManager';
import toast from 'toast';
@@ -128,7 +127,7 @@ class SyncPlayManager {
// Report ping
if (this.syncEnabled) {
- const apiClient = connectionManager.currentApiClient();
+ const apiClient = window.connectionManager.currentApiClient();
const sessionId = getActivePlayerId();
if (!sessionId) {
@@ -660,7 +659,7 @@ class SyncPlayManager {
* Overrides PlaybackManager's unpause method.
*/
playRequest (player) {
- var apiClient = connectionManager.currentApiClient();
+ var apiClient = window.connectionManager.currentApiClient();
apiClient.requestSyncPlayStart();
}
@@ -668,7 +667,7 @@ class SyncPlayManager {
* Overrides PlaybackManager's pause method.
*/
pauseRequest (player) {
- var apiClient = connectionManager.currentApiClient();
+ var apiClient = window.connectionManager.currentApiClient();
apiClient.requestSyncPlayPause();
// Pause locally as well, to give the user some little control
playbackManager._localUnpause(player);
@@ -678,7 +677,7 @@ class SyncPlayManager {
* Overrides PlaybackManager's seek method.
*/
seekRequest (PositionTicks, player) {
- var apiClient = connectionManager.currentApiClient();
+ var apiClient = window.connectionManager.currentApiClient();
apiClient.requestSyncPlaySeek({
PositionTicks: PositionTicks
});
@@ -741,7 +740,7 @@ class SyncPlayManager {
const playAtTime = this.lastCommand.When;
- const currentPositionTicks = playbackManager.currentTime();
+ const currentPositionTicks = playbackManager.currentTime() * 10000;
// Estimate PositionTicks on server
const serverPositionTicks = this.lastCommand.PositionTicks + ((currentTime - playAtTime) + this.timeOffsetWithServer) * 10000;
// Measure delay that needs to be recovered
diff --git a/src/components/syncPlay/timeSyncManager.js b/src/components/syncPlay/timeSyncManager.js
index e219fb0413..6ded631de3 100644
--- a/src/components/syncPlay/timeSyncManager.js
+++ b/src/components/syncPlay/timeSyncManager.js
@@ -4,7 +4,6 @@
*/
import events from 'events';
-import connectionManager from 'connectionManager';
/**
* Time estimation
@@ -114,7 +113,7 @@ class TimeSyncManager {
if (!this.poller) {
this.poller = setTimeout(() => {
this.poller = null;
- const apiClient = connectionManager.currentApiClient();
+ const apiClient = window.connectionManager.currentApiClient();
const requestSent = new Date();
apiClient.getServerTime().then((response) => {
const responseReceived = new Date();
diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js
index 8225156bf0..8f288a5348 100644
--- a/src/components/themeMediaPlayer.js
+++ b/src/components/themeMediaPlayer.js
@@ -1,6 +1,5 @@
import playbackManager from 'playbackManager';
import * as userSettings from 'userSettings';
-import connectionManager from 'connectionManager';
let currentOwnerId;
let currentThemeIds = [];
@@ -62,7 +61,7 @@ function loadThemeMedia(item) {
return;
}
- const apiClient = connectionManager.getApiClient(item.ServerId);
+ const apiClient = window.connectionManager.getApiClient(item.ServerId);
apiClient.getThemeMedia(apiClient.getCurrentUserId(), item.Id, true).then(function (themeMediaResult) {
const ownerId = themeMediaResult.ThemeVideosResult.Items.length ? themeMediaResult.ThemeVideosResult.OwnerId : themeMediaResult.ThemeSongsResult.OwnerId;
diff --git a/src/components/tunerPicker.js b/src/components/tunerPicker.js
index 13625ddb67..2e7629a3c5 100644
--- a/src/components/tunerPicker.js
+++ b/src/components/tunerPicker.js
@@ -1,7 +1,6 @@
import dialogHelper from 'dialogHelper';
import dom from 'dom';
import layoutManager from 'layoutManager';
-import connectionManager from 'connectionManager';
import globalize from 'globalize';
import loading from 'loading';
import browser from 'browser';
@@ -163,7 +162,7 @@ function tunerPicker() {
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
}
- const apiClient = connectionManager.getApiClient(options.serverId);
+ const apiClient = window.connectionManager.getApiClient(options.serverId);
discoverDevices(dlg, apiClient);
if (layoutManager.tv) {
diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js
index e28bb03abe..985e4fb02f 100644
--- a/src/components/upnextdialog/upnextdialog.js
+++ b/src/components/upnextdialog/upnextdialog.js
@@ -1,6 +1,5 @@
import dom from 'dom';
import playbackManager from 'playbackManager';
-import connectionManager from 'connectionManager';
import events from 'events';
import mediaInfo from 'mediaInfo';
import layoutManager from 'layoutManager';
@@ -27,7 +26,7 @@ import 'flexStyles';
if (item.SeriesPrimaryImageTag) {
options.tag = item.SeriesPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
}
@@ -35,12 +34,12 @@ import 'flexStyles';
if (item.SeriesThumbImageTag) {
options.tag = item.SeriesThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
if (item.ParentThumbImageTag) {
options.tag = item.ParentThumbImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
}
}
@@ -53,13 +52,13 @@ import 'flexStyles';
if (item.ImageTags && item.ImageTags[options.type]) {
options.tag = item.ImageTags[options.type];
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
}
if (options.type === 'Primary') {
if (item.AlbumId && item.AlbumPrimaryImageTag) {
options.tag = item.AlbumPrimaryImageTag;
- return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
+ return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
}
}
@@ -256,7 +255,7 @@ import 'flexStyles';
const runtimeTicks = playbackManager.duration(options.player);
if (runtimeTicks) {
- const timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player);
+ const timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player) * 10000;
return Math.round(timeRemainingTicks / 10000);
}
diff --git a/src/components/userdatabuttons/userdatabuttons.js b/src/components/userdatabuttons/userdatabuttons.js
index 2b09095574..6c0cbb8a29 100644
--- a/src/components/userdatabuttons/userdatabuttons.js
+++ b/src/components/userdatabuttons/userdatabuttons.js
@@ -1,4 +1,3 @@
-import connectionManager from 'connectionManager';
import globalize from 'globalize';
import dom from 'dom';
import itemHelper from 'itemHelper';
@@ -188,12 +187,12 @@ function markPlayed(link) {
}
function likes(id, serverId, isLiked) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
return apiClient.updateUserItemRating(apiClient.getCurrentUserId(), id, isLiked);
}
function played(id, serverId, isPlayed) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
const method = isPlayed ? 'markPlayed' : 'markUnplayed';
@@ -201,13 +200,13 @@ function played(id, serverId, isPlayed) {
}
function favorite(id, serverId, isFavorite) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
return apiClient.updateFavoriteStatus(apiClient.getCurrentUserId(), id, isFavorite);
}
function clearLike(id, serverId) {
- const apiClient = connectionManager.getApiClient(serverId);
+ const apiClient = window.connectionManager.getApiClient(serverId);
return apiClient.clearUserItemRating(apiClient.getCurrentUserId(), id);
}
diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js
index 9d64130cdb..c39ad2ba84 100644
--- a/src/components/viewContainer.js
+++ b/src/components/viewContainer.js
@@ -13,8 +13,9 @@ import 'css!components/viewManager/viewContainer';
controllerUrl = controllerUrl.substring('__plugin/'.length);
}
- controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl);
- return import(controllerUrl).then((ControllerFactory) => {
+ controllerUrl = Dashboard.getPluginUrl(controllerUrl);
+ let apiUrl = ApiClient.getUrl('/web/' + controllerUrl);
+ return import(apiUrl).then((ControllerFactory) => {
options.controllerFactory = ControllerFactory;
});
}
@@ -32,7 +33,7 @@ import 'css!components/viewManager/viewContainer';
pageIndex = 0;
}
- const isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1;
+ const isPluginpage = options.url.includes('configurationpage');
const newViewInfo = normalizeNewView(options, isPluginpage);
const newView = newViewInfo.elem;
@@ -243,4 +244,3 @@ export default {
reset: reset,
setOnBeforeChange: setOnBeforeChange
};
-
diff --git a/src/config.template.json b/src/config.template.json
index 9d98e8b6f7..0f308ccc11 100644
--- a/src/config.template.json
+++ b/src/config.template.json
@@ -28,6 +28,7 @@
"plugins/htmlAudioPlayer/plugin",
"plugins/htmlVideoPlayer/plugin",
"plugins/photoPlayer/plugin",
+ "plugins/comicsPlayer/plugin",
"plugins/bookPlayer/plugin",
"plugins/youtubePlayer/plugin",
"plugins/backdropScreensaver/plugin",
diff --git a/src/controllers/dashboard/dashboard.html b/src/controllers/dashboard/dashboard.html
index b7af3c8c03..ec0d60a74d 100644
--- a/src/controllers/dashboard/dashboard.html
+++ b/src/controllers/dashboard/dashboard.html
@@ -17,7 +17,7 @@
';
@@ -551,7 +550,7 @@ import 'emby-itemscontainer';
row.classList.remove('playingSession');
}
- if (session.ServerId && session.SupportedCommands.indexOf('DisplayMessage') !== -1 && session.DeviceId !== connectionManager.deviceId()) {
+ if (session.ServerId && session.SupportedCommands.indexOf('DisplayMessage') !== -1 && session.DeviceId !== window.connectionManager.deviceId()) {
row.querySelector('.btnSessionSendMessage').classList.remove('hide');
} else {
row.querySelector('.btnSessionSendMessage').classList.add('hide');
@@ -565,7 +564,7 @@ import 'emby-itemscontainer';
const btnSessionPlayPause = row.querySelector('.btnSessionPlayPause');
- if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) {
+ if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== window.connectionManager.deviceId()) {
btnSessionPlayPause.classList.remove('hide');
row.querySelector('.btnSessionStop').classList.remove('hide');
} else {
@@ -722,9 +721,9 @@ import 'emby-itemscontainer';
restart: function (btn) {
import('confirm').then(({default: confirm}) => {
confirm({
- title: globalize.translate('HeaderRestart'),
+ title: globalize.translate('Restart'),
text: globalize.translate('MessageConfirmRestart'),
- confirmText: globalize.translate('ButtonRestart'),
+ confirmText: globalize.translate('Restart'),
primary: 'delete'
}).then(function () {
const page = dom.parentWithClass(btn, 'page');
diff --git a/src/controllers/dashboard/devices/device.html b/src/controllers/dashboard/devices/device.html
index 4d8fb86537..aec73db008 100644
--- a/src/controllers/dashboard/devices/device.html
+++ b/src/controllers/dashboard/devices/device.html
@@ -9,7 +9,7 @@