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

module resolution for appRouter and moved controllers to dir

This commit is contained in:
vitorsemeano 2019-02-24 20:07:41 +00:00
parent d49fee2a29
commit 9c758a8d85
49 changed files with 464 additions and 530 deletions

View file

@ -1,140 +0,0 @@
define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-linkbutton"], function($, loading, libraryMenu, globalize, connectionManager) {
"use strict";
function populateHistory(packageInfo, page) {
for (var html = "", i = 0, length = Math.min(packageInfo.versions.length, 10); i < length; i++) {
var version = packageInfo.versions[i];
html += '<h2 style="margin:.5em 0;">' + version.versionStr + " (" + version.classification + ")</h2>", html += '<div style="margin-bottom:1.5em;">' + version.description + "</div>"
}
$("#revisionHistory", page).html(html)
}
function populateVersions(packageInfo, page, installedPlugin) {
for (var html = "", i = 0, length = packageInfo.versions.length; i < length; i++) {
var version = packageInfo.versions[i];
html += '<option value="' + version.versionStr + "|" + version.classification + '">' + version.versionStr + " (" + version.classification + ")</option>"
}
var selectmenu = $("#selectVersion", page).html(html);
installedPlugin || $("#pCurrentVersion", page).hide().html("");
var packageVersion = packageInfo.versions.filter(function(current) {
return "Release" == current.classification
})[0];
if (packageVersion || (packageVersion = packageInfo.versions.filter(function(current) {
return "Beta" == current.classification
})[0]), packageVersion) {
var val = packageVersion.versionStr + "|" + packageVersion.classification;
selectmenu.val(val)
}
}
function renderPackage(pkg, installedPlugins, pluginSecurityInfo, page) {
var installedPlugin = installedPlugins.filter(function(ip) {
return ip.Name == pkg.name
})[0];
populateVersions(pkg, page, installedPlugin);
populateHistory(pkg, page);
$(".pluginName", page).html(pkg.name);
if ("Server" == pkg.targetSystem) {
$("#btnInstallDiv", page).removeClass("hide");
$("#nonServerMsg", page).hide();
$("#pSelectVersion", page).removeClass("hide");
} else {
$("#btnInstallDiv", page).addClass("hide");
$("#pSelectVersion", page).addClass("hide");
var msg = globalize.translate("MessageInstallPluginFromApp");
$("#nonServerMsg", page).html(msg).show();
}
if (pkg.shortDescription) {
$("#tagline", page).show().html(pkg.shortDescription);
} else {
$("#tagline", page).hide();
}
$("#overview", page).html(pkg.overview || "");
$("#developer", page).html(pkg.owner);
if (pkg.richDescUrl) {
$("#pViewWebsite", page).show();
$("#pViewWebsite a", page).attr("href", pkg.richDescUrl);
} else {
$("#pViewWebsite", page).hide();
}
if (pkg.previewImage || pkg.thumbImage) {
var img = pkg.previewImage ? pkg.previewImage : pkg.thumbImage;
$("#pPreviewImage", page).show().html("<img class='pluginPreviewImg' src='" + img + "' style='max-width: 100%;' />");
} else {
$("#pPreviewImage", page).hide().html("");
}
if (installedPlugin) {
var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled").replace("{0}", "<strong>" + installedPlugin.Version + "</strong>");
$("#pCurrentVersion", page).show().html(currentVersionText);
} else {
$("#pCurrentVersion", page).hide().html("");
}
loading.hide();
}
function alertText(options) {
require(["alert"], function(alert) {
alert(options)
})
}
function performInstallation(page, packageName, guid, updateClass, version) {
var developer = $("#developer", page).html().toLowerCase(),
alertCallback = function(confirmed) {
confirmed && (loading.show(), page.querySelector("#btnInstall").disabled = !0, ApiClient.installPlugin(packageName, guid, updateClass, version).then(function() {
loading.hide(), alertText(globalize.translate("PluginInstalledMessage"))
}))
};
if ("luke" != developer && "ebr" != developer) {
loading.hide();
var msg = globalize.translate("MessagePluginInstallDisclaimer");
msg += "<br/>", msg += "<br/>", msg += globalize.translate("PleaseConfirmPluginInstallation"), require(["confirm"], function(confirm) {
confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function() {
alertCallback(!0)
}, function() {
alertCallback(!1)
})
})
} else alertCallback(!0)
}
return function(view, params) {
var onSubmit = function() {
loading.show();
var page = $(this).parents("#addPluginPage")[0],
name = params.name,
guid = params.guid;
return ApiClient.getInstalledPlugins().then(function(plugins) {
var installedPlugin = plugins.filter(function(ip) {
return ip.Name == name
})[0],
vals = $("#selectVersion", page).val().split("|"),
version = vals[0];
installedPlugin && installedPlugin.Version == version ? (loading.hide(), Dashboard.alert({
message: globalize.translate("MessageAlreadyInstalled"),
title: globalize.translate("HeaderPluginInstallation")
})) : performInstallation(page, name, guid, vals[1], version)
}), !1
};
$(".addPluginForm", view).on("submit", onSubmit), view.addEventListener("viewshow", function() {
var page = this;
loading.show();
var name = params.name,
guid = params.guid,
promise1 = ApiClient.getPackageInfo(name, guid),
promise2 = ApiClient.getInstalledPlugins();
connectionManager.getRegistrationInfo("themes", ApiClient, {
viewOnly: !0
}), Promise.all([promise1, promise2]).then(function(responses) {
connectionManager.getRegistrationInfo("themes", ApiClient, {
viewOnly: !0
}).then(function() {
renderPackage(responses[0], responses[1], {
IsMBSupporter: !0
}, page)
}, function() {
renderPackage(responses[0], responses[1], {}, page)
})
})
})
}
});

View file

@ -1,65 +0,0 @@
define(["appSettings", "loading", "browser", "emby-linkbutton"], function(appSettings, loading, browser) {
"use strict";
function handleConnectionResult(page, result) {
loading.hide();
switch (result.State) {
case "SignedIn":
var apiClient = result.ApiClient;
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient), Dashboard.navigate("home.html");
break;
case "ServerSignIn":
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id, false, "none");
break;
case "ServerSelection":
Dashboard.navigate("selectserver.html", false, "none");
break;
case "ServerUpdateNeeded":
Dashboard.alert({
message: Globalize.translate("ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
});
break;
case "Unavailable":
Dashboard.alert({
message: Globalize.translate("MessageUnableToConnectToServer"),
title: Globalize.translate("HeaderConnectionFailure")
});
}
}
function submitManualServer(page) {
var host = page.querySelector("#txtServerHost").value;
var port = page.querySelector("#txtServerPort").value;
if (port) {
host += ":" + port;
}
loading.show();
ConnectionManager.connectToAddress(host, {
enableAutoLogin: appSettings.enableAutoLogin()
}).then(function(result) {
handleConnectionResult(page, result);
}, function() {
handleConnectionResult(page, {
State: "Unavailable"
});
});
}
return function(view, params) {
view.querySelector(".manualServerForm").addEventListener("submit", onManualServerSubmit);
view.querySelector(".btnCancelManualServer").addEventListener("click", goBack);
function onManualServerSubmit(e) {
submitManualServer(view);
e.preventDefault();
return false;
}
function goBack() {
require(["appRouter"], function(appRouter) {
appRouter.back();
});
}
}
});

View file

@ -1,918 +0,0 @@
define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "humanedate", "listViewStyle", "emby-linkbutton", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog) {
"use strict";
function onConnectionHelpClick(evt) {
evt.preventDefault();
return false;
}
function buttonEnabled(elem, enabled) {
if (enabled) {
elem.setAttribute("disabled", "");
elem.removeAttribute("disabled");
} else {
elem.setAttribute("disabled", "disabled");
}
}
function onEditServerNameClick(evt) {
var page = dom.parentWithClass(this, "page");
require(["prompt"], function (prompt) {
prompt({
label: globalize.translate("LabelFriendlyServerName"),
description: globalize.translate("LabelFriendlyServerNameHelp"),
value: page.querySelector(".serverNameHeader").innerHTML,
confirmText: globalize.translate("ButtonSave")
}).then(function (value) {
loading.show();
ApiClient.getServerConfiguration().then(function (config) {
config.ServerName = value;
ApiClient.updateServerConfiguration(config).then(function () {
page.querySelector(".serverNameHeader").innerHTML = value;
loading.hide();
});
});
});
});
evt.preventDefault();
return false;
}
function showPlaybackInfo(btn, session) {
require(["alert"], function (alert) {
var showTranscodeReasons;
var title;
var text = [];
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
var isDirectStream = "DirectStream" === displayPlayMethod;
var isTranscode = "Transcode" === displayPlayMethod;
if (isDirectStream) {
title = globalize.translate("DirectStreaming");
text.push(globalize.translate("DirectStreamHelp1"));
text.push("<br/>");
text.push(globalize.translate("DirectStreamHelp2"));
} else if (isTranscode) {
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"));
session.TranscodingInfo.TranscodeReasons.forEach(function (transcodeReason) {
text.push(globalize.translate("" + transcodeReason));
});
}
}
alert({
text: text.join("<br/>"),
title: title
});
});
}
function showSendMessageForm(btn, session) {
require(["prompt"], function (prompt) {
prompt({
title: globalize.translate("HeaderSendMessage"),
label: globalize.translate("LabelMessageText"),
confirmText: globalize.translate("ButtonSend")
}).then(function (text) {
if (text) {
connectionManager.getApiClient(session.ServerId).sendMessageCommand(session.Id, {
Text: text,
TimeoutMs: 5e3
});
}
});
});
}
function showOptionsMenu(btn, session) {
require(["actionsheet"], function (actionsheet) {
var menuItems = [];
if (session.ServerId && session.DeviceId !== connectionManager.deviceId()) {
menuItems.push({
name: globalize.translate("SendMessage"),
id: "sendmessage"
});
}
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
menuItems.push({
name: globalize.translate("ViewPlaybackInfo"),
id: "transcodinginfo"
});
}
return actionsheet.show({
items: menuItems,
positionTo: btn
}).then(function (id) {
switch (id) {
case "sendmessage":
showSendMessageForm(btn, session);
break;
case "transcodinginfo":
showPlaybackInfo(btn, session);
}
});
});
}
function onActiveDevicesClick(evt) {
var btn = dom.parentWithClass(evt.target, "sessionCardButton");
if (btn) {
var card = dom.parentWithClass(btn, "card");
if (card) {
var sessionId = card.id;
var session = (DashboardPage.sessionsList || []).filter(function (dashboardSession) {
return "session" + dashboardSession.Id === sessionId;
})[0];
if (session) {
if (btn.classList.contains("btnCardOptions")) {
showOptionsMenu(btn, session);
} else if (btn.classList.contains("btnSessionInfo")) {
showPlaybackInfo(btn, session);
} 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");
}
}
}
}
}
function filterSessions(sessions) {
var list = [];
var minActiveDate = new Date().getTime() - 9e5;
for (var i = 0, length = sessions.length; i < length; i++) {
var session = sessions[i];
if (!session.NowPlayingItem && !session.UserId) {
continue;
}
if (datetime.parseISO8601Date(session.LastActivityDate, true).getTime() >= minActiveDate) {
list.push(session);
}
}
return list;
}
function refreshActiveRecordings(view, apiClient) {
apiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(),
IsInProgress: true,
Fields: "CanDelete,PrimaryImageAspectRatio",
EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb,Backdrop"
}).then(function (result) {
var itemsContainer = view.querySelector(".activeRecordingItems");
if (!result.Items.length) {
view.querySelector(".activeRecordingsSection").classList.add("hide");
return void (itemsContainer.innerHTML = "");
}
view.querySelector(".activeRecordingsSection").classList.remove("hide");
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
defaultShape: "backdrop",
showTitle: true,
showParentTitle: true,
coverImage: true,
cardLayout: false,
centerText: true,
preferThumb: "auto",
overlayText: false,
overlayMoreButton: true,
action: "none",
centerPlayButton: true
});
imageLoader.lazyChildren(itemsContainer);
});
}
function reloadSystemInfo(view, apiClient) {
apiClient.getSystemInfo().then(function (systemInfo) {
view.querySelector(".serverNameHeader").innerHTML = systemInfo.ServerName;
var localizedVersion = globalize.translate("LabelVersionNumber", systemInfo.Version);
if (systemInfo.SystemUpdateLevel && "Release" != systemInfo.SystemUpdateLevel) {
localizedVersion += " " + globalize.translate("Option" + systemInfo.SystemUpdateLevel).toLowerCase();
}
if (systemInfo.CanSelfRestart) {
view.querySelector("#btnRestartServer").classList.remove("hide");
} else {
view.querySelector("#btnRestartServer").classList.add("hide");
}
view.querySelector("#appVersionNumber").innerHTML = localizedVersion;
if (systemInfo.SupportsHttps) {
view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPorts", systemInfo.HttpServerPortNumber, systemInfo.HttpsPortNumber);
} else {
view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPort", systemInfo.HttpServerPortNumber);
}
DashboardPage.renderUrls(view, systemInfo);
DashboardPage.renderPaths(view, systemInfo);
});
}
function renderInfo(view, sessions, forceUpdate) {
sessions = filterSessions(sessions);
renderActiveConnections(view, sessions);
loading.hide();
}
function pollForInfo(view, apiClient, forceUpdate) {
apiClient.getSessions({
ActiveWithinSeconds: 960
}).then(function (sessions) {
renderInfo(view, sessions, forceUpdate);
});
apiClient.getScheduledTasks().then(function (tasks) {
renderRunningTasks(view, tasks);
});
}
function renderActiveConnections(view, sessions) {
var html = "";
DashboardPage.sessionsList = sessions;
var parentElement = view.querySelector(".activeDevices");
var cardElem = parentElement.querySelector(".card");
if (cardElem) {
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);
if (elem) {
DashboardPage.updateSession(elem, session);
} else {
var nowPlayingItem = session.NowPlayingItem;
var className = "scalableCard card activeSession backdropCard backdropCard-scalable";
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
className += " transcodingSession";
}
html += '<div class="' + className + '" id="' + rowId + '">';
html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += '<div class="cardContent">';
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem);
if (imgUrl) {
html += '<div class="sessionNowPlayingContent sessionNowPlayingContent-withbackground"';
html += ' data-src="' + imgUrl + '" style="display:inline-block;background-image:url(\'' + imgUrl + "');\"";
} else {
html += '<div class="sessionNowPlayingContent"';
}
html += "></div>";
html += '<div class="sessionNowPlayingInnerContent">';
html += '<div class="sessionAppInfo">';
var clientImage = DashboardPage.getClientImage(session);
if (clientImage) {
html += clientImage;
}
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="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>";
if (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
html += '<div class="sessionTranscodingFramerate">' + session.TranscodingInfo.Framerate + " fps</div>";
} else {
html += '<div class="sessionTranscodingFramerate"></div>';
}
var nowPlayingName = DashboardPage.getNowPlayingName(session);
html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">';
html += nowPlayingName.html;
html += "</div>";
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
html += '<progress class="playbackProgress" min="0" max="100" value="' + 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks + '"></progress>';
} else {
html += '<progress class="playbackProgress hide" min="0" max="100"></progress>';
}
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
html += '<progress class="transcodingProgress" min="0" max="100" value="' + session.TranscodingInfo.CompletionPercentage.toFixed(1) + '"></progress>';
} else {
html += '<progress class="transcodingProgress hide" min="0" max="100"></progress>';
}
html += "</div>";
html += "</div>";
html += "</div>";
html += '<div class="sessionCardFooter cardFooter">';
html += '<div class="sessionCardButtons flex align-items-center justify-content-center">';
var btnCssClass;
btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId() ? "" : " hide";
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionPlayPause paper-icon-button-light ' + btnCssClass + '"><i class="md-icon">&#xE034;</i></button>';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionStop paper-icon-button-light ' + btnCssClass + '"><i class="md-icon">&#xE047;</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") + '"><i class="md-icon">&#xE88E;</i></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="md-icon">&#xE0C9;</i></button>';
html += "</div>";
html += '<div class="sessionNowPlayingStreamInfo" style="padding:.5em 0 1em;">';
html += DashboardPage.getSessionNowPlayingStreamInfo(session);
html += "</div>";
html += '<div class="flex align-items-center justify-content-center">';
var userImage = DashboardPage.getUserImage(session);
html += userImage ? '<img style="height:1.71em;border-radius:50px;margin-right:.5em;" src="' + userImage + '" />' : '<div style="height:1.71em;"></div>';
html += '<div class="sessionUserName" style="text-transform:uppercase;">';
html += DashboardPage.getUsersHtml(session) || "&nbsp;";
html += "</div>";
html += "</div>";
html += "</div>";
html += "</div>";
html += "</div>";
}
}
parentElement.insertAdjacentHTML("beforeend", html);
var deadSessionElem = parentElement.querySelector(".deadSession");
if (deadSessionElem) {
deadSessionElem.parentNode.removeChild(deadSessionElem);
}
}
function renderRunningTasks(view, tasks) {
var html = "";
tasks = tasks.filter(function (task) {
if ("Idle" != task.State) {
return !task.IsHidden;
}
return false;
});
if (tasks.length) {
view.querySelector(".runningTasksContainer").classList.remove("hide");
} else {
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/>";
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="md-icon">cancel</i></button>';
} else if (task.State === "Cancelling") {
html += '<span style="color:#cc0000;">' + globalize.translate("LabelStopping") + "</span>";
}
html += "</p>";
}
view.querySelector("#divRunningTasks").innerHTML = html;
}
window.DashboardPage = {
renderPaths: function (page, systemInfo) {
page.querySelector("#cachePath").innerHTML = systemInfo.CachePath;
page.querySelector("#logPath").innerHTML = systemInfo.LogPath;
page.querySelector("#transcodePath").innerHTML = systemInfo.TranscodingTempPath;
page.querySelector("#metadataPath").innerHTML = systemInfo.InternalMetadataPath;
page.querySelector("#webPath").innerHTML = systemInfo.WebPath;
},
startInterval: function (apiClient) {
apiClient.sendMessage("SessionsStart", "0,1500");
apiClient.sendMessage("ScheduledTasksInfoStart", "0,1000");
},
stopInterval: function (apiClient) {
apiClient.sendMessage("SessionsStop");
apiClient.sendMessage("ScheduledTasksInfoStop");
},
getSessionNowPlayingStreamInfo: function (session) {
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 (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
html += " (" + session.TranscodingInfo.Framerate + " fps)";
}
showTranscodingInfo = true;
} else if (displayPlayMethod === "DirectPlay") {
html += globalize.translate("DirectPlaying");
}
if (showTranscodingInfo) {
var line = [];
if (session.TranscodingInfo) {
if (session.TranscodingInfo.Bitrate) {
if (session.TranscodingInfo.Bitrate > 1e6) {
line.push((session.TranscodingInfo.Bitrate / 1e6).toFixed(1) + " Mbps");
} else {
line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + " kbps");
}
}
if (session.TranscodingInfo.Container) {
line.push(session.TranscodingInfo.Container);
}
if (session.TranscodingInfo.VideoCodec) {
line.push(session.TranscodingInfo.VideoCodec);
}
if (session.TranscodingInfo.AudioCodec && session.TranscodingInfo.AudioCodec != session.TranscodingInfo.Container) {
line.push(session.TranscodingInfo.AudioCodec);
}
}
if (line.length) {
html += " - " + line.join(" ");
}
}
return html || "&nbsp;";
},
getSessionNowPlayingTime: function (session) {
var nowPlayingItem = session.NowPlayingItem;
var html = "";
if (nowPlayingItem) {
if (session.PlayState.PositionTicks) {
html += datetime.getDisplayRunningTime(session.PlayState.PositionTicks);
} else {
html += "--:--:--";
}
html += " / ";
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks);
} else {
html += "--:--:--";
}
return html;
}
return html;
},
getAppSecondaryText: function (session) {
return session.Client + " " + session.ApplicationVersion;
},
getNowPlayingName: function (session) {
var imgUrl = "";
var nowPlayingItem = session.NowPlayingItem;
if (!nowPlayingItem) {
return {
html: "Last seen " + humane_date(session.LastActivityDate),
image: imgUrl
};
}
var topText = itemHelper.getDisplayName(nowPlayingItem);
var bottomText = "";
if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
bottomText = topText;
topText = nowPlayingItem.Artists[0];
} else {
if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
bottomText = topText;
topText = nowPlayingItem.SeriesName || nowPlayingItem.Album;
} else if (nowPlayingItem.ProductionYear) {
bottomText = nowPlayingItem.ProductionYear;
}
}
if (nowPlayingItem.ImageTags && nowPlayingItem.ImageTags.Logo) {
imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.Id, {
tag: nowPlayingItem.ImageTags.Logo,
maxHeight: 24,
maxWidth: 130,
type: "Logo"
});
} else {
if (nowPlayingItem.ParentLogoImageTag) {
imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.ParentLogoItemId, {
tag: nowPlayingItem.ParentLogoImageTag,
maxHeight: 24,
maxWidth: 130,
type: "Logo"
});
}
}
if (imgUrl) {
topText = '<img src="' + imgUrl + '" style="max-height:24px;max-width:130px;" />';
}
return {
html: bottomText ? topText + "<br/>" + bottomText : topText,
image: imgUrl
};
},
getUsersHtml: function (session) {
var html = [];
if (session.UserId) {
html.push(session.UserName);
}
for (var i = 0, length = session.AdditionalUsers.length; i < length; i++) {
html.push(session.AdditionalUsers[i].UserName);
}
return html.join(", ");
},
getUserImage: function (session) {
if (session.UserId && session.UserPrimaryImageTag) {
return ApiClient.getUserImageUrl(session.UserId, {
tag: session.UserPrimaryImageTag,
height: 24,
type: "Primary"
});
}
return null;
},
updateSession: function (row, session) {
row.classList.remove("deadSession");
var nowPlayingItem = session.NowPlayingItem;
if (nowPlayingItem) {
row.classList.add("playingSession");
} else {
row.classList.remove("playingSession");
}
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");
}
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length) {
row.querySelector(".btnSessionInfo").classList.remove("hide");
} else {
row.querySelector(".btnSessionInfo").classList.add("hide");
}
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");
} else {
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 = "&#xE034;";
}
row.querySelector(".sessionNowPlayingStreamInfo").innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session);
row.querySelector(".sessionNowPlayingTime").innerHTML = DashboardPage.getSessionNowPlayingTime(session);
row.querySelector(".sessionUserName").innerHTML = DashboardPage.getUsersHtml(session) || "&nbsp;";
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");
if (!(nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute("data-imgsrc"))) {
nowPlayingInfoElem.innerHTML = nowPlayingName.html;
nowPlayingInfoElem.setAttribute("data-imgsrc", nowPlayingName.image || "");
}
var playbackProgressElem = row.querySelector(".playbackProgress");
if (playbackProgressElem) {
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var position = session.PlayState.PositionTicks || 0;
var value = 100 * position / nowPlayingItem.RunTimeTicks;
playbackProgressElem.classList.remove("hide");
playbackProgressElem.value = value;
} else {
playbackProgressElem.classList.add("hide");
}
}
var transcodingProgress = row.querySelector(".transcodingProgress");
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
row.classList.add("transcodingSession");
transcodingProgress.value = session.TranscodingInfo.CompletionPercentage;
transcodingProgress.classList.remove("hide");
} else {
transcodingProgress.classList.add("hide");
row.classList.remove("transcodingSession");
}
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.classList.add("sessionNowPlayingContent-withbackground");
} else {
imgElem.classList.remove("sessionNowPlayingContent-withbackground");
}
}
},
getClientImage: function (connection) {
var iconUrl = (connection.Client.toLowerCase(), connection.DeviceName.toLowerCase(), connection.AppIconUrl);
if (iconUrl) {
if (-1 === iconUrl.indexOf("://")) {
iconUrl = ApiClient.getUrl(iconUrl);
}
return "<img src='" + iconUrl + "' />";
}
return null;
},
getNowPlayingImageUrl: function (item) {
if (item && item.BackdropImageTags && item.BackdropImageTags.length) {
return ApiClient.getScaledImageUrl(item.Id, {
type: "Backdrop",
width: 275,
tag: item.BackdropImageTags[0]
});
}
if (item && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
return ApiClient.getScaledImageUrl(item.ParentBackdropItemId, {
type: "Backdrop",
width: 275,
tag: item.ParentBackdropImageTags[0]
});
}
if (item && item.BackdropImageTag) {
return ApiClient.getScaledImageUrl(item.BackdropItemId, {
type: "Backdrop",
width: 275,
tag: item.BackdropImageTag
});
}
var imageTags = (item || {}).ImageTags || {};
if (item && imageTags.Thumb) {
return ApiClient.getScaledImageUrl(item.Id, {
type: "Thumb",
width: 275,
tag: imageTags.Thumb
});
}
if (item && item.ParentThumbImageTag) {
return ApiClient.getScaledImageUrl(item.ParentThumbItemId, {
type: "Thumb",
width: 275,
tag: item.ParentThumbImageTag
});
}
if (item && item.ThumbImageTag) {
return ApiClient.getScaledImageUrl(item.ThumbItemId, {
type: "Thumb",
width: 275,
tag: item.ThumbImageTag
});
}
if (item && imageTags.Primary) {
return ApiClient.getScaledImageUrl(item.Id, {
type: "Primary",
width: 275,
tag: imageTags.Primary
});
}
if (item && item.PrimaryImageTag) {
return ApiClient.getScaledImageUrl(item.PrimaryImageItemId, {
type: "Primary",
width: 275,
tag: item.PrimaryImageTag
});
}
return null;
},
systemUpdateTaskKey: "SystemUpdateTask",
renderUrls: function (page, systemInfo) {
var helpButton = '<a is="emby-linkbutton" class="raised raised-mini button-submit" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Connectivity" target="_blank" style="margin-left:.7em;font-size:84%;padding:.2em .8em;">' + globalize.translate("ButtonHelp") + "</a>";
var localUrlElem = page.querySelector(".localUrl");
var externalUrlElem = page.querySelector(".externalUrl");
if (systemInfo.LocalAddress) {
var localAccessHtml = globalize.translate("LabelLocalAccessUrl", '<a is="emby-linkbutton" class="button-link" href="' + systemInfo.LocalAddress + '" target="_blank">' + systemInfo.LocalAddress + "</a>");
localUrlElem.innerHTML = localAccessHtml + helpButton;
localUrlElem.classList.remove("hide");
} else {
localUrlElem.classList.add("hide");
}
if (systemInfo.WanAddress) {
var externalUrl = systemInfo.WanAddress;
var remoteAccessHtml = globalize.translate("LabelRemoteAccessUrl", '<a is="emby-linkbutton" class="button-link" href="' + externalUrl + '" target="_blank">' + externalUrl + "</a>");
externalUrlElem.innerHTML = remoteAccessHtml + helpButton;
externalUrlElem.classList.remove("hide");
} else {
externalUrlElem.classList.add("hide");
}
},
stopTask: function (btn, id) {
var page = dom.parentWithClass(btn, "page");
ApiClient.stopScheduledTask(id).then(function () {
pollForInfo(page, ApiClient);
});
},
restart: function (btn) {
require(["confirm"], function (confirm) {
confirm({
title: globalize.translate("HeaderRestart"),
text: globalize.translate("MessageConfirmRestart"),
confirmText: globalize.translate("ButtonRestart"),
primary: "cancel"
}).then(function () {
var page = dom.parentWithClass(btn, "page");
buttonEnabled(page.querySelector("#btnRestartServer"), false);
buttonEnabled(page.querySelector("#btnShutdown"), false);
Dashboard.restartServer();
});
});
},
shutdown: function (btn) {
require(["confirm"], function (confirm) {
confirm({
title: globalize.translate("HeaderShutdown"),
text: globalize.translate("MessageConfirmShutdown"),
confirmText: globalize.translate("ButtonShutdown"),
primary: "cancel"
}).then(function () {
var page = dom.parentWithClass(btn, "page");
buttonEnabled(page.querySelector("#btnRestartServer"), false);
buttonEnabled(page.querySelector("#btnShutdown"), false);
ApiClient.shutdownServer();
});
});
}
};
return function (view, params) {
function onRestartRequired(evt, apiClient) {
if (apiClient.serverId() === serverId) {
renderHasPendingRestart(view, apiClient, true);
}
}
function onServerShuttingDown(evt, apiClient) {
if (apiClient.serverId() === serverId) {
renderHasPendingRestart(view, apiClient, true);
}
}
function onServerRestarting(evt, apiClient) {
if (apiClient.serverId() === serverId) {
renderHasPendingRestart(view, apiClient, true);
}
}
function onPackageInstalling(evt, apiClient) {
if (apiClient.serverId() === serverId) {
pollForInfo(view, apiClient, true);
reloadSystemInfo(view, apiClient);
}
}
function onPackageInstallationCompleted(evt, apiClient) {
if (apiClient.serverId() === serverId) {
pollForInfo(view, apiClient, true);
reloadSystemInfo(view, apiClient);
}
}
function onSessionsUpdate(evt, apiClient, info) {
if (apiClient.serverId() === serverId) {
renderInfo(view, info);
}
}
function onScheduledTasksUpdate(evt, apiClient, info) {
if (apiClient.serverId() === serverId) {
renderRunningTasks(view, info);
}
}
var serverId = ApiClient.serverId();
view.querySelector(".btnConnectionHelp").addEventListener("click", onConnectionHelpClick);
view.querySelector(".btnEditServerName").addEventListener("click", onEditServerNameClick);
view.querySelector(".activeDevices").addEventListener("click", onActiveDevicesClick);
view.addEventListener("viewshow", function () {
var page = this;
var apiClient = ApiClient;
if (apiClient) {
loading.show();
pollForInfo(page, apiClient);
DashboardPage.startInterval(apiClient);
// TODO we currently don't support packages and thus these events are useless
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")
});
}
if (ApiClient.isMinServerVersion("3.4.1.25")) {
if (!page.serverActivityLog) {
page.serverActivityLog = new ActivityLog({
serverId: ApiClient.serverId(),
element: page.querySelector(".serverActivityItems")
});
}
}
refreshActiveRecordings(view, apiClient);
loading.hide();
}
});
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);
if (apiClient) {
DashboardPage.stopInterval(apiClient);
}
});
view.addEventListener("viewdestroy", function () {
var page = this;
var userActivityLog = page.userActivityLog;
if (userActivityLog) {
userActivityLog.destroy();
}
var serverActivityLog = page.serverActivityLog;
if (serverActivityLog) {
serverActivityLog.destroy();
}
});
};
});

View file

@ -1,17 +0,0 @@
define(["loading"], function(loading) {
"use strict";
function reload(context, itemId) {
loading.show(), itemId ? require(["metadataEditor"], function(metadataEditor) {
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id)
}) : (context.querySelector(".editPageInnerContent").innerHTML = "", loading.hide())
}
return function(view, params) {
view.addEventListener("viewshow", function() {
reload(this, MetadataEditor.getCurrentItemId())
}), MetadataEditor.setCurrentItemId(null), view.querySelector(".libraryTree").addEventListener("itemclicked", function(event) {
var data = event.detail;
data.id != MetadataEditor.getCurrentItemId() && (MetadataEditor.setCurrentItemId(data.id), reload(view, data.id))
})
}
});

View file

@ -1,34 +0,0 @@
define([], function() {
"use strict";
function processForgotPasswordResult(result) {
if ("ContactAdmin" == result.Action) return void Dashboard.alert({
message: Globalize.translate("MessageContactAdminToResetPassword"),
title: Globalize.translate("HeaderForgotPassword")
});
if ("InNetworkRequired" == result.Action) return void Dashboard.alert({
message: Globalize.translate("MessageForgotPasswordInNetworkRequired"),
title: Globalize.translate("HeaderForgotPassword")
});
if ("PinCode" == result.Action) {
var msg = Globalize.translate("MessageForgotPasswordFileCreated");
return msg += "<br/>", msg += "<br/>", msg += result.PinFile, msg += "<br/>", void Dashboard.alert({
message: msg,
title: Globalize.translate("HeaderForgotPassword")
})
}
}
return function(view, params) {
function onSubmit(e) {
return ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword"),
dataType: "json",
data: {
EnteredUsername: view.querySelector("#txtName").value
}
}).then(processForgotPasswordResult), e.preventDefault(), !1
}
view.querySelector("form").addEventListener("submit", onSubmit)
}
});

View file

@ -1,33 +0,0 @@
define([], function() {
"use strict";
function processForgotPasswordResult(result) {
if (result.Success) {
var msg = Globalize.translate("MessagePasswordResetForUsers");
return msg += "<br/>", msg += "<br/>", msg += result.UsersReset.join("<br/>"), void Dashboard.alert({
message: msg,
title: Globalize.translate("HeaderPasswordReset"),
callback: function() {
window.location.href = "index.html"
}
})
}
Dashboard.alert({
message: Globalize.translate("MessageInvalidForgotPasswordPin"),
title: Globalize.translate("HeaderPasswordReset")
})
}
return function(view, params) {
function onSubmit(e) {
return ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword/Pin"),
dataType: "json",
data: {
Pin: view.querySelector("#txtPin").value
}
}).then(processForgotPasswordResult), e.preventDefault(), !1
}
view.querySelector("form").addEventListener("submit", onSubmit)
}
});

File diff suppressed because it is too large Load diff

View file

@ -1,43 +0,0 @@
define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function(datetime, cardBuilder, imageLoader, appHost, loading) {
"use strict";
function renderTimers(context, timers) {
var html = "";
appHost.supports("imageanalysis");
html += cardBuilder.getCardsHtml({
items: timers,
shape: "auto",
defaultShape: "portrait",
showTitle: !0,
cardLayout: !1,
preferThumb: "auto",
coverImage: !0,
overlayText: !1,
showSeriesTimerTime: !0,
showSeriesTimerChannel: !0,
centerText: !0,
overlayMoreButton: !0,
lines: 3
});
var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem), loading.hide()
}
function reload(context, promise) {
loading.show(), promise.then(function(result) {
renderTimers(context, result.Items)
})
}
var query = {
SortBy: "SortName",
SortOrder: "Ascending"
};
return function(view, params, tabContent) {
var timersPromise, self = this;
self.preRender = function() {
timersPromise = ApiClient.getLiveTvSeriesTimers(query)
}, self.renderTab = function() {
reload(tabContent, timersPromise)
}
}
});

View file

@ -1,376 +0,0 @@
define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) {
"use strict";
function enableScrollX() {
return !layoutManager.desktop;
}
function getBackdropShape() {
if (enableScrollX()) {
return "overflowBackdrop";
}
return "backdrop";
}
function getPortraitShape() {
if (enableScrollX()) {
return "overflowPortrait";
}
return "portrait";
}
function getLimit() {
if (enableScrollX()) {
return 12;
}
return 9;
}
function loadRecommendedPrograms(page) {
loading.show();
var limit = getLimit();
if (enableScrollX()) {
limit *= 2;
}
ApiClient.getLiveTvRecommendedPrograms({
userId: Dashboard.getCurrentUserId(),
IsAiring: true,
limit: limit,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Thumb,Backdrop",
EnableTotalRecordCount: false,
Fields: "ChannelInfo,PrimaryImageAspectRatio"
}).then(function (result) {
renderItems(page, result.Items, "activeProgramItems", "play", {
showAirDateTime: false,
showAirEndTime: true
});
loading.hide();
});
}
function reload(page, enableFullRender) {
if (enableFullRender) {
loadRecommendedPrograms(page);
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsMovie: false,
IsSports: false,
IsKids: false,
IsNews: false,
IsSeries: true,
EnableTotalRecordCount: false,
Fields: "ChannelInfo,PrimaryImageAspectRatio",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) {
renderItems(page, result.Items, "upcomingEpisodeItems");
});
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsMovie: true,
EnableTotalRecordCount: false,
Fields: "ChannelInfo",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) {
renderItems(page, result.Items, "upcomingTvMovieItems", null, {
shape: getPortraitShape(),
preferThumb: null,
showParentTitle: false
});
});
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsSports: true,
EnableTotalRecordCount: false,
Fields: "ChannelInfo,PrimaryImageAspectRatio",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) {
renderItems(page, result.Items, "upcomingSportsItems");
});
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsKids: true,
EnableTotalRecordCount: false,
Fields: "ChannelInfo,PrimaryImageAspectRatio",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) {
renderItems(page, result.Items, "upcomingKidsItems");
});
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsNews: true,
EnableTotalRecordCount: false,
Fields: "ChannelInfo,PrimaryImageAspectRatio",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) {
renderItems(page, result.Items, "upcomingNewsItems", null, {
showParentTitleOrTitle: true,
showTitle: false,
showParentTitle: false
});
});
}
}
function renderItems(page, items, sectionClass, overlayButton, cardOptions) {
var html = cardBuilder.getCardsHtml(Object.assign({
items: items,
preferThumb: "auto",
inheritThumb: false,
shape: enableScrollX() ? "autooverflow" : "auto",
defaultShape: getBackdropShape(),
showParentTitle: true,
showTitle: true,
centerText: true,
coverImage: true,
overlayText: false,
lazy: true,
overlayPlayButton: "play" === overlayButton,
overlayMoreButton: "more" === overlayButton,
overlayInfoButton: "info" === overlayButton,
allowBottomPadding: !enableScrollX(),
showAirTime: true,
showAirDateTime: true
}, cardOptions || {}));
var elem = page.querySelector("." + sectionClass);
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
}
function getTabs() {
return [
{ name: globalize.translate("Programs") },
{ name: globalize.translate("TabGuide") },
{ name: globalize.translate("TabChannels") },
{ name: globalize.translate("TabRecordings") },
{ name: globalize.translate("HeaderSchedule") },
{ name: globalize.translate("TabSeries") },
{ name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" }
];
}
function setScrollClasses(elem, scrollX) {
if (scrollX) {
elem.classList.add("hiddenScrollX");
if (layoutManager.tv) {
elem.classList.add("smoothScrollX");
}
elem.classList.add("scrollX");
elem.classList.remove("vertical-wrap");
} else {
elem.classList.remove("hiddenScrollX");
elem.classList.remove("smoothScrollX");
elem.classList.remove("scrollX");
elem.classList.add("vertical-wrap");
}
}
function getDefaultTabIndex(folderId) {
if (userSettings.get("landing-" + folderId) === "guide") {
return 1;
}
return 0;
}
return function (view, params) {
function enableFullRender() {
return new Date().getTime() - lastFullRender > 3e5;
}
function onBeforeTabChange(evt) {
preLoadTab(view, parseInt(evt.detail.selectedTabIndex));
}
function onTabChange(evt) {
var previousTabController = tabControllers[parseInt(evt.detail.previousIndex)];
if (previousTabController && previousTabController.onHide) {
previousTabController.onHide();
}
loadTab(view, parseInt(evt.detail.selectedTabIndex));
}
function getTabContainers() {
return view.querySelectorAll(".pageTabContent");
}
function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
}
function getTabController(page, index, callback) {
var depends = [];
// TODO int is a little hard to read
switch (index) {
case 0:
break;
case 1:
depends.push("scripts/livetvguide");
break;
case 2:
depends.push("scripts/livetvchannels");
break;
case 3:
depends.push("scripts/livetvrecordings");
break;
case 4:
depends.push("scripts/livetvschedule");
break;
case 5:
depends.push("scripts/livetvseriestimers");
break;
case 6:
depends.push("scripts/searchtab");
}
require(depends, function (controllerFactory) {
var tabContent;
if (0 == index) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent;
}
var controller = tabControllers[index];
if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (0 === index) {
controller = self;
} else if (6 === index) {
controller = new controllerFactory(view, tabContent, {
collectionType: "livetv"
});
} else {
controller = new controllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
}
function preLoadTab(page, index) {
getTabController(page, index, function (controller) {
if (renderedTabs.indexOf(index) === -1 && controller.preRender) {
controller.preRender();
}
});
}
function loadTab(page, index) {
currentTabIndex = index;
getTabController(page, index, function (controller) {
initialTabIndex = null;
if (1 === index) {
document.body.classList.add("autoScrollY");
} else {
document.body.classList.remove("autoScrollY");
}
if (-1 == renderedTabs.indexOf(index)) {
if (1 === index) {
renderedTabs.push(index);
}
controller.renderTab();
} else if (controller.onShow) {
controller.onShow();
}
currentTabController = controller;
});
}
function onInputCommand(evt) {
if (evt.detail.command === "search") {
evt.preventDefault();
Dashboard.navigate("search.html?collectionType=livetv");
}
}
var isViewRestored;
var self = this;
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex("livetv"));
var initialTabIndex = currentTabIndex;
var lastFullRender = 0;
[].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function (link) {
var href = link.href;
if (href) {
link.href = href + "&serverId=" + ApiClient.serverId();
}
});
self.initTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
var containers = tabContent.querySelectorAll(".itemsContainer");
for (var i = 0, length = containers.length; i < length; i++) {
setScrollClasses(containers[i], enableScrollX());
}
};
self.renderTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
if (enableFullRender()) {
reload(tabContent, true);
lastFullRender = new Date().getTime();
} else {
reload(tabContent);
}
};
var currentTabController;
var tabControllers = [];
var renderedTabs = [];
view.addEventListener("viewbeforeshow", function (evt) {
isViewRestored = evt.detail.isRestored;
initTabs();
});
view.addEventListener("viewshow", function (evt) {
isViewRestored = evt.detail.isRestored;
if (!isViewRestored) {
mainTabsManager.selectedTabIndex(initialTabIndex);
}
inputManager.on(window, onInputCommand);
});
view.addEventListener("viewbeforehide", function (e__u) {
if (currentTabController && currentTabController.onHide) {
currentTabController.onHide();
}
document.body.classList.remove("autoScrollY");
inputManager.off(window, onInputCommand);
});
view.addEventListener("viewdestroy", function (evt) {
tabControllers.forEach(function (tabController) {
if (tabController.destroy) {
tabController.destroy();
}
});
});
};
});

View file

@ -1,98 +0,0 @@
define(["appSettings", "dom", "connectionManager", "loading", "cardStyle", "emby-checkbox"], function(appSettings, dom, connectionManager, loading) {
"use strict";
function authenticateUserByName(page, apiClient, username, password) {
loading.show(), apiClient.authenticateUserByName(username, password).then(function(result) {
var newUrl, user = result.User,
serverId = getParameterByName("serverid");
newUrl = user.Policy.IsAdministrator && !serverId ? "dashboard.html" : "home.html", loading.hide(), Dashboard.onServerChanged(user.Id, result.AccessToken, apiClient), Dashboard.navigate(newUrl)
}, function(response) {
page.querySelector("#txtManualName").value = "", page.querySelector("#txtManualPassword").value = "", loading.hide(), 401 == response.status ? require(["toast"], function(toast) {
toast(Globalize.translate("MessageInvalidUser"))
}) : showServerConnectionFailure()
})
}
function showServerConnectionFailure() {
Dashboard.alert({
message: Globalize.translate("MessageUnableToConnectToServer"),
title: Globalize.translate("HeaderConnectionFailure")
})
}
function showManualForm(context, showCancel, focusPassword) {
context.querySelector(".chkRememberLogin").checked = appSettings.enableAutoLogin(), context.querySelector(".manualLoginForm").classList.remove("hide"), context.querySelector(".visualLoginForm").classList.add("hide"), focusPassword ? context.querySelector("#txtManualPassword").focus() : context.querySelector("#txtManualName").focus(), showCancel ? context.querySelector(".btnCancel").classList.remove("hide") : context.querySelector(".btnCancel").classList.add("hide")
}
function getRandomMetroColor() {
var index = Math.floor(Math.random() * (metroColors.length - 1));
return metroColors[index]
}
function getMetroColor(str) {
if (str) {
for (var character = String(str.substr(0, 1).charCodeAt()), sum = 0, i = 0; i < character.length; i++) sum += parseInt(character.charAt(i));
var index = String(sum).substr(-1);
return metroColors[index]
}
return getRandomMetroColor()
}
function loadUserList(context, apiClient, users) {
for (var html = "", i = 0, length = users.length; i < length; i++) {
var user = users[i];
html += '<button type="button" class="card squareCard scalableCard squareCard-scalable"><div class="cardBox cardBox-bottompadded">', html += '<div class="cardScalable">', html += '<div class="cardPadder cardPadder-square"></div>', html += '<div class="cardContent" data-haspw="' + user.HasPassword + '" data-username="' + user.Name + '" data-userid="' + user.Id + '">';
var imgUrl;
if (user.PrimaryImageTag) imgUrl = apiClient.getUserImageUrl(user.Id, {
width: 300,
tag: user.PrimaryImageTag,
type: "Primary"
}), html += '<div class="cardImageContainer coveredImage coveredImage-noScale" style="background-image:url(\'' + imgUrl + "');\"></div>";
else {
var background = getMetroColor(user.Id);
imgUrl = "css/images/logindefault.png", html += '<div class="cardImageContainer coveredImage coveredImage-noScale" style="background-image:url(\'' + imgUrl + "');background-color:" + background + ';"></div>'
}
html += "</div>", html += "</div>", html += '<div class="cardFooter visualCardBox-cardFooter">', html += '<div class="cardText singleCardText cardTextCentered">' + user.Name + "</div>", html += "</div>", html += "</div>", html += "</button>"
}
context.querySelector("#divUsers").innerHTML = html
}
var metroColors = ["#6FBD45", "#4BB3DD", "#4164A5", "#E12026", "#800080", "#E1B222", "#008040", "#0094FF", "#FF00C7", "#FF870F", "#7F0037"];
return function(view, params) {
function getApiClient() {
var serverId = params.serverid;
return serverId ? connectionManager.getOrCreateApiClient(serverId) : ApiClient
}
function showVisualForm() {
view.querySelector(".visualLoginForm").classList.remove("hide"), view.querySelector(".manualLoginForm").classList.add("hide")
}
view.querySelector("#divUsers").addEventListener("click", function(e) {
var card = dom.parentWithClass(e.target, "card"),
cardContent = card ? card.querySelector(".cardContent") : null;
if (cardContent) {
var context = view,
id = cardContent.getAttribute("data-userid"),
name = cardContent.getAttribute("data-username"),
haspw = cardContent.getAttribute("data-haspw");
"manual" == id ? (context.querySelector("#txtManualName").value = "", showManualForm(context, !0)) : "false" == haspw ? authenticateUserByName(context, getApiClient(), name, "") : (context.querySelector("#txtManualName").value = name, context.querySelector("#txtManualPassword").value = "", showManualForm(context, !0, !0))
}
}), view.querySelector(".manualLoginForm").addEventListener("submit", function(e) {
appSettings.enableAutoLogin(view.querySelector(".chkRememberLogin").checked);
var apiClient = getApiClient();
return authenticateUserByName(view, apiClient, view.querySelector("#txtManualName").value, view.querySelector("#txtManualPassword").value), e.preventDefault(), !1
}), view.querySelector(".btnForgotPassword").addEventListener("click", function() {
Dashboard.navigate("forgotpassword.html")
}), view.querySelector(".btnCancel").addEventListener("click", showVisualForm), view.querySelector(".btnManual").addEventListener("click", function() {
view.querySelector("#txtManualName").value = "", showManualForm(view, !0)
}), view.addEventListener("viewshow", function(e) {
loading.show();
var apiClient = getApiClient();
apiClient.getPublicUsers().then(function(users) {
users.length ? users.length && users[0].EnableAutoLogin ? authenticateUserByName(view, apiClient, users[0].Name, "") : (showVisualForm(), loadUserList(view, apiClient, users)) : (view.querySelector("#txtManualName").value = "", showManualForm(view, !1, !1)), loading.hide()
});
apiClient.getJSON(apiClient.getUrl("Branding/Configuration")).then(function(options) {
view.querySelector(".disclaimer").textContent = options.LoginDisclaimer || ""
});
});
}
});

View file

@ -1,276 +0,0 @@
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-itemscontainer", "emby-tabs", "emby-button"], function(events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager) {
"use strict";
function enableScrollX() {
return !layoutManager.desktop
}
function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait"
}
function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop"
}
function loadLatest(page, userId, parentId) {
var options = {
IncludeItemTypes: "Movie",
Limit: 18,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
var allowBottomPadding = !enableScrollX(),
container = page.querySelector("#recentlyAddedItems");
cardBuilder.buildCards(items, {
itemsContainer: container,
shape: getPortraitShape(),
scalable: !0,
overlayPlayButton: !0,
allowBottomPadding: allowBottomPadding,
showTitle: !0,
showYear: !0,
centerText: !0
})
})
}
function loadResume(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth,
options = {
SortBy: "DatePlayed",
SortOrder: "Descending",
IncludeItemTypes: "Movie",
Filters: "IsResumable",
Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3,
Recursive: !0,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
CollapseBoxSetItems: !1,
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getItems(userId, options).then(function(result) {
result.Items.length ? page.querySelector("#resumableSection").classList.remove("hide") : page.querySelector("#resumableSection").classList.add("hide");
var allowBottomPadding = !enableScrollX(),
container = page.querySelector("#resumableItems");
cardBuilder.buildCards(result.Items, {
itemsContainer: container,
preferThumb: !0,
shape: getThumbShape(),
scalable: !0,
overlayPlayButton: !0,
allowBottomPadding: allowBottomPadding,
cardLayout: !1,
showTitle: !0,
showYear: !0,
centerText: !0
})
})
}
function getRecommendationHtml(recommendation) {
var html = "",
title = "";
switch (recommendation.RecommendationType) {
case "SimilarToRecentlyPlayed":
title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName);
break;
case "SimilarToLikedItem":
title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName);
break;
case "HasDirectorFromRecentlyPlayed":
case "HasLikedDirector":
title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName);
break;
case "HasActorFromRecentlyPlayed":
case "HasLikedActor":
title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName)
}
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + "</h2>";
var allowBottomPadding = !0;
return enableScrollX() ? (allowBottomPadding = !1, html += '<div is="emby-itemscontainer" class="itemsContainer scrollX hiddenScrollX padded-left padded-right">') : html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">', html += cardBuilder.getCardsHtml(recommendation.Items, {
shape: getPortraitShape(),
scalable: !0,
overlayPlayButton: !0,
allowBottomPadding: allowBottomPadding
}), html += "</div>", html += "</div>"
}
function loadSuggestions(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth,
url = ApiClient.getUrl("Movies/Recommendations", {
userId: userId,
categoryLimit: 6,
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
});
ApiClient.getJSON(url).then(function(recommendations) {
if (!recommendations.length) return page.querySelector(".noItemsMessage").classList.remove("hide"), void(page.querySelector(".recommendations").innerHTML = "");
var html = recommendations.map(getRecommendationHtml).join("");
page.querySelector(".noItemsMessage").classList.add("hide");
var recs = page.querySelector(".recommendations");
recs.innerHTML = html, imageLoader.lazyChildren(recs)
})
}
function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
}
function initSuggestedTab(page, tabContent) {
for (var containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX())
}
function loadSuggestionsTab(view, params, tabContent) {
var parentId = params.topParentId,
userId = ApiClient.getCurrentUserId();
console.log("loadSuggestionsTab"), loadResume(tabContent, userId, parentId), loadLatest(tabContent, userId, parentId), loadSuggestions(tabContent, userId, parentId)
}
function getTabs() {
return [{
name: Globalize.translate("Movies")
}, {
name: Globalize.translate("TabSuggestions")
}, {
name: Globalize.translate("TabTrailers")
}, {
name: Globalize.translate("TabFavorites")
}, {
name: Globalize.translate("TabCollections")
}, {
name: Globalize.translate("TabGenres")
}, {
name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}]
}
function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) {
case "suggestions":
return 1;
case "favorites":
return 3;
case "collections":
return 4;
case "genres":
return 5;
default:
return 0
}
}
return function(view, params) {
function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
}
function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex)
}
function getTabContainers() {
return view.querySelectorAll(".pageTabContent")
}
function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
}
function getTabController(page, index, callback) {
var depends = [];
switch (index) {
case 0:
depends.push("scripts/movies");
break;
case 1:
break;
case 2:
depends.push("scripts/movietrailers");
break;
case 3:
depends.push("scripts/movies");
break;
case 4:
depends.push("scripts/moviecollections");
break;
case 5:
depends.push("scripts/moviegenres");
break;
case 6:
depends.push("scripts/searchtab")
}
require(depends, function(controllerFactory) {
var tabContent;
index === suggestionsTabIndex && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = index === suggestionsTabIndex ? self : 6 === index ? new controllerFactory(view, tabContent, {
collectionType: "movies",
parentId: params.topParentId
}) : 0 === index || 3 === index ? new controllerFactory(view, params, tabContent, {
mode: index ? "favorites" : "movies"
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
})
}
function preLoadTab(page, index) {
getTabController(page, index, function(controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
})
}
function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) {
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
})
}
function onPlaybackStop(e, state) {
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange())
}
function onInputCommand(e) {
switch (e.detail.command) {
case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId)
}
}
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
initialTabIndex = currentTabIndex,
suggestionsTabIndex = 1;
self.initTab = function() {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
initSuggestedTab(view, tabContent);
}, self.renderTab = function() {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
loadSuggestionsTab(view, params, tabContent)
};
var tabControllers = [],
renderedTabs = [];
view.addEventListener("viewshow", function(e) {
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
}) : (view.setAttribute("data-title", Globalize.translate("TabMovies")), libraryMenu.setTitle(Globalize.translate("TabMovies")))
}
events.on(playbackManager, "playbackstop", onPlaybackStop), inputManager.on(window, onInputCommand)
}), view.addEventListener("viewbeforehide", function(e) {
inputManager.off(window, onInputCommand)
}), view.addEventListener("viewdestroy", function(e) {
tabControllers.forEach(function(t) {
t.destroy && t.destroy()
})
})
}
});

View file

@ -1,279 +0,0 @@
define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function(browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager) {
"use strict";
function itemsPerRow() {
var screenWidth = dom.getWindowSize().innerWidth;
return screenWidth >= 1920 ? 9 : screenWidth >= 1200 ? 12 : screenWidth >= 1e3 ? 10 : 8
}
function enableScrollX() {
return !layoutManager.desktop
}
function getSquareShape() {
return enableScrollX() ? "overflowSquare" : "square"
}
function loadLatest(page, parentId) {
loading.show();
var userId = ApiClient.getCurrentUserId(),
options = {
IncludeItemTypes: "Audio",
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
var elem = page.querySelector("#recentlyAddedSongs"),
supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, elem.innerHTML = cardBuilder.getCardsHtml({
items: items,
showUnplayedIndicator: !1,
showLatestItemsPopup: !1,
shape: getSquareShape(),
showTitle: !0,
showParentTitle: !0,
lazy: !0,
centerText: !supportsImageAnalysis,
overlayPlayButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis,
vibrant: supportsImageAnalysis,
coverImage: !0
}), imageLoader.lazyChildren(elem), loading.hide()
})
}
function loadRecentlyPlayed(page, parentId) {
var options = {
SortBy: "DatePlayed",
SortOrder: "Descending",
IncludeItemTypes: "Audio",
Limit: itemsPerRow(),
Recursive: !0,
Fields: "PrimaryImageAspectRatio,AudioInfo",
Filters: "IsPlayed",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
var elem = page.querySelector("#recentlyPlayed");
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
var itemsContainer = elem.querySelector(".itemsContainer"),
supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items,
showUnplayedIndicator: !1,
shape: getSquareShape(),
showTitle: !0,
showParentTitle: !0,
action: "instantmix",
lazy: !0,
centerText: !supportsImageAnalysis,
overlayMoreButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis,
vibrant: supportsImageAnalysis,
coverImage: !0
}), imageLoader.lazyChildren(itemsContainer)
})
}
function loadFrequentlyPlayed(page, parentId) {
var options = {
SortBy: "PlayCount",
SortOrder: "Descending",
IncludeItemTypes: "Audio",
Limit: itemsPerRow(),
Recursive: !0,
Fields: "PrimaryImageAspectRatio,AudioInfo",
Filters: "IsPlayed",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
var elem = page.querySelector("#topPlayed");
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
var itemsContainer = elem.querySelector(".itemsContainer"),
supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items,
showUnplayedIndicator: !1,
shape: getSquareShape(),
showTitle: !0,
showParentTitle: !0,
action: "instantmix",
lazy: !0,
centerText: !supportsImageAnalysis,
overlayMoreButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis,
vibrant: supportsImageAnalysis,
coverImage: !0
}), imageLoader.lazyChildren(itemsContainer)
})
}
function loadSuggestionsTab(page, tabContent, parentId) {
console.log("loadSuggestionsTab"), loadLatest(tabContent, parentId), loadRecentlyPlayed(tabContent, parentId), loadFrequentlyPlayed(tabContent, parentId), require(["components/favoriteitems"], function(favoriteItems) {
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"])
})
}
function getTabs() {
return [{
name: Globalize.translate("TabSuggestions")
}, {
name: Globalize.translate("TabAlbums")
}, {
name: Globalize.translate("TabAlbumArtists")
}, {
name: Globalize.translate("TabArtists")
}, {
name: Globalize.translate("TabPlaylists")
}, {
name: Globalize.translate("TabSongs")
}, {
name: Globalize.translate("TabGenres")
}, {
name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}]
}
function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) {
case "albums":
return 1;
case "albumartists":
return 2;
case "artists":
return 3;
case "playlists":
return 4;
case "songs":
return 5;
case "genres":
return 6;
default:
return 0
}
}
return function(view, params) {
function reload() {
loading.show();
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
loadSuggestionsTab(view, tabContent, params.topParentId)
}
function enableScrollX() {
return browser.mobile
}
function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
}
function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
}
function onTabChange(e) {
loadTab(view, parseInt(e.detail.selectedTabIndex))
}
function getTabContainers() {
return view.querySelectorAll(".pageTabContent")
}
function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
}
function getTabController(page, index, callback) {
var depends = [];
switch (index) {
case 0:
break;
case 1:
depends.push("scripts/musicalbums");
break;
case 2:
case 3:
depends.push("scripts/musicartists");
break;
case 4:
depends.push("scripts/musicplaylists");
break;
case 5:
depends.push("scripts/songs");
break;
case 6:
depends.push("scripts/musicgenres");
break;
case 7:
depends.push("scripts/searchtab")
}
require(depends, function(controllerFactory) {
var tabContent;
0 == index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 0 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
collectionType: "music",
parentId: params.topParentId
}) : new controllerFactory(view, params, tabContent), 2 == index ? controller.mode = "albumartists" : 3 == index && (controller.mode = "artists"), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
})
}
function preLoadTab(page, index) {
getTabController(page, index, function(controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
})
}
function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) {
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
})
}
function onInputCommand(e) {
switch (e.detail.command) {
case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId)
}
}
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
initialTabIndex = currentTabIndex;
self.initTab = function() {
for (var tabContent = view.querySelector(".pageTabContent[data-index='0']"), containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX())
}, self.renderTab = function() {
reload()
};
var tabControllers = [],
renderedTabs = [];
view.addEventListener("viewshow", function(e) {
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
}) : (view.setAttribute("data-title", Globalize.translate("TabMusic")), libraryMenu.setTitle(Globalize.translate("TabMusic")))
}
inputManager.on(window, onInputCommand)
}), view.addEventListener("viewbeforehide", function(e) {
inputManager.off(window, onInputCommand)
}), view.addEventListener("viewdestroy", function(e) {
tabControllers.forEach(function(t) {
t.destroy && t.destroy()
})
})
}
});

View file

@ -1,43 +0,0 @@
define(["apphost", "connectionManager", "listViewStyle", "emby-linkbutton"], function(appHost, connectionManager) {
"use strict";
return function(view, params) {
view.querySelector(".btnLogout").addEventListener("click", function() {
Dashboard.logout();
});
view.addEventListener("viewshow", function() {
var page = this;
var userId = params.userId || Dashboard.getCurrentUserId();
page.querySelector(".lnkDisplayPreferences").setAttribute("href", "mypreferencesdisplay.html?userId=" + userId);
page.querySelector(".lnkLanguagePreferences").setAttribute("href", "mypreferenceslanguages.html?userId=" + userId);
page.querySelector(".lnkSubtitleSettings").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
page.querySelector(".lnkHomeScreenPreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId);
page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId);
if (appHost.supports("multiserver")) {
page.querySelector(".selectServer").classList.remove("hide")
} else {
page.querySelector(".selectServer").classList.add("hide");
}
connectionManager.user(ApiClient).then(function(user) {
if (user.localUser && !user.localUser.EnableAutoLogin) {
view.querySelector(".btnLogout").classList.remove("hide");
} else {
view.querySelector(".btnLogout").classList.add("hide");
}
});
Dashboard.getCurrentUser().then(function(user) {
page.querySelector(".headerUser").innerHTML = user.Name;
if (user.Policy.IsAdministrator) {
page.querySelector(".adminSection").classList.remove("hide");
} else {
page.querySelector(".adminSection").classList.add("hide");
}
});
})
}
});

View file

@ -1,28 +0,0 @@
define(["displaySettings", "userSettingsBuilder", "userSettings"], function(DisplaySettings, userSettingsBuilder, currentUserSettings) {
"use strict";
return function(view, params) {
function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
}
var settingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
view.addEventListener("viewshow", function() {
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new DisplaySettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: !1,
enableSaveConfirmation: !1
})
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
window.removeEventListener("beforeunload", onBeforeUnload), hasChanges = !1, settingsInstance && settingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
}), view.addEventListener("viewdestroy", function() {
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
})
}
});

View file

@ -1,26 +0,0 @@
define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
"use strict";
return function(view, params) {
function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
}
var homescreenSettingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
view.addEventListener("viewshow", function() {
window.addEventListener("beforeunload", onBeforeUnload), homescreenSettingsInstance ? homescreenSettingsInstance.loadData() : homescreenSettingsInstance = new HomescreenSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".homeScreenSettingsContainer"),
userSettings: userSettings,
enableSaveButton: !1,
enableSaveConfirmation: !1
})
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, homescreenSettingsInstance && homescreenSettingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
homescreenSettingsInstance && (homescreenSettingsInstance.destroy(), homescreenSettingsInstance = null)
})
}
});

View file

@ -1,26 +0,0 @@
define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
"use strict";
return function(view, params) {
function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
}
var settingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
view.addEventListener("viewshow", function() {
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new PlaybackSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: !1,
enableSaveConfirmation: !1
})
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, settingsInstance && settingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
})
}
});

View file

@ -1,26 +0,0 @@
define(["subtitleSettings", "userSettingsBuilder", "userSettings"], function(SubtitleSettings, userSettingsBuilder, currentUserSettings) {
"use strict";
return function(view, params) {
function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
}
var subtitleSettingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
view.addEventListener("viewshow", function() {
window.addEventListener("beforeunload", onBeforeUnload), subtitleSettingsInstance ? subtitleSettingsInstance.loadData() : subtitleSettingsInstance = new SubtitleSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: !1,
enableSaveConfirmation: !1
})
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, subtitleSettingsInstance && subtitleSettingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
subtitleSettingsInstance && (subtitleSettingsInstance.destroy(), subtitleSettingsInstance = null)
})
}
});

View file

@ -1,145 +0,0 @@
define(["scripts/userpasswordpage", "loading", "libraryMenu", "apphost", "emby-linkbutton"], function (Userpasswordpage, loading, libraryMenu, appHost) {
"use strict";
function reloadUser(page) {
var userId = getParameterByName("userId");
loading.show();
ApiClient.getUser(userId).then(function (user) {
page.querySelector(".username").innerHTML = user.Name;
var uploadUserImage = page.querySelector("#uploadUserImage");
uploadUserImage.value = "";
uploadUserImage.dispatchEvent(new CustomEvent("change", {}));
libraryMenu.setTitle(user.Name);
var imageUrl = "css/images/logindefault.png";
if (user.PrimaryImageTag) {
imageUrl = ApiClient.getUserImageUrl(user.Id, {
height: 200,
tag: user.PrimaryImageTag,
type: "Primary"
});
}
var fldImage = page.querySelector("#fldImage");
fldImage.classList.remove("hide");
fldImage.innerHTML = "<img width='140px' src='" + imageUrl + "' />";
Dashboard.getCurrentUser().then(function (loggedInUser) {
if (appHost.supports("fileinput") && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
page.querySelector(".newImageForm").classList.remove("hide");
if (user.PrimaryImageTag) {
page.querySelector("#btnDeleteImage").classList.remove("hide");
} else {
page.querySelector("#btnDeleteImage").classList.add("hide");
}
} else {
page.querySelector(".newImageForm").classList.add("hide");
page.querySelector("#btnDeleteImage").classList.add("hide");
}
});
loading.hide();
});
}
function onFileReaderError(evt) {
loading.hide();
switch (evt.target.error.code) {
case evt.target.error.NOT_FOUND_ERR:
require(["toast"], function (toast) {
toast(Globalize.translate("FileNotFound"));
});
break;
case evt.target.error.NOT_READABLE_ERR:
require(["toast"], function (toast) {
toast(Globalize.translate("FileReadError"));
});
break;
case evt.target.error.ABORT_ERR:
break;
default:
require(["toast"], function (toast) {
toast(Globalize.translate("FileReadError"));
});
}
}
function onFileReaderAbort(evt) {
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("FileReadCancelled"));
});
}
function setFiles(page, files) {
var file = files[0];
if (!file || !file.type.match("image.*")) {
page.querySelector("#userImageOutput").innerHTML = "";
page.querySelector("#fldUpload").classList.add("hide");
return void (currentFile = null);
}
currentFile = file;
var reader = new FileReader();
reader.onerror = onFileReaderError;
reader.onloadstart = function () {
page.querySelector("#fldUpload").classList.add("hide");
};
reader.onabort = onFileReaderAbort;
reader.onload = function (evt) {
var html = ['<img style="max-width:100%;max-height:100%;" src="', evt.target.result, '" title="', escape(file.name), '"/>'].join("");
page.querySelector("#userImageOutput").innerHTML = html;
page.querySelector("#fldUpload").classList.remove("hide");
};
reader.readAsDataURL(file);
}
function onImageDragOver(evt) {
evt.preventDefault();
evt.originalEvent.dataTransfer.dropEffect = "Copy";
return false;
}
var currentFile;
return function (view, params) {
reloadUser(view);
new Userpasswordpage(view, params);
view.querySelector("#userImageDropZone").addEventListener("dragOver", onImageDragOver);
view.querySelector("#btnDeleteImage").addEventListener("click", function () {
require(["confirm"], function (confirm) {
confirm(Globalize.translate("DeleteImageConfirmation"), Globalize.translate("DeleteImage")).then(function () {
loading.show();
var userId = getParameterByName("userId");
ApiClient.deleteUserImage(userId, "primary").then(function () {
loading.hide();
reloadUser(view);
});
});
});
});
view.querySelector(".btnBrowse").addEventListener("click", function () {
view.querySelector("#uploadUserImage").click();
});
view.querySelector(".newImageForm").addEventListener("submit", function (evt) {
var file = currentFile;
if (!file || "image/png" != file.type && "image/jpeg" != file.type && "image/jpeg" != file.type) {
return false;
}
loading.show();
var userId = getParameterByName("userId");
ApiClient.uploadUserImage(userId, "Primary", file).then(function () {
loading.hide();
reloadUser(view);
});
evt.preventDefault();
return false;
});
view.querySelector("#uploadUserImage").addEventListener("change", function (evt) {
setFiles(view, evt.target.files);
});
};
});

View file

@ -1,60 +0,0 @@
define(["loading", "libraryMenu", "globalize", "listViewStyle", "emby-linkbutton"], function(loading, libraryMenu, globalize) {
"use strict";
function reload(page) {
loading.show();
ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")).then(function(list) {
var html = "";
var lastCategory = "";
var showHelp = true;
html += list.map(function(notification) {
var itemHtml = "";
if (notification.Category !== lastCategory) {
lastCategory = notification.Category;
if (lastCategory) {
itemHtml += "</div>";
itemHtml += "</div>";
}
itemHtml += '<div class="verticalSection verticalSection-extrabottompadding">';
itemHtml += '<div class="sectionTitleContainer" style="margin-bottom:1em;">';
itemHtml += '<h2 class="sectionTitle">';
itemHtml += notification.Category;
itemHtml += "</h2>";
if (showHelp) {
showHelp = false;
itemHtml += '<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Notifications">';
itemHtml += globalize.translate("Help");
itemHtml += "</a>";
}
itemHtml += "</div>";
itemHtml += '<div class="paperList">';
}
itemHtml += '<a class="listItem listItem-border" is="emby-linkbutton" data-ripple="false" href="notificationsetting.html?type=' + notification.Type + '">';
if (notification.Enabled) {
itemHtml += '<i class="listItemIcon md-icon">notifications_active</i>';
} else {
itemHtml += '<i class="listItemIcon md-icon" style="background-color:#999;">notifications_off</i>';
}
itemHtml += '<div class="listItemBody">';
itemHtml += '<div class="listItemBodyText">' + notification.Name + "</div>";
itemHtml += "</div>";
itemHtml += '<button type="button" is="paper-icon-button-light"><i class="md-icon">mode_edit</i></button>';
itemHtml += "</a>";
return itemHtml;
}).join("");
if (list.length) {
html += "</div>";
html += "</div>";
}
page.querySelector(".notificationList").innerHTML = html;
loading.hide();
})
}
return function(view, params) {
view.addEventListener("viewshow", function() {
reload(view);
});
}
});

View file

@ -1,11 +0,0 @@
define(["components/remotecontrol", "libraryMenu", "emby-button"], function(remotecontrolFactory, libraryMenu) {
"use strict";
return function(view, params) {
var remoteControl = new remotecontrolFactory;
remoteControl.init(view, view.querySelector(".remoteControlContent")), view.addEventListener("viewshow", function(e) {
libraryMenu.setTransparentMenu(!0), remoteControl && remoteControl.onShow()
}), view.addEventListener("viewbeforehide", function(e) {
libraryMenu.setTransparentMenu(!1), remoteControl && remoteControl.destroy()
})
}
});

View file

@ -1,176 +0,0 @@
define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", "emby-checkbox", "emby-select"], function (loading, libraryMenu, globalize) {
"use strict";
function reloadList(page) {
loading.show();
var promise1 = ApiClient.getAvailablePlugins(query);
var promise2 = ApiClient.getInstalledPlugins();
Promise.all([promise1, promise2]).then(function (responses) {
populateList({
catalogElement: page.querySelector("#pluginTiles"),
noItemsElement: page.querySelector("#noPlugins"),
availablePlugins: responses[0],
installedPlugins: responses[1]
});
});
}
function getHeaderText(category) {
category = category.replace(" ", "");
if ("Channel" === category) {
category = "Channels";
} else if ("Theme" === category) {
category = "Themes";
} else if ("LiveTV" === category) {
category = "HeaderLiveTV";
} else if ("ScreenSaver" === category) {
category = "HeaderScreenSavers";
}
return globalize.translate(category);
}
function populateList(options) {
var availablePlugins = options.availablePlugins;
var installedPlugins = options.installedPlugins;
var allPlugins = availablePlugins.filter(function (plugin) {
plugin.category = plugin.category || "General";
plugin.categoryDisplayName = getHeaderText(plugin.category);
if (!options.categories || -1 != options.categories.indexOf(plugin.category)) {
if (!options.targetSystem || plugin.targetSystem == options.targetSystem) {
return "UserInstalled" == plugin.type;
}
}
return false;
});
availablePlugins = allPlugins.sort(function (a, b) {
if (a.category > b.category) {
return 1;
} else if (b.category > a.category) {
return -1;
}
if (a.name > b.name) {
return 1;
} else if (b.name > a.name) {
return -1;
}
return 0;
});
var length;
var plugin;
var currentCategory;
var html = "";
var hasOpenTag = false;
currentCategory = null;
if (options.showCategory === false) {
html += '<div class="itemsContainer vertical-wrap">';
hasOpenTag = true;
}
for (var i = 0; i < availablePlugins.length; i++) {
plugin = availablePlugins[i];
var category = plugin.categoryDisplayName;
if (category != currentCategory) {
if (false !== options.showCategory) {
if (currentCategory) {
hasOpenTag = false;
html += "</div>";
html += "</div>";
}
html += '<div class="verticalSection">';
html += '<h2 class="sectionTitle sectionTitle-cards">' + category + "</h2>";
html += '<div class="itemsContainer vertical-wrap">';
hasOpenTag = true;
}
currentCategory = category;
}
html += getPluginHtml(plugin, options, installedPlugins);
}
if (hasOpenTag) {
html += "</div>";
html += "</div>";
}
if (!availablePlugins.length && options.noItemsElement) {
options.noItemsElement.classList.add("hide");
}
options.catalogElement.innerHTML = html;
loading.hide();
}
function getPluginHtml(plugin, options, installedPlugins) {
var html = "";
var href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid;
if (options.context) {
href += "&context=" + options.context;
}
var target = plugin.externalUrl ? ' target="_blank"' : "";
html += "<div class='card backdropCard'>";
html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + href + '"' + target + ">";
if (plugin.thumbImage) {
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.thumbImage + "');\">";
html += "</div>";
} else {
html += '<i class="cardImageIcon md-icon">&#xE2C7;</i>';
}
html += "</a>";
html += "</div>";
html += '<div class="cardFooter">';
html += "<div class='cardText'>";
html += plugin.name;
html += "</div>";
var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function (ip) {
return ip.Id == plugin.guid;
})[0];
html += "<div class='cardText cardText-secondary'>";
html += installedPlugin ? globalize.translate("LabelVersionInstalled").replace("{0}", installedPlugin.Version) : "&nbsp;";
html += "</div>";
html += "</div>";
html += "</div>";
return html += "</div>";
}
function getTabs() {
return [{
href: "plugins.html",
name: globalize.translate("TabMyPlugins")
}, {
href: "plugincatalog.html",
name: globalize.translate("TabCatalog")
}];
}
var query = {
TargetSystems: "Server",
IsAppStoreSafe: true,
IsAdult: false
};
window.PluginCatalog = {
renderCatalog: populateList
};
return function (view, params) {
view.querySelector("#selectSystem").addEventListener("change", function () {
query.TargetSystems = this.value;
reloadList(view);
});
view.addEventListener("viewshow", function () {
libraryMenu.setTabs("plugins", 1, getTabs);
reloadList(this);
});
};
});

450
src/scripts/routes.js Normal file
View file

@ -0,0 +1,450 @@
define([
"emby-button",
"emby-input",
"scripts/livetvcomponents",
"paper-icon-button-light",
"emby-itemscontainer",
"emby-collapse",
"emby-select",
"livetvcss",
"emby-checkbox",
"emby-slider",
"listViewStyle",
"dashboardcss"], function () {
function defineRoute(newRoute, dictionary) {
var baseRoute = Emby.Page.baseUrl();
var path = newRoute.path;
path = path.replace(baseRoute, "");
console.log("Defining route: " + path);
newRoute.dictionary = newRoute.dictionary || dictionary || "core";
Emby.Page.addRoute(path, newRoute);
}
console.log("Defining core routes");
defineRoute({
path: "/addplugin.html",
autoFocus: false,
roles: "admin",
controller: "addpluginpage"
});
defineRoute({
path: "/appservices.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/autoorganizelog.html",
roles: "admin"
});
defineRoute({
path: "/channelsettings.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/addserver.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "addserver"
});
defineRoute({
path: "/dashboard.html",
autoFocus: false,
roles: "admin",
controller: "dashboardpage"
});
defineRoute({
path: "/dashboardgeneral.html",
controller: "dashboardgeneral",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/dashboardhosting.html",
autoFocus: false,
roles: "admin",
controller: "dashboardhosting"
});
defineRoute({
path: "/devices/devices.html",
autoFocus: false,
roles: "admin",
controller: "devices"
});
defineRoute({
path: "/devices/device.html",
autoFocus: false,
roles: "admin",
controller: "device"
});
defineRoute({
path: "/dlnaprofile.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/dlnaprofiles.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/dlnaserversettings.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/dlnasettings.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/edititemmetadata.html",
controller: "edititemmetadata",
autoFocus: false
});
defineRoute({
path: "/encodingsettings.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/opensubtitles.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/forgotpassword.html",
anonymous: true,
startup: true,
controller: "forgotpassword"
});
defineRoute({
path: "/forgotpasswordpin.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "forgotpasswordpin"
});
defineRoute({
path: "/home.html",
autoFocus: false,
controller: "home",
transition: "fade",
type: "home"
});
defineRoute({
path: "/list/list.html",
autoFocus: false,
controller: "list",
transition: "fade"
});
defineRoute({
path: "/index.html",
autoFocus: false,
isDefaultRoute: true
});
defineRoute({
path: "/itemdetails.html",
controller: "itemdetailpage",
autoFocus: false,
transition: "fade"
});
defineRoute({
path: "/library.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/librarydisplay.html",
autoFocus: false,
roles: "admin",
controller: "librarydisplay"
});
defineRoute({
path: "/librarysettings.html",
autoFocus: false,
roles: "admin",
controller: "librarysettings"
});
defineRoute({
path: "/livetv.html",
controller: "livetvsuggested",
autoFocus: false,
transition: "fade"
});
defineRoute({
path: "/livetvguideprovider.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/livetvseriestimer.html",
autoFocus: false,
controller: "livetvseriestimer"
});
defineRoute({
path: "/livetvsettings.html",
autoFocus: false
});
defineRoute({
path: "/livetvstatus.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/livetvtuner.html",
autoFocus: false,
roles: "admin",
controller: "livetvtuner"
});
defineRoute({
path: "/log.html",
roles: "admin",
controller: "logpage"
});
defineRoute({
path: "/login.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "loginpage"
});
defineRoute({
path: "/metadataadvanced.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/metadataimages.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/metadatanfo.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/movies.html",
autoFocus: false,
controller: "moviesrecommended",
transition: "fade"
});
defineRoute({
path: "/music.html",
controller: "musicrecommended",
autoFocus: false,
transition: "fade"
});
defineRoute({
path: "/mypreferencesdisplay.html",
autoFocus: false,
transition: "fade",
controller: "mypreferencesdisplay"
});
defineRoute({
path: "/mypreferenceshome.html",
autoFocus: false,
transition: "fade",
controller: "mypreferenceshome"
});
defineRoute({
path: "/mypreferencessubtitles.html",
autoFocus: false,
transition: "fade",
controller: "mypreferencessubtitles"
});
defineRoute({
path: "/mypreferenceslanguages.html",
autoFocus: false,
transition: "fade",
controller: "mypreferenceslanguages"
});
defineRoute({
path: "/mypreferencesmenu.html",
autoFocus: false,
transition: "fade",
controller: "mypreferencescommon"
});
defineRoute({
path: "/myprofile.html",
autoFocus: false,
transition: "fade",
controller: "myprofile"
});
defineRoute({
path: "/notificationsetting.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/notificationsettings.html",
controller: "notificationsettings",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/nowplaying.html",
controller: "nowplayingpage",
autoFocus: false,
transition: "fade",
fullscreen: true,
supportsThemeMedia: true,
enableMediaControl: false
});
defineRoute({
path: "/playbackconfiguration.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/plugincatalog.html",
autoFocus: false,
roles: "admin",
controller: "plugincatalogpage"
});
defineRoute({
path: "/plugins.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/scheduledtask.html",
autoFocus: false,
roles: "admin",
controller: "scheduledtaskpage"
});
defineRoute({
path: "/scheduledtasks.html",
autoFocus: false,
roles: "admin",
controller: "scheduledtaskspage"
});
defineRoute({
path: "/search.html",
controller: "searchpage"
});
defineRoute({
path: "/selectserver.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "selectserver"
});
defineRoute({
path: "/serveractivity.html",
autoFocus: false,
roles: "admin",
controller: "serveractivity"
});
defineRoute({
path: "/serversecurity.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/streamingsettings.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/support.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/tv.html",
autoFocus: false,
controller: "tvrecommended",
transition: "fade"
});
defineRoute({
path: "/useredit.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/userlibraryaccess.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/usernew.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/userparentalcontrol.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/userpassword.html",
autoFocus: false,
controller: "userpasswordpage"
});
defineRoute({
path: "/userprofiles.html",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/wizardremoteaccess.html",
autoFocus: false,
anonymous: true,
controller: "wizardremoteaccess"
});
defineRoute({
path: "/wizardfinish.html",
autoFocus: false,
anonymous: true,
controller: "wizardfinishpage"
});
defineRoute({
path: "/wizardlibrary.html",
autoFocus: false,
anonymous: true
});
defineRoute({
path: "/wizardsettings.html",
autoFocus: false,
anonymous: true,
controller: "wizardsettings"
});
defineRoute({
path: "/wizardstart.html",
autoFocus: false,
anonymous: true,
controller: "wizardstart"
});
defineRoute({
path: "/wizarduser.html",
controller: "wizarduserpage",
autoFocus: false,
anonymous: true
});
defineRoute({
path: "/videoosd.html",
transition: "fade",
controller: "videoosd",
autoFocus: false,
type: "video-osd",
supportsThemeMedia: true,
fullscreen: true,
enableMediaControl: false
});
defineRoute({
path: "/configurationpage",
autoFocus: false,
enableCache: false,
enableContentQueryString: true,
roles: "admin"
});
defineRoute({
path: "/",
isDefaultRoute: true,
autoFocus: false,
});
});

View file

@ -1,111 +0,0 @@
define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function($, loading, datetime, dom, globalize) {
"use strict";
function fillTimeOfDay(select) {
for (var options = [], i = 0; i < 864e5; i += 9e5) options.push({
name: ScheduledTaskPage.getDisplayTime(1e4 * i),
value: 1e4 * i
});
select.innerHTML = options.map(function(o) {
return '<option value="' + o.value + '">' + o.name + "</option>"
}).join("")
}
Array.prototype.remove = function(from, to) {
var rest = this.slice((to || from) + 1 || this.length);
return this.length = from < 0 ? this.length + from : from, this.push.apply(this, rest)
};
var ScheduledTaskPage = {
refreshScheduledTask: function(view) {
loading.show();
var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) {
ScheduledTaskPage.loadScheduledTask(view, task)
})
},
loadScheduledTask: function(view, task) {
$(".taskName", view).html(task.Name), $("#pTaskDescription", view).html(task.Description), require(["listViewStyle"], function() {
ScheduledTaskPage.loadTaskTriggers(view, task)
}), loading.hide()
},
loadTaskTriggers: function(context, task) {
var html = "";
html += '<div class="paperList">';
for (var i = 0, length = task.Triggers.length; i < length; i++) {
var trigger = task.Triggers[i];
if (html += '<div class="listItem listItem-border">', html += '<i class="md-icon listItemIcon">schedule</i>', trigger.MaxRuntimeTicks ? html += '<div class="listItemBody two-line">' : html += '<div class="listItemBody">', html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + "</div>", trigger.MaxRuntimeTicks) {
html += '<div class="listItemBodyText secondary">';
var hours = trigger.MaxRuntimeTicks / 36e9;
html += 1 == hours ? globalize.translate("ValueTimeLimitSingleHour") : globalize.translate("ValueTimeLimitMultiHour", hours), html += "</div>"
}
html += "</div>", html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>', html += "</div>"
}
html += "</div>", context.querySelector(".taskTriggers").innerHTML = html
},
getTriggerFriendlyName: function(trigger) {
if ("DailyTrigger" == trigger.Type) return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
if ("WeeklyTrigger" == trigger.Type) return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) return "On wake from sleep";
if ("IntervalTrigger" == trigger.Type) {
var hours = trigger.IntervalTicks / 36e9;
return .25 == hours ? "Every 15 minutes" : .5 == hours ? "Every 30 minutes" : .75 == hours ? "Every 45 minutes" : 1 == hours ? "Every hour" : "Every " + hours + " hours"
}
return "StartupTrigger" == trigger.Type ? "On application startup" : trigger.Type
},
getDisplayTime: function(ticks) {
var ms = ticks / 1e4,
now = new Date;
return now.setHours(0, 0, 0, 0), now.setTime(now.getTime() + ms), datetime.getDisplayTime(now)
},
showAddTriggerPopup: function(view) {
$("#selectTriggerType", view).val("DailyTrigger"), view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {})), $("#popupAddTrigger", view).removeClass("hide")
},
confirmDeleteTrigger: function(view, index) {
require(["confirm"], function(confirm) {
confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function() {
ScheduledTaskPage.deleteTrigger(view, index)
})
})
},
deleteTrigger: function(view, index) {
loading.show();
var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) {
task.Triggers.remove(index), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() {
ScheduledTaskPage.refreshScheduledTask(view)
})
})
},
refreshTriggerFields: function(page, triggerType) {
"DailyTrigger" == triggerType ? ($("#fldTimeOfDay", page).show(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).attr("required", "required")) : "WeeklyTrigger" == triggerType ? ($("#fldTimeOfDay", page).show(), $("#fldDayOfWeek", page).show(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).attr("required", "required")) : "SystemEventTrigger" == triggerType ? ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).show(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).removeAttr("required")) : "IntervalTrigger" == triggerType ? ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).show(), $("#selectTimeOfDay", page).removeAttr("required")) : "StartupTrigger" == triggerType && ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).removeAttr("required"))
},
getTriggerToAdd: function(page) {
var trigger = {
Type: $("#selectTriggerType", page).val()
};
"DailyTrigger" == trigger.Type ? trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val() : "WeeklyTrigger" == trigger.Type ? (trigger.DayOfWeek = $("#selectDayOfWeek", page).val(), trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val()) : "SystemEventTrigger" == trigger.Type ? trigger.SystemEvent = $("#selectSystemEvent", page).val() : "IntervalTrigger" == trigger.Type && (trigger.IntervalTicks = $("#selectInterval", page).val());
var timeLimit = $("#txtTimeLimit", page).val() || "0";
return timeLimit = 36e5 * parseFloat(timeLimit), trigger.MaxRuntimeMs = timeLimit || null, trigger
}
};
return function(view, params) {
function onSubmit(e) {
loading.show();
var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) {
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() {
$("#popupAddTrigger").addClass("hide"), ScheduledTaskPage.refreshScheduledTask(view)
})
}), e.preventDefault()
}
view.querySelector(".addTriggerForm").addEventListener("submit", onSubmit), fillTimeOfDay(view.querySelector("#selectTimeOfDay")), $(view.querySelector("#popupAddTrigger").parentNode).trigger("create"), view.querySelector(".selectTriggerType").addEventListener("change", function() {
ScheduledTaskPage.refreshTriggerFields(view, this.value)
}), view.querySelector(".btnAddTrigger").addEventListener("click", function() {
ScheduledTaskPage.showAddTriggerPopup(view)
}), view.addEventListener("click", function(e) {
var btnDeleteTrigger = dom.parentWithClass(e.target, "btnDeleteTrigger");
btnDeleteTrigger && ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")))
}), view.addEventListener("viewshow", function() {
ScheduledTaskPage.refreshScheduledTask(view)
})
}
});

View file

@ -1,99 +0,0 @@
define(["jQuery", "loading", "events", "globalize", "serverNotifications", "humanedate", "listViewStyle", "emby-linkbutton"], function($, loading, events, globalize, serverNotifications) {
"use strict";
function reloadList(page) {
ApiClient.getScheduledTasks({
isHidden: !1
}).then(function(tasks) {
populateList(page, tasks), loading.hide()
})
}
function populateList(page, tasks) {
tasks = tasks.sort(function(a, b) {
return a = a.Category + " " + a.Name, b = b.Category + " " + b.Name, a == b ? 0 : a < b ? -1 : 1
});
for (var currentCategory, html = "", i = 0, length = tasks.length; i < length; i++) {
var task = tasks[i];
task.Category != currentCategory && (currentCategory = task.Category, currentCategory && (html += "</div>", html += "</div>"), html += '<div class="verticalSection verticalSection-extrabottompadding">', html += '<div class="sectionTitleContainer" style="margin-bottom:1em;">', html += '<h2 class="sectionTitle">', html += currentCategory, html += "</h2>", 0 === i && (html += '<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Scheduled-tasks">' + globalize.translate("Help") + "</a>"), html += "</div>", html += '<div class="paperList">'), html += '<div class="listItem listItem-border scheduledTaskPaperIconItem" data-status="' + task.State + '">', html += "<a is='emby-linkbutton' style='margin:0;padding:0;' class='clearLink listItemIconContainer' href='scheduledtask.html?id=" + task.Id + "'>", html += '<i class="md-icon listItemIcon">schedule</i>', html += "</a>", html += '<div class="listItemBody two-line">', html += "<a class='clearLink' style='margin:0;padding:0;display:block;text-align:left;' is='emby-linkbutton' href='scheduledtask.html?id=" + task.Id + "'>", html += "<h3 class='listItemBodyText'>" + task.Name + "</h3>", html += "<div class='secondary listItemBodyText' id='taskProgress" + task.Id + "'>" + getTaskProgressHtml(task) + "</div>", html += "</a>", html += "</div>", "Idle" == task.State ? html += '<button type="button" is="paper-icon-button-light" id="btnTask' + task.Id + '" class="btnStartTask" data-taskid="' + task.Id + '" title="' + globalize.translate("ButtonStart") + '"><i class="md-icon">play_arrow</i></button>' : "Running" == task.State ? html += '<button type="button" is="paper-icon-button-light" id="btnTask' + task.Id + '" class="btnStopTask" data-taskid="' + task.Id + '" title="' + globalize.translate("ButtonStop") + '"><i class="md-icon">stop</i></button>' : html += '<button type="button" is="paper-icon-button-light" id="btnTask' + task.Id + '" class="btnStartTask hide" data-taskid="' + task.Id + '" title="' + globalize.translate("ButtonStart") + '"><i class="md-icon">play_arrow</i></button>', html += "</div>"
}
tasks.length && (html += "</div>", html += "</div>"), page.querySelector(".divScheduledTasks").innerHTML = html
}
function humane_elapsed(firstDateStr, secondDateStr) {
var dt1 = new Date(firstDateStr),
dt2 = new Date(secondDateStr),
seconds = (dt2.getTime() - dt1.getTime()) / 1e3,
numdays = Math.floor(seconds % 31536e3 / 86400),
numhours = Math.floor(seconds % 31536e3 % 86400 / 3600),
numminutes = Math.floor(seconds % 31536e3 % 86400 % 3600 / 60),
numseconds = Math.round(seconds % 31536e3 % 86400 % 3600 % 60),
elapsedStr = "";
return elapsedStr += 1 == numdays ? numdays + " day " : "", elapsedStr += numdays > 1 ? numdays + " days " : "", elapsedStr += 1 == numhours ? numhours + " hour " : "", elapsedStr += numhours > 1 ? numhours + " hours " : "", elapsedStr += 1 == numminutes ? numminutes + " minute " : "", elapsedStr += numminutes > 1 ? numminutes + " minutes " : "", elapsedStr += elapsedStr.length > 0 ? "and " : "", elapsedStr += 1 == numseconds ? numseconds + " second" : "", elapsedStr += 0 == numseconds || numseconds > 1 ? numseconds + " seconds" : ""
}
function getTaskProgressHtml(task) {
var html = "";
if ("Idle" == task.State) task.LastExecutionResult && (html += globalize.translate("LabelScheduledTaskLastRan").replace("{0}", humane_date(task.LastExecutionResult.EndTimeUtc)).replace("{1}", humane_elapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc)), "Failed" == task.LastExecutionResult.Status ? html += " <span style='color:#FF0000;'>(" + globalize.translate("LabelFailed") + ")</span>" : "Cancelled" == task.LastExecutionResult.Status ? html += " <span style='color:#0026FF;'>(" + globalize.translate("LabelCancelled") + ")</span>" : "Aborted" == task.LastExecutionResult.Status && (html += " <span style='color:#FF0000;'>" + globalize.translate("LabelAbortedByServerShutdown") + "</span>"));
else if ("Running" == task.State) {
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
html += '<div style="display:flex;align-items:center;">';
html += '<div class="taskProgressOuter" title="' + progress + '%" style="flex-grow:1;">';
html += '<div class="taskProgressInner" style="width:' + progress + '%;">';
html += "</div>";
html += "</div>";
html += "<span style='color:#00a4dc;margin-left:5px;'>" + progress + "%</span>";
html += "</div>";
} else {
html += "<span style='color:#FF0000;'>" + globalize.translate("LabelStopping") + "</span>";
}
return html
}
function updateTaskButton(elem, state) {
"Idle" == state ? (elem.classList.add("btnStartTask"), elem.classList.remove("btnStopTask"), elem.classList.remove("hide"), elem.querySelector("i").innerHTML = "play_arrow", elem.title = globalize.translate("ButtonStart")) : "Running" == state ? (elem.classList.remove("btnStartTask"), elem.classList.add("btnStopTask"), elem.classList.remove("hide"), elem.querySelector("i").innerHTML = "stop", elem.title = globalize.translate("ButtonStop")) : (elem.classList.add("btnStartTask"), elem.classList.remove("btnStopTask"), elem.classList.add("hide"), elem.querySelector("i").innerHTML = "play_arrow", elem.title = globalize.translate("ButtonStart")), $(elem).parents(".listItem")[0].setAttribute("data-status", state)
}
return function(view, params) {
function updateTasks(tasks) {
for (var i = 0, length = tasks.length; i < length; i++) {
var task = tasks[i];
view.querySelector("#taskProgress" + task.Id).innerHTML = getTaskProgressHtml(task);
updateTaskButton(view.querySelector("#btnTask" + task.Id), task.State)
}
}
function onPollIntervalFired() {
ApiClient.isMessageChannelOpen() || reloadList(view)
}
function onScheduledTasksUpdate(e, apiClient, info) {
apiClient.serverId() === serverId && updateTasks(info)
}
function startInterval() {
ApiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000"), pollInterval && clearInterval(pollInterval), pollInterval = setInterval(onPollIntervalFired, 1e4)
}
function stopInterval() {
ApiClient.sendMessage("ScheduledTasksInfoStop"), pollInterval && clearInterval(pollInterval)
}
var pollInterval, serverId = ApiClient.serverId();
$(".divScheduledTasks", view).on("click", ".btnStartTask", function() {
var button = this,
id = button.getAttribute("data-taskid");
ApiClient.startScheduledTask(id).then(function() {
updateTaskButton(button, "Running"), reloadList(view)
})
}).on("click", ".btnStopTask", function() {
var button = this,
id = button.getAttribute("data-taskid");
ApiClient.stopScheduledTask(id).then(function() {
updateTaskButton(button, ""), reloadList(view)
})
}), view.addEventListener("viewbeforehide", function() {
events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), stopInterval()
}), view.addEventListener("viewshow", function() {
loading.show(), startInterval(), reloadList(view), events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate)
})
}
});

View file

@ -1,21 +0,0 @@
define(["focusManager", "searchFields", "searchResults", "events"], function(focusManager, SearchFields, SearchResults, events) {
"use strict";
return function(view, params) {
function onSearch(e, value) {
self.searchResults.search(value)
}
var self = this;
view.addEventListener("viewshow", function() {
self.searchFields || (self.searchFields = new SearchFields({
element: view.querySelector(".searchFields")
}), self.searchResults = new SearchResults({
element: view.querySelector(".searchResults"),
serverId: params.serverId || ApiClient.serverId(),
parentId: params.parentId,
collectionType: params.collectionType
}), events.on(self.searchFields, "search", onSearch))
}), view.addEventListener("viewdestroy", function() {
self.searchFields && (self.searchFields.destroy(), self.searchFields = null), self.searchResults && (self.searchResults.destroy(), self.searchResults = null)
})
}
});

View file

@ -1,140 +0,0 @@
define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "backdrop", "globalize", "staticBackdrops", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function(loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, backdrop, globalize, staticBackdrops, actionSheet, dom) {
"use strict";
function renderSelectServerItems(view, servers) {
var items = servers.map(function(server) {
return {
name: server.Name,
showIcon: !0,
icon: "&#xE307;",
cardType: "",
id: server.Id,
server: server
}
}),
html = items.map(function(item) {
var cardImageContainer;
cardImageContainer = item.showIcon ? '<i class="cardImageIcon md-icon">' + item.icon + "</i>" : '<div class="cardImage" style="' + item.cardImageStyle + '"></div>';
var cardBoxCssClass = "cardBox";
layoutManager.tv && (cardBoxCssClass += " cardBox-focustransform");
var innerOpening = '<div class="' + cardBoxCssClass + '">';
return '<button raised class="card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable" style="display:inline-block;" data-id="' + item.id + '" data-url="' + (item.url || "") + '" data-cardtype="' + item.cardType + '">' + innerOpening + '<div class="cardScalable card-focuscontent"><div class="cardPadder cardPadder-square"></div><div class="cardContent"><div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;">' + cardImageContainer + '</div></div></div><div class="cardFooter"><div class="cardText cardTextCentered">' + item.name + "</div></div></div></button>"
}).join(""),
itemsContainer = view.querySelector(".servers");
items.length || (html = "<p>" + globalize.translate("MessageNoServersAvailableToConnect") + "</p>"), itemsContainer.innerHTML = html, loading.hide()
}
function updatePageStyle(view, params) {
"1" == params.showuser ? (view.classList.add("libraryPage"), view.classList.remove("standalonePage"), view.classList.add("noSecondaryNavPage")) : (view.classList.add("standalonePage"), view.classList.remove("libraryPage"), view.classList.remove("noSecondaryNavPage"))
}
function showGeneralError() {
loading.hide(), alertText(globalize.translate("DefaultErrorMessage"))
}
function alertText(text) {
alertTextWithOptions({
text: text
})
}
function alertTextWithOptions(options) {
require(["alert"], function(alert) {
alert(options)
})
}
function showServerConnectionFailure() {
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"))
}
return function(view, params) {
function connectToServer(server) {
loading.show(), connectionManager.connectToServer(server, {
enableAutoLogin: appSettings.enableAutoLogin()
}).then(function(result) {
loading.hide();
var apiClient = result.ApiClient;
switch (result.State) {
case "SignedIn":
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient), Dashboard.navigate("home.html");
break;
case "ServerSignIn":
Dashboard.onServerChanged(null, null, apiClient), Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id);
break;
case "ServerUpdateNeeded":
alertTextWithOptions({
text: globalize.translate("core#ServerUpdateNeeded", "https://github.com/jellyfin/jellyfin"),
html: globalize.translate("core#ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
});
break;
default:
showServerConnectionFailure()
}
})
}
function deleteServer(server) {
loading.show(), connectionManager.deleteServer(server.Id).then(function() {
loading.hide(), loadServers()
}, function() {
loading.hide(), loadServers()
})
}
function onServerClick(server) {
var menuItems = [];
menuItems.push({
name: globalize.translate("Connect"),
id: "connect"
}), menuItems.push({
name: globalize.translate("Delete"),
id: "delete"
});
actionSheet.show({
items: menuItems,
title: server.Name
}).then(function(id) {
switch (id) {
case "connect":
connectToServer(server);
break;
case "delete":
deleteServer(server);
}
})
}
function onServersRetrieved(result) {
servers = result, renderSelectServerItems(view, result), layoutManager.tv && focusManager.autoFocus(view)
}
function loadServers() {
loading.show(), connectionManager.getAvailableServers().then(onServersRetrieved, function(result) {
onServersRetrieved([])
})
}
var servers;
layoutManager.desktop;
updatePageStyle(view, params);
var backdropUrl = staticBackdrops.getRandomImageUrl();
view.addEventListener("viewshow", function(e) {
var isRestored = e.detail.isRestored;
appRouter.setTitle(null);
backdrop.setBackdrop(backdropUrl);
if (!isRestored) loadServers();
}), view.querySelector(".servers").addEventListener("click", function(e) {
var card = dom.parentWithClass(e.target, "card");
if (card) {
var url = card.getAttribute("data-url");
if (url) appRouter.show(url);
else {
var id = card.getAttribute("data-id");
onServerClick(servers.filter(function(s) {
return s.Id === id
})[0])
}
}
})
}
});

View file

@ -426,7 +426,7 @@ var AppInfo = {};
function initRequireWithBrowser(browser) {
var bowerPath = getBowerPath();
var apiClientBowerPath = bowerPath + "/emby-apiclient";
var apiClientBowerPath = bowerPath + "/apiclient";
var componentsPath = "components";
define("filesystem", [componentsPath + "/filesystem"], returnFirstDependency);
@ -439,12 +439,7 @@ var AppInfo = {};
define("shell", [componentsPath + "/shell"], returnFirstDependency);
if ("cordova" === self.appMode || "android" === self.appMode) {
define("apiclientcore", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency);
define("apiclient", ["bower_components/emby-apiclient/apiclientex"], returnFirstDependency);
} else {
define("apiclient", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency);
}
define("apiclient", ["bower_components/apiclient/apiclient"], returnFirstDependency);
if ("registerElement" in document) {
define("registerElement", []);
@ -575,514 +570,6 @@ var AppInfo = {};
});
}
function defineRoute(newRoute, dictionary) {
var baseRoute = Emby.Page.baseUrl();
var path = newRoute.path;
path = path.replace(baseRoute, "");
console.log("Defining route: " + path);
newRoute.dictionary = newRoute.dictionary || dictionary || "core";
Emby.Page.addRoute(path, newRoute);
}
function defineCoreRoutes(appHost) {
console.log("Defining core routes");
defineRoute({
path: "/addplugin.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "scripts/addpluginpage"
});
defineRoute({
path: "/autoorganizelog.html",
dependencies: [],
roles: "admin"
});
defineRoute({
path: "/channelsettings.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/addserver.html",
dependencies: ["emby-button", "emby-input"],
autoFocus: false,
anonymous: true,
startup: true,
controller: "scripts/addserver"
});
defineRoute({
path: "/dashboard.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "scripts/dashboardpage"
});
defineRoute({
path: "/dashboardgeneral.html",
controller: "dashboard/dashboardgeneral",
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/dashboardhosting.html",
dependencies: ["emby-input", "emby-button"],
autoFocus: false,
roles: "admin",
controller: "dashboard/dashboardhosting"
});
defineRoute({
path: "/devices/devices.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "devices/devices"
});
defineRoute({
path: "/devices/device.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "devices/device"
});
defineRoute({
path: "/dlnaprofile.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/dlnaprofiles.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/dlnaserversettings.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/dlnasettings.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/edititemmetadata.html",
dependencies: [],
controller: "scripts/edititemmetadata",
autoFocus: false
});
defineRoute({
path: "/encodingsettings.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/forgotpassword.html",
dependencies: ["emby-input", "emby-button"],
anonymous: true,
startup: true,
controller: "scripts/forgotpassword"
});
defineRoute({
path: "/forgotpasswordpin.html",
dependencies: ["emby-input", "emby-button"],
autoFocus: false,
anonymous: true,
startup: true,
controller: "scripts/forgotpasswordpin"
});
defineRoute({
path: "/home.html",
dependencies: [],
autoFocus: false,
controller: "home/home",
transition: "fade",
type: "home"
});
defineRoute({
path: "/list/list.html",
dependencies: [],
autoFocus: false,
controller: "list/list",
transition: "fade"
});
defineRoute({
path: "/index.html",
dependencies: [],
autoFocus: false,
isDefaultRoute: true
});
defineRoute({
path: "/itemdetails.html",
dependencies: ["emby-button", "scripts/livetvcomponents", "paper-icon-button-light", "emby-itemscontainer"],
controller: "scripts/itemdetailpage",
autoFocus: false,
transition: "fade"
});
defineRoute({
path: "/library.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/librarydisplay.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "dashboard/librarydisplay"
});
defineRoute({
path: "/librarysettings.html",
dependencies: ["emby-collapse", "emby-input", "emby-button", "emby-select"],
autoFocus: false,
roles: "admin",
controller: "dashboard/librarysettings"
});
defineRoute({
path: "/livetv.html",
dependencies: ["emby-button", "livetvcss"],
controller: "scripts/livetvsuggested",
autoFocus: false,
transition: "fade"
});
defineRoute({
path: "/livetvguideprovider.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/livetvseriestimer.html",
dependencies: ["emby-checkbox", "emby-input", "emby-button", "emby-collapse", "scripts/livetvcomponents", "scripts/livetvseriestimer", "livetvcss"],
autoFocus: false,
controller: "scripts/livetvseriestimer"
});
defineRoute({
path: "/livetvsettings.html",
dependencies: [],
autoFocus: false
});
defineRoute({
path: "/livetvstatus.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/livetvtuner.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "dashboard/livetvtuner"
});
defineRoute({
path: "/log.html",
dependencies: ["emby-checkbox"],
roles: "admin",
controller: "dashboard/logpage"
});
defineRoute({
path: "/login.html",
dependencies: ["emby-button", "emby-input"],
autoFocus: false,
anonymous: true,
startup: true,
controller: "scripts/loginpage"
});
defineRoute({
path: "/metadataadvanced.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/metadataimages.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/metadatanfo.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/movies.html",
dependencies: ["emby-button"],
autoFocus: false,
controller: "scripts/moviesrecommended",
transition: "fade"
});
defineRoute({
path: "/music.html",
dependencies: [],
controller: "scripts/musicrecommended",
autoFocus: false,
transition: "fade"
});
defineRoute({
path: "/mypreferencesdisplay.html",
dependencies: ["emby-checkbox", "emby-button", "emby-select"],
autoFocus: false,
transition: "fade",
controller: "scripts/mypreferencesdisplay"
});
defineRoute({
path: "/mypreferenceshome.html",
dependencies: [],
autoFocus: false,
transition: "fade",
controller: "scripts/mypreferenceshome"
});
defineRoute({
path: "/mypreferencessubtitles.html",
dependencies: [],
autoFocus: false,
transition: "fade",
controller: "scripts/mypreferencessubtitles"
});
defineRoute({
path: "/mypreferenceslanguages.html",
dependencies: ["emby-button", "emby-checkbox", "emby-select"],
autoFocus: false,
transition: "fade",
controller: "scripts/mypreferenceslanguages"
});
defineRoute({
path: "/mypreferencesmenu.html",
dependencies: ["emby-button"],
autoFocus: false,
transition: "fade",
controller: "scripts/mypreferencescommon"
});
defineRoute({
path: "/myprofile.html",
dependencies: ["emby-button", "emby-collapse", "emby-checkbox", "emby-input"],
autoFocus: false,
transition: "fade",
controller: "scripts/myprofile"
});
defineRoute({
path: "/notificationsetting.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/notificationsettings.html",
controller: "scripts/notificationsettings",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/nowplaying.html",
dependencies: ["paper-icon-button-light", "emby-slider", "emby-button", "emby-input", "emby-itemscontainer"],
controller: "scripts/nowplayingpage",
autoFocus: false,
transition: "fade",
fullscreen: true,
supportsThemeMedia: true,
enableMediaControl: false
});
defineRoute({
path: "/playbackconfiguration.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/plugincatalog.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "scripts/plugincatalogpage"
});
defineRoute({
path: "/plugins.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/scheduledtask.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "scripts/scheduledtaskpage"
});
defineRoute({
path: "/scheduledtasks.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "scripts/scheduledtaskspage"
});
defineRoute({
path: "/search.html",
dependencies: [],
controller: "scripts/searchpage"
});
defineRoute({
path: "/selectserver.html",
dependencies: ["listViewStyle", "emby-button"],
autoFocus: false,
anonymous: true,
startup: true,
controller: "scripts/selectserver"
});
defineRoute({
path: "/serveractivity.html",
dependencies: [],
autoFocus: false,
roles: "admin",
controller: "dashboard/serveractivity"
});
defineRoute({
path: "/serversecurity.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/streamingsettings.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/support.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/tv.html",
dependencies: ["paper-icon-button-light", "emby-button"],
autoFocus: false,
controller: "scripts/tvrecommended",
transition: "fade"
});
defineRoute({
path: "/useredit.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/userlibraryaccess.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/usernew.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/userparentalcontrol.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/userpassword.html",
dependencies: ["emby-input", "emby-button", "emby-checkbox"],
autoFocus: false,
controller: "scripts/userpasswordpage"
});
defineRoute({
path: "/userprofiles.html",
dependencies: [],
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/wizardremoteaccess.html",
dependencies: ["dashboardcss"],
autoFocus: false,
anonymous: true,
controller: "dashboard/wizardremoteaccess"
});
defineRoute({
path: "/wizardfinish.html",
dependencies: ["emby-button", "dashboardcss"],
autoFocus: false,
anonymous: true,
controller: "dashboard/wizardfinishpage"
});
defineRoute({
path: "/wizardlibrary.html",
dependencies: ["dashboardcss"],
autoFocus: false,
anonymous: true
});
defineRoute({
path: "/wizardsettings.html",
dependencies: ["dashboardcss"],
autoFocus: false,
anonymous: true,
controller: "dashboard/wizardsettings"
});
defineRoute({
path: "/wizardstart.html",
dependencies: ["dashboardcss"],
autoFocus: false,
anonymous: true,
controller: "dashboard/wizardstart"
});
defineRoute({
path: "/wizarduser.html",
dependencies: ["dashboardcss", "emby-input"],
controller: "scripts/wizarduserpage",
autoFocus: false,
anonymous: true
});
defineRoute({
path: "/videoosd.html",
dependencies: [],
transition: "fade",
controller: "scripts/videoosd",
autoFocus: false,
type: "video-osd",
supportsThemeMedia: true,
fullscreen: true,
enableMediaControl: false
});
defineRoute({
path: "/configurationpage",
dependencies: [],
autoFocus: false,
enableCache: false,
enableContentQueryString: true,
roles: "admin"
});
defineRoute({
path: "/",
isDefaultRoute: true,
autoFocus: false,
dependencies: []
});
}
function getPluginPageContentPath() {
if (window.ApiClient) {
return ApiClient.getUrl("web/ConfigurationPage");
}
return null;
}
function loadPlugins(externalPlugins, appHost, browser, shell) {
console.log("Loading installed plugins");
var list = [
@ -1145,8 +632,7 @@ var AppInfo = {};
require(['appRouter', 'scripts/themeloader', 'libraryMenu'], function (pageObjects) {
window.Emby.Page = pageObjects;
defineCoreRoutes(appHost);
require(['scripts/routes'], function () {
Emby.Page.start({
click: false,
hashbang: true
@ -1238,7 +724,7 @@ var AppInfo = {};
(function () {
var urlArgs = "v=" + (window.dashboardVersion || new Date().getDate());
var bowerPath = getBowerPath();
var apiClientBowerPath = bowerPath + "/emby-apiclient";
var apiClientBowerPath = bowerPath + "/apiclient";
var componentsPath = "components";
var paths = {
velocity: bowerPath + "/velocity/velocity.min",
@ -1258,7 +744,7 @@ var AppInfo = {};
libraryBrowser: "scripts/librarybrowser",
events: apiClientBowerPath + "/events",
credentialprovider: apiClientBowerPath + "/credentials",
connectionManagerFactory: bowerPath + "/emby-apiclient/connectionmanager",
connectionManagerFactory: bowerPath + "/apiclient/connectionmanager",
visibleinviewport: componentsPath + "/visibleinviewport",
browserdeviceprofile: componentsPath + "/browserdeviceprofile",
browser: componentsPath + "/browser",
@ -1511,7 +997,7 @@ var AppInfo = {};
return window.ApiClient;
};
});
define("appRouter", [componentsPath + "/router", "itemHelper"], function (appRouter, itemHelper) {
define("appRouter", [componentsPath + "/appRouter", "itemHelper"], function (appRouter, itemHelper) {
function showItem(item, serverId, options) {
if ("string" == typeof item) {
require(["connectionManager"], function (connectionManager) {

View file

@ -1,229 +0,0 @@
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function(events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager) {
"use strict";
function getTabs() {
return [{
name: Globalize.translate("TabShows")
}, {
name: Globalize.translate("TabSuggestions")
}, {
name: Globalize.translate("TabLatest")
}, {
name: Globalize.translate("TabUpcoming")
}, {
name: Globalize.translate("TabGenres")
}, {
name: Globalize.translate("TabNetworks")
}, {
name: Globalize.translate("TabEpisodes")
}, {
name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}]
}
function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) {
case "suggestions":
return 1;
case "latest":
return 2;
case "favorites":
return 1;
case "genres":
return 4;
default:
return 0
}
}
function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
}
return function(view, params) {
function reload() {
loading.show(), loadResume(), loadNextUp()
}
function loadNextUp() {
var query = {
Limit: 24,
Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo",
UserId: ApiClient.getCurrentUserId(),
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: !1
};
query.ParentId = libraryMenu.getTopParentId(), ApiClient.getNextUpEpisodes(query).then(function(result) {
result.Items.length ? view.querySelector(".noNextUpItems").classList.add("hide") : view.querySelector(".noNextUpItems").classList.remove("hide");
var container = view.querySelector("#nextUpItems");
cardBuilder.buildCards(result.Items, {
itemsContainer: container,
preferThumb: !0,
shape: "backdrop",
scalable: !0,
showTitle: !0,
showParentTitle: !0,
overlayText: !1,
centerText: !0,
overlayPlayButton: !0,
cardLayout: !1
}), loading.hide()
})
}
function enableScrollX() {
return !layoutManager.desktop
}
function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop"
}
function loadResume() {
var parentId = libraryMenu.getTopParentId(),
screenWidth = dom.getWindowSize().innerWidth,
limit = screenWidth >= 1600 ? 5 : 6,
options = {
SortBy: "DatePlayed",
SortOrder: "Descending",
IncludeItemTypes: "Episode",
Filters: "IsResumable",
Limit: limit,
Recursive: !0,
Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",
ExcludeLocationTypes: "Virtual",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
result.Items.length ? view.querySelector("#resumableSection").classList.remove("hide") : view.querySelector("#resumableSection").classList.add("hide");
var allowBottomPadding = !enableScrollX(),
container = view.querySelector("#resumableItems");
cardBuilder.buildCards(result.Items, {
itemsContainer: container,
preferThumb: !0,
shape: getThumbShape(),
scalable: !0,
showTitle: !0,
showParentTitle: !0,
overlayText: !1,
centerText: !0,
overlayPlayButton: !0,
allowBottomPadding: allowBottomPadding,
cardLayout: !1
})
})
}
function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
}
function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex)
}
function getTabContainers() {
return view.querySelectorAll(".pageTabContent")
}
function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
}
function getTabController(page, index, callback) {
var depends = [];
switch (index) {
case 0:
depends.push("scripts/tvshows");
break;
case 1:
break;
case 2:
depends.push("scripts/tvlatest");
break;
case 3:
depends.push("scripts/tvupcoming");
break;
case 4:
depends.push("scripts/tvgenres");
break;
case 5:
depends.push("scripts/tvstudios");
break;
case 6:
depends.push("scripts/episodes");
break;
case 7:
depends.push("scripts/searchtab")
}
require(depends, function(controllerFactory) {
var tabContent;
1 === index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 1 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
collectionType: "tvshows",
parentId: params.topParentId
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
})
}
function preLoadTab(page, index) {
getTabController(page, index, function(controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
})
}
function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) {
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
})
}
function onPlaybackStop(e, state) {
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange())
}
function onWebSocketMessage(e, data) {
var msg = data;
"UserDataChanged" === msg.MessageType && msg.Data.UserId == ApiClient.getCurrentUserId() && (renderedTabs = [])
}
function onInputCommand(e) {
switch (e.detail.command) {
case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId)
}
}
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
initialTabIndex = currentTabIndex;
self.initTab = function() {
var tabContent = self.tabContent;
setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX());
}, self.renderTab = function() {
reload()
};
var tabControllers = [],
renderedTabs = [];
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX()), view.addEventListener("viewshow", function(e) {
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
}) : (view.setAttribute("data-title", Globalize.translate("TabShows")), libraryMenu.setTitle(Globalize.translate("TabShows")))
}
events.on(playbackManager, "playbackstop", onPlaybackStop), events.on(ApiClient, "message", onWebSocketMessage), inputManager.on(window, onInputCommand)
}), view.addEventListener("viewbeforehide", function(e) {
inputManager.off(window, onInputCommand), events.off(playbackManager, "playbackstop", onPlaybackStop), events.off(ApiClient, "message", onWebSocketMessage)
}), view.addEventListener("viewdestroy", function(e) {
tabControllers.forEach(function(t) {
t.destroy && t.destroy()
})
})
}
});

View file

@ -1,101 +0,0 @@
define(["loading", "libraryMenu", "emby-linkbutton"], function(loading, libraryMenu) {
"use strict";
function loadUser(page, params) {
var userid = params.userId;
ApiClient.getUser(userid).then(function(user) {
Dashboard.getCurrentUser().then(function(loggedInUser) {
libraryMenu.setTitle(user.Name), page.querySelector(".username").innerHTML = user.Name;
var showPasswordSection = !0,
showLocalAccessSection = !1;
"Guest" == user.ConnectLinkType ? (page.querySelector(".localAccessSection").classList.add("hide"), showPasswordSection = !1) : user.HasConfiguredPassword ? (page.querySelector("#btnResetPassword").classList.remove("hide"), page.querySelector("#fldCurrentPassword").classList.remove("hide"), showLocalAccessSection = !0) : (page.querySelector("#btnResetPassword").classList.add("hide"), page.querySelector("#fldCurrentPassword").classList.add("hide")), showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess) ? page.querySelector(".passwordSection").classList.remove("hide") : page.querySelector(".passwordSection").classList.add("hide"), showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess) ? page.querySelector(".localAccessSection").classList.remove("hide") : page.querySelector(".localAccessSection").classList.add("hide");
var txtEasyPassword = page.querySelector("#txtEasyPassword");
txtEasyPassword.value = "", user.HasConfiguredEasyPassword ? (txtEasyPassword.placeholder = "******", page.querySelector("#btnResetEasyPassword").classList.remove("hide")) : (txtEasyPassword.removeAttribute("placeholder"), txtEasyPassword.placeholder = "", page.querySelector("#btnResetEasyPassword").classList.add("hide")), page.querySelector(".chkEnableLocalEasyPassword").checked = user.Configuration.EnableLocalPassword
})
}), page.querySelector("#txtCurrentPassword").value = "", page.querySelector("#txtNewPassword").value = "", page.querySelector("#txtNewPasswordConfirm").value = ""
}
return function(view, params) {
function saveEasyPassword() {
var userId = params.userId,
easyPassword = view.querySelector("#txtEasyPassword").value;
easyPassword ? ApiClient.updateEasyPassword(userId, easyPassword).then(function() {
onEasyPasswordSaved(userId)
}) : onEasyPasswordSaved(userId)
}
function onEasyPasswordSaved(userId) {
ApiClient.getUser(userId).then(function(user) {
user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked, ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function() {
loading.hide(), require(["toast"], function(toast) {
toast(Globalize.translate("MessageSettingsSaved"))
}), loadUser(view, params)
})
})
}
function savePassword() {
var userId = params.userId,
currentPassword = view.querySelector("#txtCurrentPassword").value,
newPassword = view.querySelector("#txtNewPassword").value;
if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) {
// Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank)
// This should only happen when user.HasConfiguredPassword is false, but this information is not passed on
currentPassword = "";
}
ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function() {
loading.hide(), require(["toast"], function(toast) {
toast(Globalize.translate("PasswordSaved"))
}), loadUser(view, params)
}, function() {
loading.hide(), Dashboard.alert({
title: Globalize.translate("HeaderLoginFailure"),
message: Globalize.translate("MessageInvalidUser")
})
})
}
function onSubmit(e) {
var form = this;
return form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value ? require(["toast"], function(toast) {
toast(Globalize.translate("PasswordMatchError"))
}) : (loading.show(), savePassword()), e.preventDefault(), !1
}
function onLocalAccessSubmit(e) {
return loading.show(), saveEasyPassword(), e.preventDefault(), !1
}
function resetPassword() {
var msg = Globalize.translate("PasswordResetConfirmation");
require(["confirm"], function(confirm) {
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function() {
var userId = params.userId;
loading.show(), ApiClient.resetUserPassword(userId).then(function() {
loading.hide(), Dashboard.alert({
message: Globalize.translate("PasswordResetComplete"),
title: Globalize.translate("PasswordResetHeader")
}), loadUser(view, params)
})
})
})
}
function resetEasyPassword() {
var msg = Globalize.translate("PinCodeResetConfirmation");
require(["confirm"], function(confirm) {
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function() {
var userId = params.userId;
loading.show(), ApiClient.resetEasyPassword(userId).then(function() {
loading.hide(), Dashboard.alert({
message: Globalize.translate("PinCodeResetComplete"),
title: Globalize.translate("HeaderPinCodeReset")
}), loadUser(view, params)
})
})
})
}
view.querySelector(".updatePasswordForm").addEventListener("submit", onSubmit), view.querySelector(".localAccessForm").addEventListener("submit", onLocalAccessSubmit), view.querySelector("#btnResetEasyPassword").addEventListener("click", resetEasyPassword), view.querySelector("#btnResetPassword").addEventListener("click", resetPassword), view.addEventListener("viewshow", function() {
loadUser(view, params)
})
}
});

File diff suppressed because it is too large Load diff

View file

@ -1,68 +0,0 @@
define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "emby-linkbutton"], function(loading, globalize) {
"use strict";
function getApiClient() {
return ApiClient
}
function nextWizardPage() {
Dashboard.navigate("wizardlibrary.html")
}
function onUpdateUserComplete(result) {
if (loading.hide(), result.UserLinkResult) {
var msgKey = result.UserLinkResult.IsPending ? "MessagePendingEmbyAccountAdded" : "MessageEmbyAccountAdded";
Dashboard.alert({
message: globalize.translate(msgKey),
title: globalize.translate("HeaderEmbyAccountAdded"),
callback: nextWizardPage
})
} else nextWizardPage()
}
function submit(form) {
loading.show();
var apiClient = getApiClient();
apiClient.ajax({
type: "POST",
data: {
Name: form.querySelector("#txtUsername").value,
Password: form.querySelector("#txtManualPassword").value
},
url: apiClient.getUrl("Startup/User")
}).then(onUpdateUserComplete, function(response) {
console.log(response);
})
}
function onSubmit(e) {
var form = this;
if (form.querySelector("#txtManualPassword").value != form.querySelector("#txtPasswordConfirm").value) {
require(["toast"], function(toast) {
toast(Globalize.translate("PasswordMatchError"));
});
} else {
submit(form);
}
e.preventDefault();
return false;
}
function onViewShow() {
loading.show();
var page = this,
apiClient = getApiClient();
apiClient.getJSON(apiClient.getUrl("Startup/User")).then(function(user) {
page.querySelector("#txtUsername").value = user.Name || "";
page.querySelector("#txtManualPassword").value = user.Password || "";
loading.hide();
})
}
return function(view, params) {
view.querySelector(".wizardUserForm").addEventListener("submit", onSubmit), view.addEventListener("viewshow", function() {
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
}), view.addEventListener("viewhide", function() {
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
}), view.addEventListener("viewshow", onViewShow)
}
});