1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge remote-tracking branch 'upstream/master' into hwaccel

This commit is contained in:
Vasily 2020-06-08 15:41:14 +03:00
commit be6c4a2ba4
506 changed files with 27834 additions and 23514 deletions

View file

@ -1,24 +1,24 @@
define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "date-fns", "dfnshelper", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "scripts/imagehelper", "indicators", "listViewStyle", "emby-button", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, datefns, dfnshelper, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) {
"use strict";
define(['datetime', 'events', 'itemHelper', 'serverNotifications', 'dom', 'globalize', 'date-fns', 'dfnshelper', 'loading', 'connectionManager', 'playMethodHelper', 'cardBuilder', 'imageLoader', 'components/activitylog', 'scripts/imagehelper', 'indicators', 'listViewStyle', 'emby-button', 'flexStyles', 'emby-button', 'emby-itemscontainer'], function (datetime, events, itemHelper, serverNotifications, dom, globalize, datefns, dfnshelper, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) {
'use strict';
function showPlaybackInfo(btn, session) {
require(["alert"], function (alert) {
require(['alert'], function (alert) {
var title;
var text = [];
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") {
title = globalize.translate("DirectStreaming");
text.push(globalize.translate("DirectStreamHelp1"));
text.push("<br/>");
text.push(globalize.translate("DirectStreamHelp2"));
} else if (displayPlayMethod === "Transcode") {
title = globalize.translate("Transcoding");
text.push(globalize.translate("MediaIsBeingConverted"));
if (displayPlayMethod === 'DirectStream') {
title = globalize.translate('DirectStreaming');
text.push(globalize.translate('DirectStreamHelp1'));
text.push('<br/>');
text.push(globalize.translate('DirectStreamHelp2'));
} else if (displayPlayMethod === 'Transcode') {
title = globalize.translate('Transcoding');
text.push(globalize.translate('MediaIsBeingConverted'));
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
text.push("<br/>");
text.push(globalize.translate("LabelReasonForTranscoding"));
text.push('<br/>');
text.push(globalize.translate('LabelReasonForTranscoding'));
session.TranscodingInfo.TranscodeReasons.forEach(function (transcodeReason) {
text.push(globalize.translate(transcodeReason));
});
@ -26,18 +26,18 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
alert({
text: text.join("<br/>"),
text: text.join('<br/>'),
title: title
});
});
}
function showSendMessageForm(btn, session) {
require(["prompt"], function (prompt) {
require(['prompt'], function (prompt) {
prompt({
title: globalize.translate("HeaderSendMessage"),
label: globalize.translate("LabelMessageText"),
confirmText: globalize.translate("ButtonSend")
title: globalize.translate('HeaderSendMessage'),
label: globalize.translate('LabelMessageText'),
confirmText: globalize.translate('ButtonSend')
}).then(function (text) {
if (text) {
connectionManager.getApiClient(session.ServerId).sendMessageCommand(session.Id, {
@ -50,20 +50,20 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
function showOptionsMenu(btn, session) {
require(["actionsheet"], function (actionsheet) {
require(['actionsheet'], function (actionsheet) {
var menuItems = [];
if (session.ServerId && session.DeviceId !== connectionManager.deviceId()) {
menuItems.push({
name: globalize.translate("SendMessage"),
id: "sendmessage"
name: globalize.translate('SendMessage'),
id: 'sendmessage'
});
}
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
menuItems.push({
name: globalize.translate("ViewPlaybackInfo"),
id: "transcodinginfo"
name: globalize.translate('ViewPlaybackInfo'),
id: 'transcodinginfo'
});
}
@ -72,11 +72,11 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
positionTo: btn
}).then(function (id) {
switch (id) {
case "sendmessage":
case 'sendmessage':
showSendMessageForm(btn, session);
break;
case "transcodinginfo":
case 'transcodinginfo':
showPlaybackInfo(btn, session);
}
});
@ -84,28 +84,28 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
function onActiveDevicesClick(evt) {
var btn = dom.parentWithClass(evt.target, "sessionCardButton");
var btn = dom.parentWithClass(evt.target, 'sessionCardButton');
if (btn) {
var card = dom.parentWithClass(btn, "card");
var card = dom.parentWithClass(btn, 'card');
if (card) {
var sessionId = card.id;
var session = (DashboardPage.sessionsList || []).filter(function (dashboardSession) {
return "session" + dashboardSession.Id === sessionId;
return 'session' + dashboardSession.Id === sessionId;
})[0];
if (session) {
if (btn.classList.contains("btnCardOptions")) {
if (btn.classList.contains('btnCardOptions')) {
showOptionsMenu(btn, session);
} else if (btn.classList.contains("btnSessionInfo")) {
} else if (btn.classList.contains('btnSessionInfo')) {
showPlaybackInfo(btn, session);
} else if (btn.classList.contains("btnSessionSendMessage")) {
} else if (btn.classList.contains('btnSessionSendMessage')) {
showSendMessageForm(btn, session);
} else if (btn.classList.contains("btnSessionStop")) {
connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "Stop");
} else if (btn.classList.contains("btnSessionPlayPause") && session.PlayState) {
connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "PlayPause");
} else if (btn.classList.contains('btnSessionStop')) {
connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, 'Stop');
} else if (btn.classList.contains('btnSessionPlayPause') && session.PlayState) {
connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, 'PlayPause');
}
}
}
@ -135,31 +135,31 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
apiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(),
IsInProgress: true,
Fields: "CanDelete,PrimaryImageAspectRatio",
Fields: 'CanDelete,PrimaryImageAspectRatio',
EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb,Backdrop"
EnableImageTypes: 'Primary,Thumb,Backdrop'
}).then(function (result) {
var itemsContainer = view.querySelector(".activeRecordingItems");
var itemsContainer = view.querySelector('.activeRecordingItems');
if (!result.Items.length) {
view.querySelector(".activeRecordingsSection").classList.add("hide");
return void(itemsContainer.innerHTML = "");
view.querySelector('.activeRecordingsSection').classList.add('hide');
return void(itemsContainer.innerHTML = '');
}
view.querySelector(".activeRecordingsSection").classList.remove("hide");
view.querySelector('.activeRecordingsSection').classList.remove('hide');
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
defaultShape: "backdrop",
shape: 'auto',
defaultShape: 'backdrop',
showTitle: true,
showParentTitle: true,
coverImage: true,
cardLayout: false,
centerText: true,
preferThumb: "auto",
preferThumb: 'auto',
overlayText: false,
overlayMoreButton: true,
action: "none",
action: 'none',
centerPlayButton: true
});
imageLoader.lazyChildren(itemsContainer);
@ -168,28 +168,22 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
function reloadSystemInfo(view, apiClient) {
apiClient.getSystemInfo().then(function (systemInfo) {
view.querySelector("#serverName").innerHTML = globalize.translate("DashboardServerName", systemInfo.ServerName);
var localizedVersion = globalize.translate("DashboardVersionNumber", systemInfo.Version);
view.querySelector('#serverName').innerHTML = globalize.translate('DashboardServerName', systemInfo.ServerName);
var localizedVersion = globalize.translate('DashboardVersionNumber', systemInfo.Version);
if (systemInfo.SystemUpdateLevel !== "Release") {
localizedVersion += " " + systemInfo.SystemUpdateLevel;
if (systemInfo.SystemUpdateLevel !== 'Release') {
localizedVersion += ' ' + systemInfo.SystemUpdateLevel;
}
view.querySelector("#versionNumber").innerHTML = localizedVersion;
view.querySelector("#operatingSystem").innerHTML = globalize.translate("DashboardOperatingSystem", systemInfo.OperatingSystem);
view.querySelector("#architecture").innerHTML = globalize.translate("DashboardArchitecture", systemInfo.SystemArchitecture);
view.querySelector('#versionNumber').innerHTML = localizedVersion;
view.querySelector('#operatingSystem').innerHTML = globalize.translate('DashboardOperatingSystem', systemInfo.OperatingSystem);
view.querySelector('#architecture').innerHTML = globalize.translate('DashboardArchitecture', systemInfo.SystemArchitecture);
if (systemInfo.CanSelfRestart) {
view.querySelector("#btnRestartServer").classList.remove("hide");
} else {
view.querySelector("#btnRestartServer").classList.add("hide");
}
view.querySelector("#cachePath").innerHTML = systemInfo.CachePath;
view.querySelector("#logPath").innerHTML = systemInfo.LogPath;
view.querySelector("#transcodePath").innerHTML = systemInfo.TranscodingTempPath;
view.querySelector("#metadataPath").innerHTML = systemInfo.InternalMetadataPath;
view.querySelector("#webPath").innerHTML = systemInfo.WebPath;
view.querySelector('#cachePath').innerHTML = systemInfo.CachePath;
view.querySelector('#logPath').innerHTML = systemInfo.LogPath;
view.querySelector('#transcodePath').innerHTML = systemInfo.TranscodingTempPath;
view.querySelector('#metadataPath').innerHTML = systemInfo.InternalMetadataPath;
view.querySelector('#webPath').innerHTML = systemInfo.WebPath;
});
}
@ -211,25 +205,25 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
function renderActiveConnections(view, sessions) {
var html = "";
var html = '';
DashboardPage.sessionsList = sessions;
var parentElement = view.querySelector(".activeDevices");
var cardElem = parentElement.querySelector(".card");
var parentElement = view.querySelector('.activeDevices');
var cardElem = parentElement.querySelector('.card');
if (cardElem) {
cardElem.classList.add("deadSession");
cardElem.classList.add('deadSession');
}
for (var i = 0, length = sessions.length; i < length; i++) {
var session = sessions[i];
var rowId = "session" + session.Id;
var elem = view.querySelector("#" + rowId);
var rowId = 'session' + session.Id;
var elem = view.querySelector('#' + rowId);
if (elem) {
DashboardPage.updateSession(elem, session);
} else {
var nowPlayingItem = session.NowPlayingItem;
var className = "scalableCard card activeSession backdropCard backdropCard-scalable";
var className = 'scalableCard card activeSession backdropCard backdropCard-scalable';
html += '<div class="' + className + '" id="' + rowId + '">';
html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
@ -253,65 +247,65 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
html += '<div class="sessionAppName" style="display:inline-block;">';
html += '<div class="sessionDeviceName">' + session.DeviceName + "</div>";
html += '<div class="sessionAppSecondaryText">' + DashboardPage.getAppSecondaryText(session) + "</div>";
html += "</div>";
html += "</div>";
html += '<div class="sessionDeviceName">' + session.DeviceName + '</div>';
html += '<div class="sessionAppSecondaryText">' + DashboardPage.getAppSecondaryText(session) + '</div>';
html += '</div>';
html += '</div>';
html += '<div class="sessionNowPlayingDetails">';
var nowPlayingName = DashboardPage.getNowPlayingName(session);
html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">';
html += nowPlayingName.html;
html += "</div>";
html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>";
html += '</div>';
html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + '</div>';
html += '</div>';
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
html += indicators.getProgressHtml(percent, {
containerClass: "playbackProgress"
containerClass: 'playbackProgress'
});
} else {
// need to leave the element in just in case the device starts playback
html += indicators.getProgressHtml(0, {
containerClass: "playbackProgress hide"
containerClass: 'playbackProgress hide'
});
}
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
html += indicators.getProgressHtml(percent, {
containerClass: "transcodingProgress"
containerClass: 'transcodingProgress'
});
} else {
// same issue as playbackProgress element above
html += indicators.getProgressHtml(0, {
containerClass: "transcodingProgress hide"
containerClass: 'transcodingProgress hide'
});
}
html += "</div>";
html += "</div>";
html += "</div>";
html += '</div>';
html += '</div>';
html += '</div>';
html += '<div class="sessionCardFooter cardFooter">';
html += '<div class="sessionCardButtons flex align-items-center justify-content-center">';
var btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl ? "" : " hide";
var playIcon = session.PlayState.IsPaused ? 'pause' : 'play';
var btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl ? '' : ' hide';
const playIcon = session.PlayState.IsPaused ? 'pause' : 'play_arrow';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionPlayPause paper-icon-button-light ' + btnCssClass + '"><i class="material-icons">' + playIcon + '</i></button>';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionStop paper-icon-button-light ' + btnCssClass + '"><i class="material-icons">stop</i></button>';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionPlayPause paper-icon-button-light ' + btnCssClass + '"><span class="material-icons ' + playIcon + '"></span></button>';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionStop paper-icon-button-light ' + btnCssClass + '"><span class="material-icons stop"></span></button>';
btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? "" : " hide";
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionInfo paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate("ViewPlaybackInfo") + '"><i class="material-icons">info</i></button>';
btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? '' : ' hide';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionInfo paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate('ViewPlaybackInfo') + '"><span class="material-icons info"></span></button>';
btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? "" : " hide";
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionSendMessage paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate("SendMessage") + '"><i class="material-icons">message</i></button>';
html += "</div>";
btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf('DisplayMessage') && session.DeviceId !== connectionManager.deviceId() ? '' : ' hide';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionSendMessage paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate('SendMessage') + '"><span class="material-icons message"></span></button>';
html += '</div>';
html += '<div class="sessionNowPlayingStreamInfo" style="padding:.5em 0 1em;">';
html += DashboardPage.getSessionNowPlayingStreamInfo(session);
html += "</div>";
html += '</div>';
html += '<div class="flex align-items-center justify-content-center">';
var userImage = DashboardPage.getUserImage(session);
@ -319,16 +313,16 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
html += '<div class="sessionUserName">';
html += DashboardPage.getUsersHtml(session);
html += "</div>";
html += "</div>";
html += "</div>";
html += "</div>";
html += "</div>";
html += '</div>';
html += '</div>';
html += '</div>';
html += '</div>';
html += '</div>';
}
}
parentElement.insertAdjacentHTML("beforeend", html);
var deadSessionElem = parentElement.querySelector(".deadSession");
parentElement.insertAdjacentHTML('beforeend', html);
var deadSessionElem = parentElement.querySelector('.deadSession');
if (deadSessionElem) {
deadSessionElem.parentNode.removeChild(deadSessionElem);
@ -336,9 +330,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
function renderRunningTasks(view, tasks) {
var html = "";
var html = '';
tasks = tasks.filter(function (task) {
if ("Idle" != task.State) {
if ('Idle' != task.State) {
return !task.IsHidden;
}
@ -346,59 +340,59 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
});
if (tasks.length) {
view.querySelector(".runningTasksContainer").classList.remove("hide");
view.querySelector('.runningTasksContainer').classList.remove('hide');
} else {
view.querySelector(".runningTasksContainer").classList.add("hide");
view.querySelector('.runningTasksContainer').classList.add('hide');
}
for (var i = 0, length = tasks.length; i < length; i++) {
var task = tasks[i];
html += "<p>";
html += task.Name + "<br/>";
html += '<p>';
html += task.Name + '<br/>';
if (task.State === "Running") {
if (task.State === 'Running') {
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
html += '<progress max="100" value="' + progress + '" title="' + progress + '%">';
html += progress + "%";
html += "</progress>";
html += "<span style='color:#00a4dc;margin-left:5px;margin-right:5px;'>" + progress + "%</span>";
html += '<button type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonStop") + '" onclick="DashboardPage.stopTask(this, \'' + task.Id + '\');" class="autoSize"><i class="material-icons">cancel</i></button>';
} else if (task.State === "Cancelling") {
html += '<span style="color:#cc0000;">' + globalize.translate("LabelStopping") + "</span>";
html += progress + '%';
html += '</progress>';
html += "<span style='color:#00a4dc;margin-left:5px;margin-right:5px;'>" + progress + '%</span>';
html += '<button type="button" is="paper-icon-button-light" title="' + globalize.translate('ButtonStop') + '" onclick="DashboardPage.stopTask(this, \'' + task.Id + '\');" class="autoSize"><span class="material-icons cancel"></span></button>';
} else if (task.State === 'Cancelling') {
html += '<span style="color:#cc0000;">' + globalize.translate('LabelStopping') + '</span>';
}
html += "</p>";
html += '</p>';
}
view.querySelector("#divRunningTasks").innerHTML = html;
view.querySelector('#divRunningTasks').innerHTML = html;
}
window.DashboardPage = {
startInterval: function (apiClient) {
apiClient.sendMessage("SessionsStart", "0,1500");
apiClient.sendMessage("ScheduledTasksInfoStart", "0,1000");
apiClient.sendMessage('SessionsStart', '0,1500');
apiClient.sendMessage('ScheduledTasksInfoStart', '0,1000');
},
stopInterval: function (apiClient) {
apiClient.sendMessage("SessionsStop");
apiClient.sendMessage("ScheduledTasksInfoStop");
apiClient.sendMessage('SessionsStop');
apiClient.sendMessage('ScheduledTasksInfoStop');
},
getSessionNowPlayingStreamInfo: function (session) {
var html = "";
var html = '';
var showTranscodingInfo = false;
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") {
html += globalize.translate("DirectStreaming");
} else if (displayPlayMethod === "Transcode") {
html += globalize.translate("Transcoding");
if (displayPlayMethod === 'DirectStream') {
html += globalize.translate('DirectStreaming');
} else if (displayPlayMethod === 'Transcode') {
html += globalize.translate('Transcoding');
if (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
html += " (" + session.TranscodingInfo.Framerate + " fps)";
html += ' (' + session.TranscodingInfo.Framerate + ' fps)';
}
showTranscodingInfo = true;
} else if (displayPlayMethod === "DirectPlay") {
html += globalize.translate("DirectPlaying");
} else if (displayPlayMethod === 'DirectPlay') {
html += globalize.translate('DirectPlaying');
}
if (showTranscodingInfo) {
@ -407,9 +401,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (session.TranscodingInfo) {
if (session.TranscodingInfo.Bitrate) {
if (session.TranscodingInfo.Bitrate > 1e6) {
line.push((session.TranscodingInfo.Bitrate / 1e6).toFixed(1) + " Mbps");
line.push((session.TranscodingInfo.Bitrate / 1e6).toFixed(1) + ' Mbps');
} else {
line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + " Kbps");
line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + ' Kbps');
}
}
@ -427,7 +421,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
if (line.length) {
html += " - " + line.join(" ");
html += ' - ' + line.join(' ');
}
}
@ -435,43 +429,43 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
},
getSessionNowPlayingTime: function (session) {
var nowPlayingItem = session.NowPlayingItem;
var html = "";
var html = '';
if (nowPlayingItem) {
if (session.PlayState.PositionTicks) {
html += datetime.getDisplayRunningTime(session.PlayState.PositionTicks);
} else {
html += "0:00";
html += '0:00';
}
html += " / ";
html += ' / ';
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks);
} else {
html += "0:00";
html += '0:00';
}
}
return html;
},
getAppSecondaryText: function (session) {
return session.Client + " " + session.ApplicationVersion;
return session.Client + ' ' + session.ApplicationVersion;
},
getNowPlayingName: function (session) {
var imgUrl = "";
var imgUrl = '';
var nowPlayingItem = session.NowPlayingItem;
// FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix
// how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences
if (!nowPlayingItem) {
return {
html: globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), dfnshelper.localeWithSuffix)),
html: globalize.translate('LastSeen', datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), dfnshelper.localeWithSuffix)),
image: imgUrl
};
}
var topText = itemHelper.getDisplayName(nowPlayingItem);
var bottomText = "";
var bottomText = '';
if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
bottomText = topText;
@ -490,14 +484,14 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
tag: nowPlayingItem.ImageTags.Logo,
maxHeight: 24,
maxWidth: 130,
type: "Logo"
type: 'Logo'
});
} else if (nowPlayingItem.ParentLogoImageTag) {
imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.ParentLogoItemId, {
tag: nowPlayingItem.ParentLogoImageTag,
maxHeight: 24,
maxWidth: 130,
type: "Logo"
type: 'Logo'
});
}
@ -506,7 +500,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
return {
html: bottomText ? topText + "<br/>" + bottomText : topText,
html: bottomText ? topText + '<br/>' + bottomText : topText,
image: imgUrl
};
},
@ -521,106 +515,104 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
html.push(session.AdditionalUsers[i].UserName);
}
return html.join(", ");
return html.join(', ');
},
getUserImage: function (session) {
if (session.UserId && session.UserPrimaryImageTag) {
return ApiClient.getUserImageUrl(session.UserId, {
tag: session.UserPrimaryImageTag,
type: "Primary"
type: 'Primary'
});
}
return null;
},
updateSession: function (row, session) {
row.classList.remove("deadSession");
row.classList.remove('deadSession');
var nowPlayingItem = session.NowPlayingItem;
if (nowPlayingItem) {
row.classList.add("playingSession");
row.classList.add('playingSession');
} else {
row.classList.remove("playingSession");
row.classList.remove('playingSession');
}
if (session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId()) {
row.querySelector(".btnSessionSendMessage").classList.remove("hide");
if (session.ServerId && -1 !== session.SupportedCommands.indexOf('DisplayMessage') && session.DeviceId !== connectionManager.deviceId()) {
row.querySelector('.btnSessionSendMessage').classList.remove('hide');
} else {
row.querySelector(".btnSessionSendMessage").classList.add("hide");
row.querySelector('.btnSessionSendMessage').classList.add('hide');
}
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length) {
row.querySelector(".btnSessionInfo").classList.remove("hide");
row.querySelector('.btnSessionInfo').classList.remove('hide');
} else {
row.querySelector(".btnSessionInfo").classList.add("hide");
row.querySelector('.btnSessionInfo').classList.add('hide');
}
var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause");
var btnSessionPlayPause = row.querySelector('.btnSessionPlayPause');
if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) {
btnSessionPlayPause.classList.remove("hide");
row.querySelector(".btnSessionStop").classList.remove("hide");
btnSessionPlayPause.classList.remove('hide');
row.querySelector('.btnSessionStop').classList.remove('hide');
} else {
btnSessionPlayPause.classList.add("hide");
row.querySelector(".btnSessionStop").classList.add("hide");
btnSessionPlayPause.classList.add('hide');
row.querySelector('.btnSessionStop').classList.add('hide');
}
if (session.PlayState && session.PlayState.IsPaused) {
btnSessionPlayPause.querySelector("i").innerHTML = "&#xE037;";
} else {
btnSessionPlayPause.querySelector("i").innerHTML = "pause";
}
const btnSessionPlayPauseIcon = btnSessionPlayPause.querySelector('.material-icons');
btnSessionPlayPauseIcon.classList.remove('play_arrow', 'pause');
btnSessionPlayPauseIcon.classList.add(session.PlayState && session.PlayState.IsPaused ? 'play_arrow' : 'pause');
row.querySelector(".sessionNowPlayingStreamInfo").innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session);
row.querySelector(".sessionNowPlayingTime").innerHTML = DashboardPage.getSessionNowPlayingTime(session);
row.querySelector(".sessionUserName").innerHTML = DashboardPage.getUsersHtml(session);
row.querySelector(".sessionAppSecondaryText").innerHTML = DashboardPage.getAppSecondaryText(session);
row.querySelector(".sessionTranscodingFramerate").innerHTML = session.TranscodingInfo && session.TranscodingInfo.Framerate ? session.TranscodingInfo.Framerate + " fps" : "";
row.querySelector('.sessionNowPlayingStreamInfo').innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session);
row.querySelector('.sessionNowPlayingTime').innerHTML = DashboardPage.getSessionNowPlayingTime(session);
row.querySelector('.sessionUserName').innerHTML = DashboardPage.getUsersHtml(session);
row.querySelector('.sessionAppSecondaryText').innerHTML = DashboardPage.getAppSecondaryText(session);
row.querySelector('.sessionTranscodingFramerate').innerHTML = session.TranscodingInfo && session.TranscodingInfo.Framerate ? session.TranscodingInfo.Framerate + ' fps' : '';
var nowPlayingName = DashboardPage.getNowPlayingName(session);
var nowPlayingInfoElem = row.querySelector(".sessionNowPlayingInfo");
var nowPlayingInfoElem = row.querySelector('.sessionNowPlayingInfo');
if (!(nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute("data-imgsrc"))) {
if (!(nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute('data-imgsrc'))) {
nowPlayingInfoElem.innerHTML = nowPlayingName.html;
nowPlayingInfoElem.setAttribute("data-imgsrc", nowPlayingName.image || "");
nowPlayingInfoElem.setAttribute('data-imgsrc', nowPlayingName.image || '');
}
var playbackProgressElem = row.querySelector(".playbackProgress");
var playbackProgressElem = row.querySelector('.playbackProgress');
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, {
containerClass: "playbackProgress"
containerClass: 'playbackProgress'
});
} else {
playbackProgressElem.outerHTML = indicators.getProgressHtml(0, {
containerClass: "playbackProgress hide"
containerClass: 'playbackProgress hide'
});
}
var transcodingProgress = row.querySelector(".transcodingProgress");
var transcodingProgress = row.querySelector('.transcodingProgress');
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
transcodingProgress.outerHTML = indicators.getProgressHtml(percent, {
containerClass: "transcodingProgress"
containerClass: 'transcodingProgress'
});
} else {
transcodingProgress.outerHTML = indicators.getProgressHtml(0, {
containerClass: "transcodingProgress hide"
containerClass: 'transcodingProgress hide'
});
}
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || "";
var imgElem = row.querySelector(".sessionNowPlayingContent");
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || '';
var imgElem = row.querySelector('.sessionNowPlayingContent');
if (imgUrl != imgElem.getAttribute("data-src")) {
imgElem.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : "";
imgElem.setAttribute("data-src", imgUrl);
if (imgUrl != imgElem.getAttribute('data-src')) {
imgElem.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : '';
imgElem.setAttribute('data-src', imgUrl);
if (imgUrl) {
imgElem.classList.add("sessionNowPlayingContent-withbackground");
imgElem.classList.add('sessionNowPlayingContent-withbackground');
} else {
imgElem.classList.remove("sessionNowPlayingContent-withbackground");
imgElem.classList.remove('sessionNowPlayingContent-withbackground');
}
}
},
@ -634,7 +626,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && item.BackdropImageTags && item.BackdropImageTags.length) {
return ApiClient.getScaledImageUrl(item.Id, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Backdrop",
type: 'Backdrop',
tag: item.BackdropImageTags[0]
});
}
@ -642,7 +634,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
return ApiClient.getScaledImageUrl(item.ParentBackdropItemId, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Backdrop",
type: 'Backdrop',
tag: item.ParentBackdropImageTags[0]
});
}
@ -650,7 +642,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && item.BackdropImageTag) {
return ApiClient.getScaledImageUrl(item.BackdropItemId, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Backdrop",
type: 'Backdrop',
tag: item.BackdropImageTag
});
}
@ -660,7 +652,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && imageTags.Thumb) {
return ApiClient.getScaledImageUrl(item.Id, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Thumb",
type: 'Thumb',
tag: imageTags.Thumb
});
}
@ -668,7 +660,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && item.ParentThumbImageTag) {
return ApiClient.getScaledImageUrl(item.ParentThumbItemId, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Thumb",
type: 'Thumb',
tag: item.ParentThumbImageTag
});
}
@ -676,7 +668,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && item.ThumbImageTag) {
return ApiClient.getScaledImageUrl(item.ThumbItemId, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Thumb",
type: 'Thumb',
tag: item.ThumbImageTag
});
}
@ -684,7 +676,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && imageTags.Primary) {
return ApiClient.getScaledImageUrl(item.Id, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Primary",
type: 'Primary',
tag: imageTags.Primary
});
}
@ -692,7 +684,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && item.PrimaryImageTag) {
return ApiClient.getScaledImageUrl(item.PrimaryImageItemId, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Primary",
type: 'Primary',
tag: item.PrimaryImageTag
});
}
@ -700,46 +692,46 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (item && item.AlbumPrimaryImageTag) {
return ApiClient.getScaledImageUrl(item.AlbumId, {
maxWidth: Math.round(dom.getScreenWidth() * 0.20),
type: "Primary",
type: 'Primary',
tag: item.AlbumPrimaryImageTag
});
}
return null;
},
systemUpdateTaskKey: "SystemUpdateTask",
systemUpdateTaskKey: 'SystemUpdateTask',
stopTask: function (btn, id) {
var page = dom.parentWithClass(btn, "page");
var page = dom.parentWithClass(btn, 'page');
ApiClient.stopScheduledTask(id).then(function () {
pollForInfo(page, ApiClient);
});
},
restart: function (btn) {
require(["confirm"], function (confirm) {
require(['confirm'], function (confirm) {
confirm({
title: globalize.translate("HeaderRestart"),
text: globalize.translate("MessageConfirmRestart"),
confirmText: globalize.translate("ButtonRestart"),
primary: "delete"
title: globalize.translate('HeaderRestart'),
text: globalize.translate('MessageConfirmRestart'),
confirmText: globalize.translate('ButtonRestart'),
primary: 'delete'
}).then(function () {
var page = dom.parentWithClass(btn, "page");
page.querySelector("#btnRestartServer").disabled = true;
page.querySelector("#btnShutdown").disabled = true;
var page = dom.parentWithClass(btn, 'page');
page.querySelector('#btnRestartServer').disabled = true;
page.querySelector('#btnShutdown').disabled = true;
ApiClient.restartServer();
});
});
},
shutdown: function (btn) {
require(["confirm"], function (confirm) {
require(['confirm'], function (confirm) {
confirm({
title: globalize.translate("HeaderShutdown"),
text: globalize.translate("MessageConfirmShutdown"),
confirmText: globalize.translate("ButtonShutdown"),
primary: "delete"
title: globalize.translate('HeaderShutdown'),
text: globalize.translate('MessageConfirmShutdown'),
confirmText: globalize.translate('ButtonShutdown'),
primary: 'delete'
}).then(function () {
var page = dom.parentWithClass(btn, "page");
page.querySelector("#btnRestartServer").disabled = true;
page.querySelector("#btnShutdown").disabled = true;
var page = dom.parentWithClass(btn, 'page');
page.querySelector('#btnRestartServer').disabled = true;
page.querySelector('#btnShutdown').disabled = true;
ApiClient.shutdownServer();
});
});
@ -785,8 +777,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
var serverId = ApiClient.serverId();
view.querySelector(".activeDevices").addEventListener("click", onActiveDevicesClick);
view.addEventListener("viewshow", function () {
view.querySelector('.activeDevices').addEventListener('click', onActiveDevicesClick);
view.addEventListener('viewshow', function () {
var page = this;
var apiClient = ApiClient;
@ -794,28 +786,28 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
loading.show();
pollForInfo(page, apiClient);
DashboardPage.startInterval(apiClient);
events.on(serverNotifications, "RestartRequired", onRestartRequired);
events.on(serverNotifications, "ServerShuttingDown", onServerShuttingDown);
events.on(serverNotifications, "ServerRestarting", onServerRestarting);
events.on(serverNotifications, "PackageInstalling", onPackageInstalling);
events.on(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted);
events.on(serverNotifications, "Sessions", onSessionsUpdate);
events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate);
events.on(serverNotifications, 'RestartRequired', onRestartRequired);
events.on(serverNotifications, 'ServerShuttingDown', onServerShuttingDown);
events.on(serverNotifications, 'ServerRestarting', onServerRestarting);
events.on(serverNotifications, 'PackageInstalling', onPackageInstalling);
events.on(serverNotifications, 'PackageInstallationCompleted', onPackageInstallationCompleted);
events.on(serverNotifications, 'Sessions', onSessionsUpdate);
events.on(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate);
DashboardPage.lastAppUpdateCheck = null;
reloadSystemInfo(page, ApiClient);
if (!page.userActivityLog) {
page.userActivityLog = new ActivityLog({
serverId: ApiClient.serverId(),
element: page.querySelector(".userActivityItems")
element: page.querySelector('.userActivityItems')
});
}
if (ApiClient.isMinServerVersion("3.4.1.25")) {
if (ApiClient.isMinServerVersion('3.4.1.25')) {
if (!page.serverActivityLog) {
page.serverActivityLog = new ActivityLog({
serverId: ApiClient.serverId(),
element: page.querySelector(".serverActivityItems")
element: page.querySelector('.serverActivityItems')
});
}
}
@ -824,21 +816,21 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
loading.hide();
}
});
view.addEventListener("viewbeforehide", function () {
view.addEventListener('viewbeforehide', function () {
var apiClient = ApiClient;
events.off(serverNotifications, "RestartRequired", onRestartRequired);
events.off(serverNotifications, "ServerShuttingDown", onServerShuttingDown);
events.off(serverNotifications, "ServerRestarting", onServerRestarting);
events.off(serverNotifications, "PackageInstalling", onPackageInstalling);
events.off(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted);
events.off(serverNotifications, "Sessions", onSessionsUpdate);
events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate);
events.off(serverNotifications, 'RestartRequired', onRestartRequired);
events.off(serverNotifications, 'ServerShuttingDown', onServerShuttingDown);
events.off(serverNotifications, 'ServerRestarting', onServerRestarting);
events.off(serverNotifications, 'PackageInstalling', onPackageInstalling);
events.off(serverNotifications, 'PackageInstallationCompleted', onPackageInstallationCompleted);
events.off(serverNotifications, 'Sessions', onSessionsUpdate);
events.off(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate);
if (apiClient) {
DashboardPage.stopInterval(apiClient);
}
});
view.addEventListener("viewdestroy", function () {
view.addEventListener('viewdestroy', function () {
var page = this;
var userActivityLog = page.userActivityLog;