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)
|
- [Nickbert7](https://github.com/Nickbert7)
|
||||||
- [ferferga](https://github.com/ferferga)
|
- [ferferga](https://github.com/ferferga)
|
||||||
- [bilde2910](https://github.com/bilde2910)
|
- [bilde2910](https://github.com/bilde2910)
|
||||||
|
- [Daniel Hartung](https://github.com/dhartung)
|
||||||
|
|
||||||
# Emby Contributors
|
# 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";
|
"use strict";
|
||||||
|
|
||||||
function getDisplayTime(hours) {
|
function getDisplayTime(hours) {
|
||||||
var minutes = 0,
|
var minutes = 0;
|
||||||
pct = hours % 1;
|
var pct = hours % 1;
|
||||||
return pct && (minutes = parseInt(60 * pct)), datetime.getDisplayTime(new Date(2e3, 1, 1, hours, minutes, 0, 0))
|
|
||||||
|
if (pct) {
|
||||||
|
minutes = parseInt(60 * pct);
|
||||||
|
}
|
||||||
|
|
||||||
|
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
function populateHours(context) {
|
function populateHours(context) {
|
||||||
for (var html = "", i = 0; i < 24; i++) html += '<option value="' + i + '">' + getDisplayTime(i) + "</option>";
|
var html = "";
|
||||||
html += '<option value="24">' + getDisplayTime(0) + "</option>", context.querySelector("#selectStart").innerHTML = html, context.querySelector("#selectEnd").innerHTML = 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) {
|
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) {
|
function submitSchedule(context, options) {
|
||||||
|
@ -22,30 +36,54 @@ define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "f
|
||||||
StartHour: context.querySelector("#selectStart").value,
|
StartHour: context.querySelector("#selectStart").value,
|
||||||
EndHour: context.querySelector("#selectEnd").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 {
|
return {
|
||||||
show: function(options) {
|
show: function (options) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
var xhr = new XMLHttpRequest;
|
var xhr = new XMLHttpRequest();
|
||||||
xhr.open("GET", "components/accessschedule/accessschedule.template.html", !0), xhr.onload = function(e) {
|
xhr.open("GET", "components/accessschedule/accessschedule.template.html", true);
|
||||||
var template = this.response,
|
|
||||||
dlg = dialogHelper.createDialog({
|
xhr.onload = function (e) {
|
||||||
removeOnClose: !0,
|
var template = this.response;
|
||||||
size: "small"
|
var dlg = dialogHelper.createDialog({
|
||||||
});
|
removeOnClose: true,
|
||||||
|
size: "small"
|
||||||
|
});
|
||||||
dlg.classList.add("formDialog");
|
dlg.classList.add("formDialog");
|
||||||
var html = "";
|
var html = "";
|
||||||
html += Globalize.translateDocument(template), dlg.innerHTML = html, populateHours(dlg), loadSchedule(dlg, options.schedule), dialogHelper.open(dlg), dlg.addEventListener("close", function() {
|
html += Globalize.translateDocument(template);
|
||||||
dlg.submitted ? resolve(options.schedule) : reject()
|
dlg.innerHTML = html;
|
||||||
}), dlg.querySelector(".btnCancel").addEventListener("click", function(e) {
|
populateHours(dlg);
|
||||||
dialogHelper.close(dlg)
|
loadSchedule(dlg, options.schedule);
|
||||||
}), dlg.querySelector("form").addEventListener("submit", function(e) {
|
dialogHelper.open(dlg);
|
||||||
return submitSchedule(dlg, options), e.preventDefault(), !1
|
dlg.addEventListener("close", function () {
|
||||||
})
|
if (dlg.submitted) {
|
||||||
}, xhr.send()
|
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";
|
"use strict";
|
||||||
|
|
||||||
function getEntryHtml(entry, apiClient) {
|
function getEntryHtml(entry, apiClient) {
|
||||||
var html = "";
|
var html = "";
|
||||||
html += '<div class="listItem listItem-border">';
|
html += '<div class="listItem listItem-border">';
|
||||||
var color = "#00a4dc";
|
var color = "#00a4dc";
|
||||||
var icon = "notifications";
|
var icon = "notifications";
|
||||||
|
|
||||||
if ("Error" == entry.Severity || "Fatal" == entry.Severity || "Warn" == entry.Severity) {
|
if ("Error" == entry.Severity || "Fatal" == entry.Severity || "Warn" == entry.Severity) {
|
||||||
color = "#cc0000";
|
color = "#cc0000";
|
||||||
icon = "notification_important";
|
icon = "notification_important";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry.UserId && entry.UserPrimaryImageTag) {
|
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, {
|
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",
|
type: "Primary",
|
||||||
|
@ -18,78 +20,138 @@ define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotific
|
||||||
} else {
|
} else {
|
||||||
html += '<i class="listItemIcon md-icon" style="background-color:' + color + '">' + icon + '</i>';
|
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);
|
html += '<div class="listItemBody three-line">';
|
||||||
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="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) {
|
function renderList(elem, apiClient, result, startIndex, limit) {
|
||||||
elem.innerHTML = result.Items.map(function(i) {
|
elem.innerHTML = result.Items.map(function (i) {
|
||||||
return getEntryHtml(i, apiClient)
|
return getEntryHtml(i, apiClient);
|
||||||
}).join("")
|
}).join("");
|
||||||
}
|
}
|
||||||
|
|
||||||
function reloadData(instance, elem, apiClient, startIndex, limit) {
|
function reloadData(instance, elem, apiClient, startIndex, limit) {
|
||||||
null == startIndex && (startIndex = parseInt(elem.getAttribute("data-activitystartindex") || "0")), limit = limit || parseInt(elem.getAttribute("data-activitylimit") || "7");
|
if (null == startIndex) {
|
||||||
var minDate = new Date,
|
startIndex = parseInt(elem.getAttribute("data-activitystartindex") || "0");
|
||||||
hasUserId = "false" !== elem.getAttribute("data-useractivity");
|
}
|
||||||
hasUserId ? minDate.setTime(minDate.getTime() - 864e5) : minDate.setTime(minDate.getTime() - 6048e5), ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries", {
|
|
||||||
|
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,
|
startIndex: startIndex,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
minDate: minDate.toISOString(),
|
minDate: minDate.toISOString(),
|
||||||
hasUserId: hasUserId
|
hasUserId: hasUserId
|
||||||
})).then(function(result) {
|
})).then(function (result) {
|
||||||
if (elem.setAttribute("data-activitystartindex", startIndex), elem.setAttribute("data-activitylimit", limit), !startIndex) {
|
elem.setAttribute("data-activitystartindex", startIndex);
|
||||||
|
elem.setAttribute("data-activitylimit", limit);
|
||||||
|
if (!startIndex) {
|
||||||
var activityContainer = dom.parentWithClass(elem, "activityContainer");
|
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) {
|
function onActivityLogUpdate(e, apiClient, data) {
|
||||||
var options = this.options;
|
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) {
|
function onListClick(e) {
|
||||||
var btnEntryInfo = dom.parentWithClass(e.target, "btnEntryInfo");
|
var btnEntryInfo = dom.parentWithClass(e.target, "btnEntryInfo");
|
||||||
|
|
||||||
if (btnEntryInfo) {
|
if (btnEntryInfo) {
|
||||||
var id = btnEntryInfo.getAttribute("data-id"),
|
var id = btnEntryInfo.getAttribute("data-id");
|
||||||
items = this.items;
|
var items = this.items;
|
||||||
|
|
||||||
if (items) {
|
if (items) {
|
||||||
var item = items.filter(function(i) {
|
var item = items.filter(function (i) {
|
||||||
return i.Id.toString() === id
|
return i.Id.toString() === id;
|
||||||
})[0];
|
})[0];
|
||||||
item && showItemOverview(item)
|
|
||||||
|
if (item) {
|
||||||
|
showItemOverview(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showItemOverview(item) {
|
function showItemOverview(item) {
|
||||||
require(["alert"], function(alert) {
|
require(["alert"], function (alert) {
|
||||||
alert({
|
alert({
|
||||||
text: item.Overview
|
text: item.Overview
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function ActivityLog(options) {
|
function ActivityLog(options) {
|
||||||
this.options = options;
|
this.options = options;
|
||||||
var element = options.element;
|
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);
|
var apiClient = connectionManager.getApiClient(options.serverId);
|
||||||
reloadData(this, element, apiClient);
|
reloadData(this, element, apiClient);
|
||||||
var onUpdate = onActivityLogUpdate.bind(this);
|
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;
|
var options = this.options;
|
||||||
|
|
||||||
if (options) {
|
if (options) {
|
||||||
options.element.classList.remove("activityLogListWidget");
|
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;
|
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";
|
"use strict";
|
||||||
return function(options) {
|
|
||||||
|
return function (options) {
|
||||||
function parentWithClass(elem, className) {
|
function parentWithClass(elem, className) {
|
||||||
for (; !elem.classList || !elem.classList.contains(className);)
|
while (!elem.classList || !elem.classList.contains(className)) {
|
||||||
if (!(elem = elem.parentNode)) return null;
|
elem = elem.parentNode;
|
||||||
return elem
|
if (!elem) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return elem;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mapChannel(button, channelId, providerChannelId) {
|
function mapChannel(button, channelId, providerChannelId) {
|
||||||
|
@ -19,33 +25,35 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
|
||||||
providerChannelId: providerChannelId
|
providerChannelId: providerChannelId
|
||||||
},
|
},
|
||||||
dataType: "json"
|
dataType: "json"
|
||||||
}).then(function(mapping) {
|
}).then(function (mapping) {
|
||||||
var listItem = parentWithClass(button, "listItem");
|
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) {
|
function onChannelsElementClick(e) {
|
||||||
var btnMap = parentWithClass(e.target, "btnMap");
|
var btnMap = parentWithClass(e.target, "btnMap");
|
||||||
|
|
||||||
if (btnMap) {
|
if (btnMap) {
|
||||||
var channelId = btnMap.getAttribute("data-id");
|
var channelId = btnMap.getAttribute("data-id");
|
||||||
var providerChannelId = btnMap.getAttribute("data-providerid");
|
var providerChannelId = btnMap.getAttribute("data-providerid");
|
||||||
var menuItems = currentMappingOptions.ProviderChannels.map(function(m) {
|
var menuItems = currentMappingOptions.ProviderChannels.map(function (m) {
|
||||||
return {
|
return {
|
||||||
name: m.Name,
|
name: m.Name,
|
||||||
id: m.Id,
|
id: m.Id,
|
||||||
selected: m.Id.toLowerCase() === providerChannelId.toLowerCase()
|
selected: m.Id.toLowerCase() === providerChannelId.toLowerCase()
|
||||||
}
|
};
|
||||||
}).sort(function (a, b) {
|
}).sort(function (a, b) {
|
||||||
return a.name.localeCompare(b.name);
|
return a.name.localeCompare(b.name);
|
||||||
});
|
});
|
||||||
|
|
||||||
actionsheet.show({
|
actionsheet.show({
|
||||||
positionTo: btnMap,
|
positionTo: btnMap,
|
||||||
items: menuItems
|
items: menuItems
|
||||||
}).then(function(newChannelId) {
|
}).then(function (newChannelId) {
|
||||||
mapChannel(btnMap, channelId, newChannelId)
|
mapChannel(btnMap, channelId, newChannelId);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,47 +61,87 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
|
||||||
var apiClient = connectionManager.getApiClient(serverId);
|
var apiClient = connectionManager.getApiClient(serverId);
|
||||||
return apiClient.getJSON(apiClient.getUrl("LiveTv/ChannelMappingOptions", {
|
return apiClient.getJSON(apiClient.getUrl("LiveTv/ChannelMappingOptions", {
|
||||||
providerId: providerId
|
providerId: providerId
|
||||||
}))
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMappingSecondaryName(mapping, providerName) {
|
function getMappingSecondaryName(mapping, providerName) {
|
||||||
return (mapping.ProviderChannelName || "") + " - " + providerName
|
return (mapping.ProviderChannelName || "") + " - " + providerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTunerChannelHtml(channel, providerName) {
|
function getTunerChannelHtml(channel, providerName) {
|
||||||
var html = "";
|
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() {
|
function getEditorHtml() {
|
||||||
var html = "";
|
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) {
|
function initEditor(dlg, options) {
|
||||||
getChannelMappingOptions(options.serverId, options.providerId).then(function(result) {
|
getChannelMappingOptions(options.serverId, options.providerId).then(function (result) {
|
||||||
currentMappingOptions = result;
|
currentMappingOptions = result;
|
||||||
var channelsElement = dlg.querySelector(".channels");
|
var channelsElement = dlg.querySelector(".channels");
|
||||||
channelsElement.innerHTML = result.TunerChannels.map(function(channel) {
|
channelsElement.innerHTML = result.TunerChannels.map(function (channel) {
|
||||||
return getTunerChannelHtml(channel, result.ProviderName)
|
return getTunerChannelHtml(channel, result.ProviderName);
|
||||||
}).join(""), channelsElement.addEventListener("click", onChannelsElementClick)
|
}).join("");
|
||||||
})
|
channelsElement.addEventListener("click", onChannelsElementClick);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
var currentMappingOptions, self = this;
|
|
||||||
self.show = function() {
|
var currentMappingOptions;
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self.show = function () {
|
||||||
var dialogOptions = {
|
var dialogOptions = {
|
||||||
removeOnClose: !0
|
removeOnClose: true
|
||||||
};
|
};
|
||||||
dialogOptions.size = "small";
|
dialogOptions.size = "small";
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
dlg.classList.add("formDialog"), dlg.classList.add("ui-body-a"), dlg.classList.add("background-theme-a");
|
dlg.classList.add("formDialog");
|
||||||
var html = "",
|
dlg.classList.add("ui-body-a");
|
||||||
title = globalize.translate("MapChannels");
|
dlg.classList.add("background-theme-a");
|
||||||
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() {
|
var html = "";
|
||||||
dialogHelper.close(dlg)
|
var title = globalize.translate("MapChannels");
|
||||||
}), new Promise(function(resolve, reject) {
|
html += '<div class="formDialogHeader">';
|
||||||
dlg.addEventListener("close", resolve), dialogHelper.open(dlg)
|
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";
|
"use strict";
|
||||||
|
|
||||||
function enableScrollX() {
|
function enableScrollX() {
|
||||||
return !layoutManager.desktop
|
return !layoutManager.desktop;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getThumbShape() {
|
function getThumbShape() {
|
||||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPosterShape() {
|
function getPosterShape() {
|
||||||
return enableScrollX() ? "overflowPortrait" : "portrait"
|
return enableScrollX() ? "overflowPortrait" : "portrait";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSquareShape() {
|
function getSquareShape() {
|
||||||
return enableScrollX() ? "overflowSquare" : "square"
|
return enableScrollX() ? "overflowSquare" : "square";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSections() {
|
function getSections() {
|
||||||
|
@ -23,147 +23,208 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad
|
||||||
types: "Movie",
|
types: "Movie",
|
||||||
id: "favoriteMovies",
|
id: "favoriteMovies",
|
||||||
shape: getPosterShape(),
|
shape: getPosterShape(),
|
||||||
showTitle: !1,
|
showTitle: false,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteShows",
|
name: "HeaderFavoriteShows",
|
||||||
types: "Series",
|
types: "Series",
|
||||||
id: "favoriteShows",
|
id: "favoriteShows",
|
||||||
shape: getPosterShape(),
|
shape: getPosterShape(),
|
||||||
showTitle: !1,
|
showTitle: false,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteEpisodes",
|
name: "HeaderFavoriteEpisodes",
|
||||||
types: "Episode",
|
types: "Episode",
|
||||||
id: "favoriteEpisode",
|
id: "favoriteEpisode",
|
||||||
shape: getThumbShape(),
|
shape: getThumbShape(),
|
||||||
preferThumb: !1,
|
preferThumb: false,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
showParentTitle: !0,
|
showParentTitle: true,
|
||||||
overlayPlayButton: !0,
|
overlayPlayButton: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
centerText: !0
|
centerText: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteVideos",
|
name: "HeaderFavoriteVideos",
|
||||||
types: "Video,MusicVideo",
|
types: "Video,MusicVideo",
|
||||||
id: "favoriteVideos",
|
id: "favoriteVideos",
|
||||||
shape: getThumbShape(),
|
shape: getThumbShape(),
|
||||||
preferThumb: !0,
|
preferThumb: true,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
overlayPlayButton: !0,
|
overlayPlayButton: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
centerText: !0
|
centerText: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteArtists",
|
name: "HeaderFavoriteArtists",
|
||||||
types: "MusicArtist",
|
types: "MusicArtist",
|
||||||
id: "favoriteArtists",
|
id: "favoriteArtists",
|
||||||
shape: getSquareShape(),
|
shape: getSquareShape(),
|
||||||
preferThumb: !1,
|
preferThumb: false,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showParentTitle: !1,
|
showParentTitle: false,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0,
|
overlayPlayButton: true,
|
||||||
coverImage: !0
|
coverImage: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteAlbums",
|
name: "HeaderFavoriteAlbums",
|
||||||
types: "MusicAlbum",
|
types: "MusicAlbum",
|
||||||
id: "favoriteAlbums",
|
id: "favoriteAlbums",
|
||||||
shape: getSquareShape(),
|
shape: getSquareShape(),
|
||||||
preferThumb: !1,
|
preferThumb: false,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showParentTitle: !0,
|
showParentTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0,
|
overlayPlayButton: true,
|
||||||
coverImage: !0
|
coverImage: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteSongs",
|
name: "HeaderFavoriteSongs",
|
||||||
types: "Audio",
|
types: "Audio",
|
||||||
id: "favoriteSongs",
|
id: "favoriteSongs",
|
||||||
shape: getSquareShape(),
|
shape: getSquareShape(),
|
||||||
preferThumb: !1,
|
preferThumb: false,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showParentTitle: !0,
|
showParentTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayMoreButton: !0,
|
overlayMoreButton: true,
|
||||||
action: "instantmix",
|
action: "instantmix",
|
||||||
coverImage: !0
|
coverImage: true
|
||||||
}]
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadSection(elem, userId, topParentId, section, isSingleSection) {
|
function loadSection(elem, userId, topParentId, section, isSingleSection) {
|
||||||
var screenWidth = dom.getWindowSize().innerWidth,
|
var screenWidth = dom.getWindowSize().innerWidth;
|
||||||
options = {
|
var options = {
|
||||||
SortBy: "SortName",
|
SortBy: "SortName",
|
||||||
SortOrder: "Ascending",
|
SortOrder: "Ascending",
|
||||||
Filters: "IsFavorite",
|
Filters: "IsFavorite",
|
||||||
Recursive: !0,
|
Recursive: true,
|
||||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||||
CollapseBoxSetItems: !1,
|
CollapseBoxSetItems: false,
|
||||||
ExcludeLocationTypes: "Virtual",
|
ExcludeLocationTypes: "Virtual",
|
||||||
EnableTotalRecordCount: !1
|
EnableTotalRecordCount: false
|
||||||
};
|
};
|
||||||
topParentId && (options.ParentId = topParentId), isSingleSection || (options.Limit = screenWidth >= 1920 ? 10 : screenWidth >= 1440 ? 8 : 6, enableScrollX() && (options.Limit = 20));
|
|
||||||
|
if (topParentId) {
|
||||||
|
options.ParentId = topParentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isSingleSection) {
|
||||||
|
options.Limit = screenWidth >= 1920 ? 10 : screenWidth >= 1440 ? 8 : 6;
|
||||||
|
|
||||||
|
if (enableScrollX()) {
|
||||||
|
options.Limit = 20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var promise;
|
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 = "";
|
var html = "";
|
||||||
|
|
||||||
if (result.Items.length) {
|
if (result.Items.length) {
|
||||||
if (html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) {
|
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>"
|
html += '<a is="emby-linkbutton" href="' + ("list.html?serverId=" + ApiClient.serverId() + "&type=" + section.types + "&IsFavorite=true") + '" class="more button-flat button-flat-mini sectionTitleTextButton">';
|
||||||
} else html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate(section.name) + "</h2>";
|
html += '<h2 class="sectionTitle sectionTitle-cards">';
|
||||||
if (html += "</div>", enableScrollX()) {
|
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";
|
var scrollXClass = "scrollX hiddenScrollX";
|
||||||
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">'
|
if (layoutManager.tv) {
|
||||||
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
scrollXClass += " smoothScrollX";
|
||||||
var supportsImageAnalysis = appHost.supports("imageanalysis"),
|
}
|
||||||
cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle;
|
|
||||||
cardLayout = !1, html += cardBuilder.getCardsHtml(result.Items, {
|
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,
|
preferThumb: section.preferThumb,
|
||||||
shape: section.shape,
|
shape: section.shape,
|
||||||
centerText: section.centerText && !cardLayout,
|
centerText: section.centerText && !cardLayout,
|
||||||
overlayText: !1 !== section.overlayText,
|
overlayText: false !== section.overlayText,
|
||||||
showTitle: section.showTitle,
|
showTitle: section.showTitle,
|
||||||
showParentTitle: section.showParentTitle,
|
showParentTitle: section.showParentTitle,
|
||||||
scalable: !0,
|
scalable: true,
|
||||||
coverImage: section.coverImage,
|
coverImage: section.coverImage,
|
||||||
overlayPlayButton: section.overlayPlayButton,
|
overlayPlayButton: section.overlayPlayButton,
|
||||||
overlayMoreButton: section.overlayMoreButton && !cardLayout,
|
overlayMoreButton: section.overlayMoreButton && !cardLayout,
|
||||||
action: section.action,
|
action: section.action,
|
||||||
allowBottomPadding: !enableScrollX(),
|
allowBottomPadding: !enableScrollX(),
|
||||||
cardLayout: cardLayout
|
cardLayout: cardLayout
|
||||||
}), html += "</div>"
|
});
|
||||||
|
html += "</div>";
|
||||||
}
|
}
|
||||||
elem.innerHTML = html, imageLoader.lazyChildren(elem)
|
|
||||||
})
|
elem.innerHTML = html;
|
||||||
|
imageLoader.lazyChildren(elem);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadSections(page, userId, topParentId, types) {
|
function loadSections(page, userId, topParentId, types) {
|
||||||
loading.show();
|
loading.show();
|
||||||
var sections = getSections(),
|
var sections = getSections();
|
||||||
sectionid = getParameterByName("sectionid");
|
var sectionid = getParameterByName("sectionid");
|
||||||
sectionid && (sections = sections.filter(function(s) {
|
|
||||||
return s.id === sectionid
|
if (sectionid) {
|
||||||
})), types && (sections = sections.filter(function(s) {
|
sections = sections.filter(function (s) {
|
||||||
return -1 !== types.indexOf(s.id)
|
return s.id === sectionid;
|
||||||
}));
|
});
|
||||||
var i, length, elem = page.querySelector(".favoriteSections");
|
}
|
||||||
|
|
||||||
|
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) {
|
if (!elem.innerHTML) {
|
||||||
var html = "";
|
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 = [];
|
var promises = [];
|
||||||
|
|
||||||
for (i = 0, length = sections.length; i < length; i++) {
|
for (i = 0, length = sections.length; i < length; i++) {
|
||||||
var section = sections[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 {
|
return {
|
||||||
render: loadSections
|
render: loadSections
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,32 +1,45 @@
|
||||||
define(["dom", "appRouter", "connectionManager"], function(dom, appRouter, connectionManager) {
|
define(["dom", "appRouter", "connectionManager"], function (dom, appRouter, connectionManager) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function onGroupedCardClick(e, card) {
|
function onGroupedCardClick(e, card) {
|
||||||
var itemId = card.getAttribute("data-id"),
|
var itemId = card.getAttribute("data-id");
|
||||||
serverId = card.getAttribute("data-serverid"),
|
var serverId = card.getAttribute("data-serverid");
|
||||||
apiClient = connectionManager.getApiClient(serverId),
|
var apiClient = connectionManager.getApiClient(serverId);
|
||||||
userId = apiClient.getCurrentUserId(),
|
var userId = apiClient.getCurrentUserId();
|
||||||
playedIndicator = card.querySelector(".playedIndicator"),
|
var playedIndicator = card.querySelector(".playedIndicator");
|
||||||
playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null,
|
var playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null;
|
||||||
options = {
|
var options = {
|
||||||
Limit: parseInt(playedIndicatorHtml || "10"),
|
Limit: parseInt(playedIndicatorHtml || "10"),
|
||||||
Fields: "PrimaryImageAspectRatio,DateCreated",
|
Fields: "PrimaryImageAspectRatio,DateCreated",
|
||||||
ParentId: itemId,
|
ParentId: itemId,
|
||||||
GroupItems: !1
|
GroupItems: false
|
||||||
},
|
};
|
||||||
actionableParent = dom.parentWithTag(e.target, ["A", "BUTTON", "INPUT"]);
|
var 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]);
|
if (!actionableParent || actionableParent.classList.contains("cardContent")) {
|
||||||
var url = "itemdetails.html?id=" + itemId + "&serverId=" + serverId;
|
apiClient.getJSON(apiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
|
||||||
Dashboard.navigate(url)
|
if (1 === items.length) {
|
||||||
}), e.stopPropagation(), e.preventDefault(), !1
|
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) {
|
function onItemsContainerClick(e) {
|
||||||
var groupedCard = dom.parentWithClass(e.target, "groupedCard");
|
var groupedCard = dom.parentWithClass(e.target, "groupedCard");
|
||||||
groupedCard && onGroupedCardClick(e, groupedCard)
|
|
||||||
|
if (groupedCard) {
|
||||||
|
onGroupedCardClick(e, groupedCard);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
onItemsContainerClick: onItemsContainerClick
|
onItemsContainerClick: onItemsContainerClick
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -584,36 +584,34 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
||||||
self.setSubtitleOffset = function(offset) {
|
self.setSubtitleOffset = function(offset) {
|
||||||
|
|
||||||
var offsetValue = parseFloat(offset);
|
var offsetValue = parseFloat(offset);
|
||||||
var videoElement = self._mediaElement;
|
|
||||||
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
|
|
||||||
|
|
||||||
Array.from(videoElement.textTracks)
|
// if .ass currently rendering
|
||||||
.filter(function(trackElement) {
|
if (currentAssRenderer){
|
||||||
if (customTrackIndex === -1 ) {
|
updateCurrentTrackOffset(offsetValue);
|
||||||
|
} else {
|
||||||
|
var videoElement = self._mediaElement;
|
||||||
|
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
|
||||||
|
|
||||||
|
Array.from(videoElement.textTracks)
|
||||||
|
.filter(function(trackElement) {
|
||||||
// get showing .vtt textTacks
|
// get showing .vtt textTacks
|
||||||
return trackElement.mode === 'showing';
|
return trackElement.mode === 'showing';
|
||||||
} else {
|
})
|
||||||
// get current .ass textTrack
|
.forEach(function(trackElement) {
|
||||||
return ("textTrack" + customTrackIndex) === trackElement.id;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.forEach(function(trackElement) {
|
|
||||||
|
|
||||||
var track = mediaStreamTextTracks.filter(function(stream) {
|
var track = customTrackIndex === -1 ? null : mediaStreamTextTracks.filter(function (t) {
|
||||||
return ("textTrack" + stream.Index) === trackElement.id;
|
return t.Index === customTrackIndex;
|
||||||
})[0];
|
})[0];
|
||||||
|
|
||||||
if(track) {
|
if (track) {
|
||||||
offsetValue = updateCurrentTrackOffset(offsetValue);
|
offsetValue = updateCurrentTrackOffset(offsetValue);
|
||||||
var format = (track.Codec || '').toLowerCase();
|
|
||||||
if (format !== 'ass' && format !== 'ssa') {
|
|
||||||
setVttSubtitleOffset(trackElement, 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) {
|
function updateCurrentTrackOffset(offsetValue) {
|
||||||
|
@ -1230,44 +1228,43 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
||||||
}
|
}
|
||||||
|
|
||||||
var trackElement = null;
|
var trackElement = null;
|
||||||
var expectedId = 'manualTrack' + track.Index;
|
if (videoElement.textTracks && videoElement.textTracks.length > 0) {
|
||||||
|
trackElement = videoElement.textTracks[0];
|
||||||
|
|
||||||
// get list of tracks
|
// This throws an error in IE, but is fine in chrome
|
||||||
var allTracks = videoElement.textTracks;
|
// In IE it's not necessary anyway because changing the src seems to be enough
|
||||||
for (var i = 0; i < allTracks.length; i++) {
|
try {
|
||||||
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
trackElement.mode = 'showing';
|
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 {
|
} 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) {
|
function updateSubtitleText(timeMs) {
|
||||||
|
|
|
@ -1,28 +1,45 @@
|
||||||
define(["datetime"], function(datetime) {
|
define(["datetime"], function (datetime) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function humaneDate(date_str) {
|
function humaneDate(date_str) {
|
||||||
var format, time_formats = [
|
var format;
|
||||||
[90, "a minute"],
|
var time_formats = [
|
||||||
[3600, "minutes", 60],
|
[90, "a minute"],
|
||||||
[5400, "an hour"],
|
[3600, "minutes", 60],
|
||||||
[86400, "hours", 3600],
|
[5400, "an hour"],
|
||||||
[129600, "a day"],
|
[86400, "hours", 3600],
|
||||||
[604800, "days", 86400],
|
[129600, "a day"],
|
||||||
[907200, "a week"],
|
[604800, "days", 86400],
|
||||||
[2628e3, "weeks", 604800],
|
[907200, "a week"],
|
||||||
[3942e3, "a month"],
|
[2628e3, "weeks", 604800],
|
||||||
[31536e3, "months", 2628e3],
|
[3942e3, "a month"],
|
||||||
[47304e3, "a year"],
|
[31536e3, "months", 2628e3],
|
||||||
[31536e5, "years", 31536e3]
|
[47304e3, "a year"],
|
||||||
],
|
[31536e5, "years", 31536e3]
|
||||||
dt = new Date,
|
];
|
||||||
date = datetime.parseISO8601Date(date_str, !0),
|
var dt = new Date();
|
||||||
seconds = (dt - date) / 1e3,
|
var date = datetime.parseISO8601Date(date_str, true);
|
||||||
i = 0;
|
var seconds = (dt - date) / 1000.0;
|
||||||
for (seconds < 0 && (seconds = Math.abs(seconds)); format = time_formats[i++];)
|
var i = 0;
|
||||||
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
|
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) {
|
function humaneElapsed(firstDateStr, secondDateStr) {
|
||||||
|
@ -30,12 +47,10 @@ define(["datetime"], function(datetime) {
|
||||||
var dateOne = new Date(firstDateStr);
|
var dateOne = new Date(firstDateStr);
|
||||||
var dateTwo = new Date(secondDateStr);
|
var dateTwo = new Date(secondDateStr);
|
||||||
var delta = (dateTwo.getTime() - dateOne.getTime()) / 1e3;
|
var delta = (dateTwo.getTime() - dateOne.getTime()) / 1e3;
|
||||||
|
|
||||||
var days = Math.floor(delta % 31536e3 / 86400);
|
var days = Math.floor(delta % 31536e3 / 86400);
|
||||||
var hours = Math.floor(delta % 31536e3 % 86400 / 3600);
|
var hours = Math.floor(delta % 31536e3 % 86400 / 3600);
|
||||||
var minutes = Math.floor(delta % 31536e3 % 86400 % 3600 / 60);
|
var minutes = Math.floor(delta % 31536e3 % 86400 % 3600 / 60);
|
||||||
var seconds = Math.round(delta % 31536e3 % 86400 % 3600 % 60);
|
var seconds = Math.round(delta % 31536e3 % 86400 % 3600 % 60);
|
||||||
|
|
||||||
var elapsed = "";
|
var elapsed = "";
|
||||||
elapsed += 1 == days ? days + " day " : "";
|
elapsed += 1 == days ? days + " day " : "";
|
||||||
elapsed += days > 1 ? days + " days " : "";
|
elapsed += days > 1 ? days + " days " : "";
|
||||||
|
@ -46,15 +61,13 @@ define(["datetime"], function(datetime) {
|
||||||
elapsed += elapsed.length > 0 ? "and " : "";
|
elapsed += elapsed.length > 0 ? "and " : "";
|
||||||
elapsed += 1 == seconds ? seconds + " second" : "";
|
elapsed += 1 == seconds ? seconds + " second" : "";
|
||||||
elapsed += 0 == seconds || seconds > 1 ? seconds + " seconds" : "";
|
elapsed += 0 == seconds || seconds > 1 ? seconds + " seconds" : "";
|
||||||
|
|
||||||
return elapsed;
|
return elapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
window.humaneDate = humaneDate;
|
window.humaneDate = humaneDate;
|
||||||
window.humaneElapsed = humaneElapsed;
|
window.humaneElapsed = humaneElapsed;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
humaneDate: humaneDate,
|
humaneDate: humaneDate,
|
||||||
humaneElapsed: humaneElapsed
|
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";
|
"use strict";
|
||||||
|
|
||||||
function getDefaultImageConfig(itemType, type) {
|
function getDefaultImageConfig(itemType, type) {
|
||||||
|
@ -6,72 +6,107 @@ define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emb
|
||||||
Type: type,
|
Type: type,
|
||||||
MinWidth: 0,
|
MinWidth: 0,
|
||||||
Limit: "Primary" === type ? 1 : 0
|
Limit: "Primary" === type ? 1 : 0
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function findImageOptions(imageOptions, type) {
|
function findImageOptions(imageOptions, type) {
|
||||||
return imageOptions.filter(function(i) {
|
return imageOptions.filter(function (i) {
|
||||||
return i.Type == type
|
return i.Type == type;
|
||||||
})[0]
|
})[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getImageConfig(options, availableOptions, imageType, itemType) {
|
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) {
|
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) {
|
function loadValues(context, itemType, options, availableOptions) {
|
||||||
var supportedImageTypes = availableOptions.SupportedImageTypes || [];
|
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) {
|
setVisibilityOfBackdrops(context.querySelector(".backdropFields"), -1 != supportedImageTypes.indexOf("Backdrop"));
|
||||||
var imageType = i.getAttribute("data-imagetype"),
|
setVisibilityOfBackdrops(context.querySelector(".screenshotFields"), -1 != supportedImageTypes.indexOf("Screenshot"));
|
||||||
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
|
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);
|
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);
|
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) {
|
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 {
|
return {
|
||||||
Type: c.getAttribute("data-imagetype"),
|
Type: c.getAttribute("data-imagetype"),
|
||||||
Limit: c.checked ? 1 : 0,
|
Limit: c.checked ? 1 : 0,
|
||||||
MinWidth: 0
|
MinWidth: 0
|
||||||
}
|
};
|
||||||
}), options.ImageOptions.push({
|
});
|
||||||
|
options.ImageOptions.push({
|
||||||
Type: "Backdrop",
|
Type: "Backdrop",
|
||||||
Limit: context.querySelector("#txtMaxBackdrops").value,
|
Limit: context.querySelector("#txtMaxBackdrops").value,
|
||||||
MinWidth: context.querySelector("#txtMinBackdropDownloadWidth").value
|
MinWidth: context.querySelector("#txtMinBackdropDownloadWidth").value
|
||||||
}), options.ImageOptions.push({
|
});
|
||||||
|
options.ImageOptions.push({
|
||||||
Type: "Screenshot",
|
Type: "Screenshot",
|
||||||
Limit: context.querySelector("#txtMaxScreenshots").value,
|
Limit: context.querySelector("#txtMaxScreenshots").value,
|
||||||
MinWidth: context.querySelector("#txtMinScreenshotDownloadWidth").value
|
MinWidth: context.querySelector("#txtMinScreenshotDownloadWidth").value
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function editor() {
|
function editor() {
|
||||||
this.show = function(itemType, options, availableOptions) {
|
this.show = function (itemType, options, availableOptions) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
var xhr = new XMLHttpRequest;
|
var xhr = new XMLHttpRequest();
|
||||||
xhr.open("GET", "components/imageoptionseditor/imageoptionseditor.template.html", !0), xhr.onload = function(e) {
|
xhr.open("GET", "components/imageoptionseditor/imageoptionseditor.template.html", true);
|
||||||
var template = this.response,
|
|
||||||
dlg = dialogHelper.createDialog({
|
xhr.onload = function (e) {
|
||||||
size: "medium-tall",
|
var template = this.response;
|
||||||
removeOnClose: !0,
|
var dlg = dialogHelper.createDialog({
|
||||||
scrollY: !1
|
size: "medium-tall",
|
||||||
});
|
removeOnClose: true,
|
||||||
dlg.classList.add("formDialog"), dlg.innerHTML = globalize.translateDocument(template), dlg.addEventListener("close", function() {
|
scrollY: false
|
||||||
saveValues(dlg, options)
|
});
|
||||||
}), loadValues(dlg, itemType, options, availableOptions), dialogHelper.open(dlg).then(resolve, resolve), dlg.querySelector(".btnCancel").addEventListener("click", function() {
|
dlg.classList.add("formDialog");
|
||||||
dialogHelper.close(dlg)
|
dlg.innerHTML = globalize.translateDocument(template);
|
||||||
})
|
dlg.addEventListener("close", function () {
|
||||||
}, xhr.send()
|
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) {
|
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';
|
"use strict";
|
||||||
|
|
||||||
var currentItem;
|
var currentItem;
|
||||||
var currentItemType;
|
var currentItemType;
|
||||||
|
@ -20,7 +20,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
};
|
};
|
||||||
|
|
||||||
var i, length;
|
var i, length;
|
||||||
var identifyField = page.querySelectorAll('.identifyField');
|
var identifyField = page.querySelectorAll(".identifyField");
|
||||||
var value;
|
var value;
|
||||||
for (i = 0, length = identifyField.length; i < length; i++) {
|
for (i = 0, length = identifyField.length; i < length; i++) {
|
||||||
|
|
||||||
|
@ -28,17 +28,17 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
|
|
||||||
if (value) {
|
if (value) {
|
||||||
|
|
||||||
if (identifyField[i].type === 'number') {
|
if (identifyField[i].type === "number") {
|
||||||
value = parseInt(value);
|
value = parseInt(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
lookupInfo[identifyField[i].getAttribute('data-lookup')] = value;
|
lookupInfo[identifyField[i].getAttribute("data-lookup")] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var hasId = false;
|
var hasId = false;
|
||||||
|
|
||||||
var txtLookupId = page.querySelectorAll('.txtLookupId');
|
var txtLookupId = page.querySelectorAll(".txtLookupId");
|
||||||
for (i = 0, length = txtLookupId.length; i < length; i++) {
|
for (i = 0, length = txtLookupId.length; i < length; i++) {
|
||||||
|
|
||||||
value = txtLookupId[i].value;
|
value = txtLookupId[i].value;
|
||||||
|
@ -46,12 +46,12 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
if (value) {
|
if (value) {
|
||||||
hasId = true;
|
hasId = true;
|
||||||
}
|
}
|
||||||
lookupInfo.ProviderIds[txtLookupId[i].getAttribute('data-providerkey')] = value;
|
lookupInfo.ProviderIds[txtLookupId[i].getAttribute("data-providerkey")] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasId && !lookupInfo.Name) {
|
if (!hasId && !lookupInfo.Name) {
|
||||||
require(['toast'], function (toast) {
|
require(["toast"], function (toast) {
|
||||||
toast(globalize.translate('PleaseEnterNameOrId'));
|
toast(globalize.translate("PleaseEnterNameOrId"));
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
url: apiClient.getUrl("Items/RemoteSearch/" + currentItemType),
|
url: apiClient.getUrl("Items/RemoteSearch/" + currentItemType),
|
||||||
data: JSON.stringify(lookupInfo),
|
data: JSON.stringify(lookupInfo),
|
||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
dataType: 'json'
|
dataType: "json"
|
||||||
|
|
||||||
}).then(function (results) {
|
}).then(function (results) {
|
||||||
|
|
||||||
|
@ -87,14 +87,14 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
|
|
||||||
function showIdentificationSearchResults(page, results) {
|
function showIdentificationSearchResults(page, results) {
|
||||||
|
|
||||||
var identificationSearchResults = page.querySelector('.identificationSearchResults');
|
var identificationSearchResults = page.querySelector(".identificationSearchResults");
|
||||||
|
|
||||||
page.querySelector('.popupIdentifyForm').classList.add('hide');
|
page.querySelector(".popupIdentifyForm").classList.add("hide");
|
||||||
identificationSearchResults.classList.remove('hide');
|
identificationSearchResults.classList.remove("hide");
|
||||||
page.querySelector('.identifyOptionsForm').classList.add('hide');
|
page.querySelector(".identifyOptionsForm").classList.add("hide");
|
||||||
page.querySelector('.dialogContentInner').classList.remove('dialog-content-centered');
|
page.querySelector(".dialogContentInner").classList.remove("dialog-content-centered");
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
var i, length;
|
var i, length;
|
||||||
for (i = 0, length = results.length; i < length; i++) {
|
for (i = 0, length = results.length; i < length; i++) {
|
||||||
|
|
||||||
|
@ -102,11 +102,11 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
html += getSearchResultHtml(result, i);
|
html += getSearchResultHtml(result, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
var elem = page.querySelector('.identificationSearchResultList');
|
var elem = page.querySelector(".identificationSearchResultList");
|
||||||
elem.innerHTML = html;
|
elem.innerHTML = html;
|
||||||
|
|
||||||
function onSearchImageClick() {
|
function onSearchImageClick() {
|
||||||
var index = parseInt(this.getAttribute('data-index'));
|
var index = parseInt(this.getAttribute("data-index"));
|
||||||
|
|
||||||
var currentResult = results[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++) {
|
for (i = 0, length = searchImages.length; i < length; i++) {
|
||||||
|
|
||||||
searchImages[i].addEventListener('click', onSearchImageClick);
|
searchImages[i].addEventListener("click", onSearchImageClick);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
|
@ -140,13 +140,13 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
|
|
||||||
function showIdentifyOptions(page, identifyResult) {
|
function showIdentifyOptions(page, identifyResult) {
|
||||||
|
|
||||||
var identifyOptionsForm = page.querySelector('.identifyOptionsForm');
|
var identifyOptionsForm = page.querySelector(".identifyOptionsForm");
|
||||||
|
|
||||||
page.querySelector('.popupIdentifyForm').classList.add('hide');
|
page.querySelector(".popupIdentifyForm").classList.add("hide");
|
||||||
page.querySelector('.identificationSearchResults').classList.add('hide');
|
page.querySelector(".identificationSearchResults").classList.add("hide");
|
||||||
identifyOptionsForm.classList.remove('hide');
|
identifyOptionsForm.classList.remove("hide");
|
||||||
page.querySelector('#chkIdentifyReplaceImages').checked = true;
|
page.querySelector("#chkIdentifyReplaceImages").checked = true;
|
||||||
page.querySelector('.dialogContentInner').classList.add('dialog-content-centered');
|
page.querySelector(".dialogContentInner").classList.add("dialog-content-centered");
|
||||||
|
|
||||||
currentSearchResult = identifyResult;
|
currentSearchResult = identifyResult;
|
||||||
|
|
||||||
|
@ -157,47 +157,47 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
lines.push(identifyResult.ProductionYear);
|
lines.push(identifyResult.ProductionYear);
|
||||||
}
|
}
|
||||||
|
|
||||||
var resultHtml = lines.join('<br/>');
|
var resultHtml = lines.join("<br/>");
|
||||||
|
|
||||||
if (identifyResult.ImageUrl) {
|
if (identifyResult.ImageUrl) {
|
||||||
var displayUrl = getSearchImageDisplayUrl(identifyResult.ImageUrl, identifyResult.SearchProviderName);
|
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) {
|
function getSearchResultHtml(result, index) {
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
var cssClass = "card scalableCard";
|
var cssClass = "card scalableCard";
|
||||||
var cardBoxCssClass = 'cardBox';
|
var cardBoxCssClass = "cardBox";
|
||||||
var padderClass;
|
var padderClass;
|
||||||
|
|
||||||
if (currentItemType === "Episode") {
|
if (currentItemType === "Episode") {
|
||||||
cssClass += " backdropCard backdropCard-scalable";
|
cssClass += " backdropCard backdropCard-scalable";
|
||||||
padderClass = 'cardPadder-backdrop';
|
padderClass = "cardPadder-backdrop";
|
||||||
}
|
}
|
||||||
else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") {
|
else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") {
|
||||||
cssClass += " squareCard squareCard-scalable";
|
cssClass += " squareCard squareCard-scalable";
|
||||||
padderClass = 'cardPadder-square';
|
padderClass = "cardPadder-square";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cssClass += " portraitCard portraitCard-scalable";
|
cssClass += " portraitCard portraitCard-scalable";
|
||||||
padderClass = 'cardPadder-portrait';
|
padderClass = "cardPadder-portrait";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layoutManager.tv && !browser.slow) {
|
if (layoutManager.tv && !browser.slow) {
|
||||||
cardBoxCssClass += ' cardBox-focustransform';
|
cardBoxCssClass += " cardBox-focustransform";
|
||||||
}
|
}
|
||||||
|
|
||||||
cardBoxCssClass += ' cardBox-bottompadded';
|
cardBoxCssClass += " cardBox-bottompadded";
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
cardBoxCssClass += ' card-focuscontent cardBox-withfocuscontent';
|
cardBoxCssClass += " card-focuscontent cardBox-withfocuscontent";
|
||||||
}
|
}
|
||||||
|
|
||||||
html += '<button type="button" class="' + cssClass + '" data-index="' + index + '">';
|
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 class="cardImageContainer coveredImage defaultCardBackground defaultCardBackground1"><div class="cardText cardCenteredText">' + result.Name + '</div></div>';
|
||||||
}
|
}
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
|
|
||||||
var numLines = 2;
|
var numLines = 2;
|
||||||
if (currentItemType === "MusicAlbum") {
|
if (currentItemType === "MusicAlbum") {
|
||||||
|
@ -239,12 +239,12 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
} else {
|
} else {
|
||||||
html += '<div class="cardText cardText-secondary cardTextCentered">';
|
html += '<div class="cardText cardText-secondary cardTextCentered">';
|
||||||
}
|
}
|
||||||
html += lines[i] || ' ';
|
html += lines[i] || " ";
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
html += '</button>';
|
html += "</button>";
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
ReplaceAllImages: page.querySelector('#chkIdentifyReplaceImages').checked
|
ReplaceAllImages: page.querySelector("#chkIdentifyReplaceImages").checked
|
||||||
};
|
};
|
||||||
|
|
||||||
var apiClient = getApiClient();
|
var apiClient = getApiClient();
|
||||||
|
@ -291,7 +291,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
|
|
||||||
apiClient.getJSON(apiClient.getUrl("Items/" + item.Id + "/ExternalIdInfos")).then(function (idList) {
|
apiClient.getJSON(apiClient.getUrl("Items/" + item.Id + "/ExternalIdInfos")).then(function (idList) {
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
|
|
||||||
var providerIds = item.ProviderIds || {};
|
var providerIds = item.ProviderIds || {};
|
||||||
|
|
||||||
|
@ -303,30 +303,30 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
|
|
||||||
html += '<div class="inputContainer">';
|
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 += '<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") {
|
if (item.Type === "Person" || item.Type === "BoxSet") {
|
||||||
|
|
||||||
page.querySelector('.fldLookupYear').classList.add('hide');
|
page.querySelector(".fldLookupYear").classList.add("hide");
|
||||||
page.querySelector('#txtLookupYear').value = '';
|
page.querySelector("#txtLookupYear").value = "";
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
page.querySelector('.fldLookupYear').classList.remove('hide');
|
page.querySelector(".fldLookupYear").classList.remove("hide");
|
||||||
page.querySelector('#txtLookupYear').value = '';
|
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();
|
loading.show();
|
||||||
|
|
||||||
require(['text!./itemidentifier.template.html'], function (template) {
|
require(["text!./itemidentifier.template.html"], function (template) {
|
||||||
|
|
||||||
var apiClient = getApiClient();
|
var apiClient = getApiClient();
|
||||||
|
|
||||||
|
@ -344,54 +344,62 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
currentItemType = currentItem.Type;
|
currentItemType = currentItem.Type;
|
||||||
|
|
||||||
var dialogOptions = {
|
var dialogOptions = {
|
||||||
size: 'fullscreen-border',
|
size: "fullscreen-border",
|
||||||
removeOnClose: true,
|
removeOnClose: true,
|
||||||
scrollY: false
|
scrollY: false
|
||||||
};
|
};
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
dialogOptions.size = 'fullscreen';
|
dialogOptions.size = "fullscreen";
|
||||||
}
|
}
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
|
|
||||||
dlg.classList.add('formDialog');
|
dlg.classList.add("formDialog");
|
||||||
dlg.classList.add('recordingDialog');
|
dlg.classList.add("recordingDialog");
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
html += globalize.translateDocument(template, 'core');
|
html += globalize.translateDocument(template, "core");
|
||||||
|
|
||||||
dlg.innerHTML = html;
|
dlg.innerHTML = html;
|
||||||
|
|
||||||
// Has to be assigned a z-index after the call to .open()
|
// Has to be assigned a z-index after the call to .open()
|
||||||
dlg.addEventListener('close', onDialogClosed);
|
dlg.addEventListener("close", onDialogClosed);
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
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);
|
dialogHelper.open(dlg);
|
||||||
|
|
||||||
dlg.querySelector('.popupIdentifyForm').addEventListener('submit', function (e) {
|
dlg.querySelector(".popupIdentifyForm").addEventListener("submit", function (e) {
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
searchForIdentificationResults(dlg);
|
searchForIdentificationResults(dlg);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.querySelector('.identifyOptionsForm').addEventListener('submit', function (e) {
|
dlg.querySelector(".identifyOptionsForm").addEventListener("submit", function (e) {
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
submitIdentficationResult(dlg);
|
submitIdentficationResult(dlg);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.querySelector('.btnCancel').addEventListener('click', function (e) {
|
dlg.querySelector(".btnCancel").addEventListener("click", function (e) {
|
||||||
|
|
||||||
dialogHelper.close(dlg);
|
dialogHelper.close(dlg);
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.classList.add('identifyDialog');
|
dlg.classList.add("identifyDialog");
|
||||||
|
|
||||||
showIdentificationForm(dlg, item);
|
showIdentificationForm(dlg, item);
|
||||||
loading.hide();
|
loading.hide();
|
||||||
|
@ -414,47 +422,49 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
currentItem = null;
|
currentItem = null;
|
||||||
currentItemType = itemType;
|
currentItemType = itemType;
|
||||||
|
|
||||||
require(['text!./itemidentifier.template.html'], function (template) {
|
require(["text!./itemidentifier.template.html"], function (template) {
|
||||||
|
|
||||||
var dialogOptions = {
|
var dialogOptions = {
|
||||||
size: 'fullscreen-border',
|
size: "fullscreen-border",
|
||||||
removeOnClose: true,
|
removeOnClose: true,
|
||||||
scrollY: false
|
scrollY: false
|
||||||
};
|
};
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
dialogOptions.size = 'fullscreen';
|
dialogOptions.size = "fullscreen";
|
||||||
}
|
}
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
|
|
||||||
dlg.classList.add('formDialog');
|
dlg.classList.add("formDialog");
|
||||||
dlg.classList.add('recordingDialog');
|
dlg.classList.add("recordingDialog");
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
html += globalize.translateDocument(template, 'core');
|
html += globalize.translateDocument(template, "core");
|
||||||
|
|
||||||
dlg.innerHTML = html;
|
dlg.innerHTML = html;
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dialogHelper.open(dlg);
|
dialogHelper.open(dlg);
|
||||||
|
|
||||||
dlg.querySelector('.btnCancel').addEventListener('click', function (e) {
|
dlg.querySelector(".btnCancel").addEventListener("click", function (e) {
|
||||||
|
|
||||||
dialogHelper.close(dlg);
|
dialogHelper.close(dlg);
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.querySelector('.popupIdentifyForm').addEventListener('submit', function (e) {
|
dlg.querySelector(".popupIdentifyForm").addEventListener("submit", function (e) {
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
searchForIdentificationResults(dlg);
|
searchForIdentificationResults(dlg);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.addEventListener('close', function () {
|
dlg.addEventListener("close", function () {
|
||||||
|
|
||||||
loading.hide();
|
loading.hide();
|
||||||
var foundItem = hasChanges ? currentSearchResult : null;
|
var foundItem = hasChanges ? currentSearchResult : null;
|
||||||
|
@ -462,7 +472,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
resolveFunc(foundItem);
|
resolveFunc(foundItem);
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.classList.add('identifyDialog');
|
dlg.classList.add("identifyDialog");
|
||||||
|
|
||||||
showIdentificationFormFindNew(dlg, itemName, itemYear, itemType);
|
showIdentificationFormFindNew(dlg, itemName, itemYear, itemType);
|
||||||
});
|
});
|
||||||
|
@ -470,20 +480,20 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
||||||
|
|
||||||
function showIdentificationFormFindNew(dlg, itemName, itemYear, itemType) {
|
function showIdentificationFormFindNew(dlg, itemName, itemYear, itemType) {
|
||||||
|
|
||||||
dlg.querySelector('#txtLookupName').value = itemName;
|
dlg.querySelector("#txtLookupName").value = itemName;
|
||||||
|
|
||||||
if (itemType === "Person" || itemType === "BoxSet") {
|
if (itemType === "Person" || itemType === "BoxSet") {
|
||||||
|
|
||||||
dlg.querySelector('.fldLookupYear').classList.add('hide');
|
dlg.querySelector(".fldLookupYear").classList.add("hide");
|
||||||
dlg.querySelector('#txtLookupYear').value = '';
|
dlg.querySelector("#txtLookupYear").value = "";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
dlg.querySelector('.fldLookupYear').classList.remove('hide');
|
dlg.querySelector(".fldLookupYear").classList.remove("hide");
|
||||||
dlg.querySelector('#txtLookupYear').value = itemYear;
|
dlg.querySelector("#txtLookupYear").value = itemYear;
|
||||||
}
|
}
|
||||||
|
|
||||||
dlg.querySelector('.formDialogHeaderTitle').innerHTML = globalize.translate('Search');
|
dlg.querySelector(".formDialogHeaderTitle").innerHTML = globalize.translate("Search");
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<div class="formDialogHeader">
|
<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">
|
<h3 class="formDialogHeaderTitle">
|
||||||
${Identify}
|
${Identify}
|
||||||
</h3>
|
</h3>
|
||||||
|
@ -10,11 +12,17 @@
|
||||||
<form class="popupIdentifyForm" style="margin:auto;">
|
<form class="popupIdentifyForm" style="margin:auto;">
|
||||||
|
|
||||||
<p>${HeaderIdentifyItemHelp}</p>
|
<p>${HeaderIdentifyItemHelp}</p>
|
||||||
|
<div class="padded-bottom fldPath hide">
|
||||||
|
<div>${LabelPath}</div>
|
||||||
|
<div class="txtPath fieldDescription"></div>
|
||||||
|
</div>
|
||||||
<div class="inputContainer">
|
<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>
|
||||||
<div class="fldLookupYear inputContainer">
|
<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>
|
||||||
|
|
||||||
<div class="identifyProviderIds">
|
<div class="identifyProviderIds">
|
||||||
|
@ -43,10 +51,11 @@
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div class="formDialogFooter">
|
<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>
|
<span>${ButtonOk}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1667,7 +1667,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
||||||
|
|
||||||
self.getPlayerSubtitleOffset = function(player) {
|
self.getPlayerSubtitleOffset = function(player) {
|
||||||
player = player || self._currentPlayer;
|
player = player || self._currentPlayer;
|
||||||
if (player.getPlayerSubtitleOffset) {
|
if (player.getSubtitleOffset) {
|
||||||
return 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";
|
"use strict";
|
||||||
|
|
||||||
function getEditorHtml() {
|
function getEditorHtml() {
|
||||||
var html = "";
|
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) {
|
function getDeviceHtml(device) {
|
||||||
var padderClass, html = "",
|
var padderClass;
|
||||||
cssClass = "card scalableCard",
|
var html = "";
|
||||||
cardBoxCssClass = "cardBox visualCardBox";
|
var cssClass = "card scalableCard";
|
||||||
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 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) {
|
function getTunerName(providerId) {
|
||||||
switch (providerId = providerId.toLowerCase()) {
|
switch (providerId = providerId.toLowerCase()) {
|
||||||
case "m3u":
|
case "m3u":
|
||||||
return "M3U";
|
return "M3U";
|
||||||
|
|
||||||
case "hdhomerun":
|
case "hdhomerun":
|
||||||
return "HDHomerun";
|
return "HDHomerun";
|
||||||
|
|
||||||
case "hauppauge":
|
case "hauppauge":
|
||||||
return "Hauppauge";
|
return "Hauppauge";
|
||||||
|
|
||||||
case "satip":
|
case "satip":
|
||||||
return "DVB";
|
return "DVB";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return "Unknown"
|
return "Unknown";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderDevices(view, devices) {
|
function renderDevices(view, devices) {
|
||||||
var i, length, html = "";
|
var i;
|
||||||
for (i = 0, length = devices.length; i < length; i++) html += getDeviceHtml(devices[i]);
|
var length;
|
||||||
devices.length ? view.querySelector(".devicesHeader").classList.remove("hide") : (html = "<p><br/>" + globalize.translate("NoNewDevicesFound") + "</p>", view.querySelector(".devicesHeader").classList.add("hide"));
|
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");
|
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) {
|
function discoverDevices(view, apiClient) {
|
||||||
return loading.show(), view.querySelector(".loadingContent").classList.remove("hide"), ApiClient.getJSON(ApiClient.getUrl("LiveTv/Tuners/Discvover", {
|
loading.show();
|
||||||
NewDevicesOnly: !0
|
view.querySelector(".loadingContent").classList.remove("hide");
|
||||||
})).then(function(devices) {
|
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/Tuners/Discvover", {
|
||||||
currentDevices = devices, renderDevices(view, devices), view.querySelector(".loadingContent").classList.add("hide"), loading.hide()
|
NewDevicesOnly: true
|
||||||
})
|
})).then(function (devices) {
|
||||||
|
currentDevices = devices;
|
||||||
|
renderDevices(view, devices);
|
||||||
|
view.querySelector(".loadingContent").classList.add("hide");
|
||||||
|
loading.hide();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function tunerPicker() {
|
function tunerPicker() {
|
||||||
this.show = function(options) {
|
this.show = function (options) {
|
||||||
var dialogOptions = {
|
var dialogOptions = {
|
||||||
removeOnClose: !0,
|
removeOnClose: true,
|
||||||
scrollY: !1
|
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);
|
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
dlg.classList.add("formDialog");
|
dlg.classList.add("formDialog");
|
||||||
var html = "";
|
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() {
|
html += '<div class="formDialogHeader">';
|
||||||
dialogHelper.close(dlg)
|
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;
|
var deviceResult;
|
||||||
dlg.querySelector(".results").addEventListener("click", function(e) {
|
dlg.querySelector(".results").addEventListener("click", function (e) {
|
||||||
var tunerCard = dom.parentWithClass(e.target, "card");
|
var tunerCard = dom.parentWithClass(e.target, "card");
|
||||||
|
|
||||||
if (tunerCard) {
|
if (tunerCard) {
|
||||||
var deviceId = tunerCard.getAttribute("data-id");
|
var deviceId = tunerCard.getAttribute("data-id");
|
||||||
deviceResult = currentDevices.filter(function(d) {
|
deviceResult = currentDevices.filter(function (d) {
|
||||||
return d.DeviceId === deviceId
|
return d.DeviceId === deviceId;
|
||||||
})[0], dialogHelper.close(dlg)
|
})[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);
|
var apiClient = connectionManager.getApiClient(options.serverId);
|
||||||
return discoverDevices(dlg, apiClient), layoutManager.tv && centerFocus(dlg.querySelector(".formDialogContent"), !1, !1), dialogHelper.open(dlg).then(function() {
|
discoverDevices(dlg, apiClient);
|
||||||
return deviceResult ? Promise.resolve(deviceResult) : Promise.reject()
|
|
||||||
})
|
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 = [];
|
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";
|
"use strict";
|
||||||
return function(page, providerId, options) {
|
|
||||||
|
return function (page, providerId, options) {
|
||||||
function reload() {
|
function reload() {
|
||||||
loading.show(), ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
loading.show();
|
||||||
var info = config.ListingProviders.filter(function(i) {
|
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||||
return i.Id === providerId
|
var info = config.ListingProviders.filter(function (i) {
|
||||||
|
return i.Id === providerId;
|
||||||
})[0] || {};
|
})[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) {
|
function setCountry(info) {
|
||||||
ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/SchedulesDirect/Countries")).then(function(result) {
|
ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/SchedulesDirect/Countries")).then(function (result) {
|
||||||
var i, length, countryList = [];
|
var i;
|
||||||
|
var length;
|
||||||
|
var countryList = [];
|
||||||
|
|
||||||
for (var region in result) {
|
for (var region in result) {
|
||||||
var countries = result[region];
|
var countries = result[region];
|
||||||
if (countries.length && "ZZZ" !== region)
|
|
||||||
for (i = 0, length = countries.length; i < length; i++) countryList.push({
|
if (countries.length && "ZZZ" !== region) {
|
||||||
name: countries[i].fullName,
|
for (i = 0, length = countries.length; i < length; i++) {
|
||||||
value: countries[i].shortName
|
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
|
countryList.sort(function (a, b) {
|
||||||
}), $("#selectCountry", page).html(countryList.map(function(c) {
|
if (a.name > b.name) {
|
||||||
return '<option value="' + c.value + '">' + c.name + "</option>"
|
return 1;
|
||||||
}).join("")).val(info.Country || ""), $(page.querySelector(".txtZipCode")).trigger("change")
|
}
|
||||||
}, function() {
|
|
||||||
|
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({
|
Dashboard.alert({
|
||||||
message: Globalize.translate("ErrorGettingTvLineups")
|
message: Globalize.translate("ErrorGettingTvLineups")
|
||||||
})
|
});
|
||||||
}), loading.hide()
|
});
|
||||||
|
loading.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
function sha256(str) {
|
function sha256(str) {
|
||||||
if (!self.TextEncoder) return Promise.resolve("");
|
if (!self.TextEncoder) {
|
||||||
|
return Promise.resolve("");
|
||||||
|
}
|
||||||
|
|
||||||
var buffer = new TextEncoder("utf-8").encode(str);
|
var buffer = new TextEncoder("utf-8").encode(str);
|
||||||
return crypto.subtle.digest("SHA-256", buffer).then(function(hash) {
|
return crypto.subtle.digest("SHA-256", buffer).then(function (hash) {
|
||||||
return hex(hash)
|
return hex(hash);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function hex(buffer) {
|
function hex(buffer) {
|
||||||
for (var hexCodes = [], view = new DataView(buffer), i = 0; i < view.byteLength; i += 4) {
|
var hexCodes = [];
|
||||||
var value = view.getUint32(i),
|
var view = new DataView(buffer);
|
||||||
stringValue = value.toString(16),
|
|
||||||
paddedValue = ("00000000" + stringValue).slice(-"00000000".length);
|
for (var i = 0; i < view.byteLength; i += 4) {
|
||||||
hexCodes.push(paddedValue)
|
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() {
|
function submitLoginForm() {
|
||||||
loading.show(), sha256(page.querySelector(".txtPass").value).then(function(passwordHash) {
|
loading.show();
|
||||||
|
sha256(page.querySelector(".txtPass").value).then(function (passwordHash) {
|
||||||
var info = {
|
var info = {
|
||||||
Type: "SchedulesDirect",
|
Type: "SchedulesDirect",
|
||||||
Username: page.querySelector(".txtUser").value,
|
Username: page.querySelector(".txtUser").value,
|
||||||
EnableAllTuners: !0,
|
EnableAllTuners: true,
|
||||||
Password: passwordHash,
|
Password: passwordHash,
|
||||||
Pw: page.querySelector(".txtPass").value
|
Pw: page.querySelector(".txtPass").value
|
||||||
},
|
};
|
||||||
id = providerId;
|
var id = providerId;
|
||||||
id && (info.Id = id), ApiClient.ajax({
|
|
||||||
|
if (id) {
|
||||||
|
info.Id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApiClient.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
||||||
ValidateLogin: !0
|
ValidateLogin: true
|
||||||
}),
|
}),
|
||||||
data: JSON.stringify(info),
|
data: JSON.stringify(info),
|
||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
dataType: "json"
|
dataType: "json"
|
||||||
}).then(function(result) {
|
}).then(function (result) {
|
||||||
Dashboard.processServerConfigurationUpdateResult(), providerId = result.Id, reload()
|
Dashboard.processServerConfigurationUpdateResult();
|
||||||
}, function() {
|
providerId = result.Id;
|
||||||
Dashboard.alert({
|
reload();
|
||||||
|
}, function () {
|
||||||
|
Dashboard.alert({ // ApiClient.ajax() error handler
|
||||||
message: Globalize.translate("ErrorSavingTvProvider")
|
message: Globalize.translate("ErrorSavingTvProvider")
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function submitListingsForm() {
|
function submitListingsForm() {
|
||||||
var selectedListingsId = $("#selectListing", page).val();
|
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();
|
loading.show();
|
||||||
var id = providerId;
|
var id = providerId;
|
||||||
ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||||
var info = config.ListingProviders.filter(function(i) {
|
var info = config.ListingProviders.filter(function (i) {
|
||||||
return i.Id === id
|
return i.Id === id;
|
||||||
})[0];
|
})[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) {
|
info.ZipCode = page.querySelector(".txtZipCode").value;
|
||||||
return i.checked
|
info.Country = $("#selectCountry", page).val();
|
||||||
}).map(function(i) {
|
info.ListingsId = selectedListingsId;
|
||||||
return i.getAttribute("data-id")
|
info.EnableAllTuners = page.querySelector(".chkAllTuners").checked;
|
||||||
}), ApiClient.ajax({
|
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",
|
type: "POST",
|
||||||
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
||||||
ValidateListings: !0
|
ValidateListings: true
|
||||||
}),
|
}),
|
||||||
data: JSON.stringify(info),
|
data: JSON.stringify(info),
|
||||||
contentType: "application/json"
|
contentType: "application/json"
|
||||||
}).then(function(result) {
|
}).then(function (result) {
|
||||||
loading.hide(), !1 !== options.showConfirmation && Dashboard.processServerConfigurationUpdateResult(), Events.trigger(self, "submitted")
|
loading.hide();
|
||||||
}, function() {
|
|
||||||
loading.hide(), Dashboard.alert({
|
if (options.showConfirmation) {
|
||||||
|
Dashboard.processServerConfigurationUpdateResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
Events.trigger(self, "submitted");
|
||||||
|
}, function () {
|
||||||
|
loading.hide();
|
||||||
|
Dashboard.alert({
|
||||||
message: Globalize.translate("ErrorAddingListingsToSchedulesDirect")
|
message: Globalize.translate("ErrorAddingListingsToSchedulesDirect")
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshListings(value) {
|
function refreshListings(value) {
|
||||||
if (!value) return void $("#selectListing", page).html("");
|
if (!value) {
|
||||||
loading.show(), ApiClient.ajax({
|
return void $("#selectListing", page).html("");
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.show();
|
||||||
|
ApiClient.ajax({
|
||||||
type: "GET",
|
type: "GET",
|
||||||
url: ApiClient.getUrl("LiveTv/ListingProviders/Lineups", {
|
url: ApiClient.getUrl("LiveTv/ListingProviders/Lineups", {
|
||||||
Id: providerId,
|
Id: providerId,
|
||||||
|
@ -121,15 +198,23 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
|
||||||
Country: $("#selectCountry", page).val()
|
Country: $("#selectCountry", page).val()
|
||||||
}),
|
}),
|
||||||
dataType: "json"
|
dataType: "json"
|
||||||
}).then(function(result) {
|
}).then(function (result) {
|
||||||
$("#selectListing", page).html(result.map(function(o) {
|
$("#selectListing", page).html(result.map(function (o) {
|
||||||
return '<option value="' + o.Id + '">' + o.Name + "</option>"
|
return '<option value="' + o.Id + '">' + o.Name + "</option>";
|
||||||
})), listingsId && $("#selectListing", page).val(listingsId), loading.hide()
|
}));
|
||||||
}, function(result) {
|
|
||||||
|
if (listingsId) {
|
||||||
|
$("#selectListing", page).val(listingsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.hide();
|
||||||
|
}, function (result) {
|
||||||
Dashboard.alert({
|
Dashboard.alert({
|
||||||
message: Globalize.translate("ErrorGettingTvLineups")
|
message: Globalize.translate("ErrorGettingTvLineups")
|
||||||
}), refreshListings(""), loading.hide()
|
});
|
||||||
})
|
refreshListings("");
|
||||||
|
loading.hide();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTunerName(providerId) {
|
function getTunerName(providerId) {
|
||||||
|
@ -141,34 +226,76 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
|
||||||
case "satip":
|
case "satip":
|
||||||
return "DVB";
|
return "DVB";
|
||||||
default:
|
default:
|
||||||
return "Unknown"
|
return "Unknown";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshTunerDevices(page, providerInfo, devices) {
|
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];
|
var device = devices[i];
|
||||||
html += '<div class="listItem">';
|
html += '<div class="listItem">';
|
||||||
var enabledTuners = providerInfo.EnabledTuners || [],
|
var enabledTuners = providerInfo.EnabledTuners || [];
|
||||||
isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id),
|
var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id);
|
||||||
checkedAttribute = isChecked ? " checked" : "";
|
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>"
|
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() {
|
var listingsId;
|
||||||
page.querySelector(".btnSubmitListingsContainer").click()
|
var self = this;
|
||||||
}, 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() {
|
self.submit = function () {
|
||||||
return submitLoginForm(), !1
|
page.querySelector(".btnSubmitListingsContainer").click();
|
||||||
}), $(".formListings", page).on("submit", function() {
|
};
|
||||||
return submitListingsForm(), !1
|
|
||||||
}), $(".txtZipCode", page).on("change", function() {
|
self.init = function () {
|
||||||
refreshListings(this.value)
|
options = options || {};
|
||||||
}), page.querySelector(".chkAllTuners").addEventListener("change", function(e) {
|
|
||||||
e.target.checked ? page.querySelector(".selectTunersSection").classList.add("hide") : page.querySelector(".selectTunersSection").classList.remove("hide")
|
if (options.showCancelButton) {
|
||||||
}), $(".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()
|
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";
|
"use strict";
|
||||||
|
|
||||||
return function (page, providerId, options) {
|
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.NewsCategories = getCategories(page.querySelector(".txtNews"));
|
||||||
info.SportsCategories = getCategories(page.querySelector(".txtSports"));
|
info.SportsCategories = getCategories(page.querySelector(".txtSports"));
|
||||||
info.EnableAllTuners = page.querySelector(".chkAllTuners").checked;
|
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;
|
return tuner.checked;
|
||||||
}).map(function (tuner) {
|
}).map(function (tuner) {
|
||||||
return tuner.getAttribute("data-id");
|
return tuner.getAttribute("data-id");
|
||||||
|
@ -135,8 +135,8 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa
|
||||||
page.querySelector(".tunerList").innerHTML = html;
|
page.querySelector(".tunerList").innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSelectPathClick(e__u) {
|
function onSelectPathClick(e) {
|
||||||
var page = $__q(e__u.target).parents(".xmltvForm")[0];
|
var page = $(e.target).parents(".xmltvForm")[0];
|
||||||
|
|
||||||
require(["directorybrowser"], function (directoryBrowser) {
|
require(["directorybrowser"], function (directoryBrowser) {
|
||||||
var picker = new directoryBrowser();
|
var picker = new directoryBrowser();
|
||||||
|
@ -175,7 +175,7 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa
|
||||||
page.querySelector(".btnSubmitListings").classList.add("hide");
|
page.querySelector(".btnSubmitListings").classList.add("hide");
|
||||||
}
|
}
|
||||||
|
|
||||||
$__q("form", page).on("submit", function () {
|
$("form", page).on("submit", function () {
|
||||||
submitListingsForm();
|
submitListingsForm();
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,22 +1,18 @@
|
||||||
define(["loading"], function(loading) {
|
define(["loading"], function (loading) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function onFinish() {
|
function onFinish() {
|
||||||
loading.show(), ApiClient.ajax({
|
loading.show();
|
||||||
|
ApiClient.ajax({
|
||||||
url: ApiClient.getUrl("Startup/Complete"),
|
url: ApiClient.getUrl("Startup/Complete"),
|
||||||
type: "POST"
|
type: "POST"
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
Dashboard.navigate("dashboard.html");
|
|
||||||
loading.hide();
|
loading.hide();
|
||||||
|
window.location.href = "index.html";
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return function(view, params) {
|
|
||||||
|
return function (view, params) {
|
||||||
view.querySelector(".btnWizardNext").addEventListener("click", onFinish);
|
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";
|
"use strict";
|
||||||
|
|
||||||
function save(page) {
|
function save(page) {
|
||||||
loading.show();
|
loading.show();
|
||||||
var apiClient = ApiClient,
|
var apiClient = ApiClient;
|
||||||
config = {};
|
var config = {};
|
||||||
config.EnableRemoteAccess = page.querySelector("#chkRemoteAccess").checked, config.EnableAutomaticPortMapping = page.querySelector("#chkEnableUpnp").checked, apiClient.ajax({
|
config.EnableRemoteAccess = page.querySelector("#chkRemoteAccess").checked;
|
||||||
|
config.EnableAutomaticPortMapping = page.querySelector("#chkEnableUpnp").checked;
|
||||||
|
apiClient.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
data: config,
|
data: config,
|
||||||
url: apiClient.getUrl("Startup/RemoteAccess")
|
url: apiClient.getUrl("Startup/RemoteAccess")
|
||||||
}).then(function() {
|
}).then(function () {
|
||||||
loading.hide(), navigateToNextPage()
|
loading.hide();
|
||||||
})
|
navigateToNextPage();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function navigateToNextPage() {
|
function navigateToNextPage() {
|
||||||
Dashboard.navigate("wizardfinish.html")
|
Dashboard.navigate("wizardfinish.html");
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSubmit(e) {
|
function onSubmit(e) {
|
||||||
return save(this), e.preventDefault(), !1
|
save(this);
|
||||||
}
|
e.preventDefault();
|
||||||
return function(view, params) {
|
return false;
|
||||||
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")
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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";
|
"use strict";
|
||||||
|
|
||||||
function save(page) {
|
function save(page) {
|
||||||
loading.show();
|
loading.show();
|
||||||
var apiClient = ApiClient;
|
var apiClient = ApiClient;
|
||||||
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config) {
|
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function (config) {
|
||||||
config.PreferredMetadataLanguage = page.querySelector("#selectLanguage").value, config.MetadataCountryCode = page.querySelector("#selectCountry").value, apiClient.ajax({
|
config.PreferredMetadataLanguage = page.querySelector("#selectLanguage").value;
|
||||||
|
config.MetadataCountryCode = page.querySelector("#selectCountry").value;
|
||||||
|
apiClient.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
data: config,
|
data: config,
|
||||||
url: apiClient.getUrl("Startup/Configuration")
|
url: apiClient.getUrl("Startup/Configuration")
|
||||||
}).then(function() {
|
}).then(function () {
|
||||||
loading.hide(), navigateToNextPage()
|
loading.hide();
|
||||||
})
|
navigateToNextPage();
|
||||||
})
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function populateLanguages(select, languages) {
|
function populateLanguages(select, languages) {
|
||||||
var html = "";
|
var html = "";
|
||||||
html += "<option value=''></option>";
|
html += "<option value=''></option>";
|
||||||
|
|
||||||
for (var i = 0, length = languages.length; i < length; i++) {
|
for (var i = 0, length = languages.length; i < length; i++) {
|
||||||
var culture = languages[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) {
|
function populateCountries(select, allCountries) {
|
||||||
var html = "";
|
var html = "";
|
||||||
html += "<option value=''></option>";
|
html += "<option value=''></option>";
|
||||||
|
|
||||||
for (var i = 0, length = allCountries.length; i < length; i++) {
|
for (var i = 0, length = allCountries.length; i < length; i++) {
|
||||||
var culture = allCountries[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) {
|
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) {
|
function reload(page) {
|
||||||
loading.show();
|
loading.show();
|
||||||
var apiClient = ApiClient,
|
var apiClient = ApiClient;
|
||||||
promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration")),
|
var promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration"));
|
||||||
promise2 = apiClient.getCultures(),
|
var promise2 = apiClient.getCultures();
|
||||||
promise3 = apiClient.getCountries();
|
var promise3 = apiClient.getCountries();
|
||||||
Promise.all([promise1, promise2, promise3]).then(function(responses) {
|
Promise.all([promise1, promise2, promise3]).then(function (responses) {
|
||||||
reloadData(page, responses[0], responses[1], responses[2])
|
reloadData(page, responses[0], responses[1], responses[2]);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function navigateToNextPage() {
|
function navigateToNextPage() {
|
||||||
Dashboard.navigate("wizardremoteaccess.html")
|
Dashboard.navigate("wizardremoteaccess.html");
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSubmit(e) {
|
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() {
|
return function (view, params) {
|
||||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"), reload(this)
|
view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit);
|
||||||
}), view.addEventListener("viewhide", function() {
|
view.addEventListener("viewshow", function () {
|
||||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
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";
|
"use strict";
|
||||||
|
|
||||||
function loadPage(page, config, languageOptions) {
|
function loadPage(page, config, languageOptions) {
|
||||||
$("#selectLocalizationLanguage", page).html(languageOptions.map(function(l) {
|
$("#selectLocalizationLanguage", page).html(languageOptions.map(function (l) {
|
||||||
return '<option value="' + l.Value + '">' + l.Name + "</option>"
|
return '<option value="' + l.Value + '">' + l.Name + "</option>";
|
||||||
})).val(config.UICulture), loading.hide()
|
})).val(config.UICulture);
|
||||||
|
loading.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
function save(page) {
|
function save(page) {
|
||||||
loading.show();
|
loading.show();
|
||||||
var apiClient = ApiClient;
|
var apiClient = ApiClient;
|
||||||
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config) {
|
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function (config) {
|
||||||
config.UICulture = $("#selectLocalizationLanguage", page).val(), apiClient.ajax({
|
config.UICulture = $("#selectLocalizationLanguage", page).val();
|
||||||
|
apiClient.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
data: config,
|
data: config,
|
||||||
url: apiClient.getUrl("Startup/Configuration")
|
url: apiClient.getUrl("Startup/Configuration")
|
||||||
}).then(function() {
|
}).then(function () {
|
||||||
Dashboard.navigate("wizarduser.html")
|
Dashboard.navigate("wizarduser.html");
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSubmit() {
|
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() {
|
return function (view, params) {
|
||||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"), loading.show();
|
$(".wizardStartForm", view).on("submit", onSubmit);
|
||||||
var page = this,
|
view.addEventListener("viewshow", function () {
|
||||||
apiClient = ApiClient,
|
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
|
||||||
promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration")),
|
loading.show();
|
||||||
promise2 = apiClient.getJSON(apiClient.getUrl("Localization/Options"));
|
var page = this;
|
||||||
Promise.all([promise1, promise2]).then(function(responses) {
|
var apiClient = ApiClient;
|
||||||
loadPage(page, responses[0], responses[1])
|
var promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration"));
|
||||||
})
|
var promise2 = apiClient.getJSON(apiClient.getUrl("Localization/Options"));
|
||||||
}), view.addEventListener("viewhide", function() {
|
Promise.all([promise1, promise2]).then(function (responses) {
|
||||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
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";
|
"use strict";
|
||||||
|
|
||||||
function getApiClient() {
|
function getApiClient() {
|
||||||
|
@ -30,13 +30,15 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em
|
||||||
|
|
||||||
function onSubmit(e) {
|
function onSubmit(e) {
|
||||||
var form = this;
|
var form = this;
|
||||||
|
|
||||||
if (form.querySelector("#txtManualPassword").value != form.querySelector("#txtPasswordConfirm").value) {
|
if (form.querySelector("#txtManualPassword").value != form.querySelector("#txtPasswordConfirm").value) {
|
||||||
require(["toast"], function(toast) {
|
require(["toast"], function (toast) {
|
||||||
toast(Globalize.translate("PasswordMatchError"));
|
toast(Globalize.translate("PasswordMatchError"));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
submit(form);
|
submit(form);
|
||||||
}
|
}
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -45,20 +47,21 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em
|
||||||
loading.show();
|
loading.show();
|
||||||
var page = this;
|
var page = this;
|
||||||
var apiClient = getApiClient();
|
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("#txtUsername").value = user.Name || "";
|
||||||
page.querySelector("#txtManualPassword").value = user.Password || "";
|
page.querySelector("#txtManualPassword").value = user.Password || "";
|
||||||
loading.hide();
|
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);
|
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";
|
"use strict";
|
||||||
|
|
||||||
function enabled() {
|
function enabled() {
|
||||||
return userSettings.enableBackdrops()
|
return userSettings.enableBackdrops();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBackdropItemIds(apiClient, userId, types, parentId) {
|
function getBackdropItemIds(apiClient, userId, types, parentId) {
|
||||||
var key = "backdrops2_" + userId + (types || "") + (parentId || ""),
|
var key = "backdrops2_" + userId + (types || "") + (parentId || "");
|
||||||
data = cache[key];
|
var data = cache[key];
|
||||||
if (data) return console.log("Found backdrop id list in cache. Key: " + key), data = JSON.parse(data), Promise.resolve(data);
|
|
||||||
|
if (data) {
|
||||||
|
console.log("Found backdrop id list in cache. Key: " + key);
|
||||||
|
data = JSON.parse(data);
|
||||||
|
return Promise.resolve(data);
|
||||||
|
}
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
SortBy: "IsFavoriteOrLiked,Random",
|
SortBy: "IsFavoriteOrLiked,Random",
|
||||||
Limit: 20,
|
Limit: 20,
|
||||||
Recursive: !0,
|
Recursive: true,
|
||||||
IncludeItemTypes: types,
|
IncludeItemTypes: types,
|
||||||
ImageTypes: "Backdrop",
|
ImageTypes: "Backdrop",
|
||||||
ParentId: parentId,
|
ParentId: parentId,
|
||||||
EnableTotalRecordCount: !1
|
EnableTotalRecordCount: false
|
||||||
};
|
};
|
||||||
return apiClient.getItems(apiClient.getCurrentUserId(), options).then(function(result) {
|
return apiClient.getItems(apiClient.getCurrentUserId(), options).then(function (result) {
|
||||||
var images = result.Items.map(function(i) {
|
var images = result.Items.map(function (i) {
|
||||||
return {
|
return {
|
||||||
Id: i.Id,
|
Id: i.Id,
|
||||||
tag: i.BackdropImageTags[0],
|
tag: i.BackdropImageTags[0],
|
||||||
ServerId: i.ServerId
|
ServerId: i.ServerId
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
return cache[key] = JSON.stringify(images), images
|
cache[key] = JSON.stringify(images);
|
||||||
})
|
return images;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function showBackdrop(type, parentId) {
|
function showBackdrop(type, parentId) {
|
||||||
var apiClient = window.ApiClient;
|
var apiClient = window.ApiClient;
|
||||||
apiClient && getBackdropItemIds(apiClient, apiClient.getCurrentUserId(), type, parentId).then(function(images) {
|
|
||||||
images.length ? backdrop.setBackdrops(images.map(function(i) {
|
if (apiClient) {
|
||||||
return i.BackdropImageTags = [i.tag], i
|
getBackdropItemIds(apiClient, apiClient.getCurrentUserId(), type, parentId).then(function (images) {
|
||||||
})) : backdrop.clear()
|
if (images.length) {
|
||||||
})
|
backdrop.setBackdrops(images.map(function (i) {
|
||||||
|
i.BackdropImageTags = [i.tag];
|
||||||
|
return i;
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
backdrop.clear();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var cache = {};
|
var cache = {};
|
||||||
pageClassOn("pageshow", "page", function() {
|
pageClassOn("pageshow", "page", function () {
|
||||||
var page = this;
|
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()) {
|
if (enabled()) {
|
||||||
var type = page.getAttribute("data-backdroptype"),
|
var type = page.getAttribute("data-backdroptype");
|
||||||
parentId = page.classList.contains("globalBackdropPage") ? "" : libraryMenu.getTopParentId();
|
var parentId = page.classList.contains("globalBackdropPage") ? "" : libraryMenu.getTopParentId();
|
||||||
showBackdrop(type, parentId)
|
showBackdrop(type, parentId);
|
||||||
} else page.classList.remove("backdropPage"), backdrop.clear();
|
} else {
|
||||||
else backdrop.clear()
|
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({
|
ApiClient.getLiveTvChannels({
|
||||||
|
ServiceName: service,
|
||||||
AddCurrentProgram: false
|
AddCurrentProgram: false
|
||||||
}).then(function (result) {
|
}).then(function (result) {
|
||||||
var nodes = result.Items.map(function (i) {
|
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";
|
"use strict";
|
||||||
|
|
||||||
function renderItems(page, item) {
|
function renderItems(page, item) {
|
||||||
var sections = [];
|
var sections = [];
|
||||||
item.ArtistCount && sections.push({
|
|
||||||
name: Globalize.translate("TabArtists"),
|
if (item.ArtistCount) {
|
||||||
type: "MusicArtist"
|
sections.push({
|
||||||
}), item.ProgramCount && "Person" == item.Type && sections.push({
|
name: Globalize.translate("TabArtists"),
|
||||||
name: Globalize.translate("HeaderUpcomingOnTV"),
|
type: "MusicArtist"
|
||||||
type: "Program"
|
});
|
||||||
}), item.MovieCount && sections.push({
|
}
|
||||||
name: Globalize.translate("TabMovies"),
|
|
||||||
type: "Movie"
|
if (item.ProgramCount && "Person" == item.Type) {
|
||||||
}), item.SeriesCount && sections.push({
|
sections.push({
|
||||||
name: Globalize.translate("TabShows"),
|
name: Globalize.translate("HeaderUpcomingOnTV"),
|
||||||
type: "Series"
|
type: "Program"
|
||||||
}), item.EpisodeCount && sections.push({
|
});
|
||||||
name: Globalize.translate("TabEpisodes"),
|
}
|
||||||
type: "Episode"
|
|
||||||
}), item.TrailerCount && sections.push({
|
if (item.MovieCount) {
|
||||||
name: Globalize.translate("TabTrailers"),
|
sections.push({
|
||||||
type: "Trailer"
|
name: Globalize.translate("TabMovies"),
|
||||||
}), item.AlbumCount && sections.push({
|
type: "Movie"
|
||||||
name: Globalize.translate("TabAlbums"),
|
});
|
||||||
type: "MusicAlbum"
|
}
|
||||||
}), item.MusicVideoCount && sections.push({
|
|
||||||
name: Globalize.translate("TabMusicVideos"),
|
if (item.SeriesCount) {
|
||||||
type: "MusicVideo"
|
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");
|
var elem = page.querySelector("#childrenContent");
|
||||||
elem.innerHTML = sections.map(function(section) {
|
elem.innerHTML = sections.map(function (section) {
|
||||||
var html = "",
|
var html = "";
|
||||||
sectionClass = "verticalSection";
|
var 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>"
|
|
||||||
|
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("");
|
}).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) {
|
function renderSection(page, item, element, type) {
|
||||||
|
@ -50,16 +100,17 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
SortBy: "StartDate"
|
SortBy: "StartDate"
|
||||||
}, {
|
}, {
|
||||||
shape: "backdrop",
|
shape: "backdrop",
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayMoreButton: !0,
|
overlayMoreButton: true,
|
||||||
preferThumb: !0,
|
preferThumb: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showAirTime: !0,
|
showAirTime: true,
|
||||||
showAirDateTime: !0,
|
showAirDateTime: true,
|
||||||
showChannelName: !0
|
showChannelName: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Movie":
|
case "Movie":
|
||||||
loadItems(element, item, type, {
|
loadItems(element, item, type, {
|
||||||
MediaTypes: "",
|
MediaTypes: "",
|
||||||
|
@ -71,13 +122,14 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
SortBy: "SortName"
|
SortBy: "SortName"
|
||||||
}, {
|
}, {
|
||||||
shape: "portrait",
|
shape: "portrait",
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayMoreButton: !0,
|
overlayMoreButton: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showYear: !0
|
showYear: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "MusicVideo":
|
case "MusicVideo":
|
||||||
loadItems(element, item, type, {
|
loadItems(element, item, type, {
|
||||||
MediaTypes: "",
|
MediaTypes: "",
|
||||||
|
@ -89,11 +141,12 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
SortBy: "SortName"
|
SortBy: "SortName"
|
||||||
}, {
|
}, {
|
||||||
shape: "portrait",
|
shape: "portrait",
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Trailer":
|
case "Trailer":
|
||||||
loadItems(element, item, type, {
|
loadItems(element, item, type, {
|
||||||
MediaTypes: "",
|
MediaTypes: "",
|
||||||
|
@ -105,11 +158,12 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
SortBy: "SortName"
|
SortBy: "SortName"
|
||||||
}, {
|
}, {
|
||||||
shape: "portrait",
|
shape: "portrait",
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Series":
|
case "Series":
|
||||||
loadItems(element, item, type, {
|
loadItems(element, item, type, {
|
||||||
MediaTypes: "",
|
MediaTypes: "",
|
||||||
|
@ -121,11 +175,12 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
SortBy: "SortName"
|
SortBy: "SortName"
|
||||||
}, {
|
}, {
|
||||||
shape: "portrait",
|
shape: "portrait",
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayMoreButton: !0
|
overlayMoreButton: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "MusicAlbum":
|
case "MusicAlbum":
|
||||||
loadItems(element, item, type, {
|
loadItems(element, item, type, {
|
||||||
MediaTypes: "",
|
MediaTypes: "",
|
||||||
|
@ -137,14 +192,15 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
SortBy: "ProductionYear,Sortname"
|
SortBy: "ProductionYear,Sortname"
|
||||||
}, {
|
}, {
|
||||||
shape: "square",
|
shape: "square",
|
||||||
playFromHere: !0,
|
playFromHere: true,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
showYear: !0,
|
showYear: true,
|
||||||
coverImage: !0,
|
coverImage: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "MusicArtist":
|
case "MusicArtist":
|
||||||
loadItems(element, item, type, {
|
loadItems(element, item, type, {
|
||||||
MediaTypes: "",
|
MediaTypes: "",
|
||||||
|
@ -156,14 +212,15 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
SortBy: "SortName"
|
SortBy: "SortName"
|
||||||
}, {
|
}, {
|
||||||
shape: "square",
|
shape: "square",
|
||||||
playFromHere: !0,
|
playFromHere: true,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
showParentTitle: !0,
|
showParentTitle: true,
|
||||||
coverImage: !0,
|
coverImage: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Episode":
|
case "Episode":
|
||||||
loadItems(element, item, type, {
|
loadItems(element, item, type, {
|
||||||
MediaTypes: "",
|
MediaTypes: "",
|
||||||
|
@ -175,12 +232,13 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
SortBy: "SortName"
|
SortBy: "SortName"
|
||||||
}, {
|
}, {
|
||||||
shape: "backdrop",
|
shape: "backdrop",
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
showParentTitle: !0,
|
showParentTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Audio":
|
case "Audio":
|
||||||
loadItems(element, item, type, {
|
loadItems(element, item, type, {
|
||||||
MediaTypes: "",
|
MediaTypes: "",
|
||||||
|
@ -190,57 +248,122 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
|
||||||
AlbumArtistIds: "",
|
AlbumArtistIds: "",
|
||||||
SortBy: "AlbumArtist,Album,SortName"
|
SortBy: "AlbumArtist,Album,SortName"
|
||||||
}, {
|
}, {
|
||||||
playFromHere: !0,
|
playFromHere: true,
|
||||||
action: "playallfromhere",
|
action: "playallfromhere",
|
||||||
smallIcon: !0,
|
smallIcon: true,
|
||||||
artist: !0
|
artist: true
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadItems(element, item, type, query, listOptions) {
|
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 = "";
|
var html = "";
|
||||||
|
|
||||||
if (query.Limit && result.TotalRecordCount > query.Limit) {
|
if (query.Limit && result.TotalRecordCount > query.Limit) {
|
||||||
var link = element.querySelector("a");
|
var link = element.querySelector("a");
|
||||||
link.classList.remove("hide"), link.setAttribute("href", getMoreItemsHref(item, type))
|
link.classList.remove("hide");
|
||||||
} else element.querySelector("a").classList.add("hide");
|
link.setAttribute("href", getMoreItemsHref(item, type));
|
||||||
|
} else {
|
||||||
|
element.querySelector("a").classList.add("hide");
|
||||||
|
}
|
||||||
|
|
||||||
listOptions.items = result.Items;
|
listOptions.items = result.Items;
|
||||||
var itemsContainer = element.querySelector(".itemsContainer");
|
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) {
|
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) {
|
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) {
|
function getQuery(options, item) {
|
||||||
var query = {
|
var query = {
|
||||||
SortOrder: "Ascending",
|
SortOrder: "Ascending",
|
||||||
IncludeItemTypes: "",
|
IncludeItemTypes: "",
|
||||||
Recursive: !0,
|
Recursive: true,
|
||||||
Fields: "AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo",
|
Fields: "AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo",
|
||||||
Limit: 100,
|
Limit: 100,
|
||||||
StartIndex: 0,
|
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) {
|
function getItemsFunction(options, item) {
|
||||||
var query = getQuery(options, item);
|
var query = getQuery(options, item);
|
||||||
return function(index, limit, fields) {
|
return function (index, limit, fields) {
|
||||||
query.StartIndex = index, query.Limit = limit, fields && (query.Fields += "," + fields);
|
query.StartIndex = index;
|
||||||
|
query.Limit = limit;
|
||||||
|
|
||||||
|
if (fields) {
|
||||||
|
query.Fields += "," + fields;
|
||||||
|
}
|
||||||
|
|
||||||
var apiClient = connectionManager.getApiClient(item.ServerId);
|
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 = {
|
window.ItemsByName = {
|
||||||
renderItems: renderItems
|
renderItems: renderItems
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,101 +1,198 @@
|
||||||
define(["userSettings"], function(userSettings) {
|
define(["userSettings"], function (userSettings) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var libraryBrowser = {
|
var libraryBrowser = {
|
||||||
getSavedQueryKey: function(modifier) {
|
getSavedQueryKey: function (modifier) {
|
||||||
return window.location.href.split("#")[0] + (modifier || "")
|
return window.location.href.split("#")[0] + (modifier || "");
|
||||||
},
|
},
|
||||||
loadSavedQueryValues: function(key, query) {
|
loadSavedQueryValues: function (key, query) {
|
||||||
var values = userSettings.get(key);
|
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 = {};
|
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) {
|
saveViewSetting: function (key, value) {
|
||||||
userSettings.set(key + "-_view", value)
|
userSettings.set(key + "-_view", value);
|
||||||
},
|
},
|
||||||
getSavedView: function(key) {
|
getSavedView: function (key) {
|
||||||
return userSettings.get(key + "-_view")
|
return userSettings.get(key + "-_view");
|
||||||
},
|
},
|
||||||
showLayoutMenu: function(button, currentLayout, views) {
|
showLayoutMenu: function (button, currentLayout, views) {
|
||||||
var dispatchEvent = !0;
|
var dispatchEvent = true;
|
||||||
views || (dispatchEvent = !1, views = button.getAttribute("data-layouts"), views = views ? views.split(",") : ["List", "Poster", "PosterCard", "Thumb", "ThumbCard"]);
|
|
||||||
var menuItems = views.map(function(v) {
|
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 {
|
return {
|
||||||
name: Globalize.translate("Option" + v),
|
name: Globalize.translate("Option" + v),
|
||||||
id: v,
|
id: v,
|
||||||
selected: currentLayout == v
|
selected: currentLayout == v
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
require(["actionsheet"], function(actionsheet) {
|
|
||||||
|
require(["actionsheet"], function (actionsheet) {
|
||||||
actionsheet.show({
|
actionsheet.show({
|
||||||
items: menuItems,
|
items: menuItems,
|
||||||
positionTo: button,
|
positionTo: button,
|
||||||
callback: function(id) {
|
callback: function (id) {
|
||||||
button.dispatchEvent(new CustomEvent("layoutchange", {
|
button.dispatchEvent(new CustomEvent("layoutchange", {
|
||||||
detail: {
|
detail: {
|
||||||
viewStyle: id
|
viewStyle: id
|
||||||
},
|
},
|
||||||
bubbles: !0,
|
bubbles: true,
|
||||||
cancelable: !1
|
cancelable: false
|
||||||
})), dispatchEvent || window.$ && $(button).trigger("layoutchange", [id])
|
}));
|
||||||
|
|
||||||
|
if (!dispatchEvent) {
|
||||||
|
if (window.$) {
|
||||||
|
$(button).trigger("layoutchange", [id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
},
|
},
|
||||||
getQueryPagingHtml: function(options) {
|
getQueryPagingHtml: function (options) {
|
||||||
var startIndex = options.startIndex,
|
var startIndex = options.startIndex;
|
||||||
limit = options.limit,
|
var limit = options.limit;
|
||||||
totalRecordCount = options.totalRecordCount,
|
var totalRecordCount = options.totalRecordCount;
|
||||||
html = "",
|
var html = "";
|
||||||
recordsEnd = Math.min(startIndex + limit, totalRecordCount),
|
var recordsEnd = Math.min(startIndex + limit, totalRecordCount);
|
||||||
showControls = limit < totalRecordCount;
|
var showControls = limit < totalRecordCount;
|
||||||
|
|
||||||
if (html += '<div class="listPaging">', showControls) {
|
if (html += '<div class="listPaging">', showControls) {
|
||||||
html += '<span style="vertical-align:middle;">';
|
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) {
|
showSortMenu: function (options) {
|
||||||
require(["dialogHelper", "emby-radio"], function(dialogHelper) {
|
require(["dialogHelper", "emby-radio"], function (dialogHelper) {
|
||||||
function onSortByChange() {
|
function onSortByChange() {
|
||||||
var newValue = this.value;
|
var newValue = this.value;
|
||||||
|
|
||||||
if (this.checked) {
|
if (this.checked) {
|
||||||
var changed = options.query.SortBy != newValue;
|
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() {
|
function onSortOrderChange() {
|
||||||
var newValue = this.value;
|
var newValue = this.value;
|
||||||
|
|
||||||
if (this.checked) {
|
if (this.checked) {
|
||||||
var changed = options.query.SortOrder != newValue;
|
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({
|
var dlg = dialogHelper.createDialog({
|
||||||
removeOnClose: !0,
|
removeOnClose: true,
|
||||||
modal: !1,
|
modal: false,
|
||||||
entryAnimationDuration: 160,
|
entryAnimationDuration: 160,
|
||||||
exitAnimationDuration: 200
|
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 = "";
|
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>";
|
html += '<div style="margin:0;padding:1.25em 1.5em 1.5em;">';
|
||||||
var i, length, isChecked;
|
html += '<h2 style="margin:0 0 .5em;">';
|
||||||
for (html += "<div>", i = 0, length = options.items.length; i < length; i++) {
|
html += Globalize.translate("HeaderSortBy");
|
||||||
var option = options.items[i],
|
html += "</h2>";
|
||||||
radioValue = option.id.replace(",", "_");
|
var i, length;
|
||||||
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>"
|
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");
|
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");
|
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() {
|
function bindMenuEvents() {
|
||||||
mainDrawerButton = document.querySelector(".mainDrawerButton");
|
mainDrawerButton = document.querySelector(".mainDrawerButton");
|
||||||
|
|
||||||
if (mainDrawerButton) {
|
if (mainDrawerButton) {
|
||||||
mainDrawerButton.addEventListener("click", toggleMainDrawer);
|
mainDrawerButton.addEventListener("click", toggleMainDrawer);
|
||||||
}
|
}
|
||||||
|
@ -198,18 +199,21 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
html += '<h3 class="sidebarHeader">';
|
html += '<h3 class="sidebarHeader">';
|
||||||
html += globalize.translate("HeaderUser");
|
html += globalize.translate("HeaderUser");
|
||||||
html += "</h3>";
|
html += "</h3>";
|
||||||
|
|
||||||
if (appHost.supports("multiserver")) {
|
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" 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 += '<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>";
|
html += "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// add buttons to navigation drawer
|
// add buttons to navigation drawer
|
||||||
navDrawerScrollContainer.innerHTML = html;
|
navDrawerScrollContainer.innerHTML = html;
|
||||||
|
|
||||||
// bind logout button click to method
|
// bind logout button click to method
|
||||||
var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout");
|
var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout");
|
||||||
|
|
||||||
if (btnLogout) {
|
if (btnLogout) {
|
||||||
btnLogout.addEventListener("click", onLogoutClick);
|
btnLogout.addEventListener("click", onLogoutClick);
|
||||||
}
|
}
|
||||||
|
@ -250,6 +254,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
pageUrls = pageUrls.split("|");
|
pageUrls = pageUrls.split("|");
|
||||||
selected = pageUrls.filter(isUrlInCurrentView).length > 0;
|
selected = pageUrls.filter(isUrlInCurrentView).length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selected) {
|
if (selected) {
|
||||||
link.classList.add("navMenuOption-selected");
|
link.classList.add("navMenuOption-selected");
|
||||||
var title = "";
|
var title = "";
|
||||||
|
@ -377,6 +382,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
function addPluginPagesToMainMenu(links, pluginItems, section) {
|
function addPluginPagesToMainMenu(links, pluginItems, section) {
|
||||||
for (var i = 0, length = pluginItems.length; i < length; i++) {
|
for (var i = 0, length = pluginItems.length; i < length; i++) {
|
||||||
var pluginItem = pluginItems[i];
|
var pluginItem = pluginItems[i];
|
||||||
|
|
||||||
if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) {
|
if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) {
|
||||||
links.push({
|
links.push({
|
||||||
name: pluginItem.DisplayName,
|
name: pluginItem.DisplayName,
|
||||||
|
@ -416,15 +422,14 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
return getToolsMenuLinks(apiClient).then(function (items) {
|
return getToolsMenuLinks(apiClient).then(function (items) {
|
||||||
var item;
|
var item;
|
||||||
var menuHtml = "";
|
var menuHtml = "";
|
||||||
|
|
||||||
menuHtml += '<div class="drawerContent">';
|
menuHtml += '<div class="drawerContent">';
|
||||||
|
|
||||||
for (var i = 0; i < items.length; i++) {
|
for (var i = 0; i < items.length; i++) {
|
||||||
item = items[i];
|
item = items[i];
|
||||||
|
|
||||||
if (item.href) {
|
if (item.href) {
|
||||||
menuHtml += getToolsLinkHtml(item);
|
menuHtml += getToolsLinkHtml(item);
|
||||||
}
|
} else if (item.name) {
|
||||||
else if (item.name) {
|
|
||||||
menuHtml += '<h3 class="sidebarHeader">';
|
menuHtml += '<h3 class="sidebarHeader">';
|
||||||
menuHtml += item.name;
|
menuHtml += item.name;
|
||||||
menuHtml += "</h3>";
|
menuHtml += "</h3>";
|
||||||
|
@ -460,8 +465,8 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
|
|
||||||
for (var i = 0, length = items.length; i < length; i++) {
|
for (var i = 0, length = items.length; i < length; i++) {
|
||||||
var view = items[i];
|
var view = items[i];
|
||||||
|
|
||||||
list.push(view);
|
list.push(view);
|
||||||
|
|
||||||
if ("livetv" == view.CollectionType) {
|
if ("livetv" == view.CollectionType) {
|
||||||
view.ImageTags = {};
|
view.ImageTags = {};
|
||||||
view.icon = "live_tv";
|
view.icon = "live_tv";
|
||||||
|
@ -484,8 +489,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
if (elem) {
|
if (elem) {
|
||||||
if (show) {
|
if (show) {
|
||||||
elem.classList.remove("hide");
|
elem.classList.remove("hide");
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
elem.classList.add("hide");
|
elem.classList.add("hide");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -503,15 +507,13 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
// FIXME: Potentially the same as above
|
// FIXME: Potentially the same as above
|
||||||
if (user.Policy.EnableContentDownloading) {
|
if (user.Policy.EnableContentDownloading) {
|
||||||
showBySelector(".lnkSyncToOtherDevices", true);
|
showBySelector(".lnkSyncToOtherDevices", true);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
showBySelector(".lnkSyncToOtherDevices", false);
|
showBySelector(".lnkSyncToOtherDevices", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.Policy.EnableContentDownloading && appHost.supports("sync")) {
|
if (user.Policy.EnableContentDownloading && appHost.supports("sync")) {
|
||||||
showBySelector(".libraryMenuDownloads", true);
|
showBySelector(".libraryMenuDownloads", true);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
showBySelector(".libraryMenuDownloads", false);
|
showBySelector(".libraryMenuDownloads", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -529,9 +531,11 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
html += items.map(function (i) {
|
html += items.map(function (i) {
|
||||||
var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType);
|
var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType);
|
||||||
var itemId = i.Id;
|
var itemId = i.Id;
|
||||||
|
|
||||||
if (i.onclick) {
|
if (i.onclick) {
|
||||||
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>";
|
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("");
|
}).join("");
|
||||||
libraryMenuOptions.innerHTML = html;
|
libraryMenuOptions.innerHTML = html;
|
||||||
|
@ -592,23 +596,17 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
|
|
||||||
if (isChannelsPage && "channels" === itemId) {
|
if (isChannelsPage && "channels" === itemId) {
|
||||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||||
}
|
} else if (isLiveTvPage && "livetv" === itemId) {
|
||||||
else if (isLiveTvPage && "livetv" === itemId) {
|
|
||||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||||
}
|
} else if (isEditorPage && "editor" === itemId) {
|
||||||
else if (isEditorPage && "editor" === itemId) {
|
|
||||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
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");
|
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");
|
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||||
}
|
} else if (id && itemId == id) {
|
||||||
else if (id && itemId == id) {
|
|
||||||
lnkMediaFolder.classList.add("navMenuOption-selected");
|
lnkMediaFolder.classList.add("navMenuOption-selected");
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
lnkMediaFolder.classList.remove("navMenuOption-selected");
|
lnkMediaFolder.classList.remove("navMenuOption-selected");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -667,8 +665,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
|
|
||||||
if (title) {
|
if (title) {
|
||||||
LibraryMenu.setTitle(title);
|
LibraryMenu.setTitle(title);
|
||||||
}
|
} else if (page.classList.contains("standalonePage")) {
|
||||||
else if (page.classList.contains("standalonePage")) {
|
|
||||||
LibraryMenu.setDefaultTitle();
|
LibraryMenu.setDefaultTitle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -697,6 +694,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
function refreshLibraryDrawer(user) {
|
function refreshLibraryDrawer(user) {
|
||||||
loadNavDrawer();
|
loadNavDrawer();
|
||||||
currentDrawerType = "library";
|
currentDrawerType = "library";
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
Promise.resolve(user);
|
Promise.resolve(user);
|
||||||
} else {
|
} else {
|
||||||
|
@ -729,9 +727,11 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
require(["navdrawer"], function (navdrawer) {
|
require(["navdrawer"], function (navdrawer) {
|
||||||
navDrawerInstance = new navdrawer(getNavDrawerOptions());
|
navDrawerInstance = new navdrawer(getNavDrawerOptions());
|
||||||
|
|
||||||
if (!layoutManager.tv) {
|
if (!layoutManager.tv) {
|
||||||
navDrawerElement.classList.remove("hide");
|
navDrawerElement.classList.remove("hide");
|
||||||
}
|
}
|
||||||
|
|
||||||
resolve(navDrawerInstance);
|
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";
|
"use strict";
|
||||||
|
|
||||||
function enableScrollX() {
|
function enableScrollX() {
|
||||||
return !layoutManager.desktop
|
return !layoutManager.desktop;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBackdropShape() {
|
function getBackdropShape() {
|
||||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTimersHtml(timers, options) {
|
function getTimersHtml(timers, options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
var i, length, items = timers.map(function(t) {
|
var i;
|
||||||
return t.Type = "Timer", t
|
var length;
|
||||||
}),
|
var items = timers.map(function (t) {
|
||||||
groups = [],
|
t.Type = "Timer";
|
||||||
currentGroupName = "",
|
return t;
|
||||||
currentGroup = [];
|
});
|
||||||
|
var groups = [];
|
||||||
|
var currentGroupName = "";
|
||||||
|
var currentGroup = [];
|
||||||
|
|
||||||
for (i = 0, length = items.length; i < length; i++) {
|
for (i = 0, length = items.length; i < length; i++) {
|
||||||
var item = items[i],
|
var item = items[i];
|
||||||
dateText = "";
|
var dateText = "";
|
||||||
if (!1 !== options.indexByDate && item.StartDate) try {
|
|
||||||
var premiereDate = datetime.parseISO8601Date(item.StartDate, !0);
|
if (options.indexByDate !== false && item.StartDate) {
|
||||||
dateText = datetime.toLocaleDateString(premiereDate, {
|
try {
|
||||||
weekday: "long",
|
var premiereDate = datetime.parseISO8601Date(item.StartDate, true);
|
||||||
month: "short",
|
dateText = datetime.toLocaleDateString(premiereDate, {
|
||||||
day: "numeric"
|
weekday: "long",
|
||||||
})
|
month: "short",
|
||||||
} catch (err) {}
|
day: "numeric"
|
||||||
dateText != currentGroupName ? (currentGroup.length && groups.push({
|
});
|
||||||
|
} 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,
|
name: currentGroupName,
|
||||||
items: currentGroup
|
items: currentGroup
|
||||||
}), currentGroupName = dateText, currentGroup = [item]) : currentGroup.push(item)
|
});
|
||||||
}
|
}
|
||||||
currentGroup.length && groups.push({
|
|
||||||
name: currentGroupName,
|
|
||||||
items: currentGroup
|
|
||||||
});
|
|
||||||
var html = "";
|
var html = "";
|
||||||
|
|
||||||
for (i = 0, length = groups.length; i < length; i++) {
|
for (i = 0, length = groups.length; i < length; i++) {
|
||||||
var group = groups[i],
|
var group = groups[i];
|
||||||
supportsImageAnalysis = appHost.supports("imageanalysis"),
|
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||||
cardLayout = appHost.preferVisualCards || supportsImageAnalysis;
|
var 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()) {
|
|
||||||
|
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";
|
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({
|
html += cardBuilder.getCardsHtml({
|
||||||
items: group.items,
|
items: group.items,
|
||||||
shape: cardLayout ? getBackdropShape() : enableScrollX() ? "autoOverflow" : "autoVertical",
|
shape: cardLayout ? getBackdropShape() : enableScrollX() ? "autoOverflow" : "autoVertical",
|
||||||
showParentTitleOrTitle: !0,
|
showParentTitleOrTitle: true,
|
||||||
showAirTime: !0,
|
showAirTime: true,
|
||||||
showAirEndTime: !0,
|
showAirEndTime: true,
|
||||||
showChannelName: !cardLayout,
|
showChannelName: !cardLayout,
|
||||||
cardLayout: cardLayout,
|
cardLayout: cardLayout,
|
||||||
centerText: !cardLayout,
|
centerText: !cardLayout,
|
||||||
|
@ -59,15 +97,22 @@ define(["layoutManager", "datetime", "cardBuilder", "apphost"], function(layoutM
|
||||||
cardFooterAside: "none",
|
cardFooterAside: "none",
|
||||||
preferThumb: !!cardLayout || "auto",
|
preferThumb: !!cardLayout || "auto",
|
||||||
defaultShape: cardLayout ? null : "portrait",
|
defaultShape: cardLayout ? null : "portrait",
|
||||||
coverImage: !0,
|
coverImage: true,
|
||||||
allowBottomPadding: !1,
|
allowBottomPadding: false,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showChannelLogo: cardLayout
|
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 = {
|
window.LiveTvHelpers = {
|
||||||
getTimersHtml: getTimersHtml
|
getTimersHtml: getTimersHtml
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,39 +1,50 @@
|
||||||
define(["listView"], function(listView) {
|
define(["listView"], function (listView) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function getFetchPlaylistItemsFn(itemId) {
|
function getFetchPlaylistItemsFn(itemId) {
|
||||||
return function() {
|
return function () {
|
||||||
var query = {
|
var query = {
|
||||||
Fields: "PrimaryImageAspectRatio,UserData",
|
Fields: "PrimaryImageAspectRatio,UserData",
|
||||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||||
UserId: ApiClient.getCurrentUserId()
|
UserId: ApiClient.getCurrentUserId()
|
||||||
};
|
};
|
||||||
return ApiClient.getJSON(ApiClient.getUrl("Playlists/" + itemId + "/Items", query))
|
return ApiClient.getJSON(ApiClient.getUrl("Playlists/" + itemId + "/Items", query));
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getItemsHtmlFn(itemId) {
|
function getItemsHtmlFn(itemId) {
|
||||||
return function(items) {
|
return function (items) {
|
||||||
return listView.getListViewHtml({
|
return listView.getListViewHtml({
|
||||||
items: items,
|
items: items,
|
||||||
showIndex: !1,
|
showIndex: false,
|
||||||
showRemoveFromPlaylist: !0,
|
showRemoveFromPlaylist: true,
|
||||||
playFromHere: !0,
|
playFromHere: true,
|
||||||
action: "playallfromhere",
|
action: "playallfromhere",
|
||||||
smallIcon: !0,
|
smallIcon: true,
|
||||||
dragHandle: !0,
|
dragHandle: true,
|
||||||
playlistId: itemId
|
playlistId: itemId
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function init(page, item) {
|
function init(page, item) {
|
||||||
var elem = page.querySelector("#childrenContent .itemsContainer");
|
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 = {
|
window.PlaylistViewer = {
|
||||||
render: function(page, item) {
|
render: function (page, item) {
|
||||||
page.playlistInit || (page.playlistInit = !0, init(page, item)), page.querySelector("#childrenContent").classList.add("verticalSection-extrabottompadding"), page.querySelector("#childrenContent .itemsContainer").refreshItems()
|
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";
|
"use strict";
|
||||||
return function(view, params) {
|
|
||||||
|
return function (view, params) {
|
||||||
function getPageData(context) {
|
function getPageData(context) {
|
||||||
var key = getSavedQueryKey(context),
|
var key = getSavedQueryKey(context);
|
||||||
pageData = data[key];
|
var pageData = data[key];
|
||||||
return pageData || (pageData = data[key] = {
|
|
||||||
query: {
|
if (!pageData) {
|
||||||
SortBy: "SortName",
|
pageData = data[key] = {
|
||||||
SortOrder: "Ascending",
|
query: {
|
||||||
IncludeItemTypes: "Playlist",
|
SortBy: "SortName",
|
||||||
Recursive: !0,
|
SortOrder: "Ascending",
|
||||||
Fields: "PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete",
|
IncludeItemTypes: "Playlist",
|
||||||
StartIndex: 0,
|
Recursive: true,
|
||||||
Limit: 100
|
Fields: "PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete",
|
||||||
},
|
StartIndex: 0,
|
||||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
Limit: 100
|
||||||
}, pageData.query.ParentId = libraryMenu.getTopParentId(), libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
},
|
||||||
|
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||||
|
};
|
||||||
|
pageData.query.ParentId = libraryMenu.getTopParentId();
|
||||||
|
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pageData;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getQuery(context) {
|
function getQuery(context) {
|
||||||
return getPageData(context).query
|
return getPageData(context).query;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSavedQueryKey(context) {
|
function getSavedQueryKey(context) {
|
||||||
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey()), context.savedQueryKey
|
if (!context.savedQueryKey) {
|
||||||
|
context.savedQueryKey = libraryBrowser.getSavedQueryKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
return context.savedQueryKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
function showLoadingMessage() {
|
function showLoadingMessage() {
|
||||||
loading.show()
|
loading.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
function hideLoadingMessage() {
|
function hideLoadingMessage() {
|
||||||
loading.hide()
|
loading.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onViewStyleChange() {
|
function onViewStyleChange() {
|
||||||
var viewStyle = getPageData(view).view,
|
var viewStyle = getPageData(view).view;
|
||||||
itemsContainer = view.querySelector(".itemsContainer");
|
var 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 = ""
|
|
||||||
|
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() {
|
function reloadItems() {
|
||||||
showLoadingMessage();
|
showLoadingMessage();
|
||||||
var query = getQuery(view),
|
var query = getQuery(view);
|
||||||
promise1 = ApiClient.getItems(Dashboard.getCurrentUserId(), query),
|
var promise1 = ApiClient.getItems(Dashboard.getCurrentUserId(), query);
|
||||||
promise2 = Dashboard.getCurrentUser();
|
var promise2 = Dashboard.getCurrentUser();
|
||||||
Promise.all([promise1, promise2]).then(function(responses) {
|
Promise.all([promise1, promise2]).then(function (responses) {
|
||||||
var result = responses[0];
|
var result = responses[0];
|
||||||
responses[1];
|
responses[1];
|
||||||
window.scrollTo(0, 0);
|
window.scrollTo(0, 0);
|
||||||
var html = "",
|
var html = "";
|
||||||
viewStyle = getPageData(view).view;
|
var viewStyle = getPageData(view).view;
|
||||||
view.querySelector(".listTopPaging").innerHTML = libraryBrowser.getQueryPagingHtml({
|
view.querySelector(".listTopPaging").innerHTML = libraryBrowser.getQueryPagingHtml({
|
||||||
startIndex: query.StartIndex,
|
startIndex: query.StartIndex,
|
||||||
limit: query.Limit,
|
limit: query.Limit,
|
||||||
totalRecordCount: result.TotalRecordCount,
|
totalRecordCount: result.TotalRecordCount,
|
||||||
viewButton: !1,
|
viewButton: false,
|
||||||
showLimit: !1,
|
showLimit: false,
|
||||||
updatePageSizeSetting: !1,
|
updatePageSizeSetting: false,
|
||||||
addLayoutButton: !0,
|
addLayoutButton: true,
|
||||||
layouts: "List,Poster,PosterCard,Thumb,ThumbCard",
|
layouts: "List,Poster,PosterCard,Thumb,ThumbCard",
|
||||||
currentLayout: viewStyle
|
currentLayout: viewStyle
|
||||||
}), result.TotalRecordCount ? (html = "List" == viewStyle ? listView.getListViewHtml({
|
});
|
||||||
items: result.Items,
|
|
||||||
sortBy: query.SortBy
|
if (result.TotalRecordCount) {
|
||||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
if (viewStyle == "List") {
|
||||||
items: result.Items,
|
html = listView.getListViewHtml({
|
||||||
shape: "square",
|
items: result.Items,
|
||||||
coverImage: !0,
|
sortBy: query.SortBy
|
||||||
showTitle: !0,
|
});
|
||||||
cardLayout: !0
|
} else if (viewStyle == "PosterCard") {
|
||||||
}) : "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
|
html = cardBuilder.getCardsHtml({
|
||||||
items: result.Items,
|
items: result.Items,
|
||||||
shape: "backdrop",
|
shape: "square",
|
||||||
showTitle: !0,
|
coverImage: true,
|
||||||
centerText: !0,
|
showTitle: true,
|
||||||
preferThumb: !0,
|
cardLayout: true
|
||||||
overlayPlayButton: !0
|
});
|
||||||
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
|
} else if (viewStyle == "Thumb") {
|
||||||
items: result.Items,
|
html = cardBuilder.getCardsHtml({
|
||||||
shape: "backdrop",
|
items: result.Items,
|
||||||
showTitle: !0,
|
shape: "backdrop",
|
||||||
preferThumb: !0,
|
showTitle: true,
|
||||||
cardLayout: !0
|
centerText: true,
|
||||||
}) : cardBuilder.getCardsHtml({
|
preferThumb: true,
|
||||||
items: result.Items,
|
overlayPlayButton: true
|
||||||
shape: "square",
|
});
|
||||||
showTitle: !0,
|
} else if (viewStyle == "ThumbCard") {
|
||||||
coverImage: !0,
|
html = cardBuilder.getCardsHtml({
|
||||||
centerText: !0,
|
items: result.Items,
|
||||||
overlayPlayButton: !0
|
shape: "backdrop",
|
||||||
}), view.querySelector(".noItemsMessage").classList.add("hide")) : view.querySelector(".noItemsMessage").classList.remove("hide");
|
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");
|
var elem = view.querySelector(".itemsContainer");
|
||||||
elem.innerHTML = html, imageLoader.lazyChildren(elem);
|
elem.innerHTML = html;
|
||||||
|
imageLoader.lazyChildren(elem);
|
||||||
var btnNextPage = view.querySelector(".btnNextPage");
|
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");
|
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");
|
var btnChangeLayout = view.querySelector(".btnChangeLayout");
|
||||||
btnChangeLayout && btnChangeLayout.addEventListener("layoutchange", function(e) {
|
|
||||||
var layout = e.detail.viewStyle;
|
if (btnChangeLayout) {
|
||||||
getPageData(view).view = layout, libraryBrowser.saveViewSetting(getSavedQueryKey(view), layout), onViewStyleChange(), reloadItems()
|
btnChangeLayout.addEventListener("layoutchange", function (e) {
|
||||||
}), libraryBrowser.saveQueryValues(getSavedQueryKey(view), query), hideLoadingMessage()
|
var layout = e.detail.viewStyle;
|
||||||
})
|
getPageData(view).view = layout;
|
||||||
|
libraryBrowser.saveViewSetting(getSavedQueryKey(view), layout);
|
||||||
|
onViewStyleChange();
|
||||||
|
reloadItems();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
libraryBrowser.saveQueryValues(getSavedQueryKey(view), query);
|
||||||
|
hideLoadingMessage();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = {};
|
var data = {};
|
||||||
view.addEventListener("viewbeforeshow", function() {
|
view.addEventListener("viewbeforeshow", function () {
|
||||||
reloadItems()
|
reloadItems();
|
||||||
}), view.querySelector(".btnNewPlaylist").addEventListener("click", function() {
|
});
|
||||||
require(["playlistEditor"], function(playlistEditor) {
|
view.querySelector(".btnNewPlaylist").addEventListener("click", function () {
|
||||||
|
require(["playlistEditor"], function (playlistEditor) {
|
||||||
var serverId = ApiClient.serverInfo().Id;
|
var serverId = ApiClient.serverInfo().Id;
|
||||||
(new playlistEditor).show({
|
new playlistEditor().show({
|
||||||
items: [],
|
items: [],
|
||||||
serverId: serverId
|
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";
|
"use strict";
|
||||||
|
|
||||||
function init(instance, tabContent, options) {
|
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")
|
element: tabContent.querySelector(".searchFields")
|
||||||
}), instance.searchResults = new SearchResults({
|
});
|
||||||
|
instance.searchResults = new SearchResults({
|
||||||
element: tabContent.querySelector(".searchResults"),
|
element: tabContent.querySelector(".searchResults"),
|
||||||
serverId: ApiClient.serverId(),
|
serverId: ApiClient.serverId(),
|
||||||
parentId: options.parentId,
|
parentId: options.parentId,
|
||||||
collectionType: options.collectionType
|
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) {
|
function SearchTab(view, tabContent, options) {
|
||||||
var self = this;
|
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;
|
var searchFields = this.searchFields;
|
||||||
searchFields && searchFields.focus()
|
|
||||||
}
|
if (searchFields) {
|
||||||
|
searchFields.focus();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
return SearchTab.prototype.destroy = function() {
|
|
||||||
|
SearchTab.prototype.destroy = function () {
|
||||||
var searchFields = this.searchFields;
|
var searchFields = this.searchFields;
|
||||||
searchFields && searchFields.destroy(), this.searchFields = null;
|
|
||||||
|
if (searchFields) {
|
||||||
|
searchFields.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.searchFields = null;
|
||||||
var searchResults = this.searchResults;
|
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";
|
"use strict";
|
||||||
return function(options) {
|
|
||||||
|
return function (options) {
|
||||||
function pollTasks() {
|
function pollTasks() {
|
||||||
connectionManager.getApiClient(serverId).getScheduledTasks({
|
connectionManager.getApiClient(serverId).getScheduledTasks({
|
||||||
IsEnabled: !0
|
IsEnabled: true
|
||||||
}).then(updateTasks)
|
}).then(updateTasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateTasks(tasks) {
|
function updateTasks(tasks) {
|
||||||
var task = tasks.filter(function(t) {
|
var task = tasks.filter(function (t) {
|
||||||
return t.Key == options.taskKey
|
return t.Key == options.taskKey;
|
||||||
})[0];
|
})[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);
|
if (options.panel) {
|
||||||
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
|
if (task) {
|
||||||
if (options.progressElem && (options.progressElem.value = progress, "Running" == task.State ? options.progressElem.classList.remove("hide") : options.progressElem.classList.add("hide")), options.lastResultElem) {
|
options.panel.classList.remove('hide');
|
||||||
var lastResult = task.LastExecutionResult ? task.LastExecutionResult.Status : "";
|
} else {
|
||||||
"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)
|
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) {
|
function onScheduledTaskMessageConfirmed(id) {
|
||||||
connectionManager.getApiClient(serverId).startScheduledTask(id).then(pollTasks)
|
connectionManager.getApiClient(serverId).startScheduledTask(id).then(pollTasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onButtonClick() {
|
function onButtonClick() {
|
||||||
onScheduledTaskMessageConfirmed(this.getAttribute("data-taskid"))
|
onScheduledTaskMessageConfirmed(this.getAttribute("data-taskid"));
|
||||||
}
|
}
|
||||||
|
|
||||||
function onScheduledTasksUpdate(e, apiClient, info) {
|
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() {
|
function onPollIntervalFired() {
|
||||||
connectionManager.getApiClient(serverId).isMessageChannelOpen() || pollTasks()
|
if (!connectionManager.getApiClient(serverId).isMessageChannelOpen()) {
|
||||||
|
pollTasks();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var pollInterval, button = options.button,
|
|
||||||
serverId = ApiClient.serverId();
|
function startInterval() {
|
||||||
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() {
|
|
||||||
var apiClient = connectionManager.getApiClient(serverId);
|
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";
|
"use strict";
|
||||||
|
|
||||||
var currentViewType;
|
var currentViewType;
|
||||||
pageClassOn("viewbeforeshow", "page", function() {
|
pageClassOn("viewbeforeshow", "page", function () {
|
||||||
var classList = this.classList,
|
var classList = this.classList;
|
||||||
viewType = classList.contains("type-interior") || classList.contains("wizardPage") ? "a" : "b";
|
var viewType = classList.contains("type-interior") || classList.contains("wizardPage") ? "a" : "b";
|
||||||
|
|
||||||
if (viewType !== currentViewType) {
|
if (viewType !== currentViewType) {
|
||||||
currentViewType = viewType;
|
currentViewType = viewType;
|
||||||
var theme, context;
|
var theme;
|
||||||
"a" === viewType ? (theme = userSettings.dashboardTheme(), context = "serverdashboard") : theme = userSettings.theme(), skinManager.setTheme(theme, context)
|
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";
|
"use strict";
|
||||||
|
|
||||||
function loadUser(page, user) {
|
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) {
|
function loadData(page) {
|
||||||
loading.show();
|
loading.show();
|
||||||
var userId = getParameterByName("userId");
|
var userId = getParameterByName("userId");
|
||||||
ApiClient.getUser(userId).then(function(user) {
|
ApiClient.getUser(userId).then(function (user) {
|
||||||
loadUser(page, 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)
|
$(document).on("pageinit", "#userPasswordPage", function () {
|
||||||
}).on("pagebeforeshow", "#userPasswordPage", function() {
|
$(".adminUpdatePasswordForm").off("submit", UpdatePasswordPage.onSubmit).on("submit", UpdatePasswordPage.onSubmit);
|
||||||
loadData(this)
|
$(".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";
|
"use strict";
|
||||||
|
|
||||||
function onSubmit(e) {
|
function onSubmit(e) {
|
||||||
return dom.parentWithClass(this, "page").querySelector(".chkAccept").checked ? Dashboard.navigate("wizardfinish.html") : Dashboard.alert({
|
if (dom.parentWithClass(this, "page").querySelector(".chkAccept").checked) {
|
||||||
message: Globalize.translate("MessagePleaseAcceptTermsOfServiceBeforeContinuing"),
|
Dashboard.navigate("wizardfinish.html");
|
||||||
title: ""
|
} else {
|
||||||
}), e.preventDefault(), !1
|
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() {
|
return function (view, params) {
|
||||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
|
view.querySelector(".wizardAgreementForm").addEventListener("submit", onSubmit);
|
||||||
}), view.addEventListener("viewhide", function() {
|
view.addEventListener("viewshow", function () {
|
||||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
|
||||||
})
|
});
|
||||||
}
|
view.addEventListener("viewhide", function () {
|
||||||
});
|
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
"AllLanguages": "Alle Sprachen",
|
"AllLanguages": "Alle Sprachen",
|
||||||
"AllLibraries": "Alle Bibliotheken",
|
"AllLibraries": "Alle Bibliotheken",
|
||||||
"AllowDeletionFromAll": "Erlaube Medienlöschung in allen 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",
|
"AllowMediaConversion": "Erlaube Medienkonvertierung",
|
||||||
"AllowMediaConversionHelp": "Erlaube oder unterbinde Zugriff auf die Medienkonvertierung.",
|
"AllowMediaConversionHelp": "Erlaube oder unterbinde Zugriff auf die Medienkonvertierung.",
|
||||||
"AllowOnTheFlySubtitleExtraction": "Erlaube Untertitelextraktion \"on-the-fly\"",
|
"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.",
|
"AllowRemoteAccess": "Erlaube externe Verbindungen zu diesem Jellyfin Server.",
|
||||||
"AllowRemoteAccessHelp": "Wenn deaktiviert werden alle externen Verbindungen blockiert.",
|
"AllowRemoteAccessHelp": "Wenn deaktiviert werden alle externen Verbindungen blockiert.",
|
||||||
"AllowSeasonalThemes": "Erlaube automatische Jahreszeitenmotive",
|
"AllowSeasonalThemes": "Erlaube automatische Jahreszeitenmotive",
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
"BirthLocation": "Geburtsort",
|
"BirthLocation": "Geburtsort",
|
||||||
"BirthPlaceValue": "Geburtsort: {0}",
|
"BirthPlaceValue": "Geburtsort: {0}",
|
||||||
"BobAndWeaveWithHelp": "Bob & Weave (höhere Qualität, aber langsamer)",
|
"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",
|
"Books": "Bücher",
|
||||||
"BoxRear": "Box (Rückseite)",
|
"BoxRear": "Box (Rückseite)",
|
||||||
"Browse": "Blättern",
|
"Browse": "Blättern",
|
||||||
|
@ -1401,7 +1401,7 @@
|
||||||
"Thumb": "Miniaturansicht",
|
"Thumb": "Miniaturansicht",
|
||||||
"TitleSupport": "Hilfe",
|
"TitleSupport": "Hilfe",
|
||||||
"Whitelist": "Erlaubt",
|
"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",
|
"Features": "Features",
|
||||||
"HeaderFavoriteBooks": "Lieblingsbücher",
|
"HeaderFavoriteBooks": "Lieblingsbücher",
|
||||||
"HeaderFavoriteMovies": "Lieblingsfilme",
|
"HeaderFavoriteMovies": "Lieblingsfilme",
|
||||||
|
@ -1437,5 +1437,23 @@
|
||||||
"HeaderTypeImageFetchers": "{0} Bildquellen",
|
"HeaderTypeImageFetchers": "{0} Bildquellen",
|
||||||
"LabelBitrate": "Bitrate:",
|
"LabelBitrate": "Bitrate:",
|
||||||
"LabelAudioBitrate": "Tonbitrate:",
|
"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",
|
"ButtonEdit": "Szerkesztés",
|
||||||
"ButtonEditImages": "Képek szerkesztése",
|
"ButtonEditImages": "Képek szerkesztése",
|
||||||
"ButtonFilter": "Szűrő",
|
"ButtonFilter": "Szűrő",
|
||||||
"ButtonForgotPassword": "Elfelejtett jelszó",
|
"ButtonForgotPassword": "Elfelejtett Jelszó",
|
||||||
"ButtonGotIt": "Értettem",
|
"ButtonGotIt": "Értettem",
|
||||||
"ButtonHelp": "Segítség",
|
"ButtonHelp": "Segítség",
|
||||||
"ButtonHome": "Kezdőlap",
|
"ButtonHome": "Kezdőlap",
|
||||||
|
@ -117,7 +117,7 @@
|
||||||
"FolderTypeMovies": "Filmek",
|
"FolderTypeMovies": "Filmek",
|
||||||
"FolderTypeMusic": "Zenék",
|
"FolderTypeMusic": "Zenék",
|
||||||
"FolderTypeMusicVideos": "Zenei Videók",
|
"FolderTypeMusicVideos": "Zenei Videók",
|
||||||
"FolderTypeTvShows": "Műsorok",
|
"FolderTypeTvShows": "TV Műsorok",
|
||||||
"FolderTypeUnset": "Vegyes Tartalom",
|
"FolderTypeUnset": "Vegyes Tartalom",
|
||||||
"Folders": "Könyvtárak",
|
"Folders": "Könyvtárak",
|
||||||
"Friday": "Péntek",
|
"Friday": "Péntek",
|
||||||
|
@ -267,7 +267,7 @@
|
||||||
"LabelGroupMoviesIntoCollections": "Filmek csoportosítása gyűjteményekbe",
|
"LabelGroupMoviesIntoCollections": "Filmek csoportosítása gyűjteményekbe",
|
||||||
"LabelH264EncodingPreset": "H264 enkóder beállítások:",
|
"LabelH264EncodingPreset": "H264 enkóder beállítások:",
|
||||||
"LabelHardwareAccelerationType": "Hardveres gyorsítás:",
|
"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}:",
|
"LabelHomeScreenSectionValue": "Kezdőképernyő blokk {0}:",
|
||||||
"LabelImageType": "Kép típusa:",
|
"LabelImageType": "Kép típusa:",
|
||||||
"LabelKodiMetadataDateFormat": "Megjelenési dátum formátuma:",
|
"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.",
|
"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",
|
"Artists": "Előadók",
|
||||||
"Blacklist": "Feketelista",
|
"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.",
|
"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.",
|
"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.",
|
"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ő.",
|
"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.",
|
"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",
|
"EveryNDays": "Minden {0} nap",
|
||||||
"ExtraLarge": "Extra nagy",
|
"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.",
|
"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",
|
"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.",
|
"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",
|
"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.",
|
"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:",
|
"LabelBirthDate": "Születési dátum:",
|
||||||
"LabelBlastMessageInterval": "Élő üzenetintervallum (másodperc)",
|
"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:",
|
"LabelBlockContentWithTags": "Blokkolja a címkével ellátott elemeket:",
|
||||||
"LabelCache": "Gyorsítótár:",
|
"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.",
|
"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",
|
"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ó.",
|
"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",
|
"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.",
|
"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",
|
"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.",
|
"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",
|
"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.",
|
"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:",
|
"LabelEndDate": "Befejezés dátuma:",
|
||||||
"LabelExtractChaptersDuringLibraryScan": "Fejezet képek készítése a könyvtár beolvasása során",
|
"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",
|
"LabelFailed": "Sikertelen",
|
||||||
"LabelFileOrUrl": "Fájl vagy URL:",
|
"LabelFileOrUrl": "Fájl vagy URL:",
|
||||||
"LabelFont": "Betűtípus:",
|
"LabelFont": "Betűtípus:",
|
||||||
"LabelFormat": "Formátum:",
|
"LabelFormat": "Formátum:",
|
||||||
"LabelFriendlyName": "Könnyen megjegyezhető név:",
|
"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.",
|
"LabelGroupMoviesIntoCollectionsHelp": "A filmlisták megjelenítésekor a gyűjteményhez tartozó filmek egy csoportos elemként jelennek meg.",
|
||||||
"LabelH264Crf": "H264 enkóder CRF:",
|
"LabelH264Crf": "H264 enkóder CRF:",
|
||||||
"LabelHomeNetworkQuality": "Otthoni hálózat minősége:",
|
"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.",
|
"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",
|
"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",
|
"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:",
|
"LabelInternetQuality": "Internet minősége:",
|
||||||
"LabelKidsCategories": "Gyermek kategóriák:",
|
"LabelKidsCategories": "Gyermek kategóriák:",
|
||||||
"LabelKodiMetadataDateFormatHelp": "Az nfo-n belüli összes dátum ezzel a formátummal lesz írva és olvasva.",
|
"LabelKodiMetadataDateFormatHelp": "Az NFO-n belüli összes dátum ezzel a formátummal lesz kezelve.",
|
||||||
"LabelKodiMetadataEnableExtraThumbs": "Másolja az extrafanartot extrathumbs-ba",
|
"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.",
|
"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",
|
"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.",
|
"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",
|
"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.",
|
"LabelKodiMetadataSaveImagePathsHelp": "Ez akkor ajánlott, ha olyan képfájlnevek vannak amelyek nem felelnek meg a Kodi irányelveinek.",
|
||||||
"LabelLanNetworks": "LAN hálózatok:",
|
"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",
|
"LabelLockItemToPreventChanges": "Az elem zárolása a jövőbeni változások elkerülése érdekében",
|
||||||
"LabelLoginDisclaimer": "Bejelentkezési nyilatkozat:",
|
"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ó",
|
"LabelManufacturer": "Gyártó",
|
||||||
"LabelManufacturerUrl": "Gyártó url címe",
|
"LabelManufacturerUrl": "Gyártó URL címe",
|
||||||
"LabelMatchType": "Egyezés típusa:",
|
"LabelMatchType": "Egyezés típusa:",
|
||||||
"LabelMaxBackdropsPerItem": "A hátterek maximális száma elemenként:",
|
"LabelMaxBackdropsPerItem": "A hátterek maximális száma elemenként:",
|
||||||
"LabelMaxChromecastBitrate": "Chromecast streaming minősége:",
|
"LabelMaxChromecastBitrate": "Chromecast streaming minősége:",
|
||||||
|
@ -931,7 +931,7 @@
|
||||||
"LabelModelUrl": "Modell URL",
|
"LabelModelUrl": "Modell URL",
|
||||||
"LabelMovieCategories": "Film kategóriák:",
|
"LabelMovieCategories": "Film kategóriák:",
|
||||||
"LabelMoviePrefix": "Film előtag:",
|
"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):",
|
"LabelMovieRecordingPath": "Filmfelvételi útvonal (opcionális):",
|
||||||
"LabelMusicStreamingTranscodingBitrate": "Zene átkódolási bitráta:",
|
"LabelMusicStreamingTranscodingBitrate": "Zene átkódolási bitráta:",
|
||||||
"LabelNewName": "Új név:",
|
"LabelNewName": "Új név:",
|
||||||
|
@ -970,7 +970,7 @@
|
||||||
"OptionDateAddedFileTime": "Használja a fájl létrehozásának dátumát",
|
"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:",
|
"LabelMinBackdropDownloadWidth": "A letöltendő háttérkép minimális szélessége:",
|
||||||
"LabelMinResumeDuration": "A folytatás minimum időtartama:",
|
"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:",
|
"LabelMinResumePercentage": "Minimum folytatás százalékban:",
|
||||||
"LabelMinScreenshotDownloadWidth": "Minimális képernyőkép letöltési szélesség:",
|
"LabelMinScreenshotDownloadWidth": "Minimális képernyőkép letöltési szélesség:",
|
||||||
"LabelPreferredSubtitleLanguage": "Alapértelmezett feliratnyelv:",
|
"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.",
|
"XmlTvSportsCategoriesHelp": "Az ilyen kategóriákkal rendelkező programok sportprogramként jelennek meg. Válaszd el őket a '|' elválasztóval.",
|
||||||
"Yes": "Igen",
|
"Yes": "Igen",
|
||||||
"LabelMaxResumePercentage": "Maximum folytatás százalékban:",
|
"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.",
|
"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",
|
"LabelMusicStreamingTranscodingBitrateHelp": "Határozz meg egy streamelési max bitrátát a zenékhez",
|
||||||
"DashboardVersionNumber": "Verzió: {0}",
|
"DashboardVersionNumber": "Verzió: {0}",
|
||||||
"DashboardServerName": "Szerver: {0}",
|
"DashboardServerName": "Szerver: {0}",
|
||||||
|
@ -1294,7 +1294,7 @@
|
||||||
"LabelUserAgent": "Felhasználó ügynök:",
|
"LabelUserAgent": "Felhasználó ügynök:",
|
||||||
"LabelUserLoginAttemptsBeforeLockout": "Sikertelen bejelentkezési kísérletek a felhasználó zárolása előtt:",
|
"LabelUserLoginAttemptsBeforeLockout": "Sikertelen bejelentkezési kísérletek a felhasználó zárolása előtt:",
|
||||||
"DashboardOperatingSystem": "Operációs rendszer: {0}",
|
"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",
|
"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.",
|
"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.",
|
"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:",
|
"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.",
|
"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:",
|
"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",
|
"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.",
|
"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",
|
"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.",
|
"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.",
|
"LabelIdentificationFieldHelp": "Kis-és nagybetű különbséget figyelmen kívül hagyó szöveg vagy reguláris kifejezés.",
|
||||||
"LabelKeepUpTo": "Őrizd meg:",
|
"LabelKeepUpTo": "Őrizd meg:",
|
||||||
"LabelKodiMetadataUser": "Mentsd el a következő felhasználó megtekintési adatát az nfo-ba:",
|
"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.",
|
"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.",
|
"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.",
|
"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.",
|
"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",
|
"HeaderFavoriteBooks": "Kedvenc Könyvek",
|
||||||
"CopyStreamURLSuccess": "URL másolása sikeres.",
|
"CopyStreamURLSuccess": "URL másolása sikeres.",
|
||||||
"CopyStreamURL": "Stream URL másolása",
|
"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": "보고 있는 것이나 최신 미디어 등을 홈 페이지에 표시합니다",
|
"DisplayInOtherHomeScreenSections": "보고 있는 것이나 최신 미디어 등을 홈 페이지에 표시합니다",
|
||||||
"DisplayMissingEpisodesWithinSeasonsHelp": "서버 환경설정에서도 TV 라이브러리가 활성화되어있어야 합니다.",
|
"DisplayMissingEpisodesWithinSeasonsHelp": "서버 환경설정에서도 TV 라이브러리가 활성화되어있어야 합니다.",
|
||||||
"ErrorAddingMediaPathToVirtualFolder": "미디어 경로를 추가하는 데에 오류가 발생했습니다. 경로를 다시 확인하거나 Jellyfin 서버가 해당 경로에 접근할 수 있는지 확인해 주세요.",
|
"ErrorAddingMediaPathToVirtualFolder": "미디어 경로를 추가하는 데에 오류가 발생했습니다. 경로를 다시 확인하거나 Jellyfin 서버가 해당 경로에 접근할 수 있는지 확인해 주세요.",
|
||||||
"ErrorGettingTvLineups": "TV 구성을 다운로드 하는 중에 오류가 발생하였습니다. 정보가 맞는지 확인한 후 다시 시도해 주세요."
|
"ErrorGettingTvLineups": "TV 구성을 다운로드 하는 중에 오류가 발생하였습니다. 정보가 맞는지 확인한 후 다시 시도해 주세요.",
|
||||||
|
"BoxRear": "상자 (후면)"
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,7 @@
|
||||||
"Director": "Realizador",
|
"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.",
|
"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",
|
"Edit": "Editar",
|
||||||
"EnableCinemaMode": "Ativar modo cinema",
|
"EnableCinemaMode": "Modo cinema",
|
||||||
"Ended": "Terminado",
|
"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.",
|
"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.",
|
"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:",
|
"LabelEpisodeNumber": "Número do episódio:",
|
||||||
"LabelEvent": "Evento:",
|
"LabelEvent": "Evento:",
|
||||||
"LabelEveryXMinutes": "A cada:",
|
"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",
|
"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",
|
"LabelFailed": "Falhou",
|
||||||
"LabelFinish": "Terminar",
|
"LabelFinish": "Terminar",
|
||||||
"LabelForgotPasswordUsernameHelp": "Introduza o seu nome de utilizador, se se recordar.",
|
"LabelForgotPasswordUsernameHelp": "Introduza o seu nome de utilizador, se se recordar.",
|
||||||
"LabelFormat": "Formato:",
|
"LabelFormat": "Formato:",
|
||||||
"LabelFriendlyName": "Nome amigável:",
|
"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",
|
"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.",
|
"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:",
|
"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:",
|
"LabelHttpsPort": "Número do porto HTTPS local:",
|
||||||
"LabelHttpsPortHelp": "Número do porto TCP em que o servidor HTTPS do Jellyfin ficará à escuta.",
|
"LabelHttpsPortHelp": "Número do porto TCP em que o servidor HTTPS do Jellyfin ficará à escuta.",
|
||||||
"LabelIconMaxHeight": "Altura máxima do ícone:",
|
"LabelIconMaxHeight": "Altura máxima do ícone:",
|
||||||
|
@ -364,10 +362,10 @@
|
||||||
"LabelImageType": "Tipo de imagem:",
|
"LabelImageType": "Tipo de imagem:",
|
||||||
"LabelImportOnlyFavoriteChannels": "Restringir a canais marcados como favoritos",
|
"LabelImportOnlyFavoriteChannels": "Restringir a canais marcados como favoritos",
|
||||||
"LabelInNetworkSignInWithEasyPassword": "Ativar acesso dentro da rede com código PIN",
|
"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:",
|
"LabelKodiMetadataDateFormat": "Formato da data de lançamento:",
|
||||||
"LabelKodiMetadataDateFormatHelp": "Todas as datas dentro dos nfo's serão lidas e gravadas usando este formato.",
|
"LabelKodiMetadataDateFormatHelp": "Todas as datas presentes em ficheiros NFO serão analisadas utilizando este formato.",
|
||||||
"LabelKodiMetadataEnableExtraThumbs": "Copiar extrafanart para extrathumbs",
|
"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.",
|
"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",
|
"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.",
|
"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",
|
"LabelLockItemToPreventChanges": "Bloquear este item para evitar alterações futuras",
|
||||||
"LabelLoginDisclaimer": "Aviso legal de login:",
|
"LabelLoginDisclaimer": "Aviso legal de login:",
|
||||||
"LabelLoginDisclaimerHelp": "Este aviso será mostrado na parte inferior da página de login.",
|
"LabelLoginDisclaimerHelp": "Este aviso será mostrado na parte inferior da página de login.",
|
||||||
"LabelManufacturer": "Fabricante:",
|
"LabelManufacturer": "Fabricante",
|
||||||
"LabelManufacturerUrl": "URL do fabricante:",
|
"LabelManufacturerUrl": "URL do Fabricante",
|
||||||
"LabelMatchType": "Tipo de correspondência:",
|
"LabelMatchType": "Tipo de correspondência:",
|
||||||
"LabelMaxBackdropsPerItem": "Número máximo de imagens de fundo por item:",
|
"LabelMaxBackdropsPerItem": "Número máximo de imagens de fundo por item:",
|
||||||
"LabelMaxParentalRating": "Controlo parental máximo permitido:",
|
"LabelMaxParentalRating": "Controlo parental máximo permitido:",
|
||||||
|
@ -408,7 +406,7 @@
|
||||||
"LabelModelUrl": "URL do modelo",
|
"LabelModelUrl": "URL do modelo",
|
||||||
"LabelMonitorUsers": "Monitorizar atividade de:",
|
"LabelMonitorUsers": "Monitorizar atividade de:",
|
||||||
"LabelMusicStreamingTranscodingBitrate": "Taxa de transcodificação de música:",
|
"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:",
|
"LabelName": "Nome:",
|
||||||
"LabelNewPassword": "Nova palavra-passe:",
|
"LabelNewPassword": "Nova palavra-passe:",
|
||||||
"LabelNewPasswordConfirm": "Confirmar nova palavra-passe:",
|
"LabelNewPasswordConfirm": "Confirmar nova palavra-passe:",
|
||||||
|
@ -455,7 +453,7 @@
|
||||||
"LabelSendNotificationToUsers": "Enviar notificação para:",
|
"LabelSendNotificationToUsers": "Enviar notificação para:",
|
||||||
"LabelSerialNumber": "Número de série",
|
"LabelSerialNumber": "Número de série",
|
||||||
"LabelServerHost": "Servidor:",
|
"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",
|
"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.",
|
"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",
|
"LabelSkipIfGraphicalSubsPresent": "Ignorar se o vídeo já possuir legendas integradas",
|
||||||
|
@ -475,7 +473,7 @@
|
||||||
"LabelTimeLimitHours": "Limite de tempo (horas):",
|
"LabelTimeLimitHours": "Limite de tempo (horas):",
|
||||||
"LabelTranscodingAudioCodec": "Codec de áudio:",
|
"LabelTranscodingAudioCodec": "Codec de áudio:",
|
||||||
"LabelTranscodingContainer": "Contentor:",
|
"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:",
|
"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.",
|
"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:",
|
"LabelTranscodingVideoCodec": "Codec do vídeo:",
|
||||||
|
@ -505,7 +503,7 @@
|
||||||
"MessageConfirmRecordingCancellation": "Cancelar a gravação?",
|
"MessageConfirmRecordingCancellation": "Cancelar a gravação?",
|
||||||
"MessageConfirmRestart": "Tem a certeza de que deseja reiniciar o Servidor Jellyfin?",
|
"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.",
|
"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?",
|
"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.",
|
"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}.",
|
"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.",
|
"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",
|
"OptionAllowRemoteControlOthers": "Permitir controlo remoto de outros utilizadores",
|
||||||
"OptionAllowRemoteSharedDevices": "Permitir controlo remoto de dispositivos compartilhados",
|
"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",
|
"OptionAllowUserToManageServer": "Permitir a este utilizador gerir o servidor",
|
||||||
"OptionAllowVideoPlaybackTranscoding": "Permitir reprodução de vídeo que necessite de transcodificação",
|
"OptionAllowVideoPlaybackTranscoding": "Permitir reprodução de vídeo que necessite de transcodificação",
|
||||||
"OptionArtist": "Artista",
|
"OptionArtist": "Artista",
|
||||||
|
@ -599,7 +597,7 @@
|
||||||
"OptionHasThemeVideo": "Vídeo de Tema",
|
"OptionHasThemeVideo": "Vídeo de Tema",
|
||||||
"OptionHideUser": "Ocultar este utilizador nos formulários de início de sessão",
|
"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.",
|
"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",
|
"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.",
|
"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",
|
"OptionImdbRating": "Classificação no IMDb",
|
||||||
|
@ -742,7 +740,7 @@
|
||||||
"UninstallPluginConfirmation": "Tem a certeza de que deseja desinstalar {0}?",
|
"UninstallPluginConfirmation": "Tem a certeza de que deseja desinstalar {0}?",
|
||||||
"UninstallPluginHeader": "Desinstalar Extensão",
|
"UninstallPluginHeader": "Desinstalar Extensão",
|
||||||
"Unmute": "Ativar som",
|
"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}",
|
"ValueAudioCodec": "Codec de Áudio: {0}",
|
||||||
"ValueConditions": "Condições: {0}",
|
"ValueConditions": "Condições: {0}",
|
||||||
"ValueSpecialEpisodeName": "Especial - {0}",
|
"ValueSpecialEpisodeName": "Especial - {0}",
|
||||||
|
@ -751,9 +749,9 @@
|
||||||
"ValueVideoCodec": "Codec de Vídeo: {0}",
|
"ValueVideoCodec": "Codec de Vídeo: {0}",
|
||||||
"Wednesday": "Quarta",
|
"Wednesday": "Quarta",
|
||||||
"WelcomeToProject": "Bem-vindo ao Jellyfin!",
|
"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",
|
"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.",
|
"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.",
|
"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",
|
"AddToCollection": "Adicionar à coleção",
|
||||||
|
@ -834,7 +832,7 @@
|
||||||
"Browse": "Procurar",
|
"Browse": "Procurar",
|
||||||
"BoxRear": "Caixa (verso)",
|
"BoxRear": "Caixa (verso)",
|
||||||
"Box": "Caixa",
|
"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",
|
"BirthLocation": "Local de nascimento",
|
||||||
"AsManyAsPossible": "Tantos quanto possível",
|
"AsManyAsPossible": "Tantos quanto possível",
|
||||||
"Art": "Capa",
|
"Art": "Capa",
|
||||||
|
@ -880,13 +878,13 @@
|
||||||
"GenreValue": "Género: {0}",
|
"GenreValue": "Género: {0}",
|
||||||
"General": "Geral",
|
"General": "Geral",
|
||||||
"FormatValue": "Formato: {0}",
|
"FormatValue": "Formato: {0}",
|
||||||
"FolderTypeUnset": "Conteúdo misto",
|
"FolderTypeUnset": "Conteúdo Misto",
|
||||||
"Filters": "Filtros",
|
"Filters": "Filtros",
|
||||||
"File": "Ficheiro",
|
"File": "Ficheiro",
|
||||||
"Favorite": "Favoritos",
|
"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.",
|
"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",
|
"Extras": "Extras",
|
||||||
"ExtraLarge": "Extra grande",
|
"ExtraLarge": "Extra Grande",
|
||||||
"EveryNDays": "A cada {0} dias",
|
"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.",
|
"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.",
|
"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.",
|
"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",
|
"Episodes": "Episódios",
|
||||||
"EndsAtValue": "Termina às {0}",
|
"EndsAtValue": "Termina às {0}",
|
||||||
"EnablePhotosHelp": "Fotografias serão detetadas e mostradas em conjunto com outros ficheiros multimédia.",
|
"EnablePhotosHelp": "Imagens serão detetadas e mostradas em conjunto com outros ficheiros multimédia.",
|
||||||
"EnablePhotos": "Ativar fotografias",
|
"EnablePhotos": "Mostrar fotografias",
|
||||||
"EnableNextVideoInfoOverlayHelp": "No final de um vídeo, mostrar informação sobre o próximo vídeo da lista de reprodução.",
|
"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",
|
"EnableHardwareEncoding": "Ativar codificação por hardware",
|
||||||
"EnableExternalVideoPlayersHelp": "O menu de um reprodutor externo será mostrado no início da reprodução de vídeo.",
|
"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",
|
"EnableExternalVideoPlayers": "Reprodutores de vídeo externos",
|
||||||
"EnableDisplayMirroring": "Ativar espelho de ecrã",
|
"EnableDisplayMirroring": "Duplicação de ecrã",
|
||||||
"EnableColorCodedBackgrounds": "Ativar código de cores para o fundo",
|
"EnableColorCodedBackgrounds": "Código de cores para o fundo",
|
||||||
"EditSubtitles": "Editar legendas",
|
"EditSubtitles": "Editar legendas",
|
||||||
"EditMetadata": "Editar metadados",
|
"EditMetadata": "Editar metadados",
|
||||||
"EditImages": "Editar imagens",
|
"EditImages": "Editar imagens",
|
||||||
|
@ -912,7 +910,7 @@
|
||||||
"Download": "Transferir",
|
"Download": "Transferir",
|
||||||
"DoNotRecord": "Não gravar",
|
"DoNotRecord": "Não gravar",
|
||||||
"DisplayModeHelp": "Selecione o tipo de ecrã onde o Jellyfin será utilizado.",
|
"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",
|
"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",
|
"DisplayInOtherHomeScreenSections": "Mostrar no ecrã principal em secções como multimédia recente ou continue a ver",
|
||||||
"DisplayInMyMedia": "Mostrar no ecrã principal",
|
"DisplayInMyMedia": "Mostrar no ecrã principal",
|
||||||
|
@ -931,7 +929,7 @@
|
||||||
"MessageContactAdminToResetPassword": "Por favor, contacte o Administrador de sistema para repôr a sua password.",
|
"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?",
|
"MessageConfirmRemoveMediaLocation": "Tem a certeza de que deseja remover esta localização?",
|
||||||
"MessageConfirmDeleteTunerDevice": "Tem a certeza de que deseja remover este dispositivo?",
|
"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",
|
"OptionProtocolHttp": "HTTP",
|
||||||
"OptionProtocolHls": "Emissão HTTP em direto",
|
"OptionProtocolHls": "Emissão HTTP em direto",
|
||||||
"LabelHomeScreenSectionValue": "Secção {0} do Painel Principal:",
|
"LabelHomeScreenSectionValue": "Secção {0} do Painel Principal:",
|
||||||
|
@ -969,7 +967,7 @@
|
||||||
"Items": "Itens",
|
"Items": "Itens",
|
||||||
"InstallingPackage": "A instalar {0}",
|
"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.",
|
"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",
|
"DirectPlaying": "Reprodução direta",
|
||||||
"Backdrop": "Imagem de Fundo",
|
"Backdrop": "Imagem de Fundo",
|
||||||
"SortChannelsBy": "Ordenar canais por:",
|
"SortChannelsBy": "Ordenar canais por:",
|
||||||
|
@ -1050,9 +1048,9 @@
|
||||||
"Display": "Visualização",
|
"Display": "Visualização",
|
||||||
"ManageLibrary": "Gerir biblioteca",
|
"ManageLibrary": "Gerir biblioteca",
|
||||||
"HeaderLibraryOrder": "Ordenação da 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.",
|
"EnableThemeVideosHelp": "Reproduzir 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.",
|
"EnableThemeSongsHelp": "Reproduzir 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.",
|
"EnableBackdropsHelp": "Mostrar imagens de fundo em algumas páginas durante a navegação pela Biblioteca.",
|
||||||
"MediaInfoSize": "Tamanho",
|
"MediaInfoSize": "Tamanho",
|
||||||
"LabelTextSize": "Tamanho do Texto:",
|
"LabelTextSize": "Tamanho do Texto:",
|
||||||
"HeaderSubtitleAppearance": "Aparência das Legendas",
|
"HeaderSubtitleAppearance": "Aparência das Legendas",
|
||||||
|
@ -1082,5 +1080,79 @@
|
||||||
"HeaderMovies": "Filmes",
|
"HeaderMovies": "Filmes",
|
||||||
"DirectorsValue": "Realização: {0}",
|
"DirectorsValue": "Realização: {0}",
|
||||||
"DirectorValue": "Realizador: {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:",
|
"LabelAirsAfterSeason": "Predvajanje po sezoni:",
|
||||||
"LabelAirsBeforeSeason": "Predvajanje pred sezono:",
|
"LabelAirsBeforeSeason": "Predvajanje pred sezono:",
|
||||||
"LabelAlbumArtists": "Izvajalci albuma:",
|
"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",
|
"AllLanguages": "Bütün diller",
|
||||||
"AllowMediaConversion": "Medya dönüşümüne izin ver",
|
"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.",
|
"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": "多次播放",
|
"HeaderFrequentlyPlayed": "多次播放",
|
||||||
"HeaderGenres": "风格",
|
"HeaderGenres": "风格",
|
||||||
"HeaderGuideProviders": "电视指南数据提供方",
|
"HeaderGuideProviders": "电视指南数据提供方",
|
||||||
"HeaderHttpHeaders": "HTTP 标头",
|
"HeaderHttpHeaders": "HTTP 头部",
|
||||||
"HeaderIdentification": "身份识别",
|
"HeaderIdentification": "身份识别",
|
||||||
"HeaderIdentificationCriteriaHelp": "至少输入一个识别标准。",
|
"HeaderIdentificationCriteriaHelp": "至少输入一个识别标准。",
|
||||||
"HeaderIdentificationHeader": "身份认证标头",
|
"HeaderIdentificationHeader": "身份认证标头",
|
||||||
|
@ -868,7 +868,7 @@
|
||||||
"MessageNoPluginsInstalled": "你没有安装插件。",
|
"MessageNoPluginsInstalled": "你没有安装插件。",
|
||||||
"MessageNoTrailersFound": "未发现任何预告片。安装 Trailer channel 以通过添加一个网络预告片媒体库来增强你的电影体验。",
|
"MessageNoTrailersFound": "未发现任何预告片。安装 Trailer channel 以通过添加一个网络预告片媒体库来增强你的电影体验。",
|
||||||
"MessageNothingHere": "这里没有可显示的内容。",
|
"MessageNothingHere": "这里没有可显示的内容。",
|
||||||
"MessagePasswordResetForUsers": "下列用户的密码已重置。现在,可使用重置时的 PIN 码进行登录。",
|
"MessagePasswordResetForUsers": "下列用户的密码已被重置。他们现在可以用执行复位的pin码登录。",
|
||||||
"MessagePleaseEnsureInternetMetadata": "请确认已启用从网络上下载媒体资料的选项。",
|
"MessagePleaseEnsureInternetMetadata": "请确认已启用从网络上下载媒体资料的选项。",
|
||||||
"MessagePleaseWait": "请稍等。这将花费大约1分钟的时间。",
|
"MessagePleaseWait": "请稍等。这将花费大约1分钟的时间。",
|
||||||
"MessagePluginConfigurationRequiresLocalAccess": "请直接登录你的本地服务器以设置这个插件。",
|
"MessagePluginConfigurationRequiresLocalAccess": "请直接登录你的本地服务器以设置这个插件。",
|
||||||
|
@ -1149,7 +1149,7 @@
|
||||||
"ServerNameIsRestarting": "Jellyfin Server - {0} 重启中。",
|
"ServerNameIsRestarting": "Jellyfin Server - {0} 重启中。",
|
||||||
"ServerNameIsShuttingDown": "Jellyfin 服务器 - {0} 正在关闭。",
|
"ServerNameIsShuttingDown": "Jellyfin 服务器 - {0} 正在关闭。",
|
||||||
"ServerRestartNeededAfterPluginInstall": "安装插件后,Jellyfin 服务器需要重启以使插件生效。",
|
"ServerRestartNeededAfterPluginInstall": "安装插件后,Jellyfin 服务器需要重启以使插件生效。",
|
||||||
"ServerUpdateNeeded": "Jellyfin 服务器需要更新,请访问 {0} 以下载最新的版本。",
|
"ServerUpdateNeeded": "Jellyfin 服务器需要更新,请访问 {0} 以下载最新的版本",
|
||||||
"Settings": "设置",
|
"Settings": "设置",
|
||||||
"SettingsSaved": "设置已保存。",
|
"SettingsSaved": "设置已保存。",
|
||||||
"SettingsWarning": "更改这些值可能会导致不稳定或连接故障。如果您遇到任何问题, 我们建议将它们重新更改为默认值。",
|
"SettingsWarning": "更改这些值可能会导致不稳定或连接故障。如果您遇到任何问题, 我们建议将它们重新更改为默认值。",
|
||||||
|
@ -1362,7 +1362,7 @@
|
||||||
"DashboardServerName": "服务器:{0}",
|
"DashboardServerName": "服务器:{0}",
|
||||||
"LabelVideo": "视频:",
|
"LabelVideo": "视频:",
|
||||||
"LabelWeb": "网站: ",
|
"LabelWeb": "网站: ",
|
||||||
"LeaveBlankToNotSetAPassword": "可选 - 留空以设置无密码",
|
"LeaveBlankToNotSetAPassword": "您可以将此字段留空以设置空密码。",
|
||||||
"LinksValue": "链接:{0}",
|
"LinksValue": "链接:{0}",
|
||||||
"LiveBroadcasts": "直播",
|
"LiveBroadcasts": "直播",
|
||||||
"LiveTV": "电视直播",
|
"LiveTV": "电视直播",
|
||||||
|
@ -1383,7 +1383,7 @@
|
||||||
"Option3D": "三维",
|
"Option3D": "三维",
|
||||||
"OptionDownloadLogoImage": "标志",
|
"OptionDownloadLogoImage": "标志",
|
||||||
"OptionLoginAttemptsBeforeLockout": "确定在锁定之前可以进行多少次不正确的登录尝试。",
|
"OptionLoginAttemptsBeforeLockout": "确定在锁定之前可以进行多少次不正确的登录尝试。",
|
||||||
"OptionLoginAttemptsBeforeLockoutHelp": "0 表示默认设置(非管理员 3 次,管理员 5 次),-1 表示不限制次数",
|
"OptionLoginAttemptsBeforeLockoutHelp": "如果值为0,则表示将允许普通用户尝试三次、管理员尝试五次的默认值。将此设置为-1将禁用此功能。",
|
||||||
"PasswordResetProviderHelp": "选择一个密码重置提供者用于密码重置",
|
"PasswordResetProviderHelp": "选择一个密码重置提供者用于密码重置",
|
||||||
"PlaceFavoriteChannelsAtBeginning": "将最喜爱的频道置顶",
|
"PlaceFavoriteChannelsAtBeginning": "将最喜爱的频道置顶",
|
||||||
"PlayNext": "播放下一个",
|
"PlayNext": "播放下一个",
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -10,8 +10,14 @@
|
||||||
<p style="margin:2em 0;">${WizardCompleted}</p>
|
<p style="margin:2em 0;">${WizardCompleted}</p>
|
||||||
|
|
||||||
<div class="wizardNavigation">
|
<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 button-cancel" onclick="history.back();">
|
||||||
<button is="emby-button" type="button" class="raised btnWizardNext button-submit"><i class="md-icon">check</i><span>${LabelFinish}</span></button>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue