diff --git a/src/Jackett/Indexers/ThePirateBay.cs b/src/Jackett/Indexers/ThePirateBay.cs index 511486fb0..715aef264 100644 --- a/src/Jackett/Indexers/ThePirateBay.cs +++ b/src/Jackett/Indexers/ThePirateBay.cs @@ -168,7 +168,7 @@ namespace Jackett.Indexers release.InfoHash = release.MagnetUri.ToString().Split(':')[3].Split('&')[0]; var sizeString = row.ChildElements.ElementAt(4).Cq().Text().Split(' '); - var sizeVal = float.Parse(sizeString[0]); + var sizeVal = float.Parse(sizeString[0], CultureInfo.InvariantCulture); var sizeUnit = sizeString[1]; release.Size = ReleaseInfo.GetBytes(sizeUnit, sizeVal); diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index da08c5216..342743671 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -148,6 +148,8 @@ + + PreserveNewest diff --git a/src/Jackett/WebContent/custom.css b/src/Jackett/WebContent/custom.css new file mode 100644 index 000000000..1fa5cddc4 --- /dev/null +++ b/src/Jackett/WebContent/custom.css @@ -0,0 +1,178 @@ + body { + background-image: url("binding_dark.png"); + background-repeat: repeat; + } + + #page { + border-radius: 6px; + background-color: white; + max-width: 900px; + margin: 0 auto; + margin-top: 30px; + padding: 20px; + margin-bottom: 100px; + } + + .container-fluid { + } + + #templates { + display: none; + } + + .card { + background-color: #f9f9f9; + border-radius: 6px; + box-shadow: 1px 1px 5px 2px #cdcdcd; + padding: 10px; + width: 260px; + display: inline-block; + vertical-align: top; + margin: 10px; + } + + .unconfigured-indexer { + height: 170px; + } + + .indexer { + height: 230px; + } + + .add-indexer { + border: 0; + } + + .indexer-logo { + text-align: center; + } + + .indexer-logo > img { + border: 1px solid #828282; + } + + .indexer-name > h3 { + margin-top: 13px; + text-align: center; + } + + .indexer-buttons { + text-align: center; + } + + .indexer-buttons > .btn { + margin-bottom: 10px; + } + + + .indexer-button-test { + width: 60px; + } + + .indexer-add-content { + color: gray; + text-align: center; + } + + .indexer-add-content > .glyphicon { + font-size: 50px; + vertical-align: bottom; + } + + .indexer-add-content > .light-text { + margin-top: 11px; + font-size: 18px; + margin-left: -5px; + } + + + .indexer-host > input { + font-size: 12px; + padding: 2px; + } + + .setup-item-inputstring { + max-width: 260px; + } + + .spinner { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; + } + + @-moz-keyframes spin { + from { + -moz-transform: rotate(0deg); + } + + to { + -moz-transform: rotate(360deg); + } + } + + @-webkit-keyframes spin { + from { + -webkit-transform: rotate(0deg); + } + + to { + -webkit-transform: rotate(360deg); + } + } + + @keyframes spin { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } + } + + #setup-indexer-go { + width: 70px; + } + + hr { + border-top-color: #cdcdcd; + } + + .input-area { + } + + .input-area > * { + vertical-align: middle; + } + + .input-area > p { + margin-top: 10px; + } + + .input-header { + font-size: 18px; + width: 140px; + display: inline-block; + } + + .input-right { + width: 300px; + display: inline-block; + font-family: monospace; + } + + #sonarr-warning { + display: none; + } + + #logo { + max-width: 50px; + } + + #header-title { + font-size: 34px; + vertical-align: middle; + padding-left: 15px; + } \ No newline at end of file diff --git a/src/Jackett/WebContent/custom.js b/src/Jackett/WebContent/custom.js new file mode 100644 index 000000000..6ca36f85f --- /dev/null +++ b/src/Jackett/WebContent/custom.js @@ -0,0 +1,296 @@ + + +reloadIndexers(); +loadSonarrInfo(); + +function loadSonarrInfo() { + getSonarrConfig(function (data) { + $("#sonarr-host").val(""); + var host, port, apiKey; + for (var i = 0; i < data.config.length; i++) { + if (data.config[i].id == "host") + host = data.config[i].value; + if (data.config[i].id == "port") + port = data.config[i].value; + if (data.config[i].id == "apikey") + apiKey = data.config[i].value; + } + if (!apiKey) + $("#sonarr-warning").show(); + else { + $("#sonarr-warning").hide(); + $("#sonarr-host").val(host + ":" + port); + } + }); +} + +function getSonarrConfig(callback) { + var jqxhr = $.get("get_sonarr_config", function (data) { + callback(data); + }).fail(function () { + doNotify("Error loading Sonarr API configuration, request to Jackett server failed", "danger", "glyphicon glyphicon-alert"); + }); +} + +$("#sonarr-test").click(function () { + var jqxhr = $.get("get_indexers", function (data) { + if (data.result == "error") + doNotify("Test failed for Sonarr API\n" + data.error, "danger", "glyphicon glyphicon-alert"); + else + doNotify("Test successful for Sonarr API", "success", "glyphicon glyphicon-ok"); + }).fail(function () { + doNotify("Error testing Sonarr, request to Jackett server failed", "danger", "glyphicon glyphicon-alert"); + }); +}); + +$("#sonarr-settings").click(function () { + getSonarrConfig(function (data) { + var config = data.config; + + var configForm = newConfigModal("Sonarr API", config); + + var $goButton = configForm.find(".setup-indexer-go"); + $goButton.click(function () { + var data = getConfigModalJson(configForm); + + var originalBtnText = $goButton.html(); + $goButton.prop('disabled', true); + $goButton.html($('#templates > .spinner')[0].outerHTML); + + var jqxhr = $.post("apply_sonarr_config", JSON.stringify(data), function (data) { + if (data.result == "error") { + if (data.config) { + populateSetupForm(data.indexer, data.name, data.config); + } + doNotify("Configuration failed: " + data.error, "danger", "glyphicon glyphicon-alert"); + } + else { + configForm.modal("hide"); + loadSonarrInfo(); + doNotify("Successfully configured Sonarr API", "success", "glyphicon glyphicon-ok"); + } + }).fail(function () { + doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert"); + }).always(function () { + $goButton.html(originalBtnText); + $goButton.prop('disabled', false); + }); + }); + + configForm.modal("show"); + + }); +}); + + +function reloadIndexers() { + $('#indexers').hide(); + $('#indexers > .indexer').remove(); + $('#unconfigured-indexers').empty(); + var jqxhr = $.get("get_indexers", function (data) { + $("#api-key-input").val(data.api_key); + displayIndexers(data.items); + }).fail(function () { + doNotify("Error loading indexers, request to Jackett server failed", "danger", "glyphicon glyphicon-alert"); + }); +} + +function displayIndexers(items) { + var indexerTemplate = Handlebars.compile($("#templates > .configured-indexer")[0].outerHTML); + var unconfiguredIndexerTemplate = Handlebars.compile($("#templates > .unconfigured-indexer")[0].outerHTML); + for (var i = 0; i < items.length; i++) { + var item = items[i]; + item.torznab_host = resolveUrl("/api/" + item.id); + if (item.configured) + $('#indexers').append(indexerTemplate(item)); + else + $('#unconfigured-indexers').append($(unconfiguredIndexerTemplate(item))); + } + + var addIndexerButton = $("#templates > .add-indexer")[0].outerHTML; + $('#indexers').append(addIndexerButton); + + $('#indexers').fadeIn(); + prepareSetupButtons(); + prepareTestButtons(); + prepareDeleteButtons(); +} + +function prepareDeleteButtons() { + $(".indexer-button-delete").each(function (i, btn) { + var $btn = $(btn); + var id = $btn.data("id"); + $btn.click(function () { + var jqxhr = $.post("delete_indexer", JSON.stringify({ indexer: id }), function (data) { + if (data.result == "error") { + doNotify("Delete error for " + id + "\n" + data.error, "danger", "glyphicon glyphicon-alert"); + } + else { + doNotify("Deleted " + id, "success", "glyphicon glyphicon-ok"); + } + }).fail(function () { + doNotify("Error deleting indexer, request to Jackett server error", "danger", "glyphicon glyphicon-alert"); + }).always(function () { + reloadIndexers(); + }); + }); + }); +} + +function prepareSetupButtons() { + $('.indexer-setup').each(function (i, btn) { + var $btn = $(btn); + var id = $btn.data("id"); + $btn.click(function () { + displayIndexerSetup(id); + }); + }); +} + +function prepareTestButtons() { + $(".indexer-button-test").each(function (i, btn) { + var $btn = $(btn); + var id = $btn.data("id"); + $btn.click(function () { + doNotify("Test started for " + id, "info", "glyphicon glyphicon-transfer"); + var jqxhr = $.post("test_indexer", JSON.stringify({ indexer: id }), function (data) { + if (data.result == "error") { + doNotify("Test failed for " + data.name + "\n" + data.error, "danger", "glyphicon glyphicon-alert"); + } + else { + doNotify("Test successful for " + data.name, "success", "glyphicon glyphicon-ok"); + } + }).fail(function () { + doNotify("Error testing indexer, request to Jackett server error", "danger", "glyphicon glyphicon-alert"); + }); + }); + }); +} + +function displayIndexerSetup(id) { + + var jqxhr = $.post("get_config_form", JSON.stringify({ indexer: id }), function (data) { + if (data.result == "error") { + doNotify("Error: " + data.error, "danger", "glyphicon glyphicon-alert"); + return; + } + populateSetupForm(id, data.name, data.config); + + }).fail(function () { + doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert"); + }); + + $("#select-indexer-modal").modal("hide"); +} + +function populateConfigItems(configForm, config) { + var $formItemContainer = configForm.find(".config-setup-form"); + $formItemContainer.empty(); + var setupItemTemplate = Handlebars.compile($("#templates > .setup-item")[0].outerHTML); + for (var i = 0; i < config.length; i++) { + var item = config[i]; + var setupValueTemplate = Handlebars.compile($("#templates > .setup-item-" + item.type)[0].outerHTML); + item.value_element = setupValueTemplate(item); + $formItemContainer.append(setupItemTemplate(item)); + } +} + +function newConfigModal(title, config) { + //config-setup-modal + var configTemplate = Handlebars.compile($("#templates > .config-setup-modal")[0].outerHTML); + var configForm = $(configTemplate({ title: title })); + + $("#modals").append(configForm); + + populateConfigItems(configForm, config); + + return configForm; + //modal.remove(); +} + +function getConfigModalJson(configForm) { + var configJson = {}; + configForm.find(".config-setup-form").children().each(function (i, el) { + $el = $(el); + var type = $el.data("type"); + var id = $el.data("id"); + switch (type) { + case "inputstring": + configJson[id] = $el.find(".setup-item-inputstring").val(); + break; + case "inputbool": + configJson[id] = $el.find(".setup-item-checkbox").val(); + break; + } + }); + return configJson; +} + +function populateSetupForm(indexerId, name, config) { + + var configForm = newConfigModal(name, config); + + var $goButton = configForm.find(".setup-indexer-go"); + $goButton.click(function () { + var data = { indexer: indexerId, name: name }; + data.config = getConfigModalJson(configForm); + + var originalBtnText = $goButton.html(); + $goButton.prop('disabled', true); + $goButton.html($('#templates > .spinner')[0].outerHTML); + + var jqxhr = $.post("configure_indexer", JSON.stringify(data), function (data) { + if (data.result == "error") { + if (data.config) { + populateConfigItems(configForm, data.config); + } + doNotify("Configuration failed: " + data.error, "danger", "glyphicon glyphicon-alert"); + } + else { + configForm.modal("hide"); + reloadIndexers(); + doNotify("Successfully configured " + data.name, "success", "glyphicon glyphicon-ok"); + } + }).fail(function () { + doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert"); + }).always(function () { + $goButton.html(originalBtnText); + $goButton.prop('disabled', false); + }); + }); + + configForm.modal("show"); +} + +function resolveUrl(url) { + var a = document.createElement('a'); + a.href = url; + url = a.href; + return url; +} + + + +function doNotify(message, type, icon) { + $.notify({ + message: message, + icon: icon + }, { + element: 'body', + type: type, + allow_dismiss: true, + z_index: 9000, + mouse_over: 'pause', + placement: { + from: "bottom", + align: "center" + } + }); +} + +function clearNotifications() { + $('[data-notify="container"]').remove(); +} + +$('#test').click(doNotify); + diff --git a/src/Jackett/WebContent/index.html b/src/Jackett/WebContent/index.html index f54b8f533..45c5af196 100644 --- a/src/Jackett/WebContent/index.html +++ b/src/Jackett/WebContent/index.html @@ -13,188 +13,9 @@ + Jackett -
@@ -341,305 +162,7 @@
- + \ No newline at end of file