mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge remote-tracking branch 'origin/master' into suboctopus
This commit is contained in:
commit
1927c2eb9b
42 changed files with 3228 additions and 1246 deletions
|
@ -30,6 +30,7 @@
|
|||
- [Nickbert7](https://github.com/Nickbert7)
|
||||
- [ferferga](https://github.com/ferferga)
|
||||
- [bilde2910](https://github.com/bilde2910)
|
||||
- [Daniel Hartung](https://github.com/dhartung)
|
||||
|
||||
# Emby Contributors
|
||||
|
||||
|
|
|
@ -1,19 +1,33 @@
|
|||
define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "formDialogStyle"], function(dialogHelper, datetime) {
|
||||
define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "formDialogStyle"], function (dialogHelper, datetime) {
|
||||
"use strict";
|
||||
|
||||
function getDisplayTime(hours) {
|
||||
var minutes = 0,
|
||||
pct = hours % 1;
|
||||
return pct && (minutes = parseInt(60 * pct)), datetime.getDisplayTime(new Date(2e3, 1, 1, hours, minutes, 0, 0))
|
||||
var minutes = 0;
|
||||
var pct = hours % 1;
|
||||
|
||||
if (pct) {
|
||||
minutes = parseInt(60 * pct);
|
||||
}
|
||||
|
||||
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
|
||||
}
|
||||
|
||||
function populateHours(context) {
|
||||
for (var html = "", i = 0; i < 24; i++) html += '<option value="' + i + '">' + getDisplayTime(i) + "</option>";
|
||||
html += '<option value="24">' + getDisplayTime(0) + "</option>", context.querySelector("#selectStart").innerHTML = html, context.querySelector("#selectEnd").innerHTML = html
|
||||
var html = "";
|
||||
|
||||
for (var i = 0; i < 24; i++) {
|
||||
html += '<option value="' + i + '">' + getDisplayTime(i) + "</option>";
|
||||
}
|
||||
|
||||
html += '<option value="24">' + getDisplayTime(0) + "</option>";
|
||||
context.querySelector("#selectStart").innerHTML = html;
|
||||
context.querySelector("#selectEnd").innerHTML = html;
|
||||
}
|
||||
|
||||
function loadSchedule(context, schedule) {
|
||||
context.querySelector("#selectDay").value = schedule.DayOfWeek || "Sunday", context.querySelector("#selectStart").value = schedule.StartHour || 0, context.querySelector("#selectEnd").value = schedule.EndHour || 0
|
||||
context.querySelector("#selectDay").value = schedule.DayOfWeek || "Sunday";
|
||||
context.querySelector("#selectStart").value = schedule.StartHour || 0;
|
||||
context.querySelector("#selectEnd").value = schedule.EndHour || 0;
|
||||
}
|
||||
|
||||
function submitSchedule(context, options) {
|
||||
|
@ -22,30 +36,54 @@ define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "f
|
|||
StartHour: context.querySelector("#selectStart").value,
|
||||
EndHour: context.querySelector("#selectEnd").value
|
||||
};
|
||||
if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) return void alert(Globalize.translate("ErrorMessageStartHourGreaterThanEnd"));
|
||||
context.submitted = !0, options.schedule = Object.assign(options.schedule, updatedSchedule), dialogHelper.close(context)
|
||||
|
||||
if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) {
|
||||
return void alert(Globalize.translate("ErrorMessageStartHourGreaterThanEnd"));
|
||||
}
|
||||
|
||||
context.submitted = true;
|
||||
options.schedule = Object.assign(options.schedule, updatedSchedule);
|
||||
dialogHelper.close(context);
|
||||
}
|
||||
|
||||
return {
|
||||
show: function(options) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var xhr = new XMLHttpRequest;
|
||||
xhr.open("GET", "components/accessschedule/accessschedule.template.html", !0), xhr.onload = function(e) {
|
||||
var template = this.response,
|
||||
dlg = dialogHelper.createDialog({
|
||||
removeOnClose: !0,
|
||||
size: "small"
|
||||
});
|
||||
show: function (options) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", "components/accessschedule/accessschedule.template.html", true);
|
||||
|
||||
xhr.onload = function (e) {
|
||||
var template = this.response;
|
||||
var dlg = dialogHelper.createDialog({
|
||||
removeOnClose: true,
|
||||
size: "small"
|
||||
});
|
||||
dlg.classList.add("formDialog");
|
||||
var html = "";
|
||||
html += Globalize.translateDocument(template), dlg.innerHTML = html, populateHours(dlg), loadSchedule(dlg, options.schedule), dialogHelper.open(dlg), dlg.addEventListener("close", function() {
|
||||
dlg.submitted ? resolve(options.schedule) : reject()
|
||||
}), dlg.querySelector(".btnCancel").addEventListener("click", function(e) {
|
||||
dialogHelper.close(dlg)
|
||||
}), dlg.querySelector("form").addEventListener("submit", function(e) {
|
||||
return submitSchedule(dlg, options), e.preventDefault(), !1
|
||||
})
|
||||
}, xhr.send()
|
||||
})
|
||||
html += Globalize.translateDocument(template);
|
||||
dlg.innerHTML = html;
|
||||
populateHours(dlg);
|
||||
loadSchedule(dlg, options.schedule);
|
||||
dialogHelper.open(dlg);
|
||||
dlg.addEventListener("close", function () {
|
||||
if (dlg.submitted) {
|
||||
resolve(options.schedule);
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
dlg.querySelector(".btnCancel").addEventListener("click", function (e) {
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
dlg.querySelector("form").addEventListener("submit", function (e) {
|
||||
submitSchedule(dlg, options);
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotifications", "connectionManager", "emby-button", "listViewStyle"], function(events, globalize, dom, datetime, userSettings, serverNotifications, connectionManager) {
|
||||
define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotifications", "connectionManager", "emby-button", "listViewStyle"], function (events, globalize, dom, datetime, userSettings, serverNotifications, connectionManager) {
|
||||
"use strict";
|
||||
|
||||
function getEntryHtml(entry, apiClient) {
|
||||
var html = "";
|
||||
html += '<div class="listItem listItem-border">';
|
||||
var color = "#00a4dc";
|
||||
var icon = "notifications";
|
||||
var icon = "notifications";
|
||||
|
||||
if ("Error" == entry.Severity || "Fatal" == entry.Severity || "Warn" == entry.Severity) {
|
||||
color = "#cc0000";
|
||||
icon = "notification_important";
|
||||
}
|
||||
|
||||
if (entry.UserId && entry.UserPrimaryImageTag) {
|
||||
html += '<i class="listItemIcon md-icon" style="width:2em!important;height:2em!important;padding:0;color:transparent;background-color:' + color + ";background-image:url('" + apiClient.getUserImageUrl(entry.UserId, {
|
||||
type: "Primary",
|
||||
|
@ -18,78 +20,138 @@ define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotific
|
|||
} else {
|
||||
html += '<i class="listItemIcon md-icon" style="background-color:' + color + '">' + icon + '</i>';
|
||||
}
|
||||
html += '<div class="listItemBody three-line">', html += '<div class="listItemBodyText">', html += entry.Name, html += "</div>", html += '<div class="listItemBodyText secondary">';
|
||||
var date = datetime.parseISO8601Date(entry.Date, !0);
|
||||
return html += datetime.toLocaleString(date).toLowerCase(), html += "</div>", html += '<div class="listItemBodyText secondary listItemBodyText-nowrap">', html += entry.ShortOverview || "", html += "</div>", html += "</div>", entry.Overview && (html += '<button type="button" is="paper-icon-button-light" class="btnEntryInfo" data-id="' + entry.Id + '" title="' + globalize.translate("Info") + '"><i class="md-icon">info</i></button>'), html += "</div>"
|
||||
|
||||
html += '<div class="listItemBody three-line">';
|
||||
html += '<div class="listItemBodyText">';
|
||||
html += entry.Name;
|
||||
html += "</div>";
|
||||
html += '<div class="listItemBodyText secondary">';
|
||||
var date = datetime.parseISO8601Date(entry.Date, true);
|
||||
html += datetime.toLocaleString(date).toLowerCase();
|
||||
html += "</div>";
|
||||
html += '<div class="listItemBodyText secondary listItemBodyText-nowrap">';
|
||||
html += entry.ShortOverview || "";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
|
||||
if (entry.Overview) {
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnEntryInfo" data-id="' + entry.Id + '" title="' + globalize.translate("Info") + '"><i class="md-icon">info</i></button>';
|
||||
}
|
||||
|
||||
return html += "</div>";
|
||||
}
|
||||
|
||||
function renderList(elem, apiClient, result, startIndex, limit) {
|
||||
elem.innerHTML = result.Items.map(function(i) {
|
||||
return getEntryHtml(i, apiClient)
|
||||
}).join("")
|
||||
elem.innerHTML = result.Items.map(function (i) {
|
||||
return getEntryHtml(i, apiClient);
|
||||
}).join("");
|
||||
}
|
||||
|
||||
function reloadData(instance, elem, apiClient, startIndex, limit) {
|
||||
null == startIndex && (startIndex = parseInt(elem.getAttribute("data-activitystartindex") || "0")), limit = limit || parseInt(elem.getAttribute("data-activitylimit") || "7");
|
||||
var minDate = new Date,
|
||||
hasUserId = "false" !== elem.getAttribute("data-useractivity");
|
||||
hasUserId ? minDate.setTime(minDate.getTime() - 864e5) : minDate.setTime(minDate.getTime() - 6048e5), ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries", {
|
||||
if (null == startIndex) {
|
||||
startIndex = parseInt(elem.getAttribute("data-activitystartindex") || "0");
|
||||
}
|
||||
|
||||
limit = limit || parseInt(elem.getAttribute("data-activitylimit") || "7");
|
||||
var minDate = new Date();
|
||||
var hasUserId = "false" !== elem.getAttribute("data-useractivity");
|
||||
|
||||
if (hasUserId) {
|
||||
minDate.setTime(minDate.getTime() - 24 * 60 * 60 * 1000); // one day back
|
||||
} else {
|
||||
minDate.setTime(minDate.getTime() - 7 * 24 * 60 * 60 * 1000); // one week back
|
||||
}
|
||||
|
||||
ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries", {
|
||||
startIndex: startIndex,
|
||||
limit: limit,
|
||||
minDate: minDate.toISOString(),
|
||||
hasUserId: hasUserId
|
||||
})).then(function(result) {
|
||||
if (elem.setAttribute("data-activitystartindex", startIndex), elem.setAttribute("data-activitylimit", limit), !startIndex) {
|
||||
})).then(function (result) {
|
||||
elem.setAttribute("data-activitystartindex", startIndex);
|
||||
elem.setAttribute("data-activitylimit", limit);
|
||||
if (!startIndex) {
|
||||
var activityContainer = dom.parentWithClass(elem, "activityContainer");
|
||||
activityContainer && (result.Items.length ? activityContainer.classList.remove("hide") : activityContainer.classList.add("hide"))
|
||||
|
||||
if (activityContainer) {
|
||||
if (result.Items.length) {
|
||||
activityContainer.classList.remove("hide");
|
||||
} else {
|
||||
activityContainer.classList.add("hide");
|
||||
}
|
||||
}
|
||||
}
|
||||
instance.items = result.Items, renderList(elem, apiClient, result, startIndex, limit)
|
||||
})
|
||||
|
||||
instance.items = result.Items;
|
||||
renderList(elem, apiClient, result, startIndex, limit);
|
||||
});
|
||||
}
|
||||
|
||||
function onActivityLogUpdate(e, apiClient, data) {
|
||||
var options = this.options;
|
||||
options && options.serverId === apiClient.serverId() && reloadData(this, options.element, apiClient)
|
||||
|
||||
if (options && options.serverId === apiClient.serverId()) {
|
||||
reloadData(this, options.element, apiClient);
|
||||
}
|
||||
}
|
||||
|
||||
function onListClick(e) {
|
||||
var btnEntryInfo = dom.parentWithClass(e.target, "btnEntryInfo");
|
||||
|
||||
if (btnEntryInfo) {
|
||||
var id = btnEntryInfo.getAttribute("data-id"),
|
||||
items = this.items;
|
||||
var id = btnEntryInfo.getAttribute("data-id");
|
||||
var items = this.items;
|
||||
|
||||
if (items) {
|
||||
var item = items.filter(function(i) {
|
||||
return i.Id.toString() === id
|
||||
var item = items.filter(function (i) {
|
||||
return i.Id.toString() === id;
|
||||
})[0];
|
||||
item && showItemOverview(item)
|
||||
|
||||
if (item) {
|
||||
showItemOverview(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function showItemOverview(item) {
|
||||
require(["alert"], function(alert) {
|
||||
require(["alert"], function (alert) {
|
||||
alert({
|
||||
text: item.Overview
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function ActivityLog(options) {
|
||||
this.options = options;
|
||||
var element = options.element;
|
||||
element.classList.add("activityLogListWidget"), element.addEventListener("click", onListClick.bind(this));
|
||||
element.classList.add("activityLogListWidget");
|
||||
element.addEventListener("click", onListClick.bind(this));
|
||||
var apiClient = connectionManager.getApiClient(options.serverId);
|
||||
reloadData(this, element, apiClient);
|
||||
var onUpdate = onActivityLogUpdate.bind(this);
|
||||
this.updateFn = onUpdate, events.on(serverNotifications, "ActivityLogEntry", onUpdate), apiClient.sendMessage("ActivityLogEntryStart", "0,1500")
|
||||
this.updateFn = onUpdate;
|
||||
events.on(serverNotifications, "ActivityLogEntry", onUpdate);
|
||||
apiClient.sendMessage("ActivityLogEntryStart", "0,1500");
|
||||
}
|
||||
return ActivityLog.prototype.destroy = function() {
|
||||
|
||||
ActivityLog.prototype.destroy = function () {
|
||||
var options = this.options;
|
||||
|
||||
if (options) {
|
||||
options.element.classList.remove("activityLogListWidget");
|
||||
connectionManager.getApiClient(options.serverId).sendMessage("ActivityLogEntryStop", "0,1500")
|
||||
connectionManager.getApiClient(options.serverId).sendMessage("ActivityLogEntryStop", "0,1500");
|
||||
}
|
||||
|
||||
var onUpdate = this.updateFn;
|
||||
onUpdate && events.off(serverNotifications, "ActivityLogEntry", onUpdate), this.items = null, this.options = null
|
||||
}, ActivityLog
|
||||
|
||||
if (onUpdate) {
|
||||
events.off(serverNotifications, "ActivityLogEntry", onUpdate);
|
||||
}
|
||||
|
||||
this.items = null;
|
||||
this.options = null;
|
||||
};
|
||||
|
||||
return ActivityLog;
|
||||
});
|
||||
|
|
|
@ -1,10 +1,16 @@
|
|||
define(["dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function(dialogHelper, loading, connectionManager, globalize, actionsheet) {
|
||||
define(["dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function (dialogHelper, loading, connectionManager, globalize, actionsheet) {
|
||||
"use strict";
|
||||
return function(options) {
|
||||
|
||||
return function (options) {
|
||||
function parentWithClass(elem, className) {
|
||||
for (; !elem.classList || !elem.classList.contains(className);)
|
||||
if (!(elem = elem.parentNode)) return null;
|
||||
return elem
|
||||
while (!elem.classList || !elem.classList.contains(className)) {
|
||||
elem = elem.parentNode;
|
||||
if (!elem) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return elem;
|
||||
}
|
||||
|
||||
function mapChannel(button, channelId, providerChannelId) {
|
||||
|
@ -19,33 +25,35 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
|
|||
providerChannelId: providerChannelId
|
||||
},
|
||||
dataType: "json"
|
||||
}).then(function(mapping) {
|
||||
}).then(function (mapping) {
|
||||
var listItem = parentWithClass(button, "listItem");
|
||||
button.setAttribute("data-providerid", mapping.ProviderChannelId), listItem.querySelector(".secondary").innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName), loading.hide()
|
||||
})
|
||||
button.setAttribute("data-providerid", mapping.ProviderChannelId);
|
||||
listItem.querySelector(".secondary").innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function onChannelsElementClick(e) {
|
||||
var btnMap = parentWithClass(e.target, "btnMap");
|
||||
|
||||
if (btnMap) {
|
||||
var channelId = btnMap.getAttribute("data-id");
|
||||
var providerChannelId = btnMap.getAttribute("data-providerid");
|
||||
var menuItems = currentMappingOptions.ProviderChannels.map(function(m) {
|
||||
var menuItems = currentMappingOptions.ProviderChannels.map(function (m) {
|
||||
return {
|
||||
name: m.Name,
|
||||
id: m.Id,
|
||||
selected: m.Id.toLowerCase() === providerChannelId.toLowerCase()
|
||||
}
|
||||
};
|
||||
}).sort(function (a, b) {
|
||||
return a.name.localeCompare(b.name);
|
||||
});
|
||||
|
||||
actionsheet.show({
|
||||
positionTo: btnMap,
|
||||
items: menuItems
|
||||
}).then(function(newChannelId) {
|
||||
mapChannel(btnMap, channelId, newChannelId)
|
||||
})
|
||||
}).then(function (newChannelId) {
|
||||
mapChannel(btnMap, channelId, newChannelId);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -53,47 +61,87 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
|
|||
var apiClient = connectionManager.getApiClient(serverId);
|
||||
return apiClient.getJSON(apiClient.getUrl("LiveTv/ChannelMappingOptions", {
|
||||
providerId: providerId
|
||||
}))
|
||||
}));
|
||||
}
|
||||
|
||||
function getMappingSecondaryName(mapping, providerName) {
|
||||
return (mapping.ProviderChannelName || "") + " - " + providerName
|
||||
return (mapping.ProviderChannelName || "") + " - " + providerName;
|
||||
}
|
||||
|
||||
function getTunerChannelHtml(channel, providerName) {
|
||||
var html = "";
|
||||
return html += '<div class="listItem">', html += '<i class="md-icon listItemIcon">dvr</i>', html += '<div class="listItemBody two-line">', html += '<h3 class="listItemBodyText">', html += channel.Name, html += "</h3>", html += '<div class="secondary listItemBodyText">', channel.ProviderChannelName && (html += getMappingSecondaryName(channel, providerName)), html += "</div>", html += "</div>", html += '<button class="btnMap autoSize" is="paper-icon-button-light" type="button" data-id="' + channel.Id + '" data-providerid="' + channel.ProviderChannelId + '"><i class="md-icon">mode_edit</i></button>', html += "</div>"
|
||||
html += '<div class="listItem">';
|
||||
html += '<i class="md-icon listItemIcon">dvr</i>';
|
||||
html += '<div class="listItemBody two-line">';
|
||||
html += '<h3 class="listItemBodyText">';
|
||||
html += channel.Name;
|
||||
html += "</h3>";
|
||||
html += '<div class="secondary listItemBodyText">';
|
||||
|
||||
if (channel.ProviderChannelName) {
|
||||
html += getMappingSecondaryName(channel, providerName);
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += '<button class="btnMap autoSize" is="paper-icon-button-light" type="button" data-id="' + channel.Id + '" data-providerid="' + channel.ProviderChannelId + '"><i class="md-icon">mode_edit</i></button>';
|
||||
return html += "</div>";
|
||||
}
|
||||
|
||||
function getEditorHtml() {
|
||||
var html = "";
|
||||
return html += '<div class="formDialogContent">', html += '<div class="dialogContentInner dialog-content-centered">', html += '<form style="margin:auto;">', html += "<h1>" + globalize.translate("HeaderChannels") + "</h1>", html += '<div class="channels paperList">', html += "</div>", html += "</form>", html += "</div>", html += "</div>"
|
||||
html += '<div class="formDialogContent">';
|
||||
html += '<div class="dialogContentInner dialog-content-centered">';
|
||||
html += '<form style="margin:auto;">';
|
||||
html += "<h1>" + globalize.translate("HeaderChannels") + "</h1>";
|
||||
html += '<div class="channels paperList">';
|
||||
html += "</div>";
|
||||
html += "</form>";
|
||||
html += "</div>";
|
||||
return html += "</div>";
|
||||
}
|
||||
|
||||
function initEditor(dlg, options) {
|
||||
getChannelMappingOptions(options.serverId, options.providerId).then(function(result) {
|
||||
getChannelMappingOptions(options.serverId, options.providerId).then(function (result) {
|
||||
currentMappingOptions = result;
|
||||
var channelsElement = dlg.querySelector(".channels");
|
||||
channelsElement.innerHTML = result.TunerChannels.map(function(channel) {
|
||||
return getTunerChannelHtml(channel, result.ProviderName)
|
||||
}).join(""), channelsElement.addEventListener("click", onChannelsElementClick)
|
||||
})
|
||||
channelsElement.innerHTML = result.TunerChannels.map(function (channel) {
|
||||
return getTunerChannelHtml(channel, result.ProviderName);
|
||||
}).join("");
|
||||
channelsElement.addEventListener("click", onChannelsElementClick);
|
||||
});
|
||||
}
|
||||
var currentMappingOptions, self = this;
|
||||
self.show = function() {
|
||||
|
||||
var currentMappingOptions;
|
||||
var self = this;
|
||||
|
||||
self.show = function () {
|
||||
var dialogOptions = {
|
||||
removeOnClose: !0
|
||||
removeOnClose: true
|
||||
};
|
||||
dialogOptions.size = "small";
|
||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||
dlg.classList.add("formDialog"), dlg.classList.add("ui-body-a"), dlg.classList.add("background-theme-a");
|
||||
var html = "",
|
||||
title = globalize.translate("MapChannels");
|
||||
return html += '<div class="formDialogHeader">', html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>', html += '<h3 class="formDialogHeaderTitle">', html += title, html += "</h3>", html += "</div>", html += getEditorHtml(), dlg.innerHTML = html, initEditor(dlg, options), dlg.querySelector(".btnCancel").addEventListener("click", function() {
|
||||
dialogHelper.close(dlg)
|
||||
}), new Promise(function(resolve, reject) {
|
||||
dlg.addEventListener("close", resolve), dialogHelper.open(dlg)
|
||||
})
|
||||
}
|
||||
}
|
||||
dlg.classList.add("formDialog");
|
||||
dlg.classList.add("ui-body-a");
|
||||
dlg.classList.add("background-theme-a");
|
||||
var html = "";
|
||||
var title = globalize.translate("MapChannels");
|
||||
html += '<div class="formDialogHeader">';
|
||||
html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>';
|
||||
html += '<h3 class="formDialogHeaderTitle">';
|
||||
html += title;
|
||||
html += "</h3>";
|
||||
html += "</div>";
|
||||
html += getEditorHtml();
|
||||
dlg.innerHTML = html;
|
||||
initEditor(dlg, options);
|
||||
dlg.querySelector(".btnCancel").addEventListener("click", function () {
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
return new Promise(function (resolve, reject) {
|
||||
dlg.addEventListener("close", resolve);
|
||||
dialogHelper.open(dlg);
|
||||
});
|
||||
};
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoader", "globalize", "layoutManager", "scrollStyles", "emby-itemscontainer"], function(loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) {
|
||||
define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoader", "globalize", "layoutManager", "scrollStyles", "emby-itemscontainer"], function (loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) {
|
||||
"use strict";
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getThumbShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||
}
|
||||
|
||||
function getPosterShape() {
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait"
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait";
|
||||
}
|
||||
|
||||
function getSquareShape() {
|
||||
return enableScrollX() ? "overflowSquare" : "square"
|
||||
return enableScrollX() ? "overflowSquare" : "square";
|
||||
}
|
||||
|
||||
function getSections() {
|
||||
|
@ -23,147 +23,208 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad
|
|||
types: "Movie",
|
||||
id: "favoriteMovies",
|
||||
shape: getPosterShape(),
|
||||
showTitle: !1,
|
||||
overlayPlayButton: !0
|
||||
showTitle: false,
|
||||
overlayPlayButton: true
|
||||
}, {
|
||||
name: "HeaderFavoriteShows",
|
||||
types: "Series",
|
||||
id: "favoriteShows",
|
||||
shape: getPosterShape(),
|
||||
showTitle: !1,
|
||||
overlayPlayButton: !0
|
||||
showTitle: false,
|
||||
overlayPlayButton: true
|
||||
}, {
|
||||
name: "HeaderFavoriteEpisodes",
|
||||
types: "Episode",
|
||||
id: "favoriteEpisode",
|
||||
shape: getThumbShape(),
|
||||
preferThumb: !1,
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
overlayPlayButton: !0,
|
||||
overlayText: !1,
|
||||
centerText: !0
|
||||
preferThumb: false,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
overlayPlayButton: true,
|
||||
overlayText: false,
|
||||
centerText: true
|
||||
}, {
|
||||
name: "HeaderFavoriteVideos",
|
||||
types: "Video,MusicVideo",
|
||||
id: "favoriteVideos",
|
||||
shape: getThumbShape(),
|
||||
preferThumb: !0,
|
||||
showTitle: !0,
|
||||
overlayPlayButton: !0,
|
||||
overlayText: !1,
|
||||
centerText: !0
|
||||
preferThumb: true,
|
||||
showTitle: true,
|
||||
overlayPlayButton: true,
|
||||
overlayText: false,
|
||||
centerText: true
|
||||
}, {
|
||||
name: "HeaderFavoriteArtists",
|
||||
types: "MusicArtist",
|
||||
id: "favoriteArtists",
|
||||
shape: getSquareShape(),
|
||||
preferThumb: !1,
|
||||
showTitle: !0,
|
||||
overlayText: !1,
|
||||
showParentTitle: !1,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
coverImage: !0
|
||||
preferThumb: false,
|
||||
showTitle: true,
|
||||
overlayText: false,
|
||||
showParentTitle: false,
|
||||
centerText: true,
|
||||
overlayPlayButton: true,
|
||||
coverImage: true
|
||||
}, {
|
||||
name: "HeaderFavoriteAlbums",
|
||||
types: "MusicAlbum",
|
||||
id: "favoriteAlbums",
|
||||
shape: getSquareShape(),
|
||||
preferThumb: !1,
|
||||
showTitle: !0,
|
||||
overlayText: !1,
|
||||
showParentTitle: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
coverImage: !0
|
||||
preferThumb: false,
|
||||
showTitle: true,
|
||||
overlayText: false,
|
||||
showParentTitle: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true,
|
||||
coverImage: true
|
||||
}, {
|
||||
name: "HeaderFavoriteSongs",
|
||||
types: "Audio",
|
||||
id: "favoriteSongs",
|
||||
shape: getSquareShape(),
|
||||
preferThumb: !1,
|
||||
showTitle: !0,
|
||||
overlayText: !1,
|
||||
showParentTitle: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
preferThumb: false,
|
||||
showTitle: true,
|
||||
overlayText: false,
|
||||
showParentTitle: true,
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
action: "instantmix",
|
||||
coverImage: !0
|
||||
}]
|
||||
coverImage: true
|
||||
}];
|
||||
}
|
||||
|
||||
function loadSection(elem, userId, topParentId, section, isSingleSection) {
|
||||
var screenWidth = dom.getWindowSize().innerWidth,
|
||||
options = {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
Filters: "IsFavorite",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
CollapseBoxSetItems: !1,
|
||||
ExcludeLocationTypes: "Virtual",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
topParentId && (options.ParentId = topParentId), isSingleSection || (options.Limit = screenWidth >= 1920 ? 10 : screenWidth >= 1440 ? 8 : 6, enableScrollX() && (options.Limit = 20));
|
||||
var screenWidth = dom.getWindowSize().innerWidth;
|
||||
var options = {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
Filters: "IsFavorite",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
CollapseBoxSetItems: false,
|
||||
ExcludeLocationTypes: "Virtual",
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
|
||||
if (topParentId) {
|
||||
options.ParentId = topParentId;
|
||||
}
|
||||
|
||||
if (!isSingleSection) {
|
||||
options.Limit = screenWidth >= 1920 ? 10 : screenWidth >= 1440 ? 8 : 6;
|
||||
|
||||
if (enableScrollX()) {
|
||||
options.Limit = 20;
|
||||
}
|
||||
}
|
||||
|
||||
var promise;
|
||||
return "MusicArtist" === section.types ? promise = ApiClient.getArtists(userId, options) : (options.IncludeItemTypes = section.types, promise = ApiClient.getItems(userId, options)), promise.then(function(result) {
|
||||
|
||||
if ("MusicArtist" === section.types) {
|
||||
promise = ApiClient.getArtists(userId, options);
|
||||
} else {
|
||||
options.IncludeItemTypes = section.types;
|
||||
promise = ApiClient.getItems(userId, options);
|
||||
}
|
||||
|
||||
return promise.then(function (result) {
|
||||
var html = "";
|
||||
|
||||
if (result.Items.length) {
|
||||
if (html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) {
|
||||
html += '<a is="emby-linkbutton" href="' + ("list.html?serverId=" + ApiClient.serverId() + "&type=" + section.types + "&IsFavorite=true") + '" class="more button-flat button-flat-mini sectionTitleTextButton">', html += '<h2 class="sectionTitle sectionTitle-cards">', html += globalize.translate(section.name), html += "</h2>", html += '<i class="md-icon"></i>', html += "</a>"
|
||||
} else html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate(section.name) + "</h2>";
|
||||
if (html += "</div>", enableScrollX()) {
|
||||
html += '<a is="emby-linkbutton" href="' + ("list.html?serverId=" + ApiClient.serverId() + "&type=" + section.types + "&IsFavorite=true") + '" class="more button-flat button-flat-mini sectionTitleTextButton">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">';
|
||||
html += globalize.translate(section.name);
|
||||
html += "</h2>";
|
||||
html += '<i class="md-icon"></i>';
|
||||
html += "</a>";
|
||||
} else {
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate(section.name) + "</h2>";
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
if (enableScrollX()) {
|
||||
var scrollXClass = "scrollX hiddenScrollX";
|
||||
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">'
|
||||
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis"),
|
||||
cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle;
|
||||
cardLayout = !1, html += cardBuilder.getCardsHtml(result.Items, {
|
||||
if (layoutManager.tv) {
|
||||
scrollXClass += " smoothScrollX";
|
||||
}
|
||||
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">';
|
||||
} else {
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||
}
|
||||
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle;
|
||||
cardLayout = false;
|
||||
html += cardBuilder.getCardsHtml(result.Items, {
|
||||
preferThumb: section.preferThumb,
|
||||
shape: section.shape,
|
||||
centerText: section.centerText && !cardLayout,
|
||||
overlayText: !1 !== section.overlayText,
|
||||
overlayText: false !== section.overlayText,
|
||||
showTitle: section.showTitle,
|
||||
showParentTitle: section.showParentTitle,
|
||||
scalable: !0,
|
||||
scalable: true,
|
||||
coverImage: section.coverImage,
|
||||
overlayPlayButton: section.overlayPlayButton,
|
||||
overlayMoreButton: section.overlayMoreButton && !cardLayout,
|
||||
action: section.action,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
cardLayout: cardLayout
|
||||
}), html += "</div>"
|
||||
});
|
||||
html += "</div>";
|
||||
}
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem)
|
||||
})
|
||||
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
});
|
||||
}
|
||||
|
||||
function loadSections(page, userId, topParentId, types) {
|
||||
loading.show();
|
||||
var sections = getSections(),
|
||||
sectionid = getParameterByName("sectionid");
|
||||
sectionid && (sections = sections.filter(function(s) {
|
||||
return s.id === sectionid
|
||||
})), types && (sections = sections.filter(function(s) {
|
||||
return -1 !== types.indexOf(s.id)
|
||||
}));
|
||||
var i, length, elem = page.querySelector(".favoriteSections");
|
||||
var sections = getSections();
|
||||
var sectionid = getParameterByName("sectionid");
|
||||
|
||||
if (sectionid) {
|
||||
sections = sections.filter(function (s) {
|
||||
return s.id === sectionid;
|
||||
});
|
||||
}
|
||||
|
||||
if (types) {
|
||||
sections = sections.filter(function (s) {
|
||||
return -1 !== types.indexOf(s.id);
|
||||
});
|
||||
}
|
||||
|
||||
var i;
|
||||
var length;
|
||||
var elem = page.querySelector(".favoriteSections");
|
||||
|
||||
if (!elem.innerHTML) {
|
||||
var html = "";
|
||||
for (i = 0, length = sections.length; i < length; i++) html += '<div class="verticalSection section' + sections[i].id + '"></div>';
|
||||
elem.innerHTML = html
|
||||
|
||||
for (i = 0, length = sections.length; i < length; i++) {
|
||||
html += '<div class="verticalSection section' + sections[i].id + '"></div>';
|
||||
}
|
||||
|
||||
elem.innerHTML = html;
|
||||
}
|
||||
|
||||
var promises = [];
|
||||
|
||||
for (i = 0, length = sections.length; i < length; i++) {
|
||||
var section = sections[i];
|
||||
elem = page.querySelector(".section" + section.id), promises.push(loadSection(elem, userId, topParentId, section, 1 === sections.length))
|
||||
elem = page.querySelector(".section" + section.id);
|
||||
promises.push(loadSection(elem, userId, topParentId, section, 1 === sections.length));
|
||||
}
|
||||
Promise.all(promises).then(function() {
|
||||
loading.hide()
|
||||
})
|
||||
|
||||
Promise.all(promises).then(function () {
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
render: loadSections
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,32 +1,45 @@
|
|||
define(["dom", "appRouter", "connectionManager"], function(dom, appRouter, connectionManager) {
|
||||
define(["dom", "appRouter", "connectionManager"], function (dom, appRouter, connectionManager) {
|
||||
"use strict";
|
||||
|
||||
function onGroupedCardClick(e, card) {
|
||||
var itemId = card.getAttribute("data-id"),
|
||||
serverId = card.getAttribute("data-serverid"),
|
||||
apiClient = connectionManager.getApiClient(serverId),
|
||||
userId = apiClient.getCurrentUserId(),
|
||||
playedIndicator = card.querySelector(".playedIndicator"),
|
||||
playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null,
|
||||
options = {
|
||||
Limit: parseInt(playedIndicatorHtml || "10"),
|
||||
Fields: "PrimaryImageAspectRatio,DateCreated",
|
||||
ParentId: itemId,
|
||||
GroupItems: !1
|
||||
},
|
||||
actionableParent = dom.parentWithTag(e.target, ["A", "BUTTON", "INPUT"]);
|
||||
if (!actionableParent || actionableParent.classList.contains("cardContent")) return apiClient.getJSON(apiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
|
||||
if (1 === items.length) return void appRouter.showItem(items[0]);
|
||||
var url = "itemdetails.html?id=" + itemId + "&serverId=" + serverId;
|
||||
Dashboard.navigate(url)
|
||||
}), e.stopPropagation(), e.preventDefault(), !1
|
||||
var itemId = card.getAttribute("data-id");
|
||||
var serverId = card.getAttribute("data-serverid");
|
||||
var apiClient = connectionManager.getApiClient(serverId);
|
||||
var userId = apiClient.getCurrentUserId();
|
||||
var playedIndicator = card.querySelector(".playedIndicator");
|
||||
var playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null;
|
||||
var options = {
|
||||
Limit: parseInt(playedIndicatorHtml || "10"),
|
||||
Fields: "PrimaryImageAspectRatio,DateCreated",
|
||||
ParentId: itemId,
|
||||
GroupItems: false
|
||||
};
|
||||
var actionableParent = dom.parentWithTag(e.target, ["A", "BUTTON", "INPUT"]);
|
||||
|
||||
if (!actionableParent || actionableParent.classList.contains("cardContent")) {
|
||||
apiClient.getJSON(apiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
|
||||
if (1 === items.length) {
|
||||
return void appRouter.showItem(items[0]);
|
||||
}
|
||||
|
||||
var url = "itemdetails.html?id=" + itemId + "&serverId=" + serverId;
|
||||
Dashboard.navigate(url);
|
||||
});
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function onItemsContainerClick(e) {
|
||||
var groupedCard = dom.parentWithClass(e.target, "groupedCard");
|
||||
groupedCard && onGroupedCardClick(e, groupedCard)
|
||||
|
||||
if (groupedCard) {
|
||||
onGroupedCardClick(e, groupedCard);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
onItemsContainerClick: onItemsContainerClick
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -584,36 +584,34 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
self.setSubtitleOffset = function(offset) {
|
||||
|
||||
var offsetValue = parseFloat(offset);
|
||||
var videoElement = self._mediaElement;
|
||||
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
|
||||
|
||||
Array.from(videoElement.textTracks)
|
||||
.filter(function(trackElement) {
|
||||
if (customTrackIndex === -1 ) {
|
||||
// if .ass currently rendering
|
||||
if (currentAssRenderer){
|
||||
updateCurrentTrackOffset(offsetValue);
|
||||
} else {
|
||||
var videoElement = self._mediaElement;
|
||||
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
|
||||
|
||||
Array.from(videoElement.textTracks)
|
||||
.filter(function(trackElement) {
|
||||
// get showing .vtt textTacks
|
||||
return trackElement.mode === 'showing';
|
||||
} else {
|
||||
// get current .ass textTrack
|
||||
return ("textTrack" + customTrackIndex) === trackElement.id;
|
||||
}
|
||||
})
|
||||
.forEach(function(trackElement) {
|
||||
})
|
||||
.forEach(function(trackElement) {
|
||||
|
||||
var track = mediaStreamTextTracks.filter(function(stream) {
|
||||
return ("textTrack" + stream.Index) === trackElement.id;
|
||||
})[0];
|
||||
var track = customTrackIndex === -1 ? null : mediaStreamTextTracks.filter(function (t) {
|
||||
return t.Index === customTrackIndex;
|
||||
})[0];
|
||||
|
||||
if(track) {
|
||||
offsetValue = updateCurrentTrackOffset(offsetValue);
|
||||
var format = (track.Codec || '').toLowerCase();
|
||||
if (format !== 'ass' && format !== 'ssa') {
|
||||
if (track) {
|
||||
offsetValue = updateCurrentTrackOffset(offsetValue);
|
||||
setVttSubtitleOffset(trackElement, offsetValue);
|
||||
} else {
|
||||
console.log("No available track, cannot apply offset : " + offsetValue);
|
||||
}
|
||||
} else {
|
||||
console.log("No available track, cannot apply offset : " + offsetValue);
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
function updateCurrentTrackOffset(offsetValue) {
|
||||
|
@ -1230,44 +1228,43 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
var trackElement = null;
|
||||
var expectedId = 'manualTrack' + track.Index;
|
||||
if (videoElement.textTracks && videoElement.textTracks.length > 0) {
|
||||
trackElement = videoElement.textTracks[0];
|
||||
|
||||
// get list of tracks
|
||||
var allTracks = videoElement.textTracks;
|
||||
for (var i = 0; i < allTracks.length; i++) {
|
||||
|
||||
var currentTrack = allTracks[i];
|
||||
|
||||
if (currentTrack.label === expectedId) {
|
||||
trackElement = currentTrack;
|
||||
break;
|
||||
} else {
|
||||
currentTrack.mode = 'disabled';
|
||||
}
|
||||
}
|
||||
|
||||
if (!trackElement) {
|
||||
trackElement = videoElement.addTextTrack('subtitles', 'manualTrack' + track.Index, track.Language || 'und');
|
||||
|
||||
// download the track json
|
||||
fetchSubtitles(track, item).then(function (data) {
|
||||
|
||||
// show in ui
|
||||
console.log('downloaded ' + data.TrackEvents.length + ' track events');
|
||||
// add some cues to show the text
|
||||
// in safari, the cues need to be added before setting the track mode to showing
|
||||
data.TrackEvents.forEach(function (trackEvent) {
|
||||
|
||||
var trackCueObject = window.VTTCue || window.TextTrackCue;
|
||||
var cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text));
|
||||
|
||||
trackElement.addCue(cue);
|
||||
});
|
||||
// This throws an error in IE, but is fine in chrome
|
||||
// In IE it's not necessary anyway because changing the src seems to be enough
|
||||
try {
|
||||
trackElement.mode = 'showing';
|
||||
});
|
||||
while (trackElement.cues.length) {
|
||||
trackElement.removeCue(trackElement.cues[0]);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('Error removing cue from textTrack');
|
||||
}
|
||||
|
||||
trackElement.mode = 'disabled';
|
||||
} else {
|
||||
trackElement.mode = 'showing';
|
||||
// There is a function addTextTrack but no function for removeTextTrack
|
||||
// Therefore we add ONE element and replace its cue data
|
||||
trackElement = videoElement.addTextTrack('subtitles', 'manualTrack', 'und');
|
||||
}
|
||||
|
||||
// download the track json
|
||||
fetchSubtitles(track, item).then(function (data) {
|
||||
|
||||
// show in ui
|
||||
console.log('downloaded ' + data.TrackEvents.length + ' track events');
|
||||
// add some cues to show the text
|
||||
// in safari, the cues need to be added before setting the track mode to showing
|
||||
data.TrackEvents.forEach(function (trackEvent) {
|
||||
|
||||
var trackCueObject = window.VTTCue || window.TextTrackCue;
|
||||
var cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text));
|
||||
|
||||
trackElement.addCue(cue);
|
||||
});
|
||||
trackElement.mode = 'showing';
|
||||
});
|
||||
}
|
||||
|
||||
function updateSubtitleText(timeMs) {
|
||||
|
|
|
@ -1,28 +1,45 @@
|
|||
define(["datetime"], function(datetime) {
|
||||
define(["datetime"], function (datetime) {
|
||||
"use strict";
|
||||
|
||||
function humaneDate(date_str) {
|
||||
var format, time_formats = [
|
||||
[90, "a minute"],
|
||||
[3600, "minutes", 60],
|
||||
[5400, "an hour"],
|
||||
[86400, "hours", 3600],
|
||||
[129600, "a day"],
|
||||
[604800, "days", 86400],
|
||||
[907200, "a week"],
|
||||
[2628e3, "weeks", 604800],
|
||||
[3942e3, "a month"],
|
||||
[31536e3, "months", 2628e3],
|
||||
[47304e3, "a year"],
|
||||
[31536e5, "years", 31536e3]
|
||||
],
|
||||
dt = new Date,
|
||||
date = datetime.parseISO8601Date(date_str, !0),
|
||||
seconds = (dt - date) / 1e3,
|
||||
i = 0;
|
||||
for (seconds < 0 && (seconds = Math.abs(seconds)); format = time_formats[i++];)
|
||||
if (seconds < format[0]) return 2 == format.length ? format[1] + " ago" : Math.round(seconds / format[2]) + " " + format[1] + " ago";
|
||||
return seconds > 47304e5 ? Math.round(seconds / 47304e5) + " centuries ago" : date_str
|
||||
var format;
|
||||
var time_formats = [
|
||||
[90, "a minute"],
|
||||
[3600, "minutes", 60],
|
||||
[5400, "an hour"],
|
||||
[86400, "hours", 3600],
|
||||
[129600, "a day"],
|
||||
[604800, "days", 86400],
|
||||
[907200, "a week"],
|
||||
[2628e3, "weeks", 604800],
|
||||
[3942e3, "a month"],
|
||||
[31536e3, "months", 2628e3],
|
||||
[47304e3, "a year"],
|
||||
[31536e5, "years", 31536e3]
|
||||
];
|
||||
var dt = new Date();
|
||||
var date = datetime.parseISO8601Date(date_str, true);
|
||||
var seconds = (dt - date) / 1000.0;
|
||||
var i = 0;
|
||||
|
||||
if (seconds < 0) {
|
||||
seconds = Math.abs(seconds);
|
||||
}
|
||||
for (; format = time_formats[i++];) {
|
||||
if (seconds < format[0]) {
|
||||
if (2 == format.length) {
|
||||
return format[1] + " ago";
|
||||
}
|
||||
|
||||
return Math.round(seconds / format[2]) + " " + format[1] + " ago";
|
||||
}
|
||||
}
|
||||
|
||||
if (seconds > 47304e5) {
|
||||
return Math.round(seconds / 47304e5) + " centuries ago";
|
||||
}
|
||||
|
||||
return date_str;
|
||||
}
|
||||
|
||||
function humaneElapsed(firstDateStr, secondDateStr) {
|
||||
|
@ -30,12 +47,10 @@ define(["datetime"], function(datetime) {
|
|||
var dateOne = new Date(firstDateStr);
|
||||
var dateTwo = new Date(secondDateStr);
|
||||
var delta = (dateTwo.getTime() - dateOne.getTime()) / 1e3;
|
||||
|
||||
var days = Math.floor(delta % 31536e3 / 86400);
|
||||
var hours = Math.floor(delta % 31536e3 % 86400 / 3600);
|
||||
var minutes = Math.floor(delta % 31536e3 % 86400 % 3600 / 60);
|
||||
var seconds = Math.round(delta % 31536e3 % 86400 % 3600 % 60);
|
||||
|
||||
var elapsed = "";
|
||||
elapsed += 1 == days ? days + " day " : "";
|
||||
elapsed += days > 1 ? days + " days " : "";
|
||||
|
@ -46,15 +61,13 @@ define(["datetime"], function(datetime) {
|
|||
elapsed += elapsed.length > 0 ? "and " : "";
|
||||
elapsed += 1 == seconds ? seconds + " second" : "";
|
||||
elapsed += 0 == seconds || seconds > 1 ? seconds + " seconds" : "";
|
||||
|
||||
return elapsed;
|
||||
}
|
||||
|
||||
window.humaneDate = humaneDate;
|
||||
window.humaneElapsed = humaneElapsed;
|
||||
|
||||
return {
|
||||
humaneDate: humaneDate,
|
||||
humaneElapsed: humaneElapsed
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emby-input"], function(globalize, dom, dialogHelper) {
|
||||
define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emby-input"], function (globalize, dom, dialogHelper) {
|
||||
"use strict";
|
||||
|
||||
function getDefaultImageConfig(itemType, type) {
|
||||
|
@ -6,72 +6,107 @@ define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emb
|
|||
Type: type,
|
||||
MinWidth: 0,
|
||||
Limit: "Primary" === type ? 1 : 0
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function findImageOptions(imageOptions, type) {
|
||||
return imageOptions.filter(function(i) {
|
||||
return i.Type == type
|
||||
})[0]
|
||||
return imageOptions.filter(function (i) {
|
||||
return i.Type == type;
|
||||
})[0];
|
||||
}
|
||||
|
||||
function getImageConfig(options, availableOptions, imageType, itemType) {
|
||||
return findImageOptions(options.ImageOptions || [], imageType) || findImageOptions(availableOptions.DefaultImageOptions || [], imageType) || getDefaultImageConfig(itemType, imageType)
|
||||
return findImageOptions(options.ImageOptions || [], imageType) || findImageOptions(availableOptions.DefaultImageOptions || [], imageType) || getDefaultImageConfig(itemType, imageType);
|
||||
}
|
||||
|
||||
function setVisibilityOfBackdrops(elem, visible) {
|
||||
visible ? (elem.classList.remove("hide"), elem.querySelector("input").setAttribute("required", "required")) : (elem.classList.add("hide"), elem.querySelector("input").setAttribute("required", ""), elem.querySelector("input").removeAttribute("required"))
|
||||
if (visible) {
|
||||
elem.classList.remove("hide");
|
||||
elem.querySelector("input").setAttribute("required", "required");
|
||||
} else {
|
||||
elem.classList.add("hide");
|
||||
elem.querySelector("input").setAttribute("required", "");
|
||||
elem.querySelector("input").removeAttribute("required");
|
||||
}
|
||||
}
|
||||
|
||||
function loadValues(context, itemType, options, availableOptions) {
|
||||
var supportedImageTypes = availableOptions.SupportedImageTypes || [];
|
||||
setVisibilityOfBackdrops(context.querySelector(".backdropFields"), -1 != supportedImageTypes.indexOf("Backdrop")), setVisibilityOfBackdrops(context.querySelector(".screenshotFields"), -1 != supportedImageTypes.indexOf("Screenshot")), Array.prototype.forEach.call(context.querySelectorAll(".imageType"), function(i) {
|
||||
var imageType = i.getAttribute("data-imagetype"),
|
||||
container = dom.parentWithTag(i, "LABEL"); - 1 == supportedImageTypes.indexOf(imageType) ? container.classList.add("hide") : container.classList.remove("hide"), getImageConfig(options, availableOptions, imageType, itemType).Limit ? i.checked = !0 : i.checked = !1
|
||||
setVisibilityOfBackdrops(context.querySelector(".backdropFields"), -1 != supportedImageTypes.indexOf("Backdrop"));
|
||||
setVisibilityOfBackdrops(context.querySelector(".screenshotFields"), -1 != supportedImageTypes.indexOf("Screenshot"));
|
||||
Array.prototype.forEach.call(context.querySelectorAll(".imageType"), function (i) {
|
||||
var imageType = i.getAttribute("data-imagetype");
|
||||
var container = dom.parentWithTag(i, "LABEL");
|
||||
|
||||
if (-1 == supportedImageTypes.indexOf(imageType)) {
|
||||
container.classList.add("hide");
|
||||
} else {
|
||||
container.classList.remove("hide");
|
||||
}
|
||||
|
||||
if (getImageConfig(options, availableOptions, imageType, itemType).Limit) {
|
||||
i.checked = true;
|
||||
} else {
|
||||
i.checked = false;
|
||||
}
|
||||
});
|
||||
var backdropConfig = getImageConfig(options, availableOptions, "Backdrop", itemType);
|
||||
context.querySelector("#txtMaxBackdrops").value = backdropConfig.Limit, context.querySelector("#txtMinBackdropDownloadWidth").value = backdropConfig.MinWidth;
|
||||
context.querySelector("#txtMaxBackdrops").value = backdropConfig.Limit;
|
||||
context.querySelector("#txtMinBackdropDownloadWidth").value = backdropConfig.MinWidth;
|
||||
var screenshotConfig = getImageConfig(options, availableOptions, "Screenshot", itemType);
|
||||
context.querySelector("#txtMaxScreenshots").value = screenshotConfig.Limit, context.querySelector("#txtMinScreenshotDownloadWidth").value = screenshotConfig.MinWidth
|
||||
context.querySelector("#txtMaxScreenshots").value = screenshotConfig.Limit;
|
||||
context.querySelector("#txtMinScreenshotDownloadWidth").value = screenshotConfig.MinWidth;
|
||||
}
|
||||
|
||||
function saveValues(context, options) {
|
||||
options.ImageOptions = Array.prototype.map.call(context.querySelectorAll(".imageType:not(.hide)"), function(c) {
|
||||
options.ImageOptions = Array.prototype.map.call(context.querySelectorAll(".imageType:not(.hide)"), function (c) {
|
||||
return {
|
||||
Type: c.getAttribute("data-imagetype"),
|
||||
Limit: c.checked ? 1 : 0,
|
||||
MinWidth: 0
|
||||
}
|
||||
}), options.ImageOptions.push({
|
||||
};
|
||||
});
|
||||
options.ImageOptions.push({
|
||||
Type: "Backdrop",
|
||||
Limit: context.querySelector("#txtMaxBackdrops").value,
|
||||
MinWidth: context.querySelector("#txtMinBackdropDownloadWidth").value
|
||||
}), options.ImageOptions.push({
|
||||
});
|
||||
options.ImageOptions.push({
|
||||
Type: "Screenshot",
|
||||
Limit: context.querySelector("#txtMaxScreenshots").value,
|
||||
MinWidth: context.querySelector("#txtMinScreenshotDownloadWidth").value
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function editor() {
|
||||
this.show = function(itemType, options, availableOptions) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var xhr = new XMLHttpRequest;
|
||||
xhr.open("GET", "components/imageoptionseditor/imageoptionseditor.template.html", !0), xhr.onload = function(e) {
|
||||
var template = this.response,
|
||||
dlg = dialogHelper.createDialog({
|
||||
size: "medium-tall",
|
||||
removeOnClose: !0,
|
||||
scrollY: !1
|
||||
});
|
||||
dlg.classList.add("formDialog"), dlg.innerHTML = globalize.translateDocument(template), dlg.addEventListener("close", function() {
|
||||
saveValues(dlg, options)
|
||||
}), loadValues(dlg, itemType, options, availableOptions), dialogHelper.open(dlg).then(resolve, resolve), dlg.querySelector(".btnCancel").addEventListener("click", function() {
|
||||
dialogHelper.close(dlg)
|
||||
})
|
||||
}, xhr.send()
|
||||
})
|
||||
}
|
||||
this.show = function (itemType, options, availableOptions) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", "components/imageoptionseditor/imageoptionseditor.template.html", true);
|
||||
|
||||
xhr.onload = function (e) {
|
||||
var template = this.response;
|
||||
var dlg = dialogHelper.createDialog({
|
||||
size: "medium-tall",
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
});
|
||||
dlg.classList.add("formDialog");
|
||||
dlg.innerHTML = globalize.translateDocument(template);
|
||||
dlg.addEventListener("close", function () {
|
||||
saveValues(dlg, options);
|
||||
});
|
||||
loadValues(dlg, itemType, options, availableOptions);
|
||||
dialogHelper.open(dlg).then(resolve, resolve);
|
||||
dlg.querySelector(".btnCancel").addEventListener("click", function () {
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
};
|
||||
|
||||
xhr.send();
|
||||
});
|
||||
};
|
||||
}
|
||||
return editor
|
||||
});
|
||||
|
||||
return editor;
|
||||
});
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', 'scrollHelper', 'layoutManager', 'focusManager', 'browser', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'cardStyle'], function (dialogHelper, loading, connectionManager, require, globalize, scrollHelper, layoutManager, focusManager, browser) {
|
||||
'use strict';
|
||||
define(["dialogHelper", "loading", "connectionManager", "require", "globalize", "scrollHelper", "layoutManager", "focusManager", "browser", "emby-input", "emby-checkbox", "paper-icon-button-light", "css!./../formdialog", "material-icons", "cardStyle"], function (dialogHelper, loading, connectionManager, require, globalize, scrollHelper, layoutManager, focusManager, browser) {
|
||||
"use strict";
|
||||
|
||||
var currentItem;
|
||||
var currentItemType;
|
||||
|
@ -20,7 +20,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
};
|
||||
|
||||
var i, length;
|
||||
var identifyField = page.querySelectorAll('.identifyField');
|
||||
var identifyField = page.querySelectorAll(".identifyField");
|
||||
var value;
|
||||
for (i = 0, length = identifyField.length; i < length; i++) {
|
||||
|
||||
|
@ -28,17 +28,17 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
|
||||
if (value) {
|
||||
|
||||
if (identifyField[i].type === 'number') {
|
||||
if (identifyField[i].type === "number") {
|
||||
value = parseInt(value);
|
||||
}
|
||||
|
||||
lookupInfo[identifyField[i].getAttribute('data-lookup')] = value;
|
||||
lookupInfo[identifyField[i].getAttribute("data-lookup")] = value;
|
||||
}
|
||||
}
|
||||
|
||||
var hasId = false;
|
||||
|
||||
var txtLookupId = page.querySelectorAll('.txtLookupId');
|
||||
var txtLookupId = page.querySelectorAll(".txtLookupId");
|
||||
for (i = 0, length = txtLookupId.length; i < length; i++) {
|
||||
|
||||
value = txtLookupId[i].value;
|
||||
|
@ -46,12 +46,12 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
if (value) {
|
||||
hasId = true;
|
||||
}
|
||||
lookupInfo.ProviderIds[txtLookupId[i].getAttribute('data-providerkey')] = value;
|
||||
lookupInfo.ProviderIds[txtLookupId[i].getAttribute("data-providerkey")] = value;
|
||||
}
|
||||
|
||||
if (!hasId && !lookupInfo.Name) {
|
||||
require(['toast'], function (toast) {
|
||||
toast(globalize.translate('PleaseEnterNameOrId'));
|
||||
require(["toast"], function (toast) {
|
||||
toast(globalize.translate("PleaseEnterNameOrId"));
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
url: apiClient.getUrl("Items/RemoteSearch/" + currentItemType),
|
||||
data: JSON.stringify(lookupInfo),
|
||||
contentType: "application/json",
|
||||
dataType: 'json'
|
||||
dataType: "json"
|
||||
|
||||
}).then(function (results) {
|
||||
|
||||
|
@ -87,14 +87,14 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
|
||||
function showIdentificationSearchResults(page, results) {
|
||||
|
||||
var identificationSearchResults = page.querySelector('.identificationSearchResults');
|
||||
var identificationSearchResults = page.querySelector(".identificationSearchResults");
|
||||
|
||||
page.querySelector('.popupIdentifyForm').classList.add('hide');
|
||||
identificationSearchResults.classList.remove('hide');
|
||||
page.querySelector('.identifyOptionsForm').classList.add('hide');
|
||||
page.querySelector('.dialogContentInner').classList.remove('dialog-content-centered');
|
||||
page.querySelector(".popupIdentifyForm").classList.add("hide");
|
||||
identificationSearchResults.classList.remove("hide");
|
||||
page.querySelector(".identifyOptionsForm").classList.add("hide");
|
||||
page.querySelector(".dialogContentInner").classList.remove("dialog-content-centered");
|
||||
|
||||
var html = '';
|
||||
var html = "";
|
||||
var i, length;
|
||||
for (i = 0, length = results.length; i < length; i++) {
|
||||
|
||||
|
@ -102,11 +102,11 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
html += getSearchResultHtml(result, i);
|
||||
}
|
||||
|
||||
var elem = page.querySelector('.identificationSearchResultList');
|
||||
var elem = page.querySelector(".identificationSearchResultList");
|
||||
elem.innerHTML = html;
|
||||
|
||||
function onSearchImageClick() {
|
||||
var index = parseInt(this.getAttribute('data-index'));
|
||||
var index = parseInt(this.getAttribute("data-index"));
|
||||
|
||||
var currentResult = results[index];
|
||||
|
||||
|
@ -119,10 +119,10 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
}
|
||||
}
|
||||
|
||||
var searchImages = elem.querySelectorAll('.card');
|
||||
var searchImages = elem.querySelectorAll(".card");
|
||||
for (i = 0, length = searchImages.length; i < length; i++) {
|
||||
|
||||
searchImages[i].addEventListener('click', onSearchImageClick);
|
||||
searchImages[i].addEventListener("click", onSearchImageClick);
|
||||
}
|
||||
|
||||
if (layoutManager.tv) {
|
||||
|
@ -140,13 +140,13 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
|
||||
function showIdentifyOptions(page, identifyResult) {
|
||||
|
||||
var identifyOptionsForm = page.querySelector('.identifyOptionsForm');
|
||||
var identifyOptionsForm = page.querySelector(".identifyOptionsForm");
|
||||
|
||||
page.querySelector('.popupIdentifyForm').classList.add('hide');
|
||||
page.querySelector('.identificationSearchResults').classList.add('hide');
|
||||
identifyOptionsForm.classList.remove('hide');
|
||||
page.querySelector('#chkIdentifyReplaceImages').checked = true;
|
||||
page.querySelector('.dialogContentInner').classList.add('dialog-content-centered');
|
||||
page.querySelector(".popupIdentifyForm").classList.add("hide");
|
||||
page.querySelector(".identificationSearchResults").classList.add("hide");
|
||||
identifyOptionsForm.classList.remove("hide");
|
||||
page.querySelector("#chkIdentifyReplaceImages").checked = true;
|
||||
page.querySelector(".dialogContentInner").classList.add("dialog-content-centered");
|
||||
|
||||
currentSearchResult = identifyResult;
|
||||
|
||||
|
@ -157,47 +157,47 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
lines.push(identifyResult.ProductionYear);
|
||||
}
|
||||
|
||||
var resultHtml = lines.join('<br/>');
|
||||
var resultHtml = lines.join("<br/>");
|
||||
|
||||
if (identifyResult.ImageUrl) {
|
||||
var displayUrl = getSearchImageDisplayUrl(identifyResult.ImageUrl, identifyResult.SearchProviderName);
|
||||
|
||||
resultHtml = '<div style="display:flex;align-items:center;"><img src="' + displayUrl + '" style="max-height:240px;" /><div style="margin-left:1em;">' + resultHtml + '</div>';
|
||||
resultHtml = '<div style="display:flex;align-items:center;"><img src="' + displayUrl + '" style="max-height:240px;" /><div style="margin-left:1em;">' + resultHtml + "</div>";
|
||||
}
|
||||
|
||||
page.querySelector('.selectedSearchResult').innerHTML = resultHtml;
|
||||
page.querySelector(".selectedSearchResult").innerHTML = resultHtml;
|
||||
|
||||
focusManager.focus(identifyOptionsForm.querySelector('.btnSubmit'));
|
||||
focusManager.focus(identifyOptionsForm.querySelector(".btnSubmit"));
|
||||
}
|
||||
|
||||
function getSearchResultHtml(result, index) {
|
||||
|
||||
var html = '';
|
||||
var html = "";
|
||||
var cssClass = "card scalableCard";
|
||||
var cardBoxCssClass = 'cardBox';
|
||||
var cardBoxCssClass = "cardBox";
|
||||
var padderClass;
|
||||
|
||||
if (currentItemType === "Episode") {
|
||||
cssClass += " backdropCard backdropCard-scalable";
|
||||
padderClass = 'cardPadder-backdrop';
|
||||
padderClass = "cardPadder-backdrop";
|
||||
}
|
||||
else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") {
|
||||
cssClass += " squareCard squareCard-scalable";
|
||||
padderClass = 'cardPadder-square';
|
||||
padderClass = "cardPadder-square";
|
||||
}
|
||||
else {
|
||||
cssClass += " portraitCard portraitCard-scalable";
|
||||
padderClass = 'cardPadder-portrait';
|
||||
padderClass = "cardPadder-portrait";
|
||||
}
|
||||
|
||||
if (layoutManager.tv && !browser.slow) {
|
||||
cardBoxCssClass += ' cardBox-focustransform';
|
||||
cardBoxCssClass += " cardBox-focustransform";
|
||||
}
|
||||
|
||||
cardBoxCssClass += ' cardBox-bottompadded';
|
||||
cardBoxCssClass += " cardBox-bottompadded";
|
||||
|
||||
if (layoutManager.tv) {
|
||||
cardBoxCssClass += ' card-focuscontent cardBox-withfocuscontent';
|
||||
cardBoxCssClass += " card-focuscontent cardBox-withfocuscontent";
|
||||
}
|
||||
|
||||
html += '<button type="button" class="' + cssClass + '" data-index="' + index + '">';
|
||||
|
@ -215,8 +215,8 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
|
||||
html += '<div class="cardImageContainer coveredImage defaultCardBackground defaultCardBackground1"><div class="cardText cardCenteredText">' + result.Name + '</div></div>';
|
||||
}
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
|
||||
var numLines = 2;
|
||||
if (currentItemType === "MusicAlbum") {
|
||||
|
@ -239,12 +239,12 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
} else {
|
||||
html += '<div class="cardText cardText-secondary cardTextCentered">';
|
||||
}
|
||||
html += lines[i] || ' ';
|
||||
html += '</div>';
|
||||
html += lines[i] || " ";
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
html += '</div>';
|
||||
html += '</button>';
|
||||
html += "</div>";
|
||||
html += "</button>";
|
||||
return html;
|
||||
}
|
||||
|
||||
|
@ -259,7 +259,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
loading.show();
|
||||
|
||||
var options = {
|
||||
ReplaceAllImages: page.querySelector('#chkIdentifyReplaceImages').checked
|
||||
ReplaceAllImages: page.querySelector("#chkIdentifyReplaceImages").checked
|
||||
};
|
||||
|
||||
var apiClient = getApiClient();
|
||||
|
@ -291,7 +291,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
|
||||
apiClient.getJSON(apiClient.getUrl("Items/" + item.Id + "/ExternalIdInfos")).then(function (idList) {
|
||||
|
||||
var html = '';
|
||||
var html = "";
|
||||
|
||||
var providerIds = item.ProviderIds || {};
|
||||
|
||||
|
@ -303,30 +303,30 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
|
||||
html += '<div class="inputContainer">';
|
||||
|
||||
var idLabel = globalize.translate('LabelDynamicExternalId').replace('{0}', idInfo.Name);
|
||||
var idLabel = globalize.translate("LabelDynamicExternalId").replace("{0}", idInfo.Name);
|
||||
|
||||
var value = providerIds[idInfo.Key] || '';
|
||||
var value = providerIds[idInfo.Key] || "";
|
||||
|
||||
html += '<input is="emby-input" class="txtLookupId" data-providerkey="' + idInfo.Key + '" id="' + id + '" label="' + idLabel + '"/>';
|
||||
|
||||
html += '</div>';
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
page.querySelector('#txtLookupName').value = '';
|
||||
page.querySelector("#txtLookupName").value = "";
|
||||
|
||||
if (item.Type === "Person" || item.Type === "BoxSet") {
|
||||
|
||||
page.querySelector('.fldLookupYear').classList.add('hide');
|
||||
page.querySelector('#txtLookupYear').value = '';
|
||||
page.querySelector(".fldLookupYear").classList.add("hide");
|
||||
page.querySelector("#txtLookupYear").value = "";
|
||||
} else {
|
||||
|
||||
page.querySelector('.fldLookupYear').classList.remove('hide');
|
||||
page.querySelector('#txtLookupYear').value = '';
|
||||
page.querySelector(".fldLookupYear").classList.remove("hide");
|
||||
page.querySelector("#txtLookupYear").value = "";
|
||||
}
|
||||
|
||||
page.querySelector('.identifyProviderIds').innerHTML = html;
|
||||
page.querySelector(".identifyProviderIds").innerHTML = html;
|
||||
|
||||
page.querySelector('.formDialogHeaderTitle').innerHTML = globalize.translate('Identify');
|
||||
page.querySelector(".formDialogHeaderTitle").innerHTML = globalize.translate("Identify");
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -334,7 +334,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
|
||||
loading.show();
|
||||
|
||||
require(['text!./itemidentifier.template.html'], function (template) {
|
||||
require(["text!./itemidentifier.template.html"], function (template) {
|
||||
|
||||
var apiClient = getApiClient();
|
||||
|
||||
|
@ -344,54 +344,62 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
currentItemType = currentItem.Type;
|
||||
|
||||
var dialogOptions = {
|
||||
size: 'fullscreen-border',
|
||||
size: "fullscreen-border",
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
};
|
||||
|
||||
if (layoutManager.tv) {
|
||||
dialogOptions.size = 'fullscreen';
|
||||
dialogOptions.size = "fullscreen";
|
||||
}
|
||||
|
||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||
|
||||
dlg.classList.add('formDialog');
|
||||
dlg.classList.add('recordingDialog');
|
||||
dlg.classList.add("formDialog");
|
||||
dlg.classList.add("recordingDialog");
|
||||
|
||||
var html = '';
|
||||
html += globalize.translateDocument(template, 'core');
|
||||
var html = "";
|
||||
html += globalize.translateDocument(template, "core");
|
||||
|
||||
dlg.innerHTML = html;
|
||||
|
||||
// Has to be assigned a z-index after the call to .open()
|
||||
dlg.addEventListener('close', onDialogClosed);
|
||||
dlg.addEventListener("close", onDialogClosed);
|
||||
|
||||
if (layoutManager.tv) {
|
||||
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
||||
scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false);
|
||||
}
|
||||
|
||||
if (item.Path) {
|
||||
dlg.querySelector('.fldPath').classList.remove('hide');
|
||||
} else {
|
||||
dlg.querySelector('.fldPath').classList.add('hide');
|
||||
}
|
||||
|
||||
dlg.querySelector('.txtPath').innerHTML = item.Path || '';
|
||||
|
||||
dialogHelper.open(dlg);
|
||||
|
||||
dlg.querySelector('.popupIdentifyForm').addEventListener('submit', function (e) {
|
||||
dlg.querySelector(".popupIdentifyForm").addEventListener("submit", function (e) {
|
||||
|
||||
e.preventDefault();
|
||||
searchForIdentificationResults(dlg);
|
||||
return false;
|
||||
});
|
||||
|
||||
dlg.querySelector('.identifyOptionsForm').addEventListener('submit', function (e) {
|
||||
dlg.querySelector(".identifyOptionsForm").addEventListener("submit", function (e) {
|
||||
|
||||
e.preventDefault();
|
||||
submitIdentficationResult(dlg);
|
||||
return false;
|
||||
});
|
||||
|
||||
dlg.querySelector('.btnCancel').addEventListener('click', function (e) {
|
||||
dlg.querySelector(".btnCancel").addEventListener("click", function (e) {
|
||||
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
|
||||
dlg.classList.add('identifyDialog');
|
||||
dlg.classList.add("identifyDialog");
|
||||
|
||||
showIdentificationForm(dlg, item);
|
||||
loading.hide();
|
||||
|
@ -414,47 +422,49 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
currentItem = null;
|
||||
currentItemType = itemType;
|
||||
|
||||
require(['text!./itemidentifier.template.html'], function (template) {
|
||||
require(["text!./itemidentifier.template.html"], function (template) {
|
||||
|
||||
var dialogOptions = {
|
||||
size: 'fullscreen-border',
|
||||
size: "fullscreen-border",
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
};
|
||||
|
||||
if (layoutManager.tv) {
|
||||
dialogOptions.size = 'fullscreen';
|
||||
dialogOptions.size = "fullscreen";
|
||||
}
|
||||
|
||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||
|
||||
dlg.classList.add('formDialog');
|
||||
dlg.classList.add('recordingDialog');
|
||||
dlg.classList.add("formDialog");
|
||||
dlg.classList.add("recordingDialog");
|
||||
|
||||
var html = '';
|
||||
html += globalize.translateDocument(template, 'core');
|
||||
var html = "";
|
||||
html += globalize.translateDocument(template, "core");
|
||||
|
||||
dlg.innerHTML = html;
|
||||
|
||||
if (layoutManager.tv) {
|
||||
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
||||
scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
dialogHelper.open(dlg);
|
||||
|
||||
dlg.querySelector('.btnCancel').addEventListener('click', function (e) {
|
||||
dlg.querySelector(".btnCancel").addEventListener("click", function (e) {
|
||||
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
|
||||
dlg.querySelector('.popupIdentifyForm').addEventListener('submit', function (e) {
|
||||
dlg.querySelector(".popupIdentifyForm").addEventListener("submit", function (e) {
|
||||
|
||||
e.preventDefault();
|
||||
searchForIdentificationResults(dlg);
|
||||
return false;
|
||||
});
|
||||
|
||||
dlg.addEventListener('close', function () {
|
||||
dlg.addEventListener("close", function () {
|
||||
|
||||
loading.hide();
|
||||
var foundItem = hasChanges ? currentSearchResult : null;
|
||||
|
@ -462,7 +472,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
resolveFunc(foundItem);
|
||||
});
|
||||
|
||||
dlg.classList.add('identifyDialog');
|
||||
dlg.classList.add("identifyDialog");
|
||||
|
||||
showIdentificationFormFindNew(dlg, itemName, itemYear, itemType);
|
||||
});
|
||||
|
@ -470,20 +480,20 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||
|
||||
function showIdentificationFormFindNew(dlg, itemName, itemYear, itemType) {
|
||||
|
||||
dlg.querySelector('#txtLookupName').value = itemName;
|
||||
dlg.querySelector("#txtLookupName").value = itemName;
|
||||
|
||||
if (itemType === "Person" || itemType === "BoxSet") {
|
||||
|
||||
dlg.querySelector('.fldLookupYear').classList.add('hide');
|
||||
dlg.querySelector('#txtLookupYear').value = '';
|
||||
dlg.querySelector(".fldLookupYear").classList.add("hide");
|
||||
dlg.querySelector("#txtLookupYear").value = "";
|
||||
|
||||
} else {
|
||||
|
||||
dlg.querySelector('.fldLookupYear').classList.remove('hide');
|
||||
dlg.querySelector('#txtLookupYear').value = itemYear;
|
||||
dlg.querySelector(".fldLookupYear").classList.remove("hide");
|
||||
dlg.querySelector("#txtLookupYear").value = itemYear;
|
||||
}
|
||||
|
||||
dlg.querySelector('.formDialogHeaderTitle').innerHTML = globalize.translate('Search');
|
||||
dlg.querySelector(".formDialogHeaderTitle").innerHTML = globalize.translate("Search");
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<div class="formDialogHeader">
|
||||
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>
|
||||
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1">
|
||||
<i class="md-icon"></i>
|
||||
</button>
|
||||
<h3 class="formDialogHeaderTitle">
|
||||
${Identify}
|
||||
</h3>
|
||||
|
@ -10,11 +12,17 @@
|
|||
<form class="popupIdentifyForm" style="margin:auto;">
|
||||
|
||||
<p>${HeaderIdentifyItemHelp}</p>
|
||||
<div class="padded-bottom fldPath hide">
|
||||
<div>${LabelPath}</div>
|
||||
<div class="txtPath fieldDescription"></div>
|
||||
</div>
|
||||
<div class="inputContainer">
|
||||
<input is="emby-input" type="text" id="txtLookupName" class="identifyField" data-lookup="Name" label="${LabelName}" />
|
||||
<input is="emby-input" type="text" id="txtLookupName" class="identifyField" data-lookup="Name"
|
||||
label="${LabelName}" />
|
||||
</div>
|
||||
<div class="fldLookupYear inputContainer">
|
||||
<input is="emby-input" type="number" id="txtLookupYear" class="identifyField" data-lookup="Year" pattern="[0-9]*" min="1800" label="${LabelYear}" />
|
||||
<input is="emby-input" type="number" id="txtLookupYear" class="identifyField" data-lookup="Year"
|
||||
pattern="[0-9]*" min="1800" label="${LabelYear}" />
|
||||
</div>
|
||||
|
||||
<div class="identifyProviderIds">
|
||||
|
@ -43,10 +51,11 @@
|
|||
</label>
|
||||
|
||||
<div class="formDialogFooter">
|
||||
<button is="emby-button" type="submit" class="raised button-submit block btnSubmit formDialogFooterItem">
|
||||
<button is="emby-button" type="submit"
|
||||
class="raised button-submit block btnSubmit formDialogFooterItem">
|
||||
<span>${ButtonOk}</span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1667,7 +1667,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||
|
||||
self.getPlayerSubtitleOffset = function(player) {
|
||||
player = player || self._currentPlayer;
|
||||
if (player.getPlayerSubtitleOffset) {
|
||||
if (player.getSubtitleOffset) {
|
||||
return player.getSubtitleOffset();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,78 +1,171 @@
|
|||
define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize", "loading", "material-icons", "formDialogStyle", "emby-button", "emby-itemscontainer", "cardStyle"], function(dialogHelper, dom, layoutManager, connectionManager, globalize, loading) {
|
||||
define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize", "loading", "material-icons", "formDialogStyle", "emby-button", "emby-itemscontainer", "cardStyle"], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading) {
|
||||
"use strict";
|
||||
|
||||
function getEditorHtml() {
|
||||
var html = "";
|
||||
return html += '<div class="formDialogContent scrollY">', html += '<div class="dialogContentInner dialog-content-centered">', html += '<div class="loadingContent hide">', html += "<h1>" + globalize.translate("DetectingDevices") + "...</h1>", html += "<p>" + globalize.translate("MessagePleaseWait") + "</p>", html += "</div>", html += '<h1 style="margin-bottom:.25em;" class="devicesHeader hide">' + globalize.translate("HeaderNewDevices") + "</h1>", html += '<div is="emby-itemscontainer" class="results vertical-wrap">', html += "</div>", html += "</div>", html += "</div>"
|
||||
html += '<div class="formDialogContent scrollY">';
|
||||
html += '<div class="dialogContentInner dialog-content-centered">';
|
||||
html += '<div class="loadingContent hide">';
|
||||
html += "<h1>" + globalize.translate("DetectingDevices") + "...</h1>";
|
||||
html += "<p>" + globalize.translate("MessagePleaseWait") + "</p>";
|
||||
html += "</div>";
|
||||
html += '<h1 style="margin-bottom:.25em;" class="devicesHeader hide">' + globalize.translate("HeaderNewDevices") + "</h1>";
|
||||
html += '<div is="emby-itemscontainer" class="results vertical-wrap">';
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
return html += "</div>";
|
||||
}
|
||||
|
||||
function getDeviceHtml(device) {
|
||||
var padderClass, html = "",
|
||||
cssClass = "card scalableCard",
|
||||
cardBoxCssClass = "cardBox visualCardBox";
|
||||
return cssClass += " backdropCard backdropCard-scalable", padderClass = "cardPadder-backdrop", layoutManager.tv && (cssClass += " card-focusscale", cardBoxCssClass += " cardBox-focustransform"), cardBoxCssClass += " card-focuscontent", html += '<button type="button" class="' + cssClass + '" data-id="' + device.DeviceId + '" style="min-width:33.3333%;">', html += '<div class="' + cardBoxCssClass + '">', html += '<div class="cardScalable visualCardBox-cardScalable">', html += '<div class="' + padderClass + '"></div>', html += '<div class="cardContent searchImage">', html += '<div class="cardImageContainer coveredImage"><i class="cardImageIcon md-icon">dvr</i></div>', html += "</div>", html += "</div>", html += '<div class="cardFooter visualCardBox-cardFooter">', html += '<div class="cardText cardTextCentered">' + getTunerName(device.Type) + "</div>", html += '<div class="cardText cardTextCentered cardText-secondary">' + device.FriendlyName + "</div>", html += '<div class="cardText cardText-secondary cardTextCentered">', html += device.Url || " ", html += "</div>", html += "</div>", html += "</div>", html += "</button>"
|
||||
var padderClass;
|
||||
var html = "";
|
||||
var cssClass = "card scalableCard";
|
||||
var cardBoxCssClass = "cardBox visualCardBox";
|
||||
cssClass += " backdropCard backdropCard-scalable";
|
||||
padderClass = "cardPadder-backdrop";
|
||||
|
||||
if (layoutManager.tv) {
|
||||
cssClass += " card-focusscale";
|
||||
cardBoxCssClass += " cardBox-focustransform";
|
||||
}
|
||||
|
||||
cardBoxCssClass += " card-focuscontent";
|
||||
html += '<button type="button" class="' + cssClass + '" data-id="' + device.DeviceId + '" style="min-width:33.3333%;">';
|
||||
html += '<div class="' + cardBoxCssClass + '">';
|
||||
html += '<div class="cardScalable visualCardBox-cardScalable">';
|
||||
html += '<div class="' + padderClass + '"></div>';
|
||||
html += '<div class="cardContent searchImage">';
|
||||
html += '<div class="cardImageContainer coveredImage"><i class="cardImageIcon md-icon">dvr</i></div>';
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += '<div class="cardFooter visualCardBox-cardFooter">';
|
||||
html += '<div class="cardText cardTextCentered">' + getTunerName(device.Type) + "</div>";
|
||||
html += '<div class="cardText cardTextCentered cardText-secondary">' + device.FriendlyName + "</div>";
|
||||
html += '<div class="cardText cardText-secondary cardTextCentered">';
|
||||
html += device.Url || " ";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
return html += "</button>";
|
||||
}
|
||||
|
||||
function getTunerName(providerId) {
|
||||
switch (providerId = providerId.toLowerCase()) {
|
||||
case "m3u":
|
||||
return "M3U";
|
||||
|
||||
case "hdhomerun":
|
||||
return "HDHomerun";
|
||||
|
||||
case "hauppauge":
|
||||
return "Hauppauge";
|
||||
|
||||
case "satip":
|
||||
return "DVB";
|
||||
|
||||
default:
|
||||
return "Unknown"
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
function renderDevices(view, devices) {
|
||||
var i, length, html = "";
|
||||
for (i = 0, length = devices.length; i < length; i++) html += getDeviceHtml(devices[i]);
|
||||
devices.length ? view.querySelector(".devicesHeader").classList.remove("hide") : (html = "<p><br/>" + globalize.translate("NoNewDevicesFound") + "</p>", view.querySelector(".devicesHeader").classList.add("hide"));
|
||||
var i;
|
||||
var length;
|
||||
var html = "";
|
||||
|
||||
for (i = 0, length = devices.length; i < length; i++) {
|
||||
html += getDeviceHtml(devices[i]);
|
||||
}
|
||||
|
||||
if (devices.length) {
|
||||
view.querySelector(".devicesHeader").classList.remove("hide");
|
||||
} else {
|
||||
html = "<p><br/>" + globalize.translate("NoNewDevicesFound") + "</p>";
|
||||
view.querySelector(".devicesHeader").classList.add("hide");
|
||||
}
|
||||
|
||||
var elem = view.querySelector(".results");
|
||||
elem.innerHTML = html, layoutManager.tv && focusManager.autoFocus(elem)
|
||||
elem.innerHTML = html;
|
||||
|
||||
if (layoutManager.tv) {
|
||||
focusManager.autoFocus(elem);
|
||||
}
|
||||
}
|
||||
|
||||
function discoverDevices(view, apiClient) {
|
||||
return loading.show(), view.querySelector(".loadingContent").classList.remove("hide"), ApiClient.getJSON(ApiClient.getUrl("LiveTv/Tuners/Discvover", {
|
||||
NewDevicesOnly: !0
|
||||
})).then(function(devices) {
|
||||
currentDevices = devices, renderDevices(view, devices), view.querySelector(".loadingContent").classList.add("hide"), loading.hide()
|
||||
})
|
||||
loading.show();
|
||||
view.querySelector(".loadingContent").classList.remove("hide");
|
||||
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/Tuners/Discvover", {
|
||||
NewDevicesOnly: true
|
||||
})).then(function (devices) {
|
||||
currentDevices = devices;
|
||||
renderDevices(view, devices);
|
||||
view.querySelector(".loadingContent").classList.add("hide");
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function tunerPicker() {
|
||||
this.show = function(options) {
|
||||
this.show = function (options) {
|
||||
var dialogOptions = {
|
||||
removeOnClose: !0,
|
||||
scrollY: !1
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
};
|
||||
layoutManager.tv ? dialogOptions.size = "fullscreen" : dialogOptions.size = "small";
|
||||
|
||||
if (layoutManager.tv) {
|
||||
dialogOptions.size = "fullscreen";
|
||||
} else {
|
||||
dialogOptions.size = "small";
|
||||
}
|
||||
|
||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||
dlg.classList.add("formDialog");
|
||||
var html = "";
|
||||
html += '<div class="formDialogHeader">', html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>', html += '<h3 class="formDialogHeaderTitle">', html += globalize.translate("HeaderLiveTvTunerSetup"), html += "</h3>", html += "</div>", html += getEditorHtml(), dlg.innerHTML = html, dlg.querySelector(".btnCancel").addEventListener("click", function() {
|
||||
dialogHelper.close(dlg)
|
||||
html += '<div class="formDialogHeader">';
|
||||
html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>';
|
||||
html += '<h3 class="formDialogHeaderTitle">';
|
||||
html += globalize.translate("HeaderLiveTvTunerSetup");
|
||||
html += "</h3>";
|
||||
html += "</div>";
|
||||
html += getEditorHtml();
|
||||
dlg.innerHTML = html;
|
||||
dlg.querySelector(".btnCancel").addEventListener("click", function () {
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
var deviceResult;
|
||||
dlg.querySelector(".results").addEventListener("click", function(e) {
|
||||
dlg.querySelector(".results").addEventListener("click", function (e) {
|
||||
var tunerCard = dom.parentWithClass(e.target, "card");
|
||||
|
||||
if (tunerCard) {
|
||||
var deviceId = tunerCard.getAttribute("data-id");
|
||||
deviceResult = currentDevices.filter(function(d) {
|
||||
return d.DeviceId === deviceId
|
||||
})[0], dialogHelper.close(dlg)
|
||||
deviceResult = currentDevices.filter(function (d) {
|
||||
return d.DeviceId === deviceId;
|
||||
})[0];
|
||||
dialogHelper.close(dlg);
|
||||
}
|
||||
}), layoutManager.tv && centerFocus(dlg.querySelector(".formDialogContent"), !1, !0);
|
||||
});
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector(".formDialogContent"), false, true);
|
||||
}
|
||||
|
||||
var apiClient = connectionManager.getApiClient(options.serverId);
|
||||
return discoverDevices(dlg, apiClient), layoutManager.tv && centerFocus(dlg.querySelector(".formDialogContent"), !1, !1), dialogHelper.open(dlg).then(function() {
|
||||
return deviceResult ? Promise.resolve(deviceResult) : Promise.reject()
|
||||
})
|
||||
}
|
||||
discoverDevices(dlg, apiClient);
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector(".formDialogContent"), false, false);
|
||||
}
|
||||
|
||||
return dialogHelper.open(dlg).then(function () {
|
||||
if (deviceResult) {
|
||||
return Promise.resolve(deviceResult);
|
||||
}
|
||||
|
||||
return Promise.reject();
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
var currentDevices = [];
|
||||
return tunerPicker
|
||||
});
|
||||
return tunerPicker;
|
||||
});
|
||||
|
|
|
@ -1,119 +1,196 @@
|
|||
define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "emby-select", "emby-button", "flexStyles"], function($, loading) {
|
||||
define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "emby-select", "emby-button", "flexStyles"], function ($, loading) {
|
||||
"use strict";
|
||||
return function(page, providerId, options) {
|
||||
|
||||
return function (page, providerId, options) {
|
||||
function reload() {
|
||||
loading.show(), ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
||||
var info = config.ListingProviders.filter(function(i) {
|
||||
return i.Id === providerId
|
||||
loading.show();
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
var info = config.ListingProviders.filter(function (i) {
|
||||
return i.Id === providerId;
|
||||
})[0] || {};
|
||||
listingsId = info.ListingsId, $("#selectListing", page).val(info.ListingsId || ""), page.querySelector(".txtUser").value = info.Username || "", page.querySelector(".txtPass").value = "", page.querySelector(".txtZipCode").value = info.ZipCode || "", info.Username && info.Password ? page.querySelector(".listingsSection").classList.remove("hide") : page.querySelector(".listingsSection").classList.add("hide"), page.querySelector(".chkAllTuners").checked = info.EnableAllTuners, page.querySelector(".chkAllTuners").checked ? page.querySelector(".selectTunersSection").classList.add("hide") : page.querySelector(".selectTunersSection").classList.remove("hide"), setCountry(info), refreshTunerDevices(page, info, config.TunerHosts)
|
||||
})
|
||||
listingsId = info.ListingsId;
|
||||
$("#selectListing", page).val(info.ListingsId || "");
|
||||
page.querySelector(".txtUser").value = info.Username || "";
|
||||
page.querySelector(".txtPass").value = "";
|
||||
page.querySelector(".txtZipCode").value = info.ZipCode || "";
|
||||
|
||||
if (info.Username && info.Password) {
|
||||
page.querySelector(".listingsSection").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".listingsSection").classList.add("hide");
|
||||
}
|
||||
|
||||
page.querySelector(".chkAllTuners").checked = info.EnableAllTuners;
|
||||
|
||||
if (info.EnableAllTuners) {
|
||||
page.querySelector(".selectTunersSection").classList.add("hide");
|
||||
} else {
|
||||
page.querySelector(".selectTunersSection").classList.remove("hide");
|
||||
}
|
||||
|
||||
setCountry(info);
|
||||
refreshTunerDevices(page, info, config.TunerHosts);
|
||||
});
|
||||
}
|
||||
|
||||
function setCountry(info) {
|
||||
ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/SchedulesDirect/Countries")).then(function(result) {
|
||||
var i, length, countryList = [];
|
||||
ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/SchedulesDirect/Countries")).then(function (result) {
|
||||
var i;
|
||||
var length;
|
||||
var countryList = [];
|
||||
|
||||
for (var region in result) {
|
||||
var countries = result[region];
|
||||
if (countries.length && "ZZZ" !== region)
|
||||
for (i = 0, length = countries.length; i < length; i++) countryList.push({
|
||||
name: countries[i].fullName,
|
||||
value: countries[i].shortName
|
||||
})
|
||||
|
||||
if (countries.length && "ZZZ" !== region) {
|
||||
for (i = 0, length = countries.length; i < length; i++) {
|
||||
countryList.push({
|
||||
name: countries[i].fullName,
|
||||
value: countries[i].shortName
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
countryList.sort(function(a, b) {
|
||||
return a.name > b.name ? 1 : a.name < b.name ? -1 : 0
|
||||
}), $("#selectCountry", page).html(countryList.map(function(c) {
|
||||
return '<option value="' + c.value + '">' + c.name + "</option>"
|
||||
}).join("")).val(info.Country || ""), $(page.querySelector(".txtZipCode")).trigger("change")
|
||||
}, function() {
|
||||
|
||||
countryList.sort(function (a, b) {
|
||||
if (a.name > b.name) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (a.name < b.name) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
});
|
||||
$("#selectCountry", page).html(countryList.map(function (c) {
|
||||
return '<option value="' + c.value + '">' + c.name + "</option>";
|
||||
}).join("")).val(info.Country || "");
|
||||
$(page.querySelector(".txtZipCode")).trigger("change");
|
||||
}, function () { // ApiClient.getJSON() error handler
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("ErrorGettingTvLineups")
|
||||
})
|
||||
}), loading.hide()
|
||||
});
|
||||
});
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function sha256(str) {
|
||||
if (!self.TextEncoder) return Promise.resolve("");
|
||||
if (!self.TextEncoder) {
|
||||
return Promise.resolve("");
|
||||
}
|
||||
|
||||
var buffer = new TextEncoder("utf-8").encode(str);
|
||||
return crypto.subtle.digest("SHA-256", buffer).then(function(hash) {
|
||||
return hex(hash)
|
||||
})
|
||||
return crypto.subtle.digest("SHA-256", buffer).then(function (hash) {
|
||||
return hex(hash);
|
||||
});
|
||||
}
|
||||
|
||||
function hex(buffer) {
|
||||
for (var hexCodes = [], view = new DataView(buffer), i = 0; i < view.byteLength; i += 4) {
|
||||
var value = view.getUint32(i),
|
||||
stringValue = value.toString(16),
|
||||
paddedValue = ("00000000" + stringValue).slice(-"00000000".length);
|
||||
hexCodes.push(paddedValue)
|
||||
var hexCodes = [];
|
||||
var view = new DataView(buffer);
|
||||
|
||||
for (var i = 0; i < view.byteLength; i += 4) {
|
||||
var value = view.getUint32(i);
|
||||
var stringValue = value.toString(16);
|
||||
var paddedValue = ("00000000" + stringValue).slice(-"00000000".length);
|
||||
hexCodes.push(paddedValue);
|
||||
}
|
||||
return hexCodes.join("")
|
||||
|
||||
return hexCodes.join("");
|
||||
}
|
||||
|
||||
function submitLoginForm() {
|
||||
loading.show(), sha256(page.querySelector(".txtPass").value).then(function(passwordHash) {
|
||||
loading.show();
|
||||
sha256(page.querySelector(".txtPass").value).then(function (passwordHash) {
|
||||
var info = {
|
||||
Type: "SchedulesDirect",
|
||||
Username: page.querySelector(".txtUser").value,
|
||||
EnableAllTuners: !0,
|
||||
Password: passwordHash,
|
||||
Pw: page.querySelector(".txtPass").value
|
||||
},
|
||||
id = providerId;
|
||||
id && (info.Id = id), ApiClient.ajax({
|
||||
Type: "SchedulesDirect",
|
||||
Username: page.querySelector(".txtUser").value,
|
||||
EnableAllTuners: true,
|
||||
Password: passwordHash,
|
||||
Pw: page.querySelector(".txtPass").value
|
||||
};
|
||||
var id = providerId;
|
||||
|
||||
if (id) {
|
||||
info.Id = id;
|
||||
}
|
||||
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
||||
ValidateLogin: !0
|
||||
ValidateLogin: true
|
||||
}),
|
||||
data: JSON.stringify(info),
|
||||
contentType: "application/json",
|
||||
dataType: "json"
|
||||
}).then(function(result) {
|
||||
Dashboard.processServerConfigurationUpdateResult(), providerId = result.Id, reload()
|
||||
}, function() {
|
||||
Dashboard.alert({
|
||||
}).then(function (result) {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
providerId = result.Id;
|
||||
reload();
|
||||
}, function () {
|
||||
Dashboard.alert({ // ApiClient.ajax() error handler
|
||||
message: Globalize.translate("ErrorSavingTvProvider")
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function submitListingsForm() {
|
||||
var selectedListingsId = $("#selectListing", page).val();
|
||||
if (!selectedListingsId) return void Dashboard.alert({
|
||||
message: Globalize.translate("ErrorPleaseSelectLineup")
|
||||
});
|
||||
|
||||
if (!selectedListingsId) {
|
||||
return void Dashboard.alert({
|
||||
message: Globalize.translate("ErrorPleaseSelectLineup")
|
||||
});
|
||||
}
|
||||
|
||||
loading.show();
|
||||
var id = providerId;
|
||||
ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
||||
var info = config.ListingProviders.filter(function(i) {
|
||||
return i.Id === id
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
var info = config.ListingProviders.filter(function (i) {
|
||||
return i.Id === id;
|
||||
})[0];
|
||||
info.ZipCode = page.querySelector(".txtZipCode").value, info.Country = $("#selectCountry", page).val(), info.ListingsId = selectedListingsId, info.EnableAllTuners = page.querySelector(".chkAllTuners").checked, info.EnabledTuners = info.EnableAllTuners ? [] : $(".chkTuner", page).get().filter(function(i) {
|
||||
return i.checked
|
||||
}).map(function(i) {
|
||||
return i.getAttribute("data-id")
|
||||
}), ApiClient.ajax({
|
||||
info.ZipCode = page.querySelector(".txtZipCode").value;
|
||||
info.Country = $("#selectCountry", page).val();
|
||||
info.ListingsId = selectedListingsId;
|
||||
info.EnableAllTuners = page.querySelector(".chkAllTuners").checked;
|
||||
info.EnabledTuners = info.EnableAllTuners ? [] : $(".chkTuner", page).get().filter(function (i) {
|
||||
return i.checked;
|
||||
}).map(function (i) {
|
||||
return i.getAttribute("data-id");
|
||||
});
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
||||
ValidateListings: !0
|
||||
ValidateListings: true
|
||||
}),
|
||||
data: JSON.stringify(info),
|
||||
contentType: "application/json"
|
||||
}).then(function(result) {
|
||||
loading.hide(), !1 !== options.showConfirmation && Dashboard.processServerConfigurationUpdateResult(), Events.trigger(self, "submitted")
|
||||
}, function() {
|
||||
loading.hide(), Dashboard.alert({
|
||||
}).then(function (result) {
|
||||
loading.hide();
|
||||
|
||||
if (options.showConfirmation) {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
}
|
||||
|
||||
Events.trigger(self, "submitted");
|
||||
}, function () {
|
||||
loading.hide();
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("ErrorAddingListingsToSchedulesDirect")
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function refreshListings(value) {
|
||||
if (!value) return void $("#selectListing", page).html("");
|
||||
loading.show(), ApiClient.ajax({
|
||||
if (!value) {
|
||||
return void $("#selectListing", page).html("");
|
||||
}
|
||||
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
type: "GET",
|
||||
url: ApiClient.getUrl("LiveTv/ListingProviders/Lineups", {
|
||||
Id: providerId,
|
||||
|
@ -121,15 +198,23 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
|
|||
Country: $("#selectCountry", page).val()
|
||||
}),
|
||||
dataType: "json"
|
||||
}).then(function(result) {
|
||||
$("#selectListing", page).html(result.map(function(o) {
|
||||
return '<option value="' + o.Id + '">' + o.Name + "</option>"
|
||||
})), listingsId && $("#selectListing", page).val(listingsId), loading.hide()
|
||||
}, function(result) {
|
||||
}).then(function (result) {
|
||||
$("#selectListing", page).html(result.map(function (o) {
|
||||
return '<option value="' + o.Id + '">' + o.Name + "</option>";
|
||||
}));
|
||||
|
||||
if (listingsId) {
|
||||
$("#selectListing", page).val(listingsId);
|
||||
}
|
||||
|
||||
loading.hide();
|
||||
}, function (result) {
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("ErrorGettingTvLineups")
|
||||
}), refreshListings(""), loading.hide()
|
||||
})
|
||||
});
|
||||
refreshListings("");
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function getTunerName(providerId) {
|
||||
|
@ -141,34 +226,76 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
|
|||
case "satip":
|
||||
return "DVB";
|
||||
default:
|
||||
return "Unknown"
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
function refreshTunerDevices(page, providerInfo, devices) {
|
||||
for (var html = "", i = 0, length = devices.length; i < length; i++) {
|
||||
var html = "";
|
||||
|
||||
for (var i = 0, length = devices.length; i < length; i++) {
|
||||
var device = devices[i];
|
||||
html += '<div class="listItem">';
|
||||
var enabledTuners = providerInfo.EnabledTuners || [],
|
||||
isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id),
|
||||
checkedAttribute = isChecked ? " checked" : "";
|
||||
html += '<label class="checkboxContainer listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" data-id="' + device.Id + '" class="chkTuner" ' + checkedAttribute + "/><span></span></label>", html += '<div class="listItemBody two-line">', html += '<div class="listItemBodyText">', html += device.FriendlyName || getTunerName(device.Type), html += "</div>", html += '<div class="listItemBodyText secondary">', html += device.Url, html += "</div>", html += "</div>", html += "</div>"
|
||||
var enabledTuners = providerInfo.EnabledTuners || [];
|
||||
var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id);
|
||||
var checkedAttribute = isChecked ? " checked" : "";
|
||||
html += '<label class="checkboxContainer listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" data-id="' + device.Id + '" class="chkTuner" ' + checkedAttribute + "/><span></span></label>";
|
||||
html += '<div class="listItemBody two-line">';
|
||||
html += '<div class="listItemBodyText">';
|
||||
html += device.FriendlyName || getTunerName(device.Type);
|
||||
html += "</div>";
|
||||
html += '<div class="listItemBodyText secondary">';
|
||||
html += device.Url;
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
page.querySelector(".tunerList").innerHTML = html
|
||||
|
||||
page.querySelector(".tunerList").innerHTML = html;
|
||||
}
|
||||
var listingsId, self = this;
|
||||
self.submit = function() {
|
||||
page.querySelector(".btnSubmitListingsContainer").click()
|
||||
}, self.init = function() {
|
||||
options = options || {}, !1 !== options.showCancelButton ? page.querySelector(".btnCancel").classList.remove("hide") : page.querySelector(".btnCancel").classList.add("hide"), !1 !== options.showSubmitButton ? page.querySelector(".btnSubmitListings").classList.remove("hide") : page.querySelector(".btnSubmitListings").classList.add("hide"), $(".formLogin", page).on("submit", function() {
|
||||
return submitLoginForm(), !1
|
||||
}), $(".formListings", page).on("submit", function() {
|
||||
return submitListingsForm(), !1
|
||||
}), $(".txtZipCode", page).on("change", function() {
|
||||
refreshListings(this.value)
|
||||
}), page.querySelector(".chkAllTuners").addEventListener("change", function(e) {
|
||||
e.target.checked ? page.querySelector(".selectTunersSection").classList.add("hide") : page.querySelector(".selectTunersSection").classList.remove("hide")
|
||||
}), $(".createAccountHelp", page).html(Globalize.translate("MessageCreateAccountAt", '<a is="emby-linkbutton" class="button-link" href="http://www.schedulesdirect.org" target="_blank">http://www.schedulesdirect.org</a>')), reload()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var listingsId;
|
||||
var self = this;
|
||||
|
||||
self.submit = function () {
|
||||
page.querySelector(".btnSubmitListingsContainer").click();
|
||||
};
|
||||
|
||||
self.init = function () {
|
||||
options = options || {};
|
||||
|
||||
if (options.showCancelButton) {
|
||||
page.querySelector(".btnCancel").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".btnCancel").classList.add("hide");
|
||||
}
|
||||
|
||||
if (options.showSubmitButton) {
|
||||
page.querySelector(".btnSubmitListings").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".btnSubmitListings").classList.add("hide");
|
||||
}
|
||||
|
||||
$(".formLogin", page).on("submit", function () {
|
||||
submitLoginForm();
|
||||
return false;
|
||||
});
|
||||
$(".formListings", page).on("submit", function () {
|
||||
submitListingsForm();
|
||||
return false;
|
||||
});
|
||||
$(".txtZipCode", page).on("change", function () {
|
||||
refreshListings(this.value);
|
||||
});
|
||||
page.querySelector(".chkAllTuners").addEventListener("change", function (e) {
|
||||
if (e.target.checked) {
|
||||
page.querySelector(".selectTunersSection").classList.add("hide");
|
||||
} else {
|
||||
page.querySelector(".selectTunersSection").classList.remove("hide");
|
||||
}
|
||||
});
|
||||
$(".createAccountHelp", page).html(Globalize.translate("MessageCreateAccountAt", '<a is="emby-linkbutton" class="button-link" href="http://www.schedulesdirect.org" target="_blank">http://www.schedulesdirect.org</a>'));
|
||||
reload();
|
||||
};
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($__q, loading) {
|
||||
define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($, loading) {
|
||||
"use strict";
|
||||
|
||||
return function (page, providerId, options) {
|
||||
|
@ -69,7 +69,7 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa
|
|||
info.NewsCategories = getCategories(page.querySelector(".txtNews"));
|
||||
info.SportsCategories = getCategories(page.querySelector(".txtSports"));
|
||||
info.EnableAllTuners = page.querySelector(".chkAllTuners").checked;
|
||||
info.EnabledTuners = info.EnableAllTuners ? [] : $__q(".chkTuner", page).get().filter(function (tuner) {
|
||||
info.EnabledTuners = info.EnableAllTuners ? [] : $(".chkTuner", page).get().filter(function (tuner) {
|
||||
return tuner.checked;
|
||||
}).map(function (tuner) {
|
||||
return tuner.getAttribute("data-id");
|
||||
|
@ -135,8 +135,8 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa
|
|||
page.querySelector(".tunerList").innerHTML = html;
|
||||
}
|
||||
|
||||
function onSelectPathClick(e__u) {
|
||||
var page = $__q(e__u.target).parents(".xmltvForm")[0];
|
||||
function onSelectPathClick(e) {
|
||||
var page = $(e.target).parents(".xmltvForm")[0];
|
||||
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
|
@ -175,7 +175,7 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa
|
|||
page.querySelector(".btnSubmitListings").classList.add("hide");
|
||||
}
|
||||
|
||||
$__q("form", page).on("submit", function () {
|
||||
$("form", page).on("submit", function () {
|
||||
submitListingsForm();
|
||||
return false;
|
||||
});
|
||||
|
|
|
@ -1,22 +1,18 @@
|
|||
define(["loading"], function(loading) {
|
||||
define(["loading"], function (loading) {
|
||||
"use strict";
|
||||
|
||||
function onFinish() {
|
||||
loading.show(), ApiClient.ajax({
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
url: ApiClient.getUrl("Startup/Complete"),
|
||||
type: "POST"
|
||||
}).then(function() {
|
||||
Dashboard.navigate("dashboard.html");
|
||||
loading.hide();
|
||||
window.location.href = "index.html";
|
||||
});
|
||||
}
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
view.querySelector(".btnWizardNext").addEventListener("click", onFinish);
|
||||
view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
|
||||
});
|
||||
view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,31 +1,39 @@
|
|||
define(["loading", "emby-checkbox", "emby-button", "emby-select"], function(loading) {
|
||||
define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loading) {
|
||||
"use strict";
|
||||
|
||||
function save(page) {
|
||||
loading.show();
|
||||
var apiClient = ApiClient,
|
||||
config = {};
|
||||
config.EnableRemoteAccess = page.querySelector("#chkRemoteAccess").checked, config.EnableAutomaticPortMapping = page.querySelector("#chkEnableUpnp").checked, apiClient.ajax({
|
||||
var apiClient = ApiClient;
|
||||
var config = {};
|
||||
config.EnableRemoteAccess = page.querySelector("#chkRemoteAccess").checked;
|
||||
config.EnableAutomaticPortMapping = page.querySelector("#chkEnableUpnp").checked;
|
||||
apiClient.ajax({
|
||||
type: "POST",
|
||||
data: config,
|
||||
url: apiClient.getUrl("Startup/RemoteAccess")
|
||||
}).then(function() {
|
||||
loading.hide(), navigateToNextPage()
|
||||
})
|
||||
}).then(function () {
|
||||
loading.hide();
|
||||
navigateToNextPage();
|
||||
});
|
||||
}
|
||||
|
||||
function navigateToNextPage() {
|
||||
Dashboard.navigate("wizardfinish.html")
|
||||
Dashboard.navigate("wizardfinish.html");
|
||||
}
|
||||
|
||||
function onSubmit(e) {
|
||||
return save(this), e.preventDefault(), !1
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
})
|
||||
save(this);
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit);
|
||||
view.addEventListener("viewshow", function () {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
|
||||
});
|
||||
view.addEventListener("viewhide", function () {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader");
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,67 +1,84 @@
|
|||
define(["loading", "emby-checkbox", "emby-button", "emby-select"], function(loading) {
|
||||
define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loading) {
|
||||
"use strict";
|
||||
|
||||
function save(page) {
|
||||
loading.show();
|
||||
var apiClient = ApiClient;
|
||||
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config) {
|
||||
config.PreferredMetadataLanguage = page.querySelector("#selectLanguage").value, config.MetadataCountryCode = page.querySelector("#selectCountry").value, apiClient.ajax({
|
||||
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function (config) {
|
||||
config.PreferredMetadataLanguage = page.querySelector("#selectLanguage").value;
|
||||
config.MetadataCountryCode = page.querySelector("#selectCountry").value;
|
||||
apiClient.ajax({
|
||||
type: "POST",
|
||||
data: config,
|
||||
url: apiClient.getUrl("Startup/Configuration")
|
||||
}).then(function() {
|
||||
loading.hide(), navigateToNextPage()
|
||||
})
|
||||
})
|
||||
}).then(function () {
|
||||
loading.hide();
|
||||
navigateToNextPage();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function populateLanguages(select, languages) {
|
||||
var html = "";
|
||||
html += "<option value=''></option>";
|
||||
|
||||
for (var i = 0, length = languages.length; i < length; i++) {
|
||||
var culture = languages[i];
|
||||
html += "<option value='" + culture.TwoLetterISOLanguageName + "'>" + culture.DisplayName + "</option>"
|
||||
html += "<option value='" + culture.TwoLetterISOLanguageName + "'>" + culture.DisplayName + "</option>";
|
||||
}
|
||||
select.innerHTML = html
|
||||
|
||||
select.innerHTML = html;
|
||||
}
|
||||
|
||||
function populateCountries(select, allCountries) {
|
||||
var html = "";
|
||||
html += "<option value=''></option>";
|
||||
|
||||
for (var i = 0, length = allCountries.length; i < length; i++) {
|
||||
var culture = allCountries[i];
|
||||
html += "<option value='" + culture.TwoLetterISORegionName + "'>" + culture.DisplayName + "</option>"
|
||||
html += "<option value='" + culture.TwoLetterISORegionName + "'>" + culture.DisplayName + "</option>";
|
||||
}
|
||||
select.innerHTML = html
|
||||
|
||||
select.innerHTML = html;
|
||||
}
|
||||
|
||||
function reloadData(page, config, cultures, countries) {
|
||||
populateLanguages(page.querySelector("#selectLanguage"), cultures), populateCountries(page.querySelector("#selectCountry"), countries), page.querySelector("#selectLanguage").value = config.PreferredMetadataLanguage, page.querySelector("#selectCountry").value = config.MetadataCountryCode, loading.hide()
|
||||
populateLanguages(page.querySelector("#selectLanguage"), cultures);
|
||||
populateCountries(page.querySelector("#selectCountry"), countries);
|
||||
page.querySelector("#selectLanguage").value = config.PreferredMetadataLanguage;
|
||||
page.querySelector("#selectCountry").value = config.MetadataCountryCode;
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function reload(page) {
|
||||
loading.show();
|
||||
var apiClient = ApiClient,
|
||||
promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration")),
|
||||
promise2 = apiClient.getCultures(),
|
||||
promise3 = apiClient.getCountries();
|
||||
Promise.all([promise1, promise2, promise3]).then(function(responses) {
|
||||
reloadData(page, responses[0], responses[1], responses[2])
|
||||
})
|
||||
var apiClient = ApiClient;
|
||||
var promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration"));
|
||||
var promise2 = apiClient.getCultures();
|
||||
var promise3 = apiClient.getCountries();
|
||||
Promise.all([promise1, promise2, promise3]).then(function (responses) {
|
||||
reloadData(page, responses[0], responses[1], responses[2]);
|
||||
});
|
||||
}
|
||||
|
||||
function navigateToNextPage() {
|
||||
Dashboard.navigate("wizardremoteaccess.html")
|
||||
Dashboard.navigate("wizardremoteaccess.html");
|
||||
}
|
||||
|
||||
function onSubmit(e) {
|
||||
return save(this), e.preventDefault(), !1
|
||||
save(this);
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"), reload(this)
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
return function (view, params) {
|
||||
view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit);
|
||||
view.addEventListener("viewshow", function () {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
|
||||
reload(this);
|
||||
});
|
||||
view.addEventListener("viewhide", function () {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader");
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,41 +1,48 @@
|
|||
define(["jQuery", "loading", "emby-button", "emby-select"], function($, loading) {
|
||||
define(["jQuery", "loading", "emby-button", "emby-select"], function ($, loading) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config, languageOptions) {
|
||||
$("#selectLocalizationLanguage", page).html(languageOptions.map(function(l) {
|
||||
return '<option value="' + l.Value + '">' + l.Name + "</option>"
|
||||
})).val(config.UICulture), loading.hide()
|
||||
$("#selectLocalizationLanguage", page).html(languageOptions.map(function (l) {
|
||||
return '<option value="' + l.Value + '">' + l.Name + "</option>";
|
||||
})).val(config.UICulture);
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function save(page) {
|
||||
loading.show();
|
||||
var apiClient = ApiClient;
|
||||
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config) {
|
||||
config.UICulture = $("#selectLocalizationLanguage", page).val(), apiClient.ajax({
|
||||
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function (config) {
|
||||
config.UICulture = $("#selectLocalizationLanguage", page).val();
|
||||
apiClient.ajax({
|
||||
type: "POST",
|
||||
data: config,
|
||||
url: apiClient.getUrl("Startup/Configuration")
|
||||
}).then(function() {
|
||||
Dashboard.navigate("wizarduser.html")
|
||||
})
|
||||
})
|
||||
}).then(function () {
|
||||
Dashboard.navigate("wizarduser.html");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
return save($(this).parents(".page")), !1
|
||||
save($(this).parents(".page"));
|
||||
return false;
|
||||
}
|
||||
return function(view, params) {
|
||||
$(".wizardStartForm", view).on("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"), loading.show();
|
||||
var page = this,
|
||||
apiClient = ApiClient,
|
||||
promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration")),
|
||||
promise2 = apiClient.getJSON(apiClient.getUrl("Localization/Options"));
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
loadPage(page, responses[0], responses[1])
|
||||
})
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
return function (view, params) {
|
||||
$(".wizardStartForm", view).on("submit", onSubmit);
|
||||
view.addEventListener("viewshow", function () {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
|
||||
loading.show();
|
||||
var page = this;
|
||||
var apiClient = ApiClient;
|
||||
var promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration"));
|
||||
var promise2 = apiClient.getJSON(apiClient.getUrl("Localization/Options"));
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
loadPage(page, responses[0], responses[1]);
|
||||
});
|
||||
});
|
||||
view.addEventListener("viewhide", function () {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader");
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "emby-button"], function(loading, globalize) {
|
||||
define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "emby-button"], function (loading, globalize) {
|
||||
"use strict";
|
||||
|
||||
function getApiClient() {
|
||||
|
@ -30,13 +30,15 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em
|
|||
|
||||
function onSubmit(e) {
|
||||
var form = this;
|
||||
|
||||
if (form.querySelector("#txtManualPassword").value != form.querySelector("#txtPasswordConfirm").value) {
|
||||
require(["toast"], function(toast) {
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("PasswordMatchError"));
|
||||
});
|
||||
} else {
|
||||
submit(form);
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
@ -45,20 +47,21 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em
|
|||
loading.show();
|
||||
var page = this;
|
||||
var apiClient = getApiClient();
|
||||
apiClient.getJSON(apiClient.getUrl("Startup/User")).then(function(user) {
|
||||
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")
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,53 +1,76 @@
|
|||
define(["backdrop", "userSettings", "libraryMenu"], function(backdrop, userSettings, libraryMenu) {
|
||||
define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSettings, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function enabled() {
|
||||
return userSettings.enableBackdrops()
|
||||
return userSettings.enableBackdrops();
|
||||
}
|
||||
|
||||
function getBackdropItemIds(apiClient, userId, types, parentId) {
|
||||
var key = "backdrops2_" + userId + (types || "") + (parentId || ""),
|
||||
data = cache[key];
|
||||
if (data) return console.log("Found backdrop id list in cache. Key: " + key), data = JSON.parse(data), Promise.resolve(data);
|
||||
var key = "backdrops2_" + userId + (types || "") + (parentId || "");
|
||||
var data = cache[key];
|
||||
|
||||
if (data) {
|
||||
console.log("Found backdrop id list in cache. Key: " + key);
|
||||
data = JSON.parse(data);
|
||||
return Promise.resolve(data);
|
||||
}
|
||||
|
||||
var options = {
|
||||
SortBy: "IsFavoriteOrLiked,Random",
|
||||
Limit: 20,
|
||||
Recursive: !0,
|
||||
Recursive: true,
|
||||
IncludeItemTypes: types,
|
||||
ImageTypes: "Backdrop",
|
||||
ParentId: parentId,
|
||||
EnableTotalRecordCount: !1
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
return apiClient.getItems(apiClient.getCurrentUserId(), options).then(function(result) {
|
||||
var images = result.Items.map(function(i) {
|
||||
return apiClient.getItems(apiClient.getCurrentUserId(), options).then(function (result) {
|
||||
var images = result.Items.map(function (i) {
|
||||
return {
|
||||
Id: i.Id,
|
||||
tag: i.BackdropImageTags[0],
|
||||
ServerId: i.ServerId
|
||||
}
|
||||
};
|
||||
});
|
||||
return cache[key] = JSON.stringify(images), images
|
||||
})
|
||||
cache[key] = JSON.stringify(images);
|
||||
return images;
|
||||
});
|
||||
}
|
||||
|
||||
function showBackdrop(type, parentId) {
|
||||
var apiClient = window.ApiClient;
|
||||
apiClient && getBackdropItemIds(apiClient, apiClient.getCurrentUserId(), type, parentId).then(function(images) {
|
||||
images.length ? backdrop.setBackdrops(images.map(function(i) {
|
||||
return i.BackdropImageTags = [i.tag], i
|
||||
})) : backdrop.clear()
|
||||
})
|
||||
|
||||
if (apiClient) {
|
||||
getBackdropItemIds(apiClient, apiClient.getCurrentUserId(), type, parentId).then(function (images) {
|
||||
if (images.length) {
|
||||
backdrop.setBackdrops(images.map(function (i) {
|
||||
i.BackdropImageTags = [i.tag];
|
||||
return i;
|
||||
}));
|
||||
} else {
|
||||
backdrop.clear();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var cache = {};
|
||||
pageClassOn("pageshow", "page", function() {
|
||||
pageClassOn("pageshow", "page", function () {
|
||||
var page = this;
|
||||
if (!page.classList.contains("selfBackdropPage"))
|
||||
if (page.classList.contains("backdropPage"))
|
||||
|
||||
if (!page.classList.contains("selfBackdropPage")) {
|
||||
if (page.classList.contains("backdropPage")) {
|
||||
if (enabled()) {
|
||||
var type = page.getAttribute("data-backdroptype"),
|
||||
parentId = page.classList.contains("globalBackdropPage") ? "" : libraryMenu.getTopParentId();
|
||||
showBackdrop(type, parentId)
|
||||
} else page.classList.remove("backdropPage"), backdrop.clear();
|
||||
else backdrop.clear()
|
||||
})
|
||||
});
|
||||
var type = page.getAttribute("data-backdroptype");
|
||||
var parentId = page.classList.contains("globalBackdropPage") ? "" : libraryMenu.getTopParentId();
|
||||
showBackdrop(type, parentId);
|
||||
} else {
|
||||
page.classList.remove("backdropPage");
|
||||
backdrop.clear();
|
||||
}
|
||||
} else {
|
||||
backdrop.clear();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -107,8 +107,9 @@ define(["datetime", "jQuery", "material-icons"], function (datetime, $) {
|
|||
});
|
||||
}
|
||||
|
||||
function loadLiveTvChannels(openItems, callback) {
|
||||
function loadLiveTvChannels(service, openItems, callback) {
|
||||
ApiClient.getLiveTvChannels({
|
||||
ServiceName: service,
|
||||
AddCurrentProgram: false
|
||||
}).then(function (result) {
|
||||
var nodes = result.Items.map(function (i) {
|
||||
|
|
|
@ -1,40 +1,90 @@
|
|||
define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryBrowser", "emby-itemscontainer", "emby-button"], function(connectionManager, listView, cardBuilder, imageLoader, libraryBrowser) {
|
||||
define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryBrowser", "emby-itemscontainer", "emby-button"], function (connectionManager, listView, cardBuilder, imageLoader, libraryBrowser) {
|
||||
"use strict";
|
||||
|
||||
function renderItems(page, item) {
|
||||
var sections = [];
|
||||
item.ArtistCount && sections.push({
|
||||
name: Globalize.translate("TabArtists"),
|
||||
type: "MusicArtist"
|
||||
}), item.ProgramCount && "Person" == item.Type && sections.push({
|
||||
name: Globalize.translate("HeaderUpcomingOnTV"),
|
||||
type: "Program"
|
||||
}), item.MovieCount && sections.push({
|
||||
name: Globalize.translate("TabMovies"),
|
||||
type: "Movie"
|
||||
}), item.SeriesCount && sections.push({
|
||||
name: Globalize.translate("TabShows"),
|
||||
type: "Series"
|
||||
}), item.EpisodeCount && sections.push({
|
||||
name: Globalize.translate("TabEpisodes"),
|
||||
type: "Episode"
|
||||
}), item.TrailerCount && sections.push({
|
||||
name: Globalize.translate("TabTrailers"),
|
||||
type: "Trailer"
|
||||
}), item.AlbumCount && sections.push({
|
||||
name: Globalize.translate("TabAlbums"),
|
||||
type: "MusicAlbum"
|
||||
}), item.MusicVideoCount && sections.push({
|
||||
name: Globalize.translate("TabMusicVideos"),
|
||||
type: "MusicVideo"
|
||||
});
|
||||
|
||||
if (item.ArtistCount) {
|
||||
sections.push({
|
||||
name: Globalize.translate("TabArtists"),
|
||||
type: "MusicArtist"
|
||||
});
|
||||
}
|
||||
|
||||
if (item.ProgramCount && "Person" == item.Type) {
|
||||
sections.push({
|
||||
name: Globalize.translate("HeaderUpcomingOnTV"),
|
||||
type: "Program"
|
||||
});
|
||||
}
|
||||
|
||||
if (item.MovieCount) {
|
||||
sections.push({
|
||||
name: Globalize.translate("TabMovies"),
|
||||
type: "Movie"
|
||||
});
|
||||
}
|
||||
|
||||
if (item.SeriesCount) {
|
||||
sections.push({
|
||||
name: Globalize.translate("TabShows"),
|
||||
type: "Series"
|
||||
});
|
||||
}
|
||||
|
||||
if (item.EpisodeCount) {
|
||||
sections.push({
|
||||
name: Globalize.translate("TabEpisodes"),
|
||||
type: "Episode"
|
||||
});
|
||||
}
|
||||
|
||||
if (item.TrailerCount) {
|
||||
sections.push({
|
||||
name: Globalize.translate("TabTrailers"),
|
||||
type: "Trailer"
|
||||
});
|
||||
}
|
||||
|
||||
if (item.AlbumCount) {
|
||||
sections.push({
|
||||
name: Globalize.translate("TabAlbums"),
|
||||
type: "MusicAlbum"
|
||||
});
|
||||
}
|
||||
|
||||
if (item.MusicVideoCount) {
|
||||
sections.push({
|
||||
name: Globalize.translate("TabMusicVideos"),
|
||||
type: "MusicVideo"
|
||||
});
|
||||
}
|
||||
|
||||
var elem = page.querySelector("#childrenContent");
|
||||
elem.innerHTML = sections.map(function(section) {
|
||||
var html = "",
|
||||
sectionClass = "verticalSection";
|
||||
return "Audio" === section.type && (sectionClass += " verticalSection-extrabottompadding"), html += '<div class="' + sectionClass + '" data-type="' + section.type + '">', html += '<div class="sectionTitleContainer sectionTitleContainer-cards">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">', html += section.name, html += "</h2>", html += '<a is="emby-linkbutton" href="#" class="clearLink hide" style="margin-left:1em;vertical-align:middle;"><button is="emby-button" type="button" class="raised more raised-mini noIcon">' + Globalize.translate("ButtonMore") + "</button></a>", html += "</div>", html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right">', html += "</div>", html += "</div>"
|
||||
elem.innerHTML = sections.map(function (section) {
|
||||
var html = "";
|
||||
var sectionClass = "verticalSection";
|
||||
|
||||
if ("Audio" === section.type) {
|
||||
sectionClass += " verticalSection-extrabottompadding";
|
||||
}
|
||||
|
||||
html += '<div class="' + sectionClass + '" data-type="' + section.type + '">';
|
||||
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">';
|
||||
html += section.name;
|
||||
html += "</h2>";
|
||||
html += '<a is="emby-linkbutton" href="#" class="clearLink hide" style="margin-left:1em;vertical-align:middle;"><button is="emby-button" type="button" class="raised more raised-mini noIcon">' + Globalize.translate("ButtonMore") + "</button></a>";
|
||||
html += "</div>";
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right">';
|
||||
html += "</div>";
|
||||
return html += "</div>";
|
||||
}).join("");
|
||||
for (var sectionElems = elem.querySelectorAll(".verticalSection"), i = 0, length = sectionElems.length; i < length; i++) renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute("data-type"))
|
||||
var sectionElems = elem.querySelectorAll(".verticalSection");
|
||||
|
||||
for (var i = 0, length = sectionElems.length; i < length; i++) {
|
||||
renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute("data-type"));
|
||||
}
|
||||
}
|
||||
|
||||
function renderSection(page, item, element, type) {
|
||||
|
@ -50,16 +100,17 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
SortBy: "StartDate"
|
||||
}, {
|
||||
shape: "backdrop",
|
||||
showTitle: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
preferThumb: !0,
|
||||
overlayText: !1,
|
||||
showAirTime: !0,
|
||||
showAirDateTime: !0,
|
||||
showChannelName: !0
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
preferThumb: true,
|
||||
overlayText: false,
|
||||
showAirTime: true,
|
||||
showAirDateTime: true,
|
||||
showChannelName: true
|
||||
});
|
||||
break;
|
||||
|
||||
case "Movie":
|
||||
loadItems(element, item, type, {
|
||||
MediaTypes: "",
|
||||
|
@ -71,13 +122,14 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
SortBy: "SortName"
|
||||
}, {
|
||||
shape: "portrait",
|
||||
showTitle: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
overlayText: !1,
|
||||
showYear: !0
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
overlayText: false,
|
||||
showYear: true
|
||||
});
|
||||
break;
|
||||
|
||||
case "MusicVideo":
|
||||
loadItems(element, item, type, {
|
||||
MediaTypes: "",
|
||||
|
@ -89,11 +141,12 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
SortBy: "SortName"
|
||||
}, {
|
||||
shape: "portrait",
|
||||
showTitle: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
break;
|
||||
|
||||
case "Trailer":
|
||||
loadItems(element, item, type, {
|
||||
MediaTypes: "",
|
||||
|
@ -105,11 +158,12 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
SortBy: "SortName"
|
||||
}, {
|
||||
shape: "portrait",
|
||||
showTitle: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
break;
|
||||
|
||||
case "Series":
|
||||
loadItems(element, item, type, {
|
||||
MediaTypes: "",
|
||||
|
@ -121,11 +175,12 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
SortBy: "SortName"
|
||||
}, {
|
||||
shape: "portrait",
|
||||
showTitle: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
overlayMoreButton: true
|
||||
});
|
||||
break;
|
||||
|
||||
case "MusicAlbum":
|
||||
loadItems(element, item, type, {
|
||||
MediaTypes: "",
|
||||
|
@ -137,14 +192,15 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
SortBy: "ProductionYear,Sortname"
|
||||
}, {
|
||||
shape: "square",
|
||||
playFromHere: !0,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
coverImage: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0
|
||||
playFromHere: true,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
coverImage: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
break;
|
||||
|
||||
case "MusicArtist":
|
||||
loadItems(element, item, type, {
|
||||
MediaTypes: "",
|
||||
|
@ -156,14 +212,15 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
SortBy: "SortName"
|
||||
}, {
|
||||
shape: "square",
|
||||
playFromHere: !0,
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
coverImage: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0
|
||||
playFromHere: true,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
coverImage: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
break;
|
||||
|
||||
case "Episode":
|
||||
loadItems(element, item, type, {
|
||||
MediaTypes: "",
|
||||
|
@ -175,12 +232,13 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
SortBy: "SortName"
|
||||
}, {
|
||||
shape: "backdrop",
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
break;
|
||||
|
||||
case "Audio":
|
||||
loadItems(element, item, type, {
|
||||
MediaTypes: "",
|
||||
|
@ -190,57 +248,122 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
|||
AlbumArtistIds: "",
|
||||
SortBy: "AlbumArtist,Album,SortName"
|
||||
}, {
|
||||
playFromHere: !0,
|
||||
playFromHere: true,
|
||||
action: "playallfromhere",
|
||||
smallIcon: !0,
|
||||
artist: !0
|
||||
})
|
||||
smallIcon: true,
|
||||
artist: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function loadItems(element, item, type, query, listOptions) {
|
||||
query = getQuery(query, item), getItemsFunction(query, item)(query.StartIndex, query.Limit, query.Fields).then(function(result) {
|
||||
query = getQuery(query, item);
|
||||
getItemsFunction(query, item)(query.StartIndex, query.Limit, query.Fields).then(function (result) {
|
||||
var html = "";
|
||||
|
||||
if (query.Limit && result.TotalRecordCount > query.Limit) {
|
||||
var link = element.querySelector("a");
|
||||
link.classList.remove("hide"), link.setAttribute("href", getMoreItemsHref(item, type))
|
||||
} else element.querySelector("a").classList.add("hide");
|
||||
link.classList.remove("hide");
|
||||
link.setAttribute("href", getMoreItemsHref(item, type));
|
||||
} else {
|
||||
element.querySelector("a").classList.add("hide");
|
||||
}
|
||||
|
||||
listOptions.items = result.Items;
|
||||
var itemsContainer = element.querySelector(".itemsContainer");
|
||||
"Audio" == type ? (html = listView.getListViewHtml(listOptions), itemsContainer.classList.remove("vertical-wrap"), itemsContainer.classList.add("vertical-list")) : (html = cardBuilder.getCardsHtml(listOptions), itemsContainer.classList.add("vertical-wrap"), itemsContainer.classList.remove("vertical-list")), itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer)
|
||||
})
|
||||
|
||||
if ("Audio" == type) {
|
||||
html = listView.getListViewHtml(listOptions);
|
||||
itemsContainer.classList.remove("vertical-wrap");
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml(listOptions);
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
});
|
||||
}
|
||||
|
||||
function getMoreItemsHref(item, type) {
|
||||
return "Genre" == item.Type ? "list.html?type=" + type + "&genreId=" + item.Id + "&serverId=" + item.ServerId : "MusicGenre" == item.Type ? "list.html?type=" + type + "&musicGenreId=" + item.Id + "&serverId=" + item.ServerId : "Studio" == item.Type ? "list.html?type=" + type + "&studioId=" + item.Id + "&serverId=" + item.ServerId : "MusicArtist" == item.Type ? "list.html?type=" + type + "&artistId=" + item.Id + "&serverId=" + item.ServerId : "Person" == item.Type ? "list.html?type=" + type + "&personId=" + item.Id + "&serverId=" + item.ServerId : "list.html?type=" + type + "&parentId=" + item.Id + "&serverId=" + item.ServerId
|
||||
if ("Genre" == item.Type) {
|
||||
return "list.html?type=" + type + "&genreId=" + item.Id + "&serverId=" + item.ServerId;
|
||||
}
|
||||
|
||||
if ("MusicGenre" == item.Type) {
|
||||
return "list.html?type=" + type + "&musicGenreId=" + item.Id + "&serverId=" + item.ServerId;
|
||||
}
|
||||
|
||||
if ("Studio" == item.Type) {
|
||||
return "list.html?type=" + type + "&studioId=" + item.Id + "&serverId=" + item.ServerId;
|
||||
}
|
||||
|
||||
if ("MusicArtist" == item.Type) {
|
||||
return "list.html?type=" + type + "&artistId=" + item.Id + "&serverId=" + item.ServerId;
|
||||
}
|
||||
|
||||
if ("Person" == item.Type) {
|
||||
return "list.html?type=" + type + "&personId=" + item.Id + "&serverId=" + item.ServerId;
|
||||
}
|
||||
|
||||
return "list.html?type=" + type + "&parentId=" + item.Id + "&serverId=" + item.ServerId;
|
||||
}
|
||||
|
||||
function addCurrentItemToQuery(query, item) {
|
||||
"Person" == item.Type ? query.PersonIds = item.Id : "Genre" == item.Type ? query.GenreIds = item.Id : "MusicGenre" == item.Type ? query.GenreIds = item.Id : "Studio" == item.Type ? query.StudioIds = item.Id : "MusicArtist" == item.Type && (connectionManager.getApiClient(item.ServerId).isMinServerVersion("3.4.1.18") ? query.AlbumArtistIds = item.Id : query.ArtistIds = item.Id)
|
||||
if (item.Type == "Person") {
|
||||
query.PersonIds = item.Id;
|
||||
} else if (item.Type == "Genre") {
|
||||
query.Genres = item.Name;
|
||||
} else if (item.Type == "MusicGenre") {
|
||||
query.Genres = item.Name;
|
||||
} else if (item.Type == "GameGenre") {
|
||||
query.Genres = item.Name;
|
||||
} else if (item.Type == "Studio") {
|
||||
query.StudioIds = item.Id;
|
||||
} else if (item.Type == "MusicArtist") {
|
||||
query.AlbumArtistIds = item.Id;
|
||||
}
|
||||
}
|
||||
|
||||
function getQuery(options, item) {
|
||||
var query = {
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "",
|
||||
Recursive: !0,
|
||||
Recursive: true,
|
||||
Fields: "AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
Limit: 100,
|
||||
StartIndex: 0,
|
||||
CollapseBoxSetItems: !1
|
||||
CollapseBoxSetItems: false
|
||||
};
|
||||
return query = Object.assign(query, options || {}), addCurrentItemToQuery(query, item), query
|
||||
query = Object.assign(query, options || {});
|
||||
addCurrentItemToQuery(query, item);
|
||||
return query;
|
||||
}
|
||||
|
||||
function getItemsFunction(options, item) {
|
||||
var query = getQuery(options, item);
|
||||
return function(index, limit, fields) {
|
||||
query.StartIndex = index, query.Limit = limit, fields && (query.Fields += "," + fields);
|
||||
return function (index, limit, fields) {
|
||||
query.StartIndex = index;
|
||||
query.Limit = limit;
|
||||
|
||||
if (fields) {
|
||||
query.Fields += "," + fields;
|
||||
}
|
||||
|
||||
var apiClient = connectionManager.getApiClient(item.ServerId);
|
||||
return "MusicArtist" === query.IncludeItemTypes ? (query.IncludeItemTypes = null, apiClient.getAlbumArtists(apiClient.getCurrentUserId(), query)) : apiClient.getItems(apiClient.getCurrentUserId(), query)
|
||||
}
|
||||
|
||||
if ("MusicArtist" === query.IncludeItemTypes) {
|
||||
query.IncludeItemTypes = null;
|
||||
return apiClient.getAlbumArtists(apiClient.getCurrentUserId(), query);
|
||||
}
|
||||
|
||||
return apiClient.getItems(apiClient.getCurrentUserId(), query);
|
||||
};
|
||||
}
|
||||
|
||||
window.ItemsByName = {
|
||||
renderItems: renderItems
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,101 +1,198 @@
|
|||
define(["userSettings"], function(userSettings) {
|
||||
define(["userSettings"], function (userSettings) {
|
||||
"use strict";
|
||||
|
||||
var libraryBrowser = {
|
||||
getSavedQueryKey: function(modifier) {
|
||||
return window.location.href.split("#")[0] + (modifier || "")
|
||||
getSavedQueryKey: function (modifier) {
|
||||
return window.location.href.split("#")[0] + (modifier || "");
|
||||
},
|
||||
loadSavedQueryValues: function(key, query) {
|
||||
loadSavedQueryValues: function (key, query) {
|
||||
var values = userSettings.get(key);
|
||||
return values ? (values = JSON.parse(values), Object.assign(query, values)) : query
|
||||
|
||||
if (values) {
|
||||
values = JSON.parse(values);
|
||||
return Object.assign(query, values);
|
||||
}
|
||||
|
||||
return query;
|
||||
},
|
||||
saveQueryValues: function(key, query) {
|
||||
saveQueryValues: function (key, query) {
|
||||
var values = {};
|
||||
query.SortBy && (values.SortBy = query.SortBy), query.SortOrder && (values.SortOrder = query.SortOrder), userSettings.set(key, JSON.stringify(values))
|
||||
|
||||
if (query.SortBy) {
|
||||
values.SortBy = query.SortBy;
|
||||
}
|
||||
|
||||
if (query.SortOrder) {
|
||||
values.SortOrder = query.SortOrder;
|
||||
}
|
||||
|
||||
userSettings.set(key, JSON.stringify(values));
|
||||
},
|
||||
saveViewSetting: function(key, value) {
|
||||
userSettings.set(key + "-_view", value)
|
||||
saveViewSetting: function (key, value) {
|
||||
userSettings.set(key + "-_view", value);
|
||||
},
|
||||
getSavedView: function(key) {
|
||||
return userSettings.get(key + "-_view")
|
||||
getSavedView: function (key) {
|
||||
return userSettings.get(key + "-_view");
|
||||
},
|
||||
showLayoutMenu: function(button, currentLayout, views) {
|
||||
var dispatchEvent = !0;
|
||||
views || (dispatchEvent = !1, views = button.getAttribute("data-layouts"), views = views ? views.split(",") : ["List", "Poster", "PosterCard", "Thumb", "ThumbCard"]);
|
||||
var menuItems = views.map(function(v) {
|
||||
showLayoutMenu: function (button, currentLayout, views) {
|
||||
var dispatchEvent = true;
|
||||
|
||||
if (!views) {
|
||||
dispatchEvent = false;
|
||||
views = button.getAttribute("data-layouts");
|
||||
views = views ? views.split(",") : ["List", "Poster", "PosterCard", "Thumb", "ThumbCard"];
|
||||
}
|
||||
|
||||
var menuItems = views.map(function (v) {
|
||||
return {
|
||||
name: Globalize.translate("Option" + v),
|
||||
id: v,
|
||||
selected: currentLayout == v
|
||||
}
|
||||
};
|
||||
});
|
||||
require(["actionsheet"], function(actionsheet) {
|
||||
|
||||
require(["actionsheet"], function (actionsheet) {
|
||||
actionsheet.show({
|
||||
items: menuItems,
|
||||
positionTo: button,
|
||||
callback: function(id) {
|
||||
callback: function (id) {
|
||||
button.dispatchEvent(new CustomEvent("layoutchange", {
|
||||
detail: {
|
||||
viewStyle: id
|
||||
},
|
||||
bubbles: !0,
|
||||
cancelable: !1
|
||||
})), dispatchEvent || window.$ && $(button).trigger("layoutchange", [id])
|
||||
bubbles: true,
|
||||
cancelable: false
|
||||
}));
|
||||
|
||||
if (!dispatchEvent) {
|
||||
if (window.$) {
|
||||
$(button).trigger("layoutchange", [id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
},
|
||||
getQueryPagingHtml: function(options) {
|
||||
var startIndex = options.startIndex,
|
||||
limit = options.limit,
|
||||
totalRecordCount = options.totalRecordCount,
|
||||
html = "",
|
||||
recordsEnd = Math.min(startIndex + limit, totalRecordCount),
|
||||
showControls = limit < totalRecordCount;
|
||||
getQueryPagingHtml: function (options) {
|
||||
var startIndex = options.startIndex;
|
||||
var limit = options.limit;
|
||||
var totalRecordCount = options.totalRecordCount;
|
||||
var html = "";
|
||||
var recordsEnd = Math.min(startIndex + limit, totalRecordCount);
|
||||
var showControls = limit < totalRecordCount;
|
||||
|
||||
if (html += '<div class="listPaging">', showControls) {
|
||||
html += '<span style="vertical-align:middle;">';
|
||||
html += (totalRecordCount ? startIndex + 1 : 0) + "-" + recordsEnd + " of " + totalRecordCount, html += "</span>"
|
||||
html += (totalRecordCount ? startIndex + 1 : 0) + "-" + recordsEnd + " of " + totalRecordCount;
|
||||
html += "</span>";
|
||||
}
|
||||
return (showControls || options.viewButton || options.filterButton || options.sortButton || options.addLayoutButton) && (html += '<div style="display:inline-block;">', showControls && (html += '<button is="paper-icon-button-light" class="btnPreviousPage autoSize" ' + (startIndex ? "" : "disabled") + '><i class="md-icon"></i></button>', html += '<button is="paper-icon-button-light" class="btnNextPage autoSize" ' + (startIndex + limit >= totalRecordCount ? "disabled" : "") + '><i class="md-icon"></i></button>'), options.addLayoutButton && (html += '<button is="paper-icon-button-light" title="' + Globalize.translate("ButtonSelectView") + '" class="btnChangeLayout autoSize" data-layouts="' + (options.layouts || "") + '" onclick="LibraryBrowser.showLayoutMenu(this, \'' + (options.currentLayout || "") + '\');"><i class="md-icon"></i></button>'), options.sortButton && (html += '<button is="paper-icon-button-light" class="btnSort autoSize" title="' + Globalize.translate("ButtonSort") + '"><i class="md-icon"></i></button>'), options.filterButton && (html += '<button is="paper-icon-button-light" class="btnFilter autoSize" title="' + Globalize.translate("ButtonFilter") + '"><i class="md-icon"></i></button>'), html += "</div>"), html += "</div>"
|
||||
|
||||
if (showControls || options.viewButton || options.filterButton || options.sortButton || options.addLayoutButton) {
|
||||
html += '<div style="display:inline-block;">';
|
||||
|
||||
if (showControls) {
|
||||
html += '<button is="paper-icon-button-light" class="btnPreviousPage autoSize" ' + (startIndex ? "" : "disabled") + '><i class="md-icon"></i></button>';
|
||||
html += '<button is="paper-icon-button-light" class="btnNextPage autoSize" ' + (startIndex + limit >= totalRecordCount ? "disabled" : "") + '><i class="md-icon"></i></button>';
|
||||
}
|
||||
|
||||
if (options.addLayoutButton) {
|
||||
html += '<button is="paper-icon-button-light" title="' + Globalize.translate("ButtonSelectView") + '" class="btnChangeLayout autoSize" data-layouts="' + (options.layouts || "") + '" onclick="LibraryBrowser.showLayoutMenu(this, \'' + (options.currentLayout || "") + '\');"><i class="md-icon"></i></button>';
|
||||
}
|
||||
|
||||
if (options.sortButton) {
|
||||
html += '<button is="paper-icon-button-light" class="btnSort autoSize" title="' + Globalize.translate("ButtonSort") + '"><i class="md-icon"></i></button>';
|
||||
}
|
||||
|
||||
if (options.filterButton) {
|
||||
html += '<button is="paper-icon-button-light" class="btnFilter autoSize" title="' + Globalize.translate("ButtonFilter") + '"><i class="md-icon"></i></button>';
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
return html += "</div>";
|
||||
},
|
||||
showSortMenu: function(options) {
|
||||
require(["dialogHelper", "emby-radio"], function(dialogHelper) {
|
||||
showSortMenu: function (options) {
|
||||
require(["dialogHelper", "emby-radio"], function (dialogHelper) {
|
||||
function onSortByChange() {
|
||||
var newValue = this.value;
|
||||
|
||||
if (this.checked) {
|
||||
var changed = options.query.SortBy != newValue;
|
||||
options.query.SortBy = newValue.replace("_", ","), options.query.StartIndex = 0, options.callback && changed && options.callback()
|
||||
options.query.SortBy = newValue.replace("_", ",");
|
||||
options.query.StartIndex = 0;
|
||||
|
||||
if (options.callback && changed) {
|
||||
options.callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onSortOrderChange() {
|
||||
var newValue = this.value;
|
||||
|
||||
if (this.checked) {
|
||||
var changed = options.query.SortOrder != newValue;
|
||||
options.query.SortOrder = newValue, options.query.StartIndex = 0, options.callback && changed && options.callback()
|
||||
options.query.SortOrder = newValue;
|
||||
options.query.StartIndex = 0;
|
||||
|
||||
if (options.callback && changed) {
|
||||
options.callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var dlg = dialogHelper.createDialog({
|
||||
removeOnClose: !0,
|
||||
modal: !1,
|
||||
removeOnClose: true,
|
||||
modal: false,
|
||||
entryAnimationDuration: 160,
|
||||
exitAnimationDuration: 200
|
||||
});
|
||||
dlg.classList.add("ui-body-a"), dlg.classList.add("background-theme-a"), dlg.classList.add("formDialog");
|
||||
dlg.classList.add("ui-body-a");
|
||||
dlg.classList.add("background-theme-a");
|
||||
dlg.classList.add("formDialog");
|
||||
var html = "";
|
||||
html += '<div style="margin:0;padding:1.25em 1.5em 1.5em;">', html += '<h2 style="margin:0 0 .5em;">', html += Globalize.translate("HeaderSortBy"), html += "</h2>";
|
||||
var i, length, isChecked;
|
||||
for (html += "<div>", i = 0, length = options.items.length; i < length; i++) {
|
||||
var option = options.items[i],
|
||||
radioValue = option.id.replace(",", "_");
|
||||
isChecked = (options.query.SortBy || "").replace(",", "_") == radioValue ? " checked" : "", html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortBy" data-id="' + option.id + '" value="' + radioValue + '" class="menuSortBy" ' + isChecked + " /><span>" + option.name + "</span></label>"
|
||||
html += '<div style="margin:0;padding:1.25em 1.5em 1.5em;">';
|
||||
html += '<h2 style="margin:0 0 .5em;">';
|
||||
html += Globalize.translate("HeaderSortBy");
|
||||
html += "</h2>";
|
||||
var i, length;
|
||||
var isChecked;
|
||||
html += '<div>';
|
||||
for (i = 0, length = options.items.length; i < length; i++) {
|
||||
var option = options.items[i];
|
||||
var radioValue = option.id.replace(",", "_");
|
||||
isChecked = (options.query.SortBy || "").replace(",", "_") == radioValue ? " checked" : "";
|
||||
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortBy" data-id="' + option.id + '" value="' + radioValue + '" class="menuSortBy" ' + isChecked + " /><span>" + option.name + "</span></label>";
|
||||
}
|
||||
html += "</div>", html += '<h2 style="margin: 1em 0 .5em;">', html += Globalize.translate("HeaderSortOrder"), html += "</h2>", html += "<div>", isChecked = "Ascending" == options.query.SortOrder ? " checked" : "", html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Ascending" class="menuSortOrder" ' + isChecked + " /><span>" + Globalize.translate("OptionAscending") + "</span></label>", isChecked = "Descending" == options.query.SortOrder ? " checked" : "", html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Descending" class="menuSortOrder" ' + isChecked + " /><span>" + Globalize.translate("OptionDescending") + "</span></label>", html += "</div>", html += "</div>", dlg.innerHTML = html, dialogHelper.open(dlg);
|
||||
|
||||
html += "</div>";
|
||||
html += '<h2 style="margin: 1em 0 .5em;">';
|
||||
html += Globalize.translate("HeaderSortOrder");
|
||||
html += "</h2>";
|
||||
html += "<div>";
|
||||
isChecked = "Ascending" == options.query.SortOrder ? " checked" : "";
|
||||
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Ascending" class="menuSortOrder" ' + isChecked + " /><span>" + Globalize.translate("OptionAscending") + "</span></label>";
|
||||
isChecked = "Descending" == options.query.SortOrder ? " checked" : "";
|
||||
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Descending" class="menuSortOrder" ' + isChecked + " /><span>" + Globalize.translate("OptionDescending") + "</span></label>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
dlg.innerHTML = html;
|
||||
dialogHelper.open(dlg);
|
||||
var sortBys = dlg.querySelectorAll(".menuSortBy");
|
||||
for (i = 0, length = sortBys.length; i < length; i++) sortBys[i].addEventListener("change", onSortByChange);
|
||||
|
||||
for (i = 0, length = sortBys.length; i < length; i++) {
|
||||
sortBys[i].addEventListener("change", onSortByChange);
|
||||
}
|
||||
|
||||
var sortOrders = dlg.querySelectorAll(".menuSortOrder");
|
||||
for (i = 0, length = sortOrders.length; i < length; i++) sortOrders[i].addEventListener("change", onSortOrderChange)
|
||||
})
|
||||
|
||||
for (i = 0, length = sortOrders.length; i < length; i++) {
|
||||
sortOrders[i].addEventListener("change", onSortOrderChange);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
return window.LibraryBrowser = libraryBrowser, libraryBrowser
|
||||
});
|
||||
window.LibraryBrowser = libraryBrowser;
|
||||
return libraryBrowser;
|
||||
});
|
||||
|
|
|
@ -105,6 +105,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
|
||||
function bindMenuEvents() {
|
||||
mainDrawerButton = document.querySelector(".mainDrawerButton");
|
||||
|
||||
if (mainDrawerButton) {
|
||||
mainDrawerButton.addEventListener("click", toggleMainDrawer);
|
||||
}
|
||||
|
@ -198,18 +199,21 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
html += '<h3 class="sidebarHeader">';
|
||||
html += globalize.translate("HeaderUser");
|
||||
html += "</h3>";
|
||||
|
||||
if (appHost.supports("multiserver")) {
|
||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" data-itemid="selectserver" href="selectserver.html?showuser=1"><i class="md-icon navMenuOptionIcon">wifi</i><span class="navMenuOptionText">' + globalize.translate("ButtonSelectServer") + "</span></a>";
|
||||
}
|
||||
|
||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder btnLogout" data-itemid="logout" href="#"><i class="md-icon navMenuOptionIcon">exit_to_app</i><span class="navMenuOptionText">' + globalize.translate("ButtonSignOut") + "</span></a>";
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
|
||||
// add buttons to navigation drawer
|
||||
navDrawerScrollContainer.innerHTML = html;
|
||||
|
||||
// bind logout button click to method
|
||||
var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout");
|
||||
|
||||
if (btnLogout) {
|
||||
btnLogout.addEventListener("click", onLogoutClick);
|
||||
}
|
||||
|
@ -250,6 +254,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
pageUrls = pageUrls.split("|");
|
||||
selected = pageUrls.filter(isUrlInCurrentView).length > 0;
|
||||
}
|
||||
|
||||
if (selected) {
|
||||
link.classList.add("navMenuOption-selected");
|
||||
var title = "";
|
||||
|
@ -377,6 +382,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
function addPluginPagesToMainMenu(links, pluginItems, section) {
|
||||
for (var i = 0, length = pluginItems.length; i < length; i++) {
|
||||
var pluginItem = pluginItems[i];
|
||||
|
||||
if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) {
|
||||
links.push({
|
||||
name: pluginItem.DisplayName,
|
||||
|
@ -416,15 +422,14 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
return getToolsMenuLinks(apiClient).then(function (items) {
|
||||
var item;
|
||||
var menuHtml = "";
|
||||
|
||||
menuHtml += '<div class="drawerContent">';
|
||||
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
item = items[i];
|
||||
|
||||
if (item.href) {
|
||||
menuHtml += getToolsLinkHtml(item);
|
||||
}
|
||||
else if (item.name) {
|
||||
} else if (item.name) {
|
||||
menuHtml += '<h3 class="sidebarHeader">';
|
||||
menuHtml += item.name;
|
||||
menuHtml += "</h3>";
|
||||
|
@ -460,8 +465,8 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
|
||||
for (var i = 0, length = items.length; i < length; i++) {
|
||||
var view = items[i];
|
||||
|
||||
list.push(view);
|
||||
|
||||
if ("livetv" == view.CollectionType) {
|
||||
view.ImageTags = {};
|
||||
view.icon = "live_tv";
|
||||
|
@ -484,8 +489,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
if (elem) {
|
||||
if (show) {
|
||||
elem.classList.remove("hide");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
elem.classList.add("hide");
|
||||
}
|
||||
}
|
||||
|
@ -503,15 +507,13 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
// FIXME: Potentially the same as above
|
||||
if (user.Policy.EnableContentDownloading) {
|
||||
showBySelector(".lnkSyncToOtherDevices", true);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
showBySelector(".lnkSyncToOtherDevices", false);
|
||||
}
|
||||
|
||||
if (user.Policy.EnableContentDownloading && appHost.supports("sync")) {
|
||||
showBySelector(".libraryMenuDownloads", true);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
showBySelector(".libraryMenuDownloads", false);
|
||||
}
|
||||
|
||||
|
@ -529,9 +531,11 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
html += items.map(function (i) {
|
||||
var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType);
|
||||
var itemId = i.Id;
|
||||
|
||||
if (i.onclick) {
|
||||
i.onclick;
|
||||
}
|
||||
|
||||
return '<a is="emby-linkbutton" data-itemid="' + itemId + '" class="lnkMediaFolder navMenuOption" href="' + getItemHref(i, i.CollectionType) + '"><i class="md-icon navMenuOptionIcon">' + icon + '</i><span class="sectionName navMenuOptionText">' + i.Name + "</span></a>";
|
||||
}).join("");
|
||||
libraryMenuOptions.innerHTML = html;
|
||||
|
@ -592,23 +596,17 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
|
||||
if (isChannelsPage && "channels" === itemId) {
|
||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||
}
|
||||
else if (isLiveTvPage && "livetv" === itemId) {
|
||||
} else if (isLiveTvPage && "livetv" === itemId) {
|
||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||
}
|
||||
else if (isEditorPage && "editor" === itemId) {
|
||||
} else if (isEditorPage && "editor" === itemId) {
|
||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||
}
|
||||
else if (isMySyncPage && "manageoffline" === itemId && -1 != window.location.href.toString().indexOf("mode=download")) {
|
||||
} else if (isMySyncPage && "manageoffline" === itemId && -1 != window.location.href.toString().indexOf("mode=download")) {
|
||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||
}
|
||||
else if (isMySyncPage && "syncotherdevices" === itemId && -1 == window.location.href.toString().indexOf("mode=download")) {
|
||||
} else if (isMySyncPage && "syncotherdevices" === itemId && -1 == window.location.href.toString().indexOf("mode=download")) {
|
||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||
}
|
||||
else if (id && itemId == id) {
|
||||
} else if (id && itemId == id) {
|
||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
lnkMediaFolder.classList.remove("navMenuOption-selected");
|
||||
}
|
||||
}
|
||||
|
@ -667,8 +665,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
|
||||
if (title) {
|
||||
LibraryMenu.setTitle(title);
|
||||
}
|
||||
else if (page.classList.contains("standalonePage")) {
|
||||
} else if (page.classList.contains("standalonePage")) {
|
||||
LibraryMenu.setDefaultTitle();
|
||||
}
|
||||
}
|
||||
|
@ -697,6 +694,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
function refreshLibraryDrawer(user) {
|
||||
loadNavDrawer();
|
||||
currentDrawerType = "library";
|
||||
|
||||
if (user) {
|
||||
Promise.resolve(user);
|
||||
} else {
|
||||
|
@ -729,9 +727,11 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
return new Promise(function (resolve, reject) {
|
||||
require(["navdrawer"], function (navdrawer) {
|
||||
navDrawerInstance = new navdrawer(getNavDrawerOptions());
|
||||
|
||||
if (!layoutManager.tv) {
|
||||
navDrawerElement.classList.remove("hide");
|
||||
}
|
||||
|
||||
resolve(navDrawerInstance);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,57 +1,95 @@
|
|||
define(["layoutManager", "datetime", "cardBuilder", "apphost"], function(layoutManager, datetime, cardBuilder, appHost) {
|
||||
define(["layoutManager", "datetime", "cardBuilder", "apphost"], function (layoutManager, datetime, cardBuilder, appHost) {
|
||||
"use strict";
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getBackdropShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||
}
|
||||
|
||||
function getTimersHtml(timers, options) {
|
||||
options = options || {};
|
||||
var i, length, items = timers.map(function(t) {
|
||||
return t.Type = "Timer", t
|
||||
}),
|
||||
groups = [],
|
||||
currentGroupName = "",
|
||||
currentGroup = [];
|
||||
var i;
|
||||
var length;
|
||||
var items = timers.map(function (t) {
|
||||
t.Type = "Timer";
|
||||
return t;
|
||||
});
|
||||
var groups = [];
|
||||
var currentGroupName = "";
|
||||
var currentGroup = [];
|
||||
|
||||
for (i = 0, length = items.length; i < length; i++) {
|
||||
var item = items[i],
|
||||
dateText = "";
|
||||
if (!1 !== options.indexByDate && item.StartDate) try {
|
||||
var premiereDate = datetime.parseISO8601Date(item.StartDate, !0);
|
||||
dateText = datetime.toLocaleDateString(premiereDate, {
|
||||
weekday: "long",
|
||||
month: "short",
|
||||
day: "numeric"
|
||||
})
|
||||
} catch (err) {}
|
||||
dateText != currentGroupName ? (currentGroup.length && groups.push({
|
||||
var item = items[i];
|
||||
var dateText = "";
|
||||
|
||||
if (options.indexByDate !== false && item.StartDate) {
|
||||
try {
|
||||
var premiereDate = datetime.parseISO8601Date(item.StartDate, true);
|
||||
dateText = datetime.toLocaleDateString(premiereDate, {
|
||||
weekday: "long",
|
||||
month: "short",
|
||||
day: "numeric"
|
||||
});
|
||||
} catch (err) {
|
||||
console.log("Error parsing premiereDate:" + item.StartDate + "; error: " + err);
|
||||
}
|
||||
}
|
||||
|
||||
if (dateText != currentGroupName) {
|
||||
if (currentGroup.length) {
|
||||
groups.push({
|
||||
name: currentGroupName,
|
||||
items: currentGroup
|
||||
});
|
||||
}
|
||||
|
||||
currentGroupName = dateText;
|
||||
currentGroup = [item];
|
||||
} else {
|
||||
currentGroup.push(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (currentGroup.length) {
|
||||
groups.push({
|
||||
name: currentGroupName,
|
||||
items: currentGroup
|
||||
}), currentGroupName = dateText, currentGroup = [item]) : currentGroup.push(item)
|
||||
});
|
||||
}
|
||||
currentGroup.length && groups.push({
|
||||
name: currentGroupName,
|
||||
items: currentGroup
|
||||
});
|
||||
|
||||
var html = "";
|
||||
|
||||
for (i = 0, length = groups.length; i < length; i++) {
|
||||
var group = groups[i],
|
||||
supportsImageAnalysis = appHost.supports("imageanalysis"),
|
||||
cardLayout = appHost.preferVisualCards || supportsImageAnalysis;
|
||||
if (cardLayout = !0, group.name && (html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>"), enableScrollX()) {
|
||||
var group = groups[i];
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
var cardLayout = appHost.preferVisualCards || supportsImageAnalysis;
|
||||
|
||||
cardLayout = true;
|
||||
if (group.name) {
|
||||
html += '<div class="verticalSection">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>";
|
||||
}
|
||||
if (enableScrollX()) {
|
||||
var scrollXClass = "scrollX hiddenScrollX";
|
||||
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">'
|
||||
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||
|
||||
if (layoutManager.tv) {
|
||||
scrollXClass += " smoothScrollX";
|
||||
}
|
||||
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">';
|
||||
} else {
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||
}
|
||||
|
||||
html += cardBuilder.getCardsHtml({
|
||||
items: group.items,
|
||||
shape: cardLayout ? getBackdropShape() : enableScrollX() ? "autoOverflow" : "autoVertical",
|
||||
showParentTitleOrTitle: !0,
|
||||
showAirTime: !0,
|
||||
showAirEndTime: !0,
|
||||
showParentTitleOrTitle: true,
|
||||
showAirTime: true,
|
||||
showAirEndTime: true,
|
||||
showChannelName: !cardLayout,
|
||||
cardLayout: cardLayout,
|
||||
centerText: !cardLayout,
|
||||
|
@ -59,15 +97,22 @@ define(["layoutManager", "datetime", "cardBuilder", "apphost"], function(layoutM
|
|||
cardFooterAside: "none",
|
||||
preferThumb: !!cardLayout || "auto",
|
||||
defaultShape: cardLayout ? null : "portrait",
|
||||
coverImage: !0,
|
||||
allowBottomPadding: !1,
|
||||
overlayText: !1,
|
||||
coverImage: true,
|
||||
allowBottomPadding: false,
|
||||
overlayText: false,
|
||||
showChannelLogo: cardLayout
|
||||
}), html += "</div>", group.name && (html += "</div>")
|
||||
});
|
||||
html += "</div>";
|
||||
|
||||
if (group.name) {
|
||||
html += "</div>";
|
||||
}
|
||||
}
|
||||
return Promise.resolve(html)
|
||||
|
||||
return Promise.resolve(html);
|
||||
}
|
||||
|
||||
window.LiveTvHelpers = {
|
||||
getTimersHtml: getTimersHtml
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,39 +1,50 @@
|
|||
define(["listView"], function(listView) {
|
||||
define(["listView"], function (listView) {
|
||||
"use strict";
|
||||
|
||||
function getFetchPlaylistItemsFn(itemId) {
|
||||
return function() {
|
||||
return function () {
|
||||
var query = {
|
||||
Fields: "PrimaryImageAspectRatio,UserData",
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
UserId: ApiClient.getCurrentUserId()
|
||||
};
|
||||
return ApiClient.getJSON(ApiClient.getUrl("Playlists/" + itemId + "/Items", query))
|
||||
}
|
||||
return ApiClient.getJSON(ApiClient.getUrl("Playlists/" + itemId + "/Items", query));
|
||||
};
|
||||
}
|
||||
|
||||
function getItemsHtmlFn(itemId) {
|
||||
return function(items) {
|
||||
return function (items) {
|
||||
return listView.getListViewHtml({
|
||||
items: items,
|
||||
showIndex: !1,
|
||||
showRemoveFromPlaylist: !0,
|
||||
playFromHere: !0,
|
||||
showIndex: false,
|
||||
showRemoveFromPlaylist: true,
|
||||
playFromHere: true,
|
||||
action: "playallfromhere",
|
||||
smallIcon: !0,
|
||||
dragHandle: !0,
|
||||
smallIcon: true,
|
||||
dragHandle: true,
|
||||
playlistId: itemId
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
function init(page, item) {
|
||||
var elem = page.querySelector("#childrenContent .itemsContainer");
|
||||
elem.classList.add("vertical-list"), elem.classList.remove("vertical-wrap"), elem.enableDragReordering(!0), elem.fetchData = getFetchPlaylistItemsFn(item.Id), elem.getItemsHtml = getItemsHtmlFn(item.Id)
|
||||
elem.classList.add("vertical-list");
|
||||
elem.classList.remove("vertical-wrap");
|
||||
elem.enableDragReordering(true);
|
||||
elem.fetchData = getFetchPlaylistItemsFn(item.Id);
|
||||
elem.getItemsHtml = getItemsHtmlFn(item.Id);
|
||||
}
|
||||
|
||||
window.PlaylistViewer = {
|
||||
render: function(page, item) {
|
||||
page.playlistInit || (page.playlistInit = !0, init(page, item)), page.querySelector("#childrenContent").classList.add("verticalSection-extrabottompadding"), page.querySelector("#childrenContent .itemsContainer").refreshItems()
|
||||
render: function (page, item) {
|
||||
if (!page.playlistInit) {
|
||||
page.playlistInit = true;
|
||||
init(page, item);
|
||||
}
|
||||
|
||||
page.querySelector("#childrenContent").classList.add("verticalSection-extrabottompadding");
|
||||
page.querySelector("#childrenContent .itemsContainer").refreshItems();
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,124 +1,186 @@
|
|||
define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", "apphost", "imageLoader", "emby-itemscontainer"], function(loading, listView, cardBuilder, libraryMenu, libraryBrowser, appHost, imageLoader) {
|
||||
define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", "apphost", "imageLoader", "emby-itemscontainer"], function (loading, listView, cardBuilder, libraryMenu, libraryBrowser, appHost, imageLoader) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function getPageData(context) {
|
||||
var key = getSavedQueryKey(context),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Playlist",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete",
|
||||
StartIndex: 0,
|
||||
Limit: 100
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, pageData.query.ParentId = libraryMenu.getTopParentId(), libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey(context);
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Playlist",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete",
|
||||
StartIndex: 0,
|
||||
Limit: 100
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
pageData.query.ParentId = libraryMenu.getTopParentId();
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery(context) {
|
||||
return getPageData(context).query
|
||||
return getPageData(context).query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey(context) {
|
||||
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey()), context.savedQueryKey
|
||||
if (!context.savedQueryKey) {
|
||||
context.savedQueryKey = libraryBrowser.getSavedQueryKey();
|
||||
}
|
||||
|
||||
return context.savedQueryKey;
|
||||
}
|
||||
|
||||
function showLoadingMessage() {
|
||||
loading.show()
|
||||
loading.show();
|
||||
}
|
||||
|
||||
function hideLoadingMessage() {
|
||||
loading.hide()
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function onViewStyleChange() {
|
||||
var viewStyle = getPageData(view).view,
|
||||
itemsContainer = view.querySelector(".itemsContainer");
|
||||
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
|
||||
var viewStyle = getPageData(view).view;
|
||||
var itemsContainer = view.querySelector(".itemsContainer");
|
||||
|
||||
if ("List" == viewStyle) {
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
itemsContainer.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = "";
|
||||
}
|
||||
|
||||
function reloadItems() {
|
||||
showLoadingMessage();
|
||||
var query = getQuery(view),
|
||||
promise1 = ApiClient.getItems(Dashboard.getCurrentUserId(), query),
|
||||
promise2 = Dashboard.getCurrentUser();
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
var query = getQuery(view);
|
||||
var promise1 = ApiClient.getItems(Dashboard.getCurrentUserId(), query);
|
||||
var promise2 = Dashboard.getCurrentUser();
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
var result = responses[0];
|
||||
responses[1];
|
||||
window.scrollTo(0, 0);
|
||||
var html = "",
|
||||
viewStyle = getPageData(view).view;
|
||||
var html = "";
|
||||
var viewStyle = getPageData(view).view;
|
||||
view.querySelector(".listTopPaging").innerHTML = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
viewButton: !1,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !0,
|
||||
viewButton: false,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: true,
|
||||
layouts: "List,Poster,PosterCard,Thumb,ThumbCard",
|
||||
currentLayout: viewStyle
|
||||
}), result.TotalRecordCount ? (html = "List" == viewStyle ? listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
sortBy: query.SortBy
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
coverImage: !0,
|
||||
showTitle: !0,
|
||||
cardLayout: !0
|
||||
}) : "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: !0,
|
||||
centerText: !0,
|
||||
preferThumb: !0,
|
||||
overlayPlayButton: !0
|
||||
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: !0,
|
||||
preferThumb: !0,
|
||||
cardLayout: !0
|
||||
}) : cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
showTitle: !0,
|
||||
coverImage: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0
|
||||
}), view.querySelector(".noItemsMessage").classList.add("hide")) : view.querySelector(".noItemsMessage").classList.remove("hide");
|
||||
});
|
||||
|
||||
if (result.TotalRecordCount) {
|
||||
if (viewStyle == "List") {
|
||||
html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
sortBy: query.SortBy
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
coverImage: true,
|
||||
showTitle: true,
|
||||
cardLayout: true
|
||||
});
|
||||
} else if (viewStyle == "Thumb") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
preferThumb: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
} else if (viewStyle == "ThumbCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
preferThumb: true,
|
||||
cardLayout: true
|
||||
});
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
showTitle: true,
|
||||
coverImage: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
}
|
||||
view.querySelector(".noItemsMessage").classList.add("hide");
|
||||
} else {
|
||||
view.querySelector(".noItemsMessage").classList.remove("hide");
|
||||
}
|
||||
|
||||
var elem = view.querySelector(".itemsContainer");
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem);
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
var btnNextPage = view.querySelector(".btnNextPage");
|
||||
btnNextPage && btnNextPage.addEventListener("click", function() {
|
||||
query.StartIndex += query.Limit, reloadItems()
|
||||
});
|
||||
|
||||
if (btnNextPage) {
|
||||
btnNextPage.addEventListener("click", function () {
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems();
|
||||
});
|
||||
}
|
||||
|
||||
var btnPreviousPage = view.querySelector(".btnPreviousPage");
|
||||
btnPreviousPage && btnPreviousPage.addEventListener("click", function() {
|
||||
query.StartIndex -= query.Limit, reloadItems()
|
||||
});
|
||||
|
||||
if (btnPreviousPage) {
|
||||
btnPreviousPage.addEventListener("click", function () {
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems();
|
||||
});
|
||||
}
|
||||
|
||||
var btnChangeLayout = view.querySelector(".btnChangeLayout");
|
||||
btnChangeLayout && btnChangeLayout.addEventListener("layoutchange", function(e) {
|
||||
var layout = e.detail.viewStyle;
|
||||
getPageData(view).view = layout, libraryBrowser.saveViewSetting(getSavedQueryKey(view), layout), onViewStyleChange(), reloadItems()
|
||||
}), libraryBrowser.saveQueryValues(getSavedQueryKey(view), query), hideLoadingMessage()
|
||||
})
|
||||
|
||||
if (btnChangeLayout) {
|
||||
btnChangeLayout.addEventListener("layoutchange", function (e) {
|
||||
var layout = e.detail.viewStyle;
|
||||
getPageData(view).view = layout;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(view), layout);
|
||||
onViewStyleChange();
|
||||
reloadItems();
|
||||
});
|
||||
}
|
||||
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(view), query);
|
||||
hideLoadingMessage();
|
||||
});
|
||||
}
|
||||
|
||||
var data = {};
|
||||
view.addEventListener("viewbeforeshow", function() {
|
||||
reloadItems()
|
||||
}), view.querySelector(".btnNewPlaylist").addEventListener("click", function() {
|
||||
require(["playlistEditor"], function(playlistEditor) {
|
||||
view.addEventListener("viewbeforeshow", function () {
|
||||
reloadItems();
|
||||
});
|
||||
view.querySelector(".btnNewPlaylist").addEventListener("click", function () {
|
||||
require(["playlistEditor"], function (playlistEditor) {
|
||||
var serverId = ApiClient.serverInfo().Id;
|
||||
(new playlistEditor).show({
|
||||
new playlistEditor().show({
|
||||
items: [],
|
||||
serverId: serverId
|
||||
})
|
||||
})
|
||||
}), onViewStyleChange()
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
onViewStyleChange();
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,30 +1,54 @@
|
|||
define(["searchFields", "searchResults", "events"], function(SearchFields, SearchResults, events) {
|
||||
define(["searchFields", "searchResults", "events"], function (SearchFields, SearchResults, events) {
|
||||
"use strict";
|
||||
|
||||
function init(instance, tabContent, options) {
|
||||
tabContent.innerHTML = '<div class="padded-left padded-right searchFields"></div><div class="searchResults padded-top" style="padding-top:1.5em;"></div>', instance.searchFields = new SearchFields({
|
||||
tabContent.innerHTML = '<div class="padded-left padded-right searchFields"></div><div class="searchResults padded-top" style="padding-top:1.5em;"></div>';
|
||||
instance.searchFields = new SearchFields({
|
||||
element: tabContent.querySelector(".searchFields")
|
||||
}), instance.searchResults = new SearchResults({
|
||||
});
|
||||
instance.searchResults = new SearchResults({
|
||||
element: tabContent.querySelector(".searchResults"),
|
||||
serverId: ApiClient.serverId(),
|
||||
parentId: options.parentId,
|
||||
collectionType: options.collectionType
|
||||
}), events.on(instance.searchFields, "search", function(e, value) {
|
||||
instance.searchResults.search(value)
|
||||
})
|
||||
});
|
||||
events.on(instance.searchFields, "search", function (e, value) {
|
||||
instance.searchResults.search(value);
|
||||
});
|
||||
}
|
||||
|
||||
function SearchTab(view, tabContent, options) {
|
||||
var self = this;
|
||||
options = options || {}, init(this, tabContent, options), self.preRender = function() {}, self.renderTab = function() {
|
||||
options = options || {};
|
||||
init(this, tabContent, options);
|
||||
|
||||
self.preRender = function () {};
|
||||
|
||||
self.renderTab = function () {
|
||||
var searchFields = this.searchFields;
|
||||
searchFields && searchFields.focus()
|
||||
}
|
||||
|
||||
if (searchFields) {
|
||||
searchFields.focus();
|
||||
}
|
||||
};
|
||||
}
|
||||
return SearchTab.prototype.destroy = function() {
|
||||
|
||||
SearchTab.prototype.destroy = function () {
|
||||
var searchFields = this.searchFields;
|
||||
searchFields && searchFields.destroy(), this.searchFields = null;
|
||||
|
||||
if (searchFields) {
|
||||
searchFields.destroy();
|
||||
}
|
||||
|
||||
this.searchFields = null;
|
||||
var searchResults = this.searchResults;
|
||||
searchResults && searchResults.destroy(), this.searchResults = null
|
||||
}, SearchTab
|
||||
});
|
||||
|
||||
if (searchResults) {
|
||||
searchResults.destroy();
|
||||
}
|
||||
|
||||
this.searchResults = null;
|
||||
};
|
||||
|
||||
return SearchTab;
|
||||
});
|
||||
|
|
|
@ -1,48 +1,119 @@
|
|||
define(["events", "userSettings", "serverNotifications", "connectionManager", "emby-button"], function(events, userSettings, serverNotifications, connectionManager) {
|
||||
define(["events", "userSettings", "serverNotifications", "connectionManager", "emby-button"], function (events, userSettings, serverNotifications, connectionManager) {
|
||||
"use strict";
|
||||
return function(options) {
|
||||
|
||||
return function (options) {
|
||||
function pollTasks() {
|
||||
connectionManager.getApiClient(serverId).getScheduledTasks({
|
||||
IsEnabled: !0
|
||||
}).then(updateTasks)
|
||||
IsEnabled: true
|
||||
}).then(updateTasks);
|
||||
}
|
||||
|
||||
function updateTasks(tasks) {
|
||||
var task = tasks.filter(function(t) {
|
||||
return t.Key == options.taskKey
|
||||
var task = tasks.filter(function (t) {
|
||||
return t.Key == options.taskKey;
|
||||
})[0];
|
||||
if (options.panel && (task ? options.panel.classList.remove("hide") : options.panel.classList.add("hide")), task) {
|
||||
"Idle" == task.State ? button.removeAttribute("disabled") : button.setAttribute("disabled", "disabled"), button.setAttribute("data-taskid", task.Id);
|
||||
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
|
||||
if (options.progressElem && (options.progressElem.value = progress, "Running" == task.State ? options.progressElem.classList.remove("hide") : options.progressElem.classList.add("hide")), options.lastResultElem) {
|
||||
var lastResult = task.LastExecutionResult ? task.LastExecutionResult.Status : "";
|
||||
"Failed" == lastResult ? options.lastResultElem.html('<span style="color:#FF0000;">(' + Globalize.translate("LabelFailed") + ")</span>") : "Cancelled" == lastResult ? options.lastResultElem.html('<span style="color:#0026FF;">(' + Globalize.translate("LabelCancelled") + ")</span>") : "Aborted" == lastResult ? options.lastResultElem.html('<span style="color:#FF0000;">' + Globalize.translate("LabelAbortedByServerShutdown") + "</span>") : options.lastResultElem.html(lastResult)
|
||||
|
||||
if (options.panel) {
|
||||
if (task) {
|
||||
options.panel.classList.remove('hide');
|
||||
} else {
|
||||
options.panel.classList.add('hide');
|
||||
}
|
||||
}
|
||||
|
||||
if (!task) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (task.State == 'Idle') {
|
||||
button.removeAttribute("disabled");
|
||||
} else {
|
||||
button.setAttribute("disabled", "disabled");
|
||||
}
|
||||
|
||||
button.setAttribute("data-taskid", task.Id);
|
||||
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
|
||||
|
||||
if (options.progressElem) {
|
||||
options.progressElem.value = progress;
|
||||
|
||||
if (task.State == 'Running') {
|
||||
options.progressElem.classList.remove('hide');
|
||||
} else {
|
||||
options.progressElem.classList.add('hide');
|
||||
}
|
||||
}
|
||||
|
||||
if (options.lastResultElem) {
|
||||
var lastResult = task.LastExecutionResult ? task.LastExecutionResult.Status : '';
|
||||
|
||||
if (lastResult == "Failed") {
|
||||
options.lastResultElem.html('<span style="color:#FF0000;">(' + Globalize.translate('LabelFailed') + ')</span>');
|
||||
} else if (lastResult == "Cancelled") {
|
||||
options.lastResultElem.html('<span style="color:#0026FF;">(' + Globalize.translate('LabelCancelled') + ')</span>');
|
||||
} else if (lastResult == "Aborted") {
|
||||
options.lastResultElem.html('<span style="color:#FF0000;">' + Globalize.translate('LabelAbortedByServerShutdown') + '</span>');
|
||||
} else {
|
||||
options.lastResultElem.html(lastResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onScheduledTaskMessageConfirmed(id) {
|
||||
connectionManager.getApiClient(serverId).startScheduledTask(id).then(pollTasks)
|
||||
connectionManager.getApiClient(serverId).startScheduledTask(id).then(pollTasks);
|
||||
}
|
||||
|
||||
function onButtonClick() {
|
||||
onScheduledTaskMessageConfirmed(this.getAttribute("data-taskid"))
|
||||
onScheduledTaskMessageConfirmed(this.getAttribute("data-taskid"));
|
||||
}
|
||||
|
||||
function onScheduledTasksUpdate(e, apiClient, info) {
|
||||
apiClient.serverId() === serverId && updateTasks(info)
|
||||
if (apiClient.serverId() === serverId) {
|
||||
updateTasks(info);
|
||||
}
|
||||
}
|
||||
|
||||
var pollInterval;
|
||||
var button = options.button;
|
||||
var serverId = ApiClient.serverId();
|
||||
|
||||
function onPollIntervalFired() {
|
||||
connectionManager.getApiClient(serverId).isMessageChannelOpen() || pollTasks()
|
||||
if (!connectionManager.getApiClient(serverId).isMessageChannelOpen()) {
|
||||
pollTasks();
|
||||
}
|
||||
}
|
||||
var pollInterval, button = options.button,
|
||||
serverId = ApiClient.serverId();
|
||||
options.panel && options.panel.classList.add("hide"), "off" == options.mode ? (button.removeEventListener("click", onButtonClick), events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), function() {
|
||||
connectionManager.getApiClient(serverId).sendMessage("ScheduledTasksInfoStop"), pollInterval && clearInterval(pollInterval)
|
||||
}()) : (button.addEventListener("click", onButtonClick), pollTasks(), function() {
|
||||
|
||||
function startInterval() {
|
||||
var apiClient = connectionManager.getApiClient(serverId);
|
||||
pollInterval && clearInterval(pollInterval), apiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000"), pollInterval = setInterval(onPollIntervalFired, 1e4)
|
||||
}(), events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate))
|
||||
}
|
||||
});
|
||||
|
||||
if (pollInterval) {
|
||||
clearInterval(pollInterval);
|
||||
}
|
||||
apiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000");
|
||||
pollInterval = setInterval(onPollIntervalFired, 5000);
|
||||
}
|
||||
|
||||
function stopInterval() {
|
||||
connectionManager.getApiClient(serverId).sendMessage("ScheduledTasksInfoStop");
|
||||
|
||||
if (pollInterval) {
|
||||
clearInterval(pollInterval);
|
||||
}
|
||||
}
|
||||
|
||||
if (options.panel) {
|
||||
options.panel.classList.add("hide");
|
||||
}
|
||||
|
||||
if (options.mode == 'off') {
|
||||
button.removeEventListener("click", onButtonClick);
|
||||
events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate);
|
||||
stopInterval();
|
||||
} else {
|
||||
button.addEventListener("click", onButtonClick);
|
||||
pollTasks();
|
||||
startInterval();
|
||||
events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,15 +1,27 @@
|
|||
define(["userSettings", "skinManager", "connectionManager", "events"], function(userSettings, skinManager, connectionManager, events) {
|
||||
define(["userSettings", "skinManager", "connectionManager", "events"], function (userSettings, skinManager, connectionManager, events) {
|
||||
"use strict";
|
||||
|
||||
var currentViewType;
|
||||
pageClassOn("viewbeforeshow", "page", function() {
|
||||
var classList = this.classList,
|
||||
viewType = classList.contains("type-interior") || classList.contains("wizardPage") ? "a" : "b";
|
||||
pageClassOn("viewbeforeshow", "page", function () {
|
||||
var classList = this.classList;
|
||||
var viewType = classList.contains("type-interior") || classList.contains("wizardPage") ? "a" : "b";
|
||||
|
||||
if (viewType !== currentViewType) {
|
||||
currentViewType = viewType;
|
||||
var theme, context;
|
||||
"a" === viewType ? (theme = userSettings.dashboardTheme(), context = "serverdashboard") : theme = userSettings.theme(), skinManager.setTheme(theme, context)
|
||||
var theme;
|
||||
var context;
|
||||
|
||||
if ("a" === viewType) {
|
||||
theme = userSettings.dashboardTheme();
|
||||
context = "serverdashboard";
|
||||
} else {
|
||||
theme = userSettings.theme();
|
||||
}
|
||||
|
||||
skinManager.setTheme(theme, context);
|
||||
}
|
||||
}), events.on(connectionManager, "localusersignedin", function(e, user) {
|
||||
currentViewType = null
|
||||
})
|
||||
});
|
||||
});
|
||||
events.on(connectionManager, "localusersignedin", function (e, user) {
|
||||
currentViewType = null;
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,20 +1,30 @@
|
|||
define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
|
||||
define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadUser(page, user) {
|
||||
libraryMenu.setTitle(user.Name), "Guest" == user.ConnectLinkType ? $(".connectMessage", page).show() : $(".connectMessage", page).hide(), loading.hide()
|
||||
libraryMenu.setTitle(user.Name);
|
||||
|
||||
if ("Guest" == user.ConnectLinkType) {
|
||||
$(".connectMessage", page).show();
|
||||
} else {
|
||||
$(".connectMessage", page).hide();
|
||||
}
|
||||
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function loadData(page) {
|
||||
loading.show();
|
||||
var userId = getParameterByName("userId");
|
||||
ApiClient.getUser(userId).then(function(user) {
|
||||
loadUser(page, user)
|
||||
})
|
||||
ApiClient.getUser(userId).then(function (user) {
|
||||
loadUser(page, user);
|
||||
});
|
||||
}
|
||||
$(document).on("pageinit", "#userPasswordPage", function() {
|
||||
$(".adminUpdatePasswordForm").off("submit", UpdatePasswordPage.onSubmit).on("submit", UpdatePasswordPage.onSubmit), $(".adminLocalAccessForm").off("submit", UpdatePasswordPage.onLocalAccessSubmit).on("submit", UpdatePasswordPage.onLocalAccessSubmit)
|
||||
}).on("pagebeforeshow", "#userPasswordPage", function() {
|
||||
loadData(this)
|
||||
})
|
||||
});
|
||||
|
||||
$(document).on("pageinit", "#userPasswordPage", function () {
|
||||
$(".adminUpdatePasswordForm").off("submit", UpdatePasswordPage.onSubmit).on("submit", UpdatePasswordPage.onSubmit);
|
||||
$(".adminLocalAccessForm").off("submit", UpdatePasswordPage.onLocalAccessSubmit).on("submit", UpdatePasswordPage.onLocalAccessSubmit);
|
||||
}).on("pagebeforeshow", "#userPasswordPage", function () {
|
||||
loadData(this);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,17 +1,27 @@
|
|||
define(["dom", "emby-button"], function(dom) {
|
||||
define(["dom", "emby-button"], function (dom) {
|
||||
"use strict";
|
||||
|
||||
function onSubmit(e) {
|
||||
return dom.parentWithClass(this, "page").querySelector(".chkAccept").checked ? Dashboard.navigate("wizardfinish.html") : Dashboard.alert({
|
||||
message: Globalize.translate("MessagePleaseAcceptTermsOfServiceBeforeContinuing"),
|
||||
title: ""
|
||||
}), e.preventDefault(), !1
|
||||
if (dom.parentWithClass(this, "page").querySelector(".chkAccept").checked) {
|
||||
Dashboard.navigate("wizardfinish.html");
|
||||
} else {
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("MessagePleaseAcceptTermsOfServiceBeforeContinuing"),
|
||||
title: ""
|
||||
});
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector(".wizardAgreementForm").addEventListener("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
return function (view, params) {
|
||||
view.querySelector(".wizardAgreementForm").addEventListener("submit", onSubmit);
|
||||
view.addEventListener("viewshow", function () {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
|
||||
});
|
||||
view.addEventListener("viewhide", function () {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader");
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -22,11 +22,11 @@
|
|||
"AllLanguages": "Alle Sprachen",
|
||||
"AllLibraries": "Alle Bibliotheken",
|
||||
"AllowDeletionFromAll": "Erlaube Medienlöschung in allen Bibliotheken",
|
||||
"AllowHWTranscodingHelp": "Wenn aktiviert, übernimmt der Tuner die Transkodierung in Echtzeit. Das hilft eventuell die Transkodierung auf dem Jellyfin Servers zu reduzieren. (Spart Hardwareressourcen)",
|
||||
"AllowHWTranscodingHelp": "Erlaube dem Tuner die Transkodierung in Echtzeit. Das hilft eventuell die Transkodierung auf dem Jellyfin Servers zu reduzieren. (Spart Hardwareressourcen)",
|
||||
"AllowMediaConversion": "Erlaube Medienkonvertierung",
|
||||
"AllowMediaConversionHelp": "Erlaube oder unterbinde Zugriff auf die Medienkonvertierung.",
|
||||
"AllowOnTheFlySubtitleExtraction": "Erlaube Untertitelextraktion \"on-the-fly\"",
|
||||
"AllowOnTheFlySubtitleExtractionHelp": "Eingebettete Untertitel können aus Videos extrahiert und in Textformat an Jellyfin gesendet werden um Transkodieren zu vermeiden. Auf manchen Systemen kann dieser Vorgang eine lange Zeit in Anspruch nehmen und die Videowiedergabe zum Halten bringen während der Extraktion. Deaktiviere diese Option um eingebettete Untertitel während des Videotranskodierens einbrennen zu lassen, wenn sie nicht nativ vom Client unterstützt werden.",
|
||||
"AllowOnTheFlySubtitleExtractionHelp": "Eingebettete Untertitel können aus Videos extrahiert und in Textformat an Clients gesendet werden um Transkodieren zu vermeiden. Auf manchen Systemen kann dieser Vorgang eine lange Zeit in Anspruch nehmen und die Videowiedergabe zum Halten bringen während der Extraktion. Deaktiviere diese Option um eingebettete Untertitel während der Videotranskodierung einbrennen zu lassen, wenn sie nicht nativ vom Client unterstützt werden.",
|
||||
"AllowRemoteAccess": "Erlaube externe Verbindungen zu diesem Jellyfin Server.",
|
||||
"AllowRemoteAccessHelp": "Wenn deaktiviert werden alle externen Verbindungen blockiert.",
|
||||
"AllowSeasonalThemes": "Erlaube automatische Jahreszeitenmotive",
|
||||
|
@ -55,7 +55,7 @@
|
|||
"BirthLocation": "Geburtsort",
|
||||
"BirthPlaceValue": "Geburtsort: {0}",
|
||||
"BobAndWeaveWithHelp": "Bob & Weave (höhere Qualität, aber langsamer)",
|
||||
"BookLibraryHelp": "Hörbücher und E-Books werden unterstützt. Schaue in den {0}Jellyfin Book Naming Guide {1}.",
|
||||
"BookLibraryHelp": "Hörbücher und E-Books werden unterstützt. Schaue in den {0}Book Naming Guide {1}.",
|
||||
"Books": "Bücher",
|
||||
"BoxRear": "Box (Rückseite)",
|
||||
"Browse": "Blättern",
|
||||
|
@ -1401,7 +1401,7 @@
|
|||
"Thumb": "Miniaturansicht",
|
||||
"TitleSupport": "Hilfe",
|
||||
"Whitelist": "Erlaubt",
|
||||
"AuthProviderHelp": "Auswählen eines Authentifizierungsanbieter, der zur Authentifizierung des Passworts dieses Benutzes verwendet werden soll",
|
||||
"AuthProviderHelp": "Auswählen eines Authentifizierungsanbieter, der zur Authentifizierung des Passworts dieses Benutzes verwendet werden soll.",
|
||||
"Features": "Features",
|
||||
"HeaderFavoriteBooks": "Lieblingsbücher",
|
||||
"HeaderFavoriteMovies": "Lieblingsfilme",
|
||||
|
@ -1437,5 +1437,23 @@
|
|||
"HeaderTypeImageFetchers": "{0} Bildquellen",
|
||||
"LabelBitrate": "Bitrate:",
|
||||
"LabelAudioBitrate": "Tonbitrate:",
|
||||
"ButtonAddImage": "Bild hinzufügen"
|
||||
"ButtonAddImage": "Bild hinzufügen",
|
||||
"LabelSize": "Größe:",
|
||||
"LabelTranscodes": "Transkoder:",
|
||||
"LabelTranscodingProgress": "Transcodierungsfortschritt:",
|
||||
"LabelAudioBitDepth": "Audio-Bittiefe:",
|
||||
"LabelPleaseRestart": "Die Änderungen werden nach dem manuellen Neuladen des Webclients wirksam.",
|
||||
"LabelVideoBitrate": "Video-Bitrate:",
|
||||
"LabelTranscodingFramerate": "Transcodierrate:",
|
||||
"LabelAudioSampleRate": "Audio-Abtastrate:",
|
||||
"LabelBaseUrl": "Basis URL:",
|
||||
"LabelBaseUrlHelp": "Du kannst hier ein benutzerdefiniertes Unterverzeichnis hinzufügen, um über eine eindeutige URL auf den Server zuzugreifen.",
|
||||
"LabelFolder": "Ordner:",
|
||||
"LabelPasswordResetProvider": "Anbieter zum Zurücksetzen des Passwortes:",
|
||||
"LabelPlayMethod": "Spielmethode:",
|
||||
"DashboardOperatingSystem": "Betriebssystem: {O}",
|
||||
"DashboardArchitecture": "Architektur: {0}",
|
||||
"LabelVideoCodec": "Videocodec:",
|
||||
"LaunchWebAppOnStartup": "Das Webinterface öffnen, wenn der Server startet",
|
||||
"LaunchWebAppOnStartupHelp": "Öffne den Webclient in Standard-Webbrowser, wenn der Server zum ersten Mal gestartet wird. Dies tritt bei Verwendung der Neustart-Serverfunktion nicht auf."
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
"ButtonEdit": "Szerkesztés",
|
||||
"ButtonEditImages": "Képek szerkesztése",
|
||||
"ButtonFilter": "Szűrő",
|
||||
"ButtonForgotPassword": "Elfelejtett jelszó",
|
||||
"ButtonForgotPassword": "Elfelejtett Jelszó",
|
||||
"ButtonGotIt": "Értettem",
|
||||
"ButtonHelp": "Segítség",
|
||||
"ButtonHome": "Kezdőlap",
|
||||
|
@ -117,7 +117,7 @@
|
|||
"FolderTypeMovies": "Filmek",
|
||||
"FolderTypeMusic": "Zenék",
|
||||
"FolderTypeMusicVideos": "Zenei Videók",
|
||||
"FolderTypeTvShows": "Műsorok",
|
||||
"FolderTypeTvShows": "TV Műsorok",
|
||||
"FolderTypeUnset": "Vegyes Tartalom",
|
||||
"Folders": "Könyvtárak",
|
||||
"Friday": "Péntek",
|
||||
|
@ -267,7 +267,7 @@
|
|||
"LabelGroupMoviesIntoCollections": "Filmek csoportosítása gyűjteményekbe",
|
||||
"LabelH264EncodingPreset": "H264 enkóder beállítások:",
|
||||
"LabelHardwareAccelerationType": "Hardveres gyorsítás:",
|
||||
"LabelHardwareAccelerationTypeHelp": "Csak támogatott rendszereken érhető el.",
|
||||
"LabelHardwareAccelerationTypeHelp": "Ez egy kísérleti szolgáltatás, amely csak a támogatott rendszereken érhető el.",
|
||||
"LabelHomeScreenSectionValue": "Kezdőképernyő blokk {0}:",
|
||||
"LabelImageType": "Kép típusa:",
|
||||
"LabelKodiMetadataDateFormat": "Megjelenési dátum formátuma:",
|
||||
|
@ -607,7 +607,7 @@
|
|||
"AlwaysPlaySubtitlesHelp": "A nyelvi beállításoknak megfelelő feliratok az audió nyelvétől függetlenül kerülnek betöltésre.",
|
||||
"Artists": "Előadók",
|
||||
"Blacklist": "Feketelista",
|
||||
"BookLibraryHelp": "Az audió- és szövegkönyvek támogatottak. Nézd meg a {0} Jellyfin Könyvelnevezési útmutatót {1}.",
|
||||
"BookLibraryHelp": "Az audió- és szövegkönyvek támogatottak. Nézd meg a {0} könyvelnevezési útmutatót {1}.",
|
||||
"BrowsePluginCatalogMessage": "Böngéssz a Bővítmény katalógusunkban a rendelkezésre álló bővítmények megtekintéséhez.",
|
||||
"AddItemToCollectionHelp": "Adj elemeket a gyűjteményekhez, ehhez keresed meg őket, majd kattints jobb egérgombbal, vagy kattints a menüre és add hozzá a gyűjteményhez.",
|
||||
"AllowedRemoteAddressesHelp": "Vesszővel válaszd el az IP-címek vagy IP / netmask címek listáját annak a hálózatnak amelyből távolról csatlakozhatnak. Ha üresen marad, az összes távoli cím megengedett.",
|
||||
|
@ -689,8 +689,8 @@
|
|||
"ErrorMessageStartHourGreaterThanEnd": "A befejezési időnek nagyobbnak kell lennie mint a kezdési idő.",
|
||||
"ErrorSavingTvProvider": "Hiba történt a TV szolgáltató mentésekor. Kérlek győződj meg róla, hogy elérhető és próbálkozz meg újra.",
|
||||
"EveryNDays": "Minden {0} nap",
|
||||
"ExtraLarge": "Extra nagy",
|
||||
"ExtractChapterImagesHelp": "A fejezetképek kivonása lehetővé teszi, hogy a Jellyfin alkalmazások grafikus jelenetválasztási menüket jelenítsenek meg. A folyamat lehet lassú, CPU intenzív és több gigabájt területet igényelhet. A kivonás akkor történik, amikor új videók kerülnek a Médiatárba, valamint egy éjszakai ütemezett feladatként. Az ütemezés konfigurálható az Ütemezett Feladatok menüpontban. Nem ajánlott ezt a feladatot a csúcshasználati órákban futtatni.",
|
||||
"ExtraLarge": "Extra NAGY",
|
||||
"ExtractChapterImagesHelp": "A fejezetképek kivonása lehetővé teszi, hogy az alkalmazások grafikus jelenetválasztási menüket jelenítsenek meg. A folyamat lehet lassú, erőforrás igényes, és több gigabájt területet igényelhet. A kivonás akkor történik, amikor új videók kerülnek a Médiatárba, valamint egy éjszakai ütemezett feladatként. Az ütemezés konfigurálható az Ütemezett Feladatok menüpontban. Nem ajánlott ezt a feladatot a csúcshasználati órákban futtatni.",
|
||||
"Extras": "Extrák",
|
||||
"FFmpegSavePathNotFound": "Nem található az FFmpeg a megadott útvonalon. FFprobe is szükséges, és ugyanabban a mappában kell lennie. Ezek az összetevők általában ugyanabban a csomagban találhatók. Kérlek ellenőrizd a megadott útvonalat és próbáld meg újra.",
|
||||
"File": "Fájl",
|
||||
|
@ -845,7 +845,7 @@
|
|||
"LabelBindToLocalNetworkAddressHelp": "Opcionális. A helyi IP cím felülbírálása a http szerverhez való csatlakozáshoz. Ha üres marad, a szerver minden elérhető címhez kötődik. Az érték megváltoztatásához a Jellyfin Szerver újraindítása szükséges.",
|
||||
"LabelBirthDate": "Születési dátum:",
|
||||
"LabelBlastMessageInterval": "Élő üzenetintervallum (másodperc)",
|
||||
"LabelBlastMessageIntervalHelp": "Meghatározza az időtartamot másodpercben a szerver üzenetei között.",
|
||||
"LabelBlastMessageIntervalHelp": "Meghatározza másodpercben az üzenetek közötti időtartamot.",
|
||||
"LabelBlockContentWithTags": "Blokkolja a címkével ellátott elemeket:",
|
||||
"LabelCache": "Gyorsítótár:",
|
||||
"LabelCachePathHelp": "Adj meg egy egyéni helyet a szerver gyorsítótár fájljainak, például a képeknek. Hagyd üresen az alapértelmezett beállításához.",
|
||||
|
@ -879,44 +879,44 @@
|
|||
"LabelEnableDlnaDebugLogging": "DLNA hibakeresési naplózás engedélyezése",
|
||||
"LabelEnableDlnaDebugLoggingHelp": "Ez nagy naplófájlokat hoz létre és csak hibaelhárítás céljából használható.",
|
||||
"LabelEnableDlnaPlayTo": "DLNA Play To engedélyezése",
|
||||
"LabelEnableDlnaPlayToHelp": "A Jellyfin képes érzékelni a hálózaton belüli eszközöket, és képes a távoli vezérlésükre.",
|
||||
"LabelEnableDlnaServer": "Dlna szerver engedélyezése",
|
||||
"LabelEnableDlnaServerHelp": "Lehetővé teszi a hálózaton található UPnP eszközöknek, hogy a Jellyfin tartalmát böngésszék és lejátszák.",
|
||||
"LabelEnableDlnaPlayToHelp": "Felismerheti a hálózaton belüli eszközöket, és lehetővé teszi azok távvezérlését.",
|
||||
"LabelEnableDlnaServer": "DLNA szerver engedélyezése",
|
||||
"LabelEnableDlnaServerHelp": "Lehetővé teszi a hálózaton található UPnP eszközöknek, hogy böngésszenek és lejátszanak tartalmat.",
|
||||
"LabelEnableSingleImageInDidlLimit": "Korlátozás egyetlen beágyazott képre",
|
||||
"LabelEnableSingleImageInDidlLimitHelp": "Néhány eszköz nem jeleníti meg megfelelően, ha több kép van beágyazva a Didl-be.",
|
||||
"LabelEndDate": "Befejezés dátuma:",
|
||||
"LabelExtractChaptersDuringLibraryScan": "Fejezet képek készítése a könyvtár beolvasása során",
|
||||
"LabelExtractChaptersDuringLibraryScanHelp": "Ha engedélyezve van, a fejezetképek elkészítése a könyvtár beolvasása során történik meg. Ha le van tiltva, akkor az elkészítés az Ütemezett feladatokban meghatározott időben készül el, ami lehetővé teszi a könyvtárbeolvasás gyorsítását.",
|
||||
"LabelExtractChaptersDuringLibraryScanHelp": "A fejezetképek elkészítése a könyvtár beolvasása során történik meg. Ellenkező esetben az elkészítés az Ütemezett feladatokban meghatározott időben készül el, ami lehetővé teszi a könyvtárbeolvasás gyorsítását.",
|
||||
"LabelFailed": "Sikertelen",
|
||||
"LabelFileOrUrl": "Fájl vagy URL:",
|
||||
"LabelFont": "Betűtípus:",
|
||||
"LabelFormat": "Formátum:",
|
||||
"LabelFriendlyName": "Könnyen megjegyezhető név:",
|
||||
"LabelServerNameHelp": "Ez a név kerül a Szerver azonosítására. Ha üresen marad, a számítógép neve kerül felhasználásra.",
|
||||
"LabelServerNameHelp": "Ez a név kerül a Szerver azonosítására és alapértelmezetten a számítógép neve kerül felhasználásra.",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "A filmlisták megjelenítésekor a gyűjteményhez tartozó filmek egy csoportos elemként jelennek meg.",
|
||||
"LabelH264Crf": "H264 enkóder CRF:",
|
||||
"LabelHomeNetworkQuality": "Otthoni hálózat minősége:",
|
||||
"LabelHttpsPort": "Helyi https port száma:",
|
||||
"LabelHttpsPort": "Helyi HTTPS port száma:",
|
||||
"LabelImageFetchersHelp": "Engedélyezd és rangsorold az előnyben részesített képletöltőket prioritásuk sorrendjében.",
|
||||
"LabelImportOnlyFavoriteChannels": "Csak a kedvencként megjelölt csatornákra korlátozza",
|
||||
"LabelInNetworkSignInWithEasyPassword": "Engedélyezze a hálózaton belüli bejelentkezést az egyszerű PIN kóddal",
|
||||
"LabelInNetworkSignInWithEasyPasswordHelp": "Ha engedélyezve van, akkor az egyszerű PIN kódod segítségével beléphetsz a Jellyfin alkalmazásokba az otthoni hálózaton belül. A szokásos jelszót csak akkor kell használni, ha az otthoni hálózaton kívül vagy. Ha a PIN kód üres, akkor nem lesz szükség jelszóra az otthoni hálózaton belül.",
|
||||
"LabelInNetworkSignInWithEasyPasswordHelp": "Az egyszerű PIN kódod segítségével beléphetsz az alkalmazásokból az otthoni hálózaton belül. A szokásos jelszót csak akkor kell használni, ha az otthoni hálózaton kívül vagy. Ha a PIN kód üres, akkor nem lesz szükség jelszóra az otthoni hálózaton belül.",
|
||||
"LabelInternetQuality": "Internet minősége:",
|
||||
"LabelKidsCategories": "Gyermek kategóriák:",
|
||||
"LabelKodiMetadataDateFormatHelp": "Az nfo-n belüli összes dátum ezzel a formátummal lesz írva és olvasva.",
|
||||
"LabelKodiMetadataEnableExtraThumbs": "Másolja az extrafanartot extrathumbs-ba",
|
||||
"LabelKodiMetadataDateFormatHelp": "Az NFO-n belüli összes dátum ezzel a formátummal lesz kezelve.",
|
||||
"LabelKodiMetadataEnableExtraThumbs": "Másolja az extrafanartot extrathumbs mezőbe",
|
||||
"LabelKodiMetadataEnableExtraThumbsHelp": "A képek letöltésekor mind az extrafanart, mind az extrathumbs-ba menthetőek a maximális Kodi skin kompatibilitáshoz.",
|
||||
"LabelKodiMetadataEnablePathSubstitution": "Útvonal helyettesítés engedélyezése",
|
||||
"LabelKodiMetadataEnablePathSubstitutionHelp": "Lehetővé teszi a képútvonalak helyettesítését a szerver útvonal helyettesítési beállításaival.",
|
||||
"LabelKodiMetadataSaveImagePaths": "A képek útvonalának mentése az nfo fájlokban",
|
||||
"LabelKodiMetadataSaveImagePathsHelp": "Ez akkor ajánlott, ha olyan képfájlnevek vannak amelyek nem felelnek meg a Kodi irányelveinek.",
|
||||
"LabelLanNetworks": "LAN hálózatok:",
|
||||
"LabelLocalHttpServerPortNumber": "Helyi http port száma:",
|
||||
"LabelLocalHttpServerPortNumber": "Helyi HTTP port száma:",
|
||||
"LabelLockItemToPreventChanges": "Az elem zárolása a jövőbeni változások elkerülése érdekében",
|
||||
"LabelLoginDisclaimer": "Bejelentkezési nyilatkozat:",
|
||||
"LabelLoginDisclaimerHelp": "Ez a bejelentkezési oldal alján jelenik meg.",
|
||||
"LabelLoginDisclaimerHelp": "Ez az üzenet a bejelentkezési oldal alján jelenik meg.",
|
||||
"LabelManufacturer": "Gyártó",
|
||||
"LabelManufacturerUrl": "Gyártó url címe",
|
||||
"LabelManufacturerUrl": "Gyártó URL címe",
|
||||
"LabelMatchType": "Egyezés típusa:",
|
||||
"LabelMaxBackdropsPerItem": "A hátterek maximális száma elemenként:",
|
||||
"LabelMaxChromecastBitrate": "Chromecast streaming minősége:",
|
||||
|
@ -931,7 +931,7 @@
|
|||
"LabelModelUrl": "Modell URL",
|
||||
"LabelMovieCategories": "Film kategóriák:",
|
||||
"LabelMoviePrefix": "Film előtag:",
|
||||
"LabelMoviePrefixHelp": "Ha a filmcímekhez előtagot használsz írd be ide, hogy Jellyfin megfelelően kezelje.",
|
||||
"LabelMoviePrefixHelp": "Ha a filmcímekhez előtagot használsz, írd be ide, hogy a szerver megfelelően kezelje.",
|
||||
"LabelMovieRecordingPath": "Filmfelvételi útvonal (opcionális):",
|
||||
"LabelMusicStreamingTranscodingBitrate": "Zene átkódolási bitráta:",
|
||||
"LabelNewName": "Új név:",
|
||||
|
@ -970,7 +970,7 @@
|
|||
"OptionDateAddedFileTime": "Használja a fájl létrehozásának dátumát",
|
||||
"LabelMinBackdropDownloadWidth": "A letöltendő háttérkép minimális szélessége:",
|
||||
"LabelMinResumeDuration": "A folytatás minimum időtartama:",
|
||||
"LabelMinResumeDurationHelp": "A rövidebb videó hosszúság másodpercben, melynél a lejátszás helye mentésre kerül, így később folytatható lesz",
|
||||
"LabelMinResumeDurationHelp": "A rövidebb videó hosszúság másodpercben, melynél a lejátszás helye mentésre kerül, így később folytatható lesz.",
|
||||
"LabelMinResumePercentage": "Minimum folytatás százalékban:",
|
||||
"LabelMinScreenshotDownloadWidth": "Minimális képernyőkép letöltési szélesség:",
|
||||
"LabelPreferredSubtitleLanguage": "Alapértelmezett feliratnyelv:",
|
||||
|
@ -1280,9 +1280,9 @@
|
|||
"XmlTvSportsCategoriesHelp": "Az ilyen kategóriákkal rendelkező programok sportprogramként jelennek meg. Válaszd el őket a '|' elválasztóval.",
|
||||
"Yes": "Igen",
|
||||
"LabelMaxResumePercentage": "Maximum folytatás százalékban:",
|
||||
"LabelMaxResumePercentageHelp": "A címeket teljesen lejátszottnak tekintjük, ha ezen idő után fejezed be",
|
||||
"LabelMaxResumePercentageHelp": "A címeket teljesen lejátszottnak tekintjük, ha ezen idő után fejezed be.",
|
||||
"LabelMaxStreamingBitrateHelp": "Adj meg egy maximum bitrátát a streameléshez.",
|
||||
"LabelMinResumePercentageHelp": "A címeket nem lejátszottnak tekintjük, ha ez alatt az idő alatt fejezed be",
|
||||
"LabelMinResumePercentageHelp": "A címeket nem lejátszottnak tekintjük, ha ez alatt az idő alatt fejezed be.",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Határozz meg egy streamelési max bitrátát a zenékhez",
|
||||
"DashboardVersionNumber": "Verzió: {0}",
|
||||
"DashboardServerName": "Szerver: {0}",
|
||||
|
@ -1294,7 +1294,7 @@
|
|||
"LabelUserAgent": "Felhasználó ügynök:",
|
||||
"LabelUserLoginAttemptsBeforeLockout": "Sikertelen bejelentkezési kísérletek a felhasználó zárolása előtt:",
|
||||
"DashboardOperatingSystem": "Operációs rendszer: {0}",
|
||||
"DashboardArchitecture": "Rendszer típusa: {0}",
|
||||
"DashboardArchitecture": "Platform: {0}",
|
||||
"LaunchWebAppOnStartup": "Indítsa el a Jellyfin webes alkalmazást a böngészőben, amikor a Jellyfin Szerver elindul",
|
||||
"MessageNoCollectionsAvailable": "A gyűjtemények lehetővé teszik Filmek, Sorozatok és Albumok egyéni csoportosítását. A gyűjtemények létrehozásához kattints a + gombra.",
|
||||
"MessageNoServersAvailable": "Az automatikus kiszolgálókeresés nem talált szervert.",
|
||||
|
@ -1343,7 +1343,7 @@
|
|||
"LabelDateAddedBehavior": "Új tartalom esetén alkalmazandó hozzáadás dátuma mód:",
|
||||
"LabelDateAddedBehaviorHelp": "Ha egy metaadat érték jelen van, akkor mindig az lesz előnyben részesítve ezen opciók előtt.",
|
||||
"LabelDownMixAudioScale": "Hangkiemelés átkódolás esetén:",
|
||||
"LabelDownMixAudioScaleHelp": "Hangkiemelés átkódoláskor. Állítsd 1-re az eredeti hangerő érték megőrzéséhez.",
|
||||
"LabelDownMixAudioScaleHelp": "Hangkiemelés átkódoláskor. Az egy érték az eredeti hangerő értékének felel meg.",
|
||||
"LabelEmbedAlbumArtDidl": "Albumborító beágyazása a Didl-be",
|
||||
"LabelEmbedAlbumArtDidlHelp": "Néhány eszköz ezt a megoldást részesíti előnyben az albumborítók esetében. Mások esetlegesen lejátszási hibát jeleznek, ha ez az opció engedélyezve van.",
|
||||
"LabelEnableBlastAliveMessages": "Blast alive üzenetek",
|
||||
|
@ -1354,8 +1354,8 @@
|
|||
"LabelIconMaxWidthHelp": "Ikon maximális szélesség, mely az upnp:icon keresztül kiajánlásra kerül.",
|
||||
"LabelIdentificationFieldHelp": "Kis-és nagybetű különbséget figyelmen kívül hagyó szöveg vagy reguláris kifejezés.",
|
||||
"LabelKeepUpTo": "Őrizd meg:",
|
||||
"LabelKodiMetadataUser": "Mentsd el a következő felhasználó megtekintési adatát az nfo-ba:",
|
||||
"LabelKodiMetadataUserHelp": "Ha ezt engedélyezed, akkor a kiválasztott felhasználó megtekintési adata elmentésre kerül az NFO fájlokba, melyet azután más alkalmazások használhatnak.",
|
||||
"LabelKodiMetadataUser": "Mentsd el a következő felhasználó megtekintési adatát az NFO-ba:",
|
||||
"LabelKodiMetadataUserHelp": "A kiválasztott felhasználó megtekintési adata elmentésre kerül az NFO fájlokba, melyet azután más alkalmazások használhatnak.",
|
||||
"LabelLocalHttpServerPortNumberHelp": "A TCP port száma, melyen a Jellyfin HTTP szerver figyel.",
|
||||
"UserAgentHelp": "Adj meg egy egyedi http user-agent fejlécet, amennyiben szükséges.",
|
||||
"XmlDocumentAttributeListHelp": "Ezek a tulajdonságok minden xml válaszüzenet gyökér elemére alkalmazásra kerülnek.",
|
||||
|
@ -1371,5 +1371,10 @@
|
|||
"HeaderFavoriteBooks": "Kedvenc Könyvek",
|
||||
"CopyStreamURLSuccess": "URL másolása sikeres.",
|
||||
"CopyStreamURL": "Stream URL másolása",
|
||||
"PlaybackData": "Lejátszási adatok"
|
||||
"PlaybackData": "Lejátszási adatok",
|
||||
"ButtonAddImage": "Kép hozzáadása",
|
||||
"LabelPasswordResetProvider": "Jelszó Visszaállítási Szolgáltató:",
|
||||
"FetchingData": "További adatok lekérése",
|
||||
"LabelBaseUrl": "Alap URL:",
|
||||
"Depressed": "Nyomott"
|
||||
}
|
||||
|
|
|
@ -1278,5 +1278,6 @@
|
|||
"DisplayInOtherHomeScreenSections": "보고 있는 것이나 최신 미디어 등을 홈 페이지에 표시합니다",
|
||||
"DisplayMissingEpisodesWithinSeasonsHelp": "서버 환경설정에서도 TV 라이브러리가 활성화되어있어야 합니다.",
|
||||
"ErrorAddingMediaPathToVirtualFolder": "미디어 경로를 추가하는 데에 오류가 발생했습니다. 경로를 다시 확인하거나 Jellyfin 서버가 해당 경로에 접근할 수 있는지 확인해 주세요.",
|
||||
"ErrorGettingTvLineups": "TV 구성을 다운로드 하는 중에 오류가 발생하였습니다. 정보가 맞는지 확인한 후 다시 시도해 주세요."
|
||||
"ErrorGettingTvLineups": "TV 구성을 다운로드 하는 중에 오류가 발생하였습니다. 정보가 맞는지 확인한 후 다시 시도해 주세요.",
|
||||
"BoxRear": "상자 (후면)"
|
||||
}
|
||||
|
|
|
@ -90,7 +90,7 @@
|
|||
"Director": "Realizador",
|
||||
"EasyPasswordHelp": "O código PIN é utilizado para acesso off-line em clientes suportados e pode ser usado para um acesso fácil dentro da rede.",
|
||||
"Edit": "Editar",
|
||||
"EnableCinemaMode": "Ativar modo cinema",
|
||||
"EnableCinemaMode": "Modo cinema",
|
||||
"Ended": "Terminado",
|
||||
"ErrorAddingMediaPathToVirtualFolder": "Ocorreu um erro ao adicionar a localização dos seus ficheiros. Por favor, assegure-se que o local é valido e que o processo do Jellyfin Server tenha acesso a essa localização.",
|
||||
"ErrorGettingTvLineups": "Ocorreu um erro ao transferir a programação de TV. Por favor, certifique-se que a sua informação está correta e tente novamente.",
|
||||
|
@ -340,20 +340,18 @@
|
|||
"LabelEpisodeNumber": "Número do episódio:",
|
||||
"LabelEvent": "Evento:",
|
||||
"LabelEveryXMinutes": "A cada:",
|
||||
"LabelExtractChaptersDuringLibraryScan": "Extrair imagens dos capítulos durante o rastreamento da biblioteca",
|
||||
"LabelExtractChaptersDuringLibraryScanHelp": "Se ativado, as imagens dos capítulos serão extraídas quando os vídeos forem importados durante a pesquisa na biblioteca. Se desativado, elas serão extraídas durante a tarefa agendada de imagens dos capítulos, permitindo que a pesquisa na biblioteca seja mais rápida.",
|
||||
"LabelExtractChaptersDuringLibraryScan": "Extrair imagens dos capítulos durante a atualização da biblioteca",
|
||||
"LabelExtractChaptersDuringLibraryScanHelp": "Se ativado, as imagens dos capítulos serão extraídas quando os vídeos forem importados durante a atualização da biblioteca. Se desativado, serão extraídas durante a tarefa agendada de extração de imagens dos capítulos, permitindo que a atualização da biblioteca seja mais rápida.",
|
||||
"LabelExtractChaptersDuringLibraryScanHelp": "Gerar imagens dos capítulos quando os vídeos forem importados durante a atualização da biblioteca. Caso contrário, serão geradas durante a tarefa agendada de extração de imagens dos capítulos, permitindo que a atualização da biblioteca seja mais rápida.",
|
||||
"LabelFailed": "Falhou",
|
||||
"LabelFinish": "Terminar",
|
||||
"LabelForgotPasswordUsernameHelp": "Introduza o seu nome de utilizador, se se recordar.",
|
||||
"LabelFormat": "Formato:",
|
||||
"LabelFriendlyName": "Nome amigável:",
|
||||
"LabelServerNameHelp": "Este nome será utilizado para identificar o servidor. Se não for preenchido, será usado o nome do computador.",
|
||||
"LabelServerNameHelp": "Este nome será utilizado para identificar o servidor. Por defeito, é usado o nome do computador.",
|
||||
"LabelGroupMoviesIntoCollections": "Agrupar filmes em coleções",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "Ao mostrar listas de filmes, filmes que pertençam a uma coleção serão mostrados como um único item agrupado.",
|
||||
"LabelHardwareAccelerationType": "Aceleração por hardware:",
|
||||
"LabelHardwareAccelerationTypeHelp": "Disponível apenas em sistemas suportados.",
|
||||
"LabelHardwareAccelerationTypeHelp": "Esta funcionalidade é experimental e está disponível apenas em sistemas suportados.",
|
||||
"LabelHttpsPort": "Número do porto HTTPS local:",
|
||||
"LabelHttpsPortHelp": "Número do porto TCP em que o servidor HTTPS do Jellyfin ficará à escuta.",
|
||||
"LabelIconMaxHeight": "Altura máxima do ícone:",
|
||||
|
@ -364,10 +362,10 @@
|
|||
"LabelImageType": "Tipo de imagem:",
|
||||
"LabelImportOnlyFavoriteChannels": "Restringir a canais marcados como favoritos",
|
||||
"LabelInNetworkSignInWithEasyPassword": "Ativar acesso dentro da rede com código PIN",
|
||||
"LabelInNetworkSignInWithEasyPasswordHelp": "Se ativado, poderá utilizar um código PIN para entrar no Jellyfin dentro da rede. A palavra-passe só será necessária fora da rede. Se o código PIN for deixado em branco, não será necessária autenticação dentro da rede.",
|
||||
"LabelInNetworkSignInWithEasyPasswordHelp": "Utilizar um código PIN para entrar no Jellyfin dentro da rede. A palavra-passe só será necessária fora da rede. Se o código PIN for deixado em branco, não será necessária autenticação dentro da rede.",
|
||||
"LabelKodiMetadataDateFormat": "Formato da data de lançamento:",
|
||||
"LabelKodiMetadataDateFormatHelp": "Todas as datas dentro dos nfo's serão lidas e gravadas usando este formato.",
|
||||
"LabelKodiMetadataEnableExtraThumbs": "Copiar extrafanart para extrathumbs",
|
||||
"LabelKodiMetadataDateFormatHelp": "Todas as datas presentes em ficheiros NFO serão analisadas utilizando este formato.",
|
||||
"LabelKodiMetadataEnableExtraThumbs": "Copiar o parâmetro extrafanart para extrathumbs",
|
||||
"LabelKodiMetadataEnableExtraThumbsHelp": "Ao transferir imagens, estas podem ser guardadas como extrafanart e extrathumbs para uma maior compatibilidade com os temas Kodi.",
|
||||
"LabelKodiMetadataEnablePathSubstitution": "Ativar substituição de local",
|
||||
"LabelKodiMetadataEnablePathSubstitutionHelp": "Ativa a substituição do local das imagens usando as opções de substituição de caminho no servidor.",
|
||||
|
@ -380,8 +378,8 @@
|
|||
"LabelLockItemToPreventChanges": "Bloquear este item para evitar alterações futuras",
|
||||
"LabelLoginDisclaimer": "Aviso legal de login:",
|
||||
"LabelLoginDisclaimerHelp": "Este aviso será mostrado na parte inferior da página de login.",
|
||||
"LabelManufacturer": "Fabricante:",
|
||||
"LabelManufacturerUrl": "URL do fabricante:",
|
||||
"LabelManufacturer": "Fabricante",
|
||||
"LabelManufacturerUrl": "URL do Fabricante",
|
||||
"LabelMatchType": "Tipo de correspondência:",
|
||||
"LabelMaxBackdropsPerItem": "Número máximo de imagens de fundo por item:",
|
||||
"LabelMaxParentalRating": "Controlo parental máximo permitido:",
|
||||
|
@ -408,7 +406,7 @@
|
|||
"LabelModelUrl": "URL do modelo",
|
||||
"LabelMonitorUsers": "Monitorizar atividade de:",
|
||||
"LabelMusicStreamingTranscodingBitrate": "Taxa de transcodificação de música:",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Defina a taxa máxima ao fazer transmissão de música.",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Defina a taxa máxima ao fazer transmissão de música",
|
||||
"LabelName": "Nome:",
|
||||
"LabelNewPassword": "Nova palavra-passe:",
|
||||
"LabelNewPasswordConfirm": "Confirmar nova palavra-passe:",
|
||||
|
@ -455,7 +453,7 @@
|
|||
"LabelSendNotificationToUsers": "Enviar notificação para:",
|
||||
"LabelSerialNumber": "Número de série",
|
||||
"LabelServerHost": "Servidor:",
|
||||
"LabelServerHostHelp": "192.168.1.100 ou https://omeudominio.com",
|
||||
"LabelServerHostHelp": "192.168.1.100:8096 ou https://omeudominio.com",
|
||||
"LabelSkipIfAudioTrackPresent": "Ignorar no caso de o idioma da faixa de áudio principal coincidir com o idioma de transferência",
|
||||
"LabelSkipIfAudioTrackPresentHelp": "Desmarque esta opção para garantir que todos os vídeos têm legendas, independentemente do idioma do áudio.",
|
||||
"LabelSkipIfGraphicalSubsPresent": "Ignorar se o vídeo já possuir legendas integradas",
|
||||
|
@ -475,7 +473,7 @@
|
|||
"LabelTimeLimitHours": "Limite de tempo (horas):",
|
||||
"LabelTranscodingAudioCodec": "Codec de áudio:",
|
||||
"LabelTranscodingContainer": "Contentor:",
|
||||
"LabelTranscodingTempPathHelp": "Esta pasta contém ficheiros ativos utilizados pelo transcodificador. Indique uma localização personalizada ou deixe em branco para utilizar o caminho por defeito.",
|
||||
"LabelTranscodingTempPathHelp": "Indique uma localização personalizada para os ficheiros de transcodificação em utilização, ou deixe em branco para utilizar o caminho por defeito.",
|
||||
"LabelTranscodingThreadCount": "Número de threads de transcodificação:",
|
||||
"LabelTranscodingThreadCountHelp": "Indique o número máximo de threads a ser utilizado para transcodificação. Reduzir o número de threads diminuirá a utilização do CPU, mas pode não converter rápido o suficiente para uma experiência de reprodução suave.",
|
||||
"LabelTranscodingVideoCodec": "Codec do vídeo:",
|
||||
|
@ -505,7 +503,7 @@
|
|||
"MessageConfirmRecordingCancellation": "Cancelar a gravação?",
|
||||
"MessageConfirmRestart": "Tem a certeza de que deseja reiniciar o Servidor Jellyfin?",
|
||||
"MessageConfirmRevokeApiKey": "Tem a certeza de que deseja revogar esta chave da API? A ligação da aplicação ao Servidor Jellyfin vai ser terminada de imediato.",
|
||||
"MessageConfirmShutdown": "Tem a certeza de que deseja encerrar o Servidor Jellyfin?",
|
||||
"MessageConfirmShutdown": "Tem a certeza de que deseja encerrar o servidor?",
|
||||
"MessageDeleteTaskTrigger": "Tem a certeza de que deseja remover o agendamento desta tarefa?",
|
||||
"MessageDirectoryPickerBSDInstruction": "Num sistema operativo BSD, é necessário configurar o disco Jail FreeNAS para permitir o acesso do Servidor Jellyfin.",
|
||||
"MessageDirectoryPickerInstruction": "As localizações de rede podem ser escritas manualmente caso o botão \"Rede\" não consiga encontrar os dispositivos. Por exemplo, {0} ou {1}.",
|
||||
|
@ -546,7 +544,7 @@
|
|||
"OptionAllowMediaPlaybackTranscodingHelp": "Restringir o acesso à transcodificação pode causar falhas de reprodução nas aplicações do Jellyfin devido a formatos multimédia não suportados.",
|
||||
"OptionAllowRemoteControlOthers": "Permitir controlo remoto de outros utilizadores",
|
||||
"OptionAllowRemoteSharedDevices": "Permitir controlo remoto de dispositivos compartilhados",
|
||||
"OptionAllowRemoteSharedDevicesHelp": "Dispositivos DLNA são considerados compartilhados até que um utilizador comece a controlá-lo.",
|
||||
"OptionAllowRemoteSharedDevicesHelp": "Dispositivos DLNA são considerados como partilhados até que um utilizador comece a controlá-lo.",
|
||||
"OptionAllowUserToManageServer": "Permitir a este utilizador gerir o servidor",
|
||||
"OptionAllowVideoPlaybackTranscoding": "Permitir reprodução de vídeo que necessite de transcodificação",
|
||||
"OptionArtist": "Artista",
|
||||
|
@ -599,7 +597,7 @@
|
|||
"OptionHasThemeVideo": "Vídeo de Tema",
|
||||
"OptionHideUser": "Ocultar este utilizador nos formulários de início de sessão",
|
||||
"OptionHideUserFromLoginHelp": "Útil para contas de administrador privadas ou ocultas. O utilizador necessita de entrar manualmente, introduzindo o seu nome de utilizador e palavra-passe.",
|
||||
"OptionHlsSegmentedSubtitles": "Legendas segmentadas hls",
|
||||
"OptionHlsSegmentedSubtitles": "Legendas segmentadas HLS",
|
||||
"OptionIgnoreTranscodeByteRangeRequests": "Ignorar requisições de extensão do byte de transcodificação",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Se ativadas, estas requisições serão honradas mas irão ignorar o cabeçalho da extensão do byte.",
|
||||
"OptionImdbRating": "Classificação no IMDb",
|
||||
|
@ -742,7 +740,7 @@
|
|||
"UninstallPluginConfirmation": "Tem a certeza de que deseja desinstalar {0}?",
|
||||
"UninstallPluginHeader": "Desinstalar Extensão",
|
||||
"Unmute": "Ativar som",
|
||||
"UserProfilesIntro": "O Jellyfin inclui suporte nativo de perfis de utilizadores, permitindo que cada utilizador tenha as suas configurações de visualização, estado da reprodução e controlos parentais.",
|
||||
"UserProfilesIntro": "O Jellyfin suporta perfis de utilizadores, permitindo que cada utilizador tenha as suas configurações de visualização, estado da reprodução e controlos parentais.",
|
||||
"ValueAudioCodec": "Codec de Áudio: {0}",
|
||||
"ValueConditions": "Condições: {0}",
|
||||
"ValueSpecialEpisodeName": "Especial - {0}",
|
||||
|
@ -751,9 +749,9 @@
|
|||
"ValueVideoCodec": "Codec de Vídeo: {0}",
|
||||
"Wednesday": "Quarta",
|
||||
"WelcomeToProject": "Bem-vindo ao Jellyfin!",
|
||||
"WizardCompleted": "É tudo, de momento. O Jellyfin iniciou a recolha de informações da sua biblioteca multimédia. Conheça algumas das nossas aplicações e, de seguida, clique <b>Terminar</b> para ver o <b>Painel Principal</b> do Servidor.",
|
||||
"WizardCompleted": "É tudo, de momento. O Jellyfin iniciou a recolha de informações da sua biblioteca multimédia. Conheça algumas das nossas aplicações e, de seguida, clique <b>Terminar</b> para ver o <b>Painel Principal</b>.",
|
||||
"Writer": "Escritor",
|
||||
"XmlDocumentAttributeListHelp": "Estes atributos são aplicados ao elemento principal de cada resposta xml.",
|
||||
"XmlDocumentAttributeListHelp": "Estes atributos são aplicados ao elemento principal de cada resposta XML.",
|
||||
"AccessRestrictedTryAgainLater": "Acesso restrito. Por favor, tente mais tarde.",
|
||||
"AddItemToCollectionHelp": "Adicione itens às coleções pesquisando-os e utilizando o respetivo menu de toque ou clique direito para os adicionar a uma coleção.",
|
||||
"AddToCollection": "Adicionar à coleção",
|
||||
|
@ -834,7 +832,7 @@
|
|||
"Browse": "Procurar",
|
||||
"BoxRear": "Caixa (verso)",
|
||||
"Box": "Caixa",
|
||||
"BookLibraryHelp": "Livros de texto e áudio são suportados. Consulte o Guia de Nomenclatura de Livros Jellyfin {1}.",
|
||||
"BookLibraryHelp": "Livros de texto e áudio são suportados. Consulte o guia de nomenclatura de livros{1}.",
|
||||
"BirthLocation": "Local de nascimento",
|
||||
"AsManyAsPossible": "Tantos quanto possível",
|
||||
"Art": "Capa",
|
||||
|
@ -880,13 +878,13 @@
|
|||
"GenreValue": "Género: {0}",
|
||||
"General": "Geral",
|
||||
"FormatValue": "Formato: {0}",
|
||||
"FolderTypeUnset": "Conteúdo misto",
|
||||
"FolderTypeUnset": "Conteúdo Misto",
|
||||
"Filters": "Filtros",
|
||||
"File": "Ficheiro",
|
||||
"Favorite": "Favoritos",
|
||||
"FFmpegSavePathNotFound": "Não foi possível encontrar o binário FFmpeg na localização que introduziu. O binário FFprobe também é necessário, e deve estar na mesma pasta. Estes componentes são, por norma, instalados em conjunto. Por favor, verifique o caminho da localização e tente de novo.",
|
||||
"Extras": "Extras",
|
||||
"ExtraLarge": "Extra grande",
|
||||
"ExtraLarge": "Extra Grande",
|
||||
"EveryNDays": "A cada {0} dias",
|
||||
"ErrorSavingTvProvider": "Ocorreu um erro ao guardar o provedor do serviços de TV. Por favor, garanta que está acessível e tente de novo.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "A hora de fim deve ser superior à hora de início.",
|
||||
|
@ -895,15 +893,15 @@
|
|||
"ErrorAddingXmlTvFile": "Ocorreu um erro ao aceder ao ficheiro XmlTV. Por favor, garanta que o ficheiro está acessível e tente de novo.",
|
||||
"Episodes": "Episódios",
|
||||
"EndsAtValue": "Termina às {0}",
|
||||
"EnablePhotosHelp": "Fotografias serão detetadas e mostradas em conjunto com outros ficheiros multimédia.",
|
||||
"EnablePhotos": "Ativar fotografias",
|
||||
"EnablePhotosHelp": "Imagens serão detetadas e mostradas em conjunto com outros ficheiros multimédia.",
|
||||
"EnablePhotos": "Mostrar fotografias",
|
||||
"EnableNextVideoInfoOverlayHelp": "No final de um vídeo, mostrar informação sobre o próximo vídeo da lista de reprodução.",
|
||||
"EnableNextVideoInfoOverlay": "Ativar informação sobre o próximo vídeo durante a reprodução",
|
||||
"EnableNextVideoInfoOverlay": "Mostrar informação sobre o próximo vídeo durante a reprodução",
|
||||
"EnableHardwareEncoding": "Ativar codificação por hardware",
|
||||
"EnableExternalVideoPlayersHelp": "O menu de um reprodutor externo será mostrado no início da reprodução de vídeo.",
|
||||
"EnableExternalVideoPlayers": "Ativar reprodutores de vídeo externos",
|
||||
"EnableDisplayMirroring": "Ativar espelho de ecrã",
|
||||
"EnableColorCodedBackgrounds": "Ativar código de cores para o fundo",
|
||||
"EnableExternalVideoPlayers": "Reprodutores de vídeo externos",
|
||||
"EnableDisplayMirroring": "Duplicação de ecrã",
|
||||
"EnableColorCodedBackgrounds": "Código de cores para o fundo",
|
||||
"EditSubtitles": "Editar legendas",
|
||||
"EditMetadata": "Editar metadados",
|
||||
"EditImages": "Editar imagens",
|
||||
|
@ -912,7 +910,7 @@
|
|||
"Download": "Transferir",
|
||||
"DoNotRecord": "Não gravar",
|
||||
"DisplayModeHelp": "Selecione o tipo de ecrã onde o Jellyfin será utilizado.",
|
||||
"DisplayMissingEpisodesWithinSeasonsHelp": "Deve também ser ativado para as bibliotecas de TV no Painel Principal do Servidor Jellyfin.",
|
||||
"DisplayMissingEpisodesWithinSeasonsHelp": "Deve também ser ativado para as bibliotecas de TV nas configurações do servidor.",
|
||||
"DisplayMissingEpisodesWithinSeasons": "Mostrar episódios em falta numa série",
|
||||
"DisplayInOtherHomeScreenSections": "Mostrar no ecrã principal em secções como multimédia recente ou continue a ver",
|
||||
"DisplayInMyMedia": "Mostrar no ecrã principal",
|
||||
|
@ -931,7 +929,7 @@
|
|||
"MessageContactAdminToResetPassword": "Por favor, contacte o Administrador de sistema para repôr a sua password.",
|
||||
"MessageConfirmRemoveMediaLocation": "Tem a certeza de que deseja remover esta localização?",
|
||||
"MessageConfirmDeleteTunerDevice": "Tem a certeza de que deseja remover este dispositivo?",
|
||||
"UserAgentHelp": "Forneça um user-agent HTTP personalizado, se necessário.",
|
||||
"UserAgentHelp": "Forneça um user-agent HTTP personalizado.",
|
||||
"OptionProtocolHttp": "HTTP",
|
||||
"OptionProtocolHls": "Emissão HTTP em direto",
|
||||
"LabelHomeScreenSectionValue": "Secção {0} do Painel Principal:",
|
||||
|
@ -969,7 +967,7 @@
|
|||
"Items": "Itens",
|
||||
"InstallingPackage": "A instalar {0}",
|
||||
"HttpsRequiresCert": "Para ativar ligações seguras, é necessário fornecer um certificado SSL confiável. Forneça um certificado SSL ou desative as ligações seguras.",
|
||||
"DirectStreamHelp1": "O tipo de multimédia (H.264, AC3, etc.) e a sua resolução são compatíveis com o dispositivo, no entanto, o formato (.mkv, .avi, .wmv, etc.) não é. O conteúdo é reempacotado em tempo real antes de ser enviado para o dispositivo.",
|
||||
"DirectStreamHelp1": "O tipo de multimédia (H.264, AC3, etc.) e a sua resolução são compatíveis com o dispositivo, no entanto, o formato (mkv, avi, wmv, etc.) não é. O conteúdo é reempacotado em tempo real antes de ser enviado para o dispositivo.",
|
||||
"DirectPlaying": "Reprodução direta",
|
||||
"Backdrop": "Imagem de Fundo",
|
||||
"SortChannelsBy": "Ordenar canais por:",
|
||||
|
@ -1050,9 +1048,9 @@
|
|||
"Display": "Visualização",
|
||||
"ManageLibrary": "Gerir biblioteca",
|
||||
"HeaderLibraryOrder": "Ordenação da Biblioteca",
|
||||
"EnableThemeVideosHelp": "Se ativado, serão reproduzidos vídeos do tema em plano de fundo durante a navegação pela Biblioteca.",
|
||||
"EnableThemeSongsHelp": "Se ativado, serão reproduzidas músicas do tema em plano de fundo durante a navegação pela Biblioteca.",
|
||||
"EnableBackdropsHelp": "Se ativado, serão mostradas imagens de fundo em algumas páginas durante a navegação pela Biblioteca.",
|
||||
"EnableThemeVideosHelp": "Reproduzir vídeos do tema em plano de fundo durante a navegação pela Biblioteca.",
|
||||
"EnableThemeSongsHelp": "Reproduzir músicas do tema em plano de fundo durante a navegação pela Biblioteca.",
|
||||
"EnableBackdropsHelp": "Mostrar imagens de fundo em algumas páginas durante a navegação pela Biblioteca.",
|
||||
"MediaInfoSize": "Tamanho",
|
||||
"LabelTextSize": "Tamanho do Texto:",
|
||||
"HeaderSubtitleAppearance": "Aparência das Legendas",
|
||||
|
@ -1082,5 +1080,79 @@
|
|||
"HeaderMovies": "Filmes",
|
||||
"DirectorsValue": "Realização: {0}",
|
||||
"DirectorValue": "Realizador: {0}",
|
||||
"ButtonOff": "Desligado"
|
||||
"ButtonOff": "Desligado",
|
||||
"ButtonAddImage": "Adicionar Imagem",
|
||||
"LabelOriginalTitle": "Título original:",
|
||||
"LabelPostProcessorArgumentsHelp": "Utilizar o caminho {path} como caminho para o ficheiro de gravação.",
|
||||
"Hide": "Esconder",
|
||||
"LabelBaseUrl": "URL Base:",
|
||||
"LabelNewName": "Novo nome:",
|
||||
"HeaderUploadImage": "Enviar Imagem",
|
||||
"EnableThemeSongs": "Músicas do tema",
|
||||
"EnableThemeVideos": "Vídeos do tema",
|
||||
"HeaderMoreLikeThis": "Mais Como Este",
|
||||
"HeaderRecordingPostProcessing": "Pós-Processamento de Gravações",
|
||||
"Descending": "Descendente",
|
||||
"CopyStreamURLSuccess": "URL copiado com sucesso.",
|
||||
"ErrorAddingListingsToSchedulesDirect": "Ocorreu um erro ao adicionar o alinhamento à sua conta Schedules Direct. As contas Schedules Direct permitem apenas um número limitado de alinhamentos. Poderá ser necessário iniciar sessão na sua conta e remover outras listagens antes de prosseguir.",
|
||||
"HeaderFavoriteBooks": "Livros Favoritos",
|
||||
"HeaderStopRecording": "Parar Gravação",
|
||||
"HeaderVideoQuality": "Qualidade do Vídeo",
|
||||
"HeaderVideoType": "Tipo de Vídeo",
|
||||
"LabelFolder": "Pasta:",
|
||||
"LabelOptionalNetworkPath": "(Opcional) Pasta partilhada de rede:",
|
||||
"ColorSpace": "Espaço de cores",
|
||||
"HeaderMyMediaSmall": "A Minha Multimédia (pequeno)",
|
||||
"HeaderNewDevices": "Novos Dispositivos",
|
||||
"HeaderRecordingOptions": "Opções de Gravação",
|
||||
"HeaderSortOrder": "Direção de Ordenação",
|
||||
"LabelBaseUrlHelp": "Pode adicionar uma sub-pasta personalizada aqui para aceder ao servidor através de um URL mais direto.",
|
||||
"LabelMoviePrefixHelp": "Se aplicar um prefixo aos títulos dos filmes, introduza-o aqui para que o servidor consiga tratá-los corretamente.",
|
||||
"LabelPleaseRestart": "As alterações produzirão efeito depois de recarregar a página web.",
|
||||
"LabelRecordingPathHelp": "Especifique a localização por defeito para guardar as gravações. Se for deixado em branco, será utilizada a pasta base do servidor.",
|
||||
"ColorTransfer": "Transferência de cores",
|
||||
"ExtractChapterImagesHelp": "Extrair imagens do capítulo permite aos clientes apresentar menus de seleção de cenas com gráficos. O processo poderá ser lento e exigente em recursos, bem como ocupar múltiplos gigabytes em disco. Este processo é corrido quando novos vídeos são encontrados e também através de uma tarefa agendada noturna. É possível configurar a hora de execução para que, idealmente, não coincida com horas de maior utilização.",
|
||||
"Features": "Funcionalidades",
|
||||
"HeaderMusicQuality": "Qualidade da Música",
|
||||
"HeaderMyDevice": "O Meu Dispositivo",
|
||||
"HeaderSortBy": "Ordenar Por",
|
||||
"LabelOptionalNetworkPathHelp": "Se esta pasta estiver partilhada na rede, fornecer o caminho de rede pode permitir aos clientes aceder diretamente aos ficheiros multimédia.",
|
||||
"LabelPersonRoleHelp": "Exemplo: motorista da carrinha de gelados",
|
||||
"LabelPlayer": "Reprodutor:",
|
||||
"LabelServerName": "Nome do servidor:",
|
||||
"LabelSize": "Tamanho:",
|
||||
"LabelLanNetworks": "Redes locais (LAN):",
|
||||
"HeaderOtherItems": "Outros Itens",
|
||||
"HeaderPhotoAlbums": "Álbuns de Fotografias",
|
||||
"HeaderSeasons": "Temporadas",
|
||||
"HeaderSecondsValue": "{0} Segundos",
|
||||
"HeaderSeriesOptions": "Opções da Série",
|
||||
"HeaderSeriesStatus": "Estado da Série",
|
||||
"HeaderTracks": "Faixas",
|
||||
"HeaderTuners": "Sintonizadores",
|
||||
"Horizontal": "Horizontal",
|
||||
"LabelAudioBitrate": "Taxa de bits de áudio:",
|
||||
"LabelAudioChannels": "Canais de áudio:",
|
||||
"LabelAudioCodec": "Codec de áudio:",
|
||||
"LabelAudioSampleRate": "Taxa de amostragem de áudio:",
|
||||
"LabelBitrate": "Taxa de bits:",
|
||||
"LabelCache": "Cache:",
|
||||
"LabelDiscNumber": "Número do disco:",
|
||||
"LabelInternetQuality": "Qualidade para a Internet:",
|
||||
"LabelKidsCategories": "Categorias para crianças:",
|
||||
"LabelMovieCategories": "Categorias para filmes:",
|
||||
"LabelMoviePrefix": "Prefixo para filmes:",
|
||||
"LabelMovieRecordingPath": "Caminho para gravação de filmes (opcional):",
|
||||
"LabelNewsCategories": "Categorias para notícias:",
|
||||
"LabelNumber": "Número:",
|
||||
"LabelPlayMethod": "Método de reprodução:",
|
||||
"LabelPostProcessor": "Aplicação de pós-processamento:",
|
||||
"LabelPostProcessorArguments": "Argumentos de linha de comandos para a aplicação de pós-processamento:",
|
||||
"LabelPreferredSubtitleLanguage": "Idioma preferencial das legendas:",
|
||||
"LabelProfileCodecs": "Codecs:",
|
||||
"LabelReasonForTranscoding": "Razão para transcodificação:",
|
||||
"LabelScreensaver": "Proteção de Ecrã:",
|
||||
"LabelSecureConnectionsMode": "Modo de ligação segura:",
|
||||
"LabelSeriesRecordingPath": "Caminho para gravação de séries (opcional):",
|
||||
"ColorPrimaries": "Cores primárias"
|
||||
}
|
||||
|
|
|
@ -614,5 +614,44 @@
|
|||
"LabelAirsAfterSeason": "Predvajanje po sezoni:",
|
||||
"LabelAirsBeforeSeason": "Predvajanje pred sezono:",
|
||||
"LabelAlbumArtists": "Izvajalci albuma:",
|
||||
"LabelAll": "Vse"
|
||||
"LabelAll": "Vse",
|
||||
"LabelCustomRating": "Prilagojena ocena:",
|
||||
"LabelDashboardTheme": "Tema pregledne plošče strežnika:",
|
||||
"LabelBirthDate": "Datum rojstva:",
|
||||
"LabelCache": "Predpomnilnik:",
|
||||
"LabelCachePath": "Pot predpomnilnika:",
|
||||
"LabelCancelled": "Prekinjeno",
|
||||
"LabelCertificatePassword": "Geslo certifikata:",
|
||||
"LabelCertificatePasswordHelp": "V kolikor vaš certifikat potrebuje geslo ga prosimo vnesite tukaj.",
|
||||
"LabelChannels": "Kanali:",
|
||||
"LabelCommunityRating": "Ocena skupnosti:",
|
||||
"LabelCriticRating": "Ocena kritikov:",
|
||||
"LabelCustomCertificatePathHelp": "Pot do PKCS #12 datoteke, ki vsebuje certifikat in zasebni ključ, za omogočanje TLS povezave na domenah po meri.",
|
||||
"LabelCustomCss": "CSS po meri:",
|
||||
"LabelCustomCssHelp": "Določite vaš lasten stil spletnega vmesnika.",
|
||||
"LabelCustomDeviceDisplayName": "Prikazano ime:",
|
||||
"LabelCustomDeviceDisplayNameHelp": "Določi prikazano ime naprave. Pusti prazno za uporabo imena kot ga sporoči naprava sama.",
|
||||
"LabelDefaultScreen": "Privzeti zaslon:",
|
||||
"LabelDateAdded": "Datum dodajanja:",
|
||||
"LabelDateAddedBehavior": "Vedenje datuma dodajanja za nove vsebine:",
|
||||
"LabelDateAddedBehaviorHelp": "V kolikor so prisotni ustrezni metapodatki bodo ti vedno uporabljeni najprej.",
|
||||
"LabelDateTimeLocale": "Lokacija datuma/časa:",
|
||||
"LabelDefaultUser": "Privzeti uporabnik:",
|
||||
"LabelDeviceDescription": "Opis naprave",
|
||||
"LabelDiscNumber": "Številka diska:",
|
||||
"LabelDisplayLanguage": "Jezik prikaza:",
|
||||
"LabelDisplayLanguageHelp": "Prevajanje Jellyfin strežnika je tekoči projekt.",
|
||||
"LabelBirthYear": "Letnica rojstva:",
|
||||
"LabelBlastMessageIntervalHelp": "Določi dolžino intervala v sekundah med pošiljanjem sporočil o dostopnosti.",
|
||||
"LabelBurnSubtitles": "Vžgi podnapise:",
|
||||
"LabelCachePathHelp": "Določi lokacijo po meri za predpomnjene podatke, na primer slike. Pusti prazno za uporabo privzete lokacije.",
|
||||
"LabelCollection": "Zbirka:",
|
||||
"LabelCustomCertificatePath": "Lokacija certifikata ssl po meri:",
|
||||
"LabelDidlMode": "DIDL način:",
|
||||
"LabelDisplayMissingEpisodesWithinSeasons": "Prikaži manjkajoče epizode znotraj sezon",
|
||||
"LabelDay": "Dan:",
|
||||
"LabelDeathDate": "Datum smrti:",
|
||||
"LabelBitrate": "Bitna hitrost:",
|
||||
"LabelBlastMessageInterval": "Interval sporočila o dostopnosti (sekunde)",
|
||||
"LabelDefaultUserHelp": "Določi knjižnica katerega uporabnika bo prikazana na povezanih napravah. To lahko preglasite s profili za posamezno napravo."
|
||||
}
|
||||
|
|
|
@ -288,5 +288,156 @@
|
|||
"AllLanguages": "Bütün diller",
|
||||
"AllowMediaConversion": "Medya dönüşümüne izin ver",
|
||||
"AddItemToCollectionHelp": "Ögeleri koleksiyona eklemek için arama yapın ve üzerine sağ tıklayın veya sekme menüsünden koleksiyona ekleyin.",
|
||||
"AllowHWTranscodingHelp": "Ayarlayıcının anında akışları dönüştürmesine izin verin. Bu, sunucunun gerektirdiği kodlamanın azaltılmasına yardımcı olabilir."
|
||||
"AllowHWTranscodingHelp": "Ayarlayıcının anında akışları dönüştürmesine izin verin. Bu, sunucunun gerektirdiği kodlamanın azaltılmasına yardımcı olabilir.",
|
||||
"ColorSpace": "Renk Uzayı",
|
||||
"ButtonConnect": "Bağlan",
|
||||
"ColorTransfer": "Renk transferi",
|
||||
"ButtonPreviousTrack": "Önceki parça",
|
||||
"ButtonProfile": "Profil",
|
||||
"ButtonRefresh": "Yenile",
|
||||
"ButtonRename": "Yeniden Adlandır",
|
||||
"ButtonRepeat": "Tekrar",
|
||||
"ButtonResume": "Devam Et",
|
||||
"ButtonRevoke": "geri al",
|
||||
"ChannelNumber": "Kanal Numarası",
|
||||
"ContinueWatching": "İzlemeye devam et",
|
||||
"CriticRating": "Kritik değerlendirme",
|
||||
"CustomDlnaProfilesHelp": "Yeni bir cihazı hedeflemek veya bir sistem profilini geçersiz kılmak için özel bir profil oluşturun.",
|
||||
"Descending": "Azalan",
|
||||
"DetectingDevices": "Cihazları tespit",
|
||||
"DirectPlaying": "Doğrudan oynatma",
|
||||
"CommunityRating": "Topluluk değerlendirmesi",
|
||||
"Composer": "Besteci",
|
||||
"ConfigureDateAdded": "Eklenen tarihin, Kitaplık ayarları altındaki Jellyfin Sunucu kontrol panelinde nasıl belirleneceğini yapılandırın",
|
||||
"ConfirmDeleteImage": "Resmi Sil?",
|
||||
"ButtonResetEasyPassword": "Kolay pin kodunu sıfırla",
|
||||
"ColorPrimaries": "Renk primerleri",
|
||||
"DirectStreamHelp2": "Doğrudan Akış, video kalitesinde herhangi bir kayıp olmadan çok az işlem gücü kullanır.",
|
||||
"DirectStreaming": "Doğrudan akış",
|
||||
"Director": "yönetmen",
|
||||
"DirectorValue": "Yönetmen: {0}",
|
||||
"DirectorsValue": "Yöneticiler: {0}",
|
||||
"Disabled": "Deaktif",
|
||||
"DisplayModeHelp": "Jellyfin’i çalıştırdığınız ekran türünü seçin.",
|
||||
"DoNotRecord": "Kaydetme",
|
||||
"Down": "Aşağı",
|
||||
"Download": "İndir",
|
||||
"DownloadsValue": "{0} indirme",
|
||||
"EditImages": "Resimleri düzenle",
|
||||
"EditMetadata": "Meta verileri düzenle",
|
||||
"EditSubtitles": "Altyazıları düzenle",
|
||||
"EnableBackdropsHelp": "Kütüphaneye göz atarken arka plandaki bazı sayfaların arka planında görüntüleyin.",
|
||||
"AllowMediaConversionHelp": "Dönüştürme özelliğine erişim izni verme veya reddetme.",
|
||||
"AllowOnTheFlySubtitleExtraction": "Anında altyazı çıkartmaya izin ver",
|
||||
"ButtonSelectServer": "Sunucu Seç",
|
||||
"Disc": "Disk",
|
||||
"ButtonAddImage": "Resim ekle",
|
||||
"ButtonAddScheduledTaskTrigger": "Tetikleyici ekle",
|
||||
"ButtonAddServer": "Sunucu ekle",
|
||||
"ButtonAudioTracks": "Ses Parçalari",
|
||||
"ButtonChangeServer": "Sunucu Değiştir",
|
||||
"ButtonGotIt": "Anladım",
|
||||
"ButtonMore": "Daha",
|
||||
"ButtonOpen": "Açık",
|
||||
"ButtonArrowUp": "Yukarı",
|
||||
"ButtonNetwork": "Ağ",
|
||||
"ButtonDownload": "İndir",
|
||||
"ButtonNextTrack": "Sonraki parça",
|
||||
"ButtonOff": "Kapalı",
|
||||
"ButtonParentalControl": "Ebeveyn Kontrolü",
|
||||
"ButtonArrowDown": "Aşağı",
|
||||
"ButtonArrowLeft": "Sol",
|
||||
"ButtonDown": "Aşağı",
|
||||
"ButtonGuide": "Rehber",
|
||||
"ButtonLearnMore": "Daha fazla bilgi edin",
|
||||
"ButtonLibraryAccess": "Kütüphane erişimi",
|
||||
"ButtonScanAllLibraries": "Tüm Kütüphaneleri Tara",
|
||||
"ButtonSelectView": "Görünüm seç",
|
||||
"ButtonShuffle": "Karıştır",
|
||||
"ButtonShutdown": "Kapat",
|
||||
"ChannelNameOnly": "Yalnızca {0} kanalı",
|
||||
"ConfirmDeleteItems": "Bu öğeleri silmek, onları hem dosya sisteminden hem de medya kitaplığınızdan siler. Devam etmek istediğinize emin misiniz?",
|
||||
"ConfirmDeletion": "Silmeyi onayla",
|
||||
"ConfirmEndPlayerSession": "Jellyfin'i {0} tarihinde kapatmak ister misiniz?",
|
||||
"Connect": "Bağlan",
|
||||
"Disconnect": "Bağlantısız",
|
||||
"Dislike": "Beğenmemek",
|
||||
"Display": "Görüntüle",
|
||||
"DisplayInMyMedia": "Ana ekranda görüntüleme",
|
||||
"DisplayInOtherHomeScreenSections": "En son medya gibi ana ekran bölümlerinde görüntüleyin ve izlemeye devam edin",
|
||||
"EnableBackdrops": "Arka planında",
|
||||
"BurnSubtitlesHelp": "Altyazı formatına bağlı olarak video dönüştürülürken sunucunun altyazılarda yazıp yazmayacağını belirler. Altyazılarda yanmaktan kaçınmak, sunucu performansını iyileştirir. Görüntü tabanlı biçimleri (VOBSUB, PGS, SUB / IDX, vb.) Ve bazı ASS / SSA altyazılarını yazmak için Otomatik'i seçin.",
|
||||
"ConfirmDeleteItem": "Bu öğeyi silmek, onu hem dosya sisteminden hem de medya kütüphanenizden siler. Devam etmek istediğinize emin misiniz?",
|
||||
"ValueSpecialEpisodeName": "Özel -{0}",
|
||||
"DeviceAccessHelp": "Bu, yalnızca benzersiz şekilde tanımlanabilen ve tarayıcı erişimini engellemeyen cihazlar için geçerlidir. Kullanıcı cihazlarına erişimin filtrelenmesi, burada onaylanana kadar yeni cihazları kullanmalarını önler.",
|
||||
"DirectStreamHelp1": "Medya, çözünürlük ve medya türüyle (H.264, AC3, vb.) İlgili cihazla uyumludur, ancak uyumsuz bir dosya konteynerinde (mkv, avi, wmv, vb.) Bulunur. Video, cihaza aktarılmadan önce anında yeniden paketlenecek.",
|
||||
"DisplayMissingEpisodesWithinSeasonsHelp": "Bu, sunucu yapılandırmasındaki TV kütüphaneleri için de etkinleştirilmelidir.",
|
||||
"EasyPasswordHelp": "Kolay pin kodunuz, desteklenen istemcilerde çevrimdışı erişim için kullanılır ve ayrıca ağ içinde oturum açmak için de kullanılabilir.",
|
||||
"ChangingMetadataImageSettingsNewContent": "Meta veri veya resim indirme ayarlarında yapılan değişiklikler yalnızca kitaplığınıza eklenen yeni içerikler için geçerli olacaktır. Değişiklikleri mevcut başlıklara uygulamak için meta verilerini el ile yenilemeniz gerekir.",
|
||||
"CinemaModeConfigurationHelp": "Sinema modu, ana özellikten önce fragmanlar ve özel tanıtımlar oynatabilen tiyatro deneyimini doğrudan oturma odanıza getirir.",
|
||||
"Browse": "Gözat",
|
||||
"AllowOnTheFlySubtitleExtractionHelp": "Gömülü alt yazılar, videoların kodlanmasını önlemek için videolardan çıkarılabilir ve istemcilere düz metin olarak gönderilebilir. Bazı sistemlerde bu uzun zaman alabilir ve çıkarma işlemi sırasında video oynatmanın durmasına neden olabilir. İstemci cihaz tarafından doğal olarak desteklenmiyorsa, video kod kodlaması ile birlikte yakılmış gömülü altyazılara sahip olmak için bunu devre dışı bırakın.",
|
||||
"AllowedRemoteAddressesHelp": "Uzaktan bağlanmasına izin verilecek ağlar için virgülle ayrılmış IP adresleri listesi veya IP / ağ maskesi girişleri. Boş bırakılırsa, tüm uzak adreslere izin verilir.",
|
||||
"AlwaysPlaySubtitlesHelp": "Dil tercihi ile eşleşen altyazılar, ses diline bakılmaksızın yüklenir.",
|
||||
"AnyLanguage": "Herhangi bir dil",
|
||||
"Anytime": "İstediğin zaman",
|
||||
"AroundTime": "{0} civarında",
|
||||
"Art": "Sanat",
|
||||
"AsManyAsPossible": "Mümkün olduğunca",
|
||||
"Ascending": "yükselen",
|
||||
"AspectRatio": "Boy oranı",
|
||||
"Audio": "Ses",
|
||||
"AuthProviderHelp": "Bu kullanıcının şifresini doğrulamak için kullanılacak bir Kimlik Doğrulama Sağlayıcısı seçin.",
|
||||
"AutoBasedOnLanguageSetting": "Otomatik (dil ayarına göre)",
|
||||
"Backdrop": "zemin",
|
||||
"Backdrops": "Zeminler",
|
||||
"Banner": "afiş",
|
||||
"BirthDateValue": "Doğan: {0}",
|
||||
"BirthLocation": "Doğum yeri",
|
||||
"BirthPlaceValue": "Doğum yeri: {0}",
|
||||
"Auto": "Oto",
|
||||
"Blacklist": "kara liste",
|
||||
"BoxRear": "Kutu (arka)",
|
||||
"ButtonAddMediaLibrary": "Medya Kitaplığı Ekle",
|
||||
"ButtonSubmit": "Sunmak",
|
||||
"ButtonStart": "Başlat",
|
||||
"ButtonTrailer": "Fragman",
|
||||
"Box": "Kutu",
|
||||
"ButtonViewWebsite": "Web sitesini görüntüle",
|
||||
"CancelRecording": "Kaydı iptal et",
|
||||
"CancelSeries": "Serileri iptal et",
|
||||
"ButtonUninstall": "Kaldır",
|
||||
"ButtonUp": "Yukarı",
|
||||
"ButtonWebsite": "Website",
|
||||
"Categories": "Kategoriler",
|
||||
"DrmChannelsNotImported": "DRM'li kanallar içe aktarılmayacak.",
|
||||
"DropShadow": "Düşen gölge",
|
||||
"CopyStreamURL": "Akış URL’sini kopyala",
|
||||
"DefaultSubtitlesHelp": "Altyazılar, gömülü meta verilerdeki varsayılan ve zorunlu bayraklara göre yüklenir. Birden fazla seçenek olduğunda dil tercihleri göz önünde bulundurulur.",
|
||||
"DeleteDeviceConfirmation": "Bu cihazı silmek istediğinden emin misin? Bir kullanıcı bir sonraki oturum açışında yeniden görünecektir.",
|
||||
"DisplayMissingEpisodesWithinSeasons": "Sezonlardaki eksik bölümleri görüntüleme",
|
||||
"AlwaysPlaySubtitles": "Her zaman altyazıları oynat",
|
||||
"CopyStreamURLSuccess": "URL başarıyla kopyalandı.",
|
||||
"DateAdded": "Ekleme Tarihi",
|
||||
"DatePlayed": "Oynanan tarih",
|
||||
"DeathDateValue": "Öldü: {0}",
|
||||
"Default": "Varsayılan",
|
||||
"DefaultErrorMessage": "İsteğin işlenmesi sırasında bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.",
|
||||
"DefaultMetadataLangaugeDescription": "Bunlar varsayılan ayarlarınızdır ve kitaplık bazında özelleştirilebilir.",
|
||||
"DeleteUserConfirmation": "Bu kullanıcıyı silmek istediğinden emin misin?",
|
||||
"Depressed": "Bunalımlı",
|
||||
"Desktop": "Masaüstü",
|
||||
"HeaderFavoriteShows": "Favori Diziler",
|
||||
"HeaderFavoriteEpisodes": "Favori Bölümler",
|
||||
"BookLibraryHelp": "Ses ve ders kitapları desteklenir. {0} kitap adlandırma kılavuzunu {1} gözden geçirin.",
|
||||
"EnableDisplayMirroring": "Ekran Yansıtma",
|
||||
"EnableExternalVideoPlayers": "Harici video oynatıcılar",
|
||||
"EnableExternalVideoPlayersHelp": "Video oynatmaya başlarken harici bir oynatıcı menüsü görüntülenecektir.",
|
||||
"EnableHardwareEncoding": "Donanım kodlamasını etkinleştir",
|
||||
"EnableNextVideoInfoOverlayHelp": "Bir videonun sonunda, geçerli oynatma listesinde çıkan bir sonraki video hakkındaki bilgileri görüntüleyin.",
|
||||
"EnablePhotos": "Fotoğrafları göster",
|
||||
"EnableNextVideoInfoOverlay": "Oynatma sırasında bir sonraki video bilgisini göster",
|
||||
"EnablePhotosHelp": "Görüntüler diğer medya dosyalarıyla birlikte algılanacak ve gösterilecektir.",
|
||||
"EnableCinemaMode": "Sinema Modu",
|
||||
"EnableColorCodedBackgrounds": "Renk kodlu arka planlar"
|
||||
}
|
||||
|
|
|
@ -323,7 +323,7 @@
|
|||
"HeaderFrequentlyPlayed": "多次播放",
|
||||
"HeaderGenres": "风格",
|
||||
"HeaderGuideProviders": "电视指南数据提供方",
|
||||
"HeaderHttpHeaders": "HTTP 标头",
|
||||
"HeaderHttpHeaders": "HTTP 头部",
|
||||
"HeaderIdentification": "身份识别",
|
||||
"HeaderIdentificationCriteriaHelp": "至少输入一个识别标准。",
|
||||
"HeaderIdentificationHeader": "身份认证标头",
|
||||
|
@ -868,7 +868,7 @@
|
|||
"MessageNoPluginsInstalled": "你没有安装插件。",
|
||||
"MessageNoTrailersFound": "未发现任何预告片。安装 Trailer channel 以通过添加一个网络预告片媒体库来增强你的电影体验。",
|
||||
"MessageNothingHere": "这里没有可显示的内容。",
|
||||
"MessagePasswordResetForUsers": "下列用户的密码已重置。现在,可使用重置时的 PIN 码进行登录。",
|
||||
"MessagePasswordResetForUsers": "下列用户的密码已被重置。他们现在可以用执行复位的pin码登录。",
|
||||
"MessagePleaseEnsureInternetMetadata": "请确认已启用从网络上下载媒体资料的选项。",
|
||||
"MessagePleaseWait": "请稍等。这将花费大约1分钟的时间。",
|
||||
"MessagePluginConfigurationRequiresLocalAccess": "请直接登录你的本地服务器以设置这个插件。",
|
||||
|
@ -1149,7 +1149,7 @@
|
|||
"ServerNameIsRestarting": "Jellyfin Server - {0} 重启中。",
|
||||
"ServerNameIsShuttingDown": "Jellyfin 服务器 - {0} 正在关闭。",
|
||||
"ServerRestartNeededAfterPluginInstall": "安装插件后,Jellyfin 服务器需要重启以使插件生效。",
|
||||
"ServerUpdateNeeded": "Jellyfin 服务器需要更新,请访问 {0} 以下载最新的版本。",
|
||||
"ServerUpdateNeeded": "Jellyfin 服务器需要更新,请访问 {0} 以下载最新的版本",
|
||||
"Settings": "设置",
|
||||
"SettingsSaved": "设置已保存。",
|
||||
"SettingsWarning": "更改这些值可能会导致不稳定或连接故障。如果您遇到任何问题, 我们建议将它们重新更改为默认值。",
|
||||
|
@ -1362,7 +1362,7 @@
|
|||
"DashboardServerName": "服务器:{0}",
|
||||
"LabelVideo": "视频:",
|
||||
"LabelWeb": "网站: ",
|
||||
"LeaveBlankToNotSetAPassword": "可选 - 留空以设置无密码",
|
||||
"LeaveBlankToNotSetAPassword": "您可以将此字段留空以设置空密码。",
|
||||
"LinksValue": "链接:{0}",
|
||||
"LiveBroadcasts": "直播",
|
||||
"LiveTV": "电视直播",
|
||||
|
@ -1383,7 +1383,7 @@
|
|||
"Option3D": "三维",
|
||||
"OptionDownloadLogoImage": "标志",
|
||||
"OptionLoginAttemptsBeforeLockout": "确定在锁定之前可以进行多少次不正确的登录尝试。",
|
||||
"OptionLoginAttemptsBeforeLockoutHelp": "0 表示默认设置(非管理员 3 次,管理员 5 次),-1 表示不限制次数",
|
||||
"OptionLoginAttemptsBeforeLockoutHelp": "如果值为0,则表示将允许普通用户尝试三次、管理员尝试五次的默认值。将此设置为-1将禁用此功能。",
|
||||
"PasswordResetProviderHelp": "选择一个密码重置提供者用于密码重置",
|
||||
"PlaceFavoriteChannelsAtBeginning": "将最喜爱的频道置顶",
|
||||
"PlayNext": "播放下一个",
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -10,8 +10,14 @@
|
|||
<p style="margin:2em 0;">${WizardCompleted}</p>
|
||||
|
||||
<div class="wizardNavigation">
|
||||
<button is="emby-button" type="button" class="raised button-cancel" onclick="history.back();"><i class="md-icon">arrow_back</i><span>${LabelPrevious}</span></button>
|
||||
<button is="emby-button" type="button" class="raised btnWizardNext button-submit"><i class="md-icon">check</i><span>${LabelFinish}</span></button>
|
||||
<button is="emby-button" type="button" class="raised button-cancel" onclick="history.back();">
|
||||
<i class="md-icon">arrow_back</i>
|
||||
<span>${LabelPrevious}</span>
|
||||
</button>
|
||||
<button is="emby-button" type="button" class="raised btnWizardNext button-submit">
|
||||
<i class="md-icon">check</i>
|
||||
<span>${LabelFinish}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue