mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge pull request #400 from dkanada/url
Add base url option to web client
This commit is contained in:
commit
a6db774318
7 changed files with 83 additions and 32 deletions
|
@ -1,20 +1,16 @@
|
||||||
<div data-role="page" class="page standalonePage">
|
<div data-role="page" class="page standalonePage">
|
||||||
<div class="padded-left padded-right padded-bottom-page">
|
<div class="padded-left padded-right padded-bottom-page">
|
||||||
<form class="manualServerForm" style="margin: 0 auto;">
|
<form class="addServerForm" style="margin: 0 auto;">
|
||||||
<h1 style="text-align: left;">${HeaderConnectToServer}</h1>
|
<h1>${HeaderConnectToServer}</h1>
|
||||||
<div class="inputContainer">
|
<div class="inputContainer">
|
||||||
<input is="emby-input" type="text" id="txtServerHost" required="required" label="${LabelServerHost}" autocomplete="off" spellcheck="false" autocapitalize="none" autocorrect="off" />
|
<input is="emby-input" type="text" id="txtServerHost" required="required" label="${LabelServerHost}" autocomplete="off" spellcheck="false" autocapitalize="none" autocorrect="off" />
|
||||||
<div class="fieldDescription" style="text-align: left;">${LabelServerHostHelp}</div>
|
<div class="fieldDescription">${LabelServerHostHelp}</div>
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<div class="inputContainer">
|
|
||||||
<input is="emby-input" type="number" id="txtServerPort" step="1" min="0" value="8096" label="${LabelServerPort}" />
|
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<button is="emby-button" type="submit" class="raised button-submit block">
|
<button is="emby-button" type="submit" class="raised button-submit block">
|
||||||
<span>${ButtonConnect}</span>
|
<span>${ButtonConnect}</span>
|
||||||
</button>
|
</button>
|
||||||
<button is="emby-button" type="button" class="raised button-cancel block btnCancelManualServer">
|
<button is="emby-button" type="button" class="raised button-cancel block btnCancel">
|
||||||
<span>${ButtonCancel}</span>
|
<span>${ButtonCancel}</span>
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -242,7 +242,7 @@ define(["events", "appStorage"], function(events, appStorage) {
|
||||||
var url = serverAddress || this._serverAddress;
|
var url = serverAddress || this._serverAddress;
|
||||||
if (!url) throw new Error("serverAddress is yet not set");
|
if (!url) throw new Error("serverAddress is yet not set");
|
||||||
var lowered = url.toLowerCase();
|
var lowered = url.toLowerCase();
|
||||||
return -1 === lowered.indexOf("/emby") && -1 === lowered.indexOf("/mediabrowser") && (url += "/emby"), "/" !== name.charAt(0) && (url += "/"), url += name, params && (params = paramsToString(params)) && (url += "?" + params), url
|
return "/" !== name.charAt(0) && (url += "/"), url += name, params && (params = paramsToString(params)) && (url += "?" + params), url
|
||||||
}, ApiClient.prototype.fetchWithFailover = function(request, enableReconnection) {
|
}, ApiClient.prototype.fetchWithFailover = function(request, enableReconnection) {
|
||||||
console.log("Requesting " + request.url), request.timeout = 3e4;
|
console.log("Requesting " + request.url), request.timeout = 3e4;
|
||||||
var instance = this;
|
var instance = this;
|
||||||
|
|
|
@ -40,7 +40,7 @@ define(["events", "apiclient", "appStorage"], function(events, apiClientFactory,
|
||||||
}
|
}
|
||||||
|
|
||||||
function getEmbyServerUrl(baseUrl, handler) {
|
function getEmbyServerUrl(baseUrl, handler) {
|
||||||
return baseUrl + "/emby/" + handler
|
return baseUrl + "/" + handler
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFetchPromise(request) {
|
function getFetchPromise(request) {
|
||||||
|
|
|
@ -6,7 +6,8 @@ define(["appSettings", "loading", "browser", "emby-button"], function(appSetting
|
||||||
switch (result.State) {
|
switch (result.State) {
|
||||||
case "SignedIn":
|
case "SignedIn":
|
||||||
var apiClient = result.ApiClient;
|
var apiClient = result.ApiClient;
|
||||||
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient), Dashboard.navigate("home.html");
|
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient);
|
||||||
|
Dashboard.navigate("home.html");
|
||||||
break;
|
break;
|
||||||
case "ServerSignIn":
|
case "ServerSignIn":
|
||||||
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id, false, "none");
|
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id, false, "none");
|
||||||
|
@ -27,14 +28,9 @@ define(["appSettings", "loading", "browser", "emby-button"], function(appSetting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function submitManualServer(page) {
|
function submitServer(page) {
|
||||||
var host = page.querySelector("#txtServerHost").value;
|
|
||||||
var port = page.querySelector("#txtServerPort").value;
|
|
||||||
if (port) {
|
|
||||||
host += ":" + port;
|
|
||||||
}
|
|
||||||
|
|
||||||
loading.show();
|
loading.show();
|
||||||
|
var host = page.querySelector("#txtServerHost").value;
|
||||||
ConnectionManager.connectToAddress(host, {
|
ConnectionManager.connectToAddress(host, {
|
||||||
enableAutoLogin: appSettings.enableAutoLogin()
|
enableAutoLogin: appSettings.enableAutoLogin()
|
||||||
}).then(function(result) {
|
}).then(function(result) {
|
||||||
|
@ -47,11 +43,11 @@ define(["appSettings", "loading", "browser", "emby-button"], function(appSetting
|
||||||
}
|
}
|
||||||
|
|
||||||
return function(view, params) {
|
return function(view, params) {
|
||||||
view.querySelector(".manualServerForm").addEventListener("submit", onManualServerSubmit);
|
view.querySelector(".addServerForm").addEventListener("submit", onServerSubmit);
|
||||||
view.querySelector(".btnCancelManualServer").addEventListener("click", goBack);
|
view.querySelector(".btnCancel").addEventListener("click", goBack);
|
||||||
|
|
||||||
function onManualServerSubmit(e) {
|
function onServerSubmit(e) {
|
||||||
submitManualServer(view);
|
submitServer(view);
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,25 +2,62 @@ define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"],
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function onSubmit(e) {
|
function onSubmit(e) {
|
||||||
var form = this,
|
var form = this;
|
||||||
localAddress = form.querySelector("#txtLocalAddress").value,
|
var localAddress = form.querySelector("#txtLocalAddress").value;
|
||||||
enableUpnp = form.querySelector("#chkEnableUpnp").checked;
|
var enableUpnp = form.querySelector("#chkEnableUpnp").checked;
|
||||||
confirmSelections(localAddress, enableUpnp, function() {
|
confirmSelections(localAddress, enableUpnp, function() {
|
||||||
var validationResult = getValidationAlert(form);
|
var validationResult = getValidationAlert(form);
|
||||||
if (validationResult) return void alertText(validationResult);
|
if (validationResult) return void alertText(validationResult);
|
||||||
validateHttps(form).then(function() {
|
validateHttps(form).then(function() {
|
||||||
loading.show(), ApiClient.getServerConfiguration().then(function(config) {
|
loading.show();
|
||||||
|
ApiClient.getServerConfiguration().then(function(config) {
|
||||||
config.LocalNetworkSubnets = form.querySelector("#txtLanNetworks").value.split(",").map(function(s) {
|
config.LocalNetworkSubnets = form.querySelector("#txtLanNetworks").value.split(",").map(function(s) {
|
||||||
return s.trim()
|
return s.trim()
|
||||||
}).filter(function(s) {
|
}).filter(function(s) {
|
||||||
return s.length > 0
|
return s.length > 0
|
||||||
}), config.RemoteIPFilter = form.querySelector("#txtExternalAddressFilter").value.split(",").map(function(s) {
|
});
|
||||||
|
|
||||||
|
config.RemoteIPFilter = form.querySelector("#txtExternalAddressFilter").value.split(",").map(function(s) {
|
||||||
return s.trim()
|
return s.trim()
|
||||||
}).filter(function(s) {
|
}).filter(function(s) {
|
||||||
return s.length > 0
|
return s.length > 0
|
||||||
}), config.IsRemoteIPFilterBlacklist = "blacklist" === form.querySelector("#selectExternalAddressFilterMode").value, config.PublicPort = form.querySelector("#txtPublicPort").value, config.PublicHttpsPort = form.querySelector("#txtPublicHttpsPort").value;
|
});
|
||||||
|
|
||||||
|
config.IsRemoteIPFilterBlacklist = "blacklist" === form.querySelector("#selectExternalAddressFilterMode").value;
|
||||||
|
config.PublicPort = form.querySelector("#txtPublicPort").value;
|
||||||
|
config.PublicHttpsPort = form.querySelector("#txtPublicHttpsPort").value;
|
||||||
var httpsMode = form.querySelector("#selectHttpsMode").value;
|
var httpsMode = form.querySelector("#selectHttpsMode").value;
|
||||||
"proxy" === httpsMode ? (config.EnableHttps = !0, config.RequireHttps = !1, config.IsBehindProxy = !0) : "required" === httpsMode ? (config.EnableHttps = !0, config.RequireHttps = !0, config.IsBehindProxy = !1) : "enabled" === httpsMode ? (config.EnableHttps = !0, config.RequireHttps = !1, config.IsBehindProxy = !1) : (config.EnableHttps = !1, config.RequireHttps = !1, config.IsBehindProxy = !1), config.HttpsPortNumber = form.querySelector("#txtHttpsPort").value, config.HttpServerPortNumber = form.querySelector("#txtPortNumber").value, config.EnableUPnP = enableUpnp, config.WanDdns = form.querySelector("#txtDdns").value, config.EnableRemoteAccess = form.querySelector("#chkRemoteAccess").checked, config.CertificatePath = form.querySelector("#txtCertificatePath").value || null, config.CertificatePassword = form.querySelector("#txtCertPassword").value || null, config.LocalNetworkAddresses = localAddress ? [localAddress] : [], ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult, Dashboard.processErrorResponse)
|
switch (httpsMode) {
|
||||||
|
case "proxy":
|
||||||
|
config.EnableHttps = true;
|
||||||
|
config.RequireHttps = false;
|
||||||
|
config.IsBehindProxy = true;
|
||||||
|
break;
|
||||||
|
case "required":
|
||||||
|
config.EnableHttps = true;
|
||||||
|
config.RequireHttps = true;
|
||||||
|
config.IsBehindProxy = false;
|
||||||
|
break;
|
||||||
|
case "enabled":
|
||||||
|
config.EnableHttps = true;
|
||||||
|
config.RequireHttps = false;
|
||||||
|
config.IsBehindProxy = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
config.EnableHttps = false;
|
||||||
|
config.RequireHttps = false;
|
||||||
|
config.IsBehindProxy = false;
|
||||||
|
}
|
||||||
|
config.HttpsPortNumber = form.querySelector("#txtHttpsPort").value;
|
||||||
|
config.HttpServerPortNumber = form.querySelector("#txtPortNumber").value;
|
||||||
|
config.EnableUPnP = enableUpnp;
|
||||||
|
config.WanDdns = form.querySelector("#txtDdns").value;
|
||||||
|
config.BaseUrl = form.querySelector("#txtBaseUrl").value;
|
||||||
|
config.EnableRemoteAccess = form.querySelector("#chkRemoteAccess").checked;
|
||||||
|
config.CertificatePath = form.querySelector("#txtCertificatePath").value || null;
|
||||||
|
config.CertificatePassword = form.querySelector("#txtCertPassword").value || null;
|
||||||
|
config.LocalNetworkAddresses = localAddress ? [localAddress] : [];
|
||||||
|
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult, Dashboard.processErrorResponse);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}), e.preventDefault()
|
}), e.preventDefault()
|
||||||
|
@ -63,11 +100,26 @@ define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"],
|
||||||
|
|
||||||
return function(view, params) {
|
return function(view, params) {
|
||||||
function loadPage(page, config) {
|
function loadPage(page, config) {
|
||||||
page.querySelector("#txtPortNumber").value = config.HttpServerPortNumber, page.querySelector("#txtPublicPort").value = config.PublicPort, page.querySelector("#txtPublicHttpsPort").value = config.PublicHttpsPort, page.querySelector("#txtLocalAddress").value = config.LocalNetworkAddresses[0] || "", page.querySelector("#txtLanNetworks").value = (config.LocalNetworkSubnets || []).join(", "), page.querySelector("#txtExternalAddressFilter").value = (config.RemoteIPFilter || []).join(", "), page.querySelector("#selectExternalAddressFilterMode").value = config.IsRemoteIPFilterBlacklist ? "blacklist" : "whitelist", page.querySelector("#chkRemoteAccess").checked = null == config.EnableRemoteAccess || config.EnableRemoteAccess;
|
page.querySelector("#txtPortNumber").value = config.HttpServerPortNumber;
|
||||||
|
page.querySelector("#txtPublicPort").value = config.PublicPort;
|
||||||
|
page.querySelector("#txtPublicHttpsPort").value = config.PublicHttpsPort;
|
||||||
|
page.querySelector("#txtLocalAddress").value = config.LocalNetworkAddresses[0] || "";
|
||||||
|
page.querySelector("#txtLanNetworks").value = (config.LocalNetworkSubnets || []).join(", ");
|
||||||
|
page.querySelector("#txtExternalAddressFilter").value = (config.RemoteIPFilter || []).join(", ");
|
||||||
|
page.querySelector("#selectExternalAddressFilterMode").value = config.IsRemoteIPFilterBlacklist ? "blacklist" : "whitelist";
|
||||||
|
page.querySelector("#chkRemoteAccess").checked = null == config.EnableRemoteAccess || config.EnableRemoteAccess;
|
||||||
var selectHttpsMode = page.querySelector("#selectHttpsMode");
|
var selectHttpsMode = page.querySelector("#selectHttpsMode");
|
||||||
config.IsBehindProxy ? selectHttpsMode.value = "proxy" : config.RequireHttps ? selectHttpsMode.value = "required" : config.EnableHttps ? selectHttpsMode.value = "enabled" : selectHttpsMode.value = "disabled", page.querySelector("#txtHttpsPort").value = config.HttpsPortNumber, page.querySelector("#txtDdns").value = config.WanDdns || "";
|
config.IsBehindProxy ? selectHttpsMode.value = "proxy" : config.RequireHttps ? selectHttpsMode.value = "required" : config.EnableHttps ? selectHttpsMode.value = "enabled" : selectHttpsMode.value = "disabled";
|
||||||
|
page.querySelector("#txtHttpsPort").value = config.HttpsPortNumber;
|
||||||
|
page.querySelector("#txtDdns").value = config.WanDdns || "";
|
||||||
|
page.querySelector("#txtBaseUrl").value = config.BaseUrl || "";
|
||||||
var txtCertificatePath = page.querySelector("#txtCertificatePath");
|
var txtCertificatePath = page.querySelector("#txtCertificatePath");
|
||||||
txtCertificatePath.value = config.CertificatePath || "", page.querySelector("#txtCertPassword").value = config.CertificatePassword || "", page.querySelector("#chkEnableUpnp").checked = config.EnableUPnP, onCertPathChange.call(txtCertificatePath), triggerChange(page.querySelector("#chkRemoteAccess")), loading.hide()
|
txtCertificatePath.value = config.CertificatePath || "";
|
||||||
|
page.querySelector("#txtCertPassword").value = config.CertificatePassword || "";
|
||||||
|
page.querySelector("#chkEnableUpnp").checked = config.EnableUPnP;
|
||||||
|
onCertPathChange.call(txtCertificatePath);
|
||||||
|
triggerChange(page.querySelector("#chkRemoteAccess"));
|
||||||
|
loading.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onCertPathChange() {
|
function onCertPathChange() {
|
||||||
|
|
|
@ -56,6 +56,11 @@
|
||||||
<div class="fieldDescription">${LabelExternalDDNSHelp}</div>
|
<div class="fieldDescription">${LabelExternalDDNSHelp}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="inputContainer fldBaseUrl">
|
||||||
|
<input is="emby-input" id="txtBaseUrl" type="text" label="${LabelBaseUrl}" />
|
||||||
|
<div class="fieldDescription">${LabelBaseUrlHelp}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="inputContainer fldCertificatePath hide">
|
<div class="inputContainer fldCertificatePath hide">
|
||||||
<div style="display: flex; align-items: center;">
|
<div style="display: flex; align-items: center;">
|
||||||
<div style="flex-grow:1;">
|
<div style="flex-grow:1;">
|
||||||
|
|
|
@ -632,6 +632,8 @@
|
||||||
"LabelEveryXMinutes": "Every:",
|
"LabelEveryXMinutes": "Every:",
|
||||||
"LabelExternalDDNS": "External domain:",
|
"LabelExternalDDNS": "External domain:",
|
||||||
"LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here for clients to use when connecting remotely. This field is required when used with a custom SSL certificate. Example: mydomain.com.",
|
"LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here for clients to use when connecting remotely. This field is required when used with a custom SSL certificate. Example: mydomain.com.",
|
||||||
|
"LabelBaseUrl": "Base URL:",
|
||||||
|
"LabelBaseUrlHelp": "You can add a custom subdirectory here to access the server from a more unique URL.",
|
||||||
"LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan",
|
"LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan",
|
||||||
"LabelExtractChaptersDuringLibraryScanHelp": "If enabled, chapter images will be extracted when videos are imported during the library scan. If disabled they will be extracted during the chapter images scheduled task, allowing the regular library scan to complete faster.",
|
"LabelExtractChaptersDuringLibraryScanHelp": "If enabled, chapter images will be extracted when videos are imported during the library scan. If disabled they will be extracted during the chapter images scheduled task, allowing the regular library scan to complete faster.",
|
||||||
"LabelFailed": "Failed",
|
"LabelFailed": "Failed",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue