From 8f3a04e720a3fee85239aa170bdd500caebadf82 Mon Sep 17 00:00:00 2001 From: TheOtherP Date: Sun, 11 Apr 2021 13:39:59 +0200 Subject: [PATCH] Custom mapping for queries and titles. This allows you to customize / change the values used by external tools or returned by metadata providers like TVDB. Closes #700. Closes #638 --- .gitignore | 3 +- .../java/org/nzbhydra/api/ExternalApi.java | 4 + .../org/nzbhydra/config/SearchingConfig.java | 15 + .../downloaders/nzbget/NzbGet.java | 2 +- .../org/nzbhydra/logging/LoggingMarkers.java | 1 + .../searching/CustomSearchRequestMapping.java | 246 + .../org/nzbhydra/searching/SearchWeb.java | 3 + .../searchrequests/SearchRequest.java | 14 + .../searchrequests/SearchRequestFactory.java | 1 + core/src/main/resources/changelog.json | 7584 ++++++++++------- core/src/main/resources/config/baseConfig.yml | 1 + .../main/resources/static/css/dark.css.map | 2 +- .../main/resources/static/css/grey.css.map | 2 +- core/src/main/resources/static/js/nzbhydra.js | 124 + .../main/resources/static/js/nzbhydra.js.map | 2 +- .../src/main/resources/static/js/templates.js | 3 +- .../CustomSearchRequestMappingTest.java | 111 + core/ui-src/html/custom-mapping-help.html | 71 + core/ui-src/html/states/config.html | 14 +- .../ui-src/js/config/config-fields-service.js | 74 +- core/ui-src/js/config/formly-config.js | 51 + core/ui-src/less/grey.less | 3 +- 22 files changed, 5116 insertions(+), 3215 deletions(-) create mode 100644 core/src/main/java/org/nzbhydra/searching/CustomSearchRequestMapping.java create mode 100644 core/src/test/java/org/nzbhydra/searching/CustomSearchRequestMappingTest.java create mode 100644 core/ui-src/html/custom-mapping-help.html diff --git a/.gitignore b/.gitignore index 26cba6cf6..61a5a0c85 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ pom.xml.versionsBackup *.bak *.phd javacore* -heapdump* \ No newline at end of file +heapdump* +/ui diff --git a/core/src/main/java/org/nzbhydra/api/ExternalApi.java b/core/src/main/java/org/nzbhydra/api/ExternalApi.java index e39c13598..997ea03f3 100644 --- a/core/src/main/java/org/nzbhydra/api/ExternalApi.java +++ b/core/src/main/java/org/nzbhydra/api/ExternalApi.java @@ -21,6 +21,7 @@ import org.nzbhydra.mapping.newznab.xml.NewznabXmlError; import org.nzbhydra.mediainfo.Imdb; import org.nzbhydra.mediainfo.MediaIdType; import org.nzbhydra.searching.CategoryProvider; +import org.nzbhydra.searching.CustomSearchRequestMapping; import org.nzbhydra.searching.SearchResult; import org.nzbhydra.searching.Searcher; import org.nzbhydra.searching.dtoseventsenums.DownloadType; @@ -88,6 +89,8 @@ public class ExternalApi { private CapsGenerator capsGenerator; @Autowired private MockSearch mockSearch; + @Autowired + private CustomSearchRequestMapping customSearchRequestMapping; protected Clock clock = Clock.systemUTC(); private final Random random = new Random(); @@ -328,6 +331,7 @@ public class ExternalApi { searchRequest.getInternalData().setIncludePasswords(true); } searchRequest = searchRequestFactory.extendWithSavedIdentifiers(searchRequest); + searchRequest = customSearchRequestMapping.mapSearchRequest(searchRequest); return searchRequest; } diff --git a/core/src/main/java/org/nzbhydra/config/SearchingConfig.java b/core/src/main/java/org/nzbhydra/config/SearchingConfig.java index 048006445..8c29fc611 100644 --- a/core/src/main/java/org/nzbhydra/config/SearchingConfig.java +++ b/core/src/main/java/org/nzbhydra/config/SearchingConfig.java @@ -6,12 +6,15 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.google.common.base.Strings; import lombok.Data; import org.nzbhydra.indexers.QueryGenerator; +import org.nzbhydra.searching.CustomSearchRequestMapping; +import org.nzbhydra.searching.searchrequests.SearchRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Optional; @@ -29,6 +32,7 @@ public class SearchingConfig extends ValidatingConfig { @JsonFormat(shape = Shape.STRING) private SearchSourceRestriction applyRestrictions = SearchSourceRestriction.BOTH; private int coverSize = 128; + private List customMappings = new ArrayList<>(); private Integer globalCacheTimeMinutes; private float duplicateAgeThreshold = 2.0F; private float duplicateSizeThresholdInPercent = 1.0F; @@ -111,6 +115,17 @@ public class SearchingConfig extends ValidatingConfig { warnings.add("You selected not to apply any word restrictions in \"Searching\" but supplied a forbidden or required regex there"); } } + final CustomSearchRequestMapping customSearchRequestMapping = new CustomSearchRequestMapping(); + final SearchRequest searchRequest = new SearchRequest(); + searchRequest.setTitle("test title"); + searchRequest.setQuery("test query"); + for (CustomSearchRequestMapping.Mapping customMapping : newConfig.getCustomMappings()) { + try { + customSearchRequestMapping.mapSearchRequest(searchRequest, Collections.singletonList(customMapping)); + } catch (Exception e) { + errors.add(String.format("Unable to process mapping %s:}\n%s", customMapping.toString(), e.getMessage())); + } + } return new ConfigValidationResult(errors.isEmpty(), false, errors, warnings); } diff --git a/core/src/main/java/org/nzbhydra/downloading/downloaders/nzbget/NzbGet.java b/core/src/main/java/org/nzbhydra/downloading/downloaders/nzbget/NzbGet.java index a8b59b63b..11bbeebc5 100644 --- a/core/src/main/java/org/nzbhydra/downloading/downloaders/nzbget/NzbGet.java +++ b/core/src/main/java/org/nzbhydra/downloading/downloaders/nzbget/NzbGet.java @@ -348,7 +348,7 @@ public class NzbGet extends Downloader { if (nzbId <= 0) { throw new DownloaderException("NZBGet returned error code. Check its logs"); } - logger.info("Successfully added NZB \"{}\" to NZBGet queue with ID {} in category {}", title, nzbId, category); + logger.info("Successfully added NZB \"{}\" to NZBGet queue with ID {} in category \"{}\"", title, nzbId, category); return String.valueOf(nzbId); } diff --git a/core/src/main/java/org/nzbhydra/logging/LoggingMarkers.java b/core/src/main/java/org/nzbhydra/logging/LoggingMarkers.java index 277879f6b..e1e47e273 100644 --- a/core/src/main/java/org/nzbhydra/logging/LoggingMarkers.java +++ b/core/src/main/java/org/nzbhydra/logging/LoggingMarkers.java @@ -6,6 +6,7 @@ import org.slf4j.MarkerFactory; public class LoggingMarkers { public static final Marker CONFIG_READ_WRITE = MarkerFactory.getMarker("CONFIG_READ_WRITE"); + public static final Marker CUSTOM_MAPPING = MarkerFactory.getMarker("CUSTOM_MAPPING"); public static final Marker DOWNLOADER_STATUS_UPDATE = MarkerFactory.getMarker("DOWNLOADER_STATUS_UPDATE"); public static final Marker DOWNLOAD_STATUS_UPDATE = MarkerFactory.getMarker("DOWNLOAD_STATUS_UPDATE"); public static final Marker DUPLICATES = MarkerFactory.getMarker("DUPLICATES"); diff --git a/core/src/main/java/org/nzbhydra/searching/CustomSearchRequestMapping.java b/core/src/main/java/org/nzbhydra/searching/CustomSearchRequestMapping.java new file mode 100644 index 000000000..8788e50f5 --- /dev/null +++ b/core/src/main/java/org/nzbhydra/searching/CustomSearchRequestMapping.java @@ -0,0 +1,246 @@ +/* + * (C) Copyright 2021 TheOtherP (theotherp@posteo.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.nzbhydra.searching; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.google.common.base.Joiner; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.nzbhydra.config.ConfigProvider; +import org.nzbhydra.logging.LoggingMarkers; +import org.nzbhydra.searching.dtoseventsenums.SearchType; +import org.nzbhydra.searching.searchrequests.SearchRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.security.access.annotation.Secured; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.StringJoiner; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +@Component +@RestController +public class CustomSearchRequestMapping { + + public enum AffectedValue { + TITLE, + QUERY + } + + private static final Logger logger = LoggerFactory.getLogger(CustomSearchRequestMapping.class); + + @Autowired + private ConfigProvider configProvider; + + + public SearchRequest mapSearchRequest(SearchRequest searchRequest) { + return mapSearchRequest(searchRequest, configProvider.getBaseConfig().getSearching().getCustomMappings()); + } + + public SearchRequest mapSearchRequest(SearchRequest searchRequest, List mappings) { + final List datasets = mappings.stream() + .filter(x -> searchRequest.getSearchType() == x.searchType) + .filter(mapping -> isDatasetMatch(searchRequest, mapping)) + .filter(mapping -> { + if (mapping.to.contains("{season") && !searchRequest.getSeason().isPresent()) { + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "Can't use mapping {} because no season information is available for {}", mapping, searchRequest.simpleToString()); + return false; + } + if (mapping.to.contains("{episode") && !searchRequest.getEpisode().isPresent()) { + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "Can't use mapping {} because no episode information is available for {}", mapping, searchRequest.simpleToString()); + return false; + } + return true; + }) + .collect(Collectors.toList()); + + if (datasets.isEmpty()) { + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "No datasets found matching: {}", searchRequest.simpleToString()); + return searchRequest; + } + if (datasets.size() > 1) { + logger.error("Unable to map search request ({}) because multiple mappings match it:\n{}", searchRequest.simpleToString(), Joiner.on("\n").join(mappings)); + return searchRequest; + } + final Mapping mapping = datasets.get(0); + if (mapping.affectedValue == AffectedValue.TITLE) { + logger.debug(""); + } + + mapSearchRequest(searchRequest, mapping); + + return searchRequest; + } + + @SuppressWarnings("OptionalGetWithoutIsPresent") + @Secured({"ROLE_ADMIN"}) + @RequestMapping(value = "/internalapi/customMapping/test", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) + public TestResponse testMapping(@RequestBody TestRequest testRequest) { + SearchRequest searchRequest = new SearchRequest(); + final String exampleInput = testRequest.exampleInput; + if (!testRequest.mapping.getFromPattern().matcher(exampleInput).matches()) { + return new TestResponse(null, null, false); + } + if (testRequest.mapping.affectedValue == AffectedValue.TITLE) { + searchRequest.setTitle(exampleInput); + } else { + searchRequest.setQuery(exampleInput); + } + searchRequest.setSearchType(testRequest.mapping.searchType); + searchRequest.setSeason(1); + searchRequest.setEpisode("1"); + try { + mapSearchRequest(searchRequest, testRequest.mapping); + if (testRequest.mapping.affectedValue == AffectedValue.TITLE) { + return new TestResponse(searchRequest.getTitle().get(), null, true); + } else { + return new TestResponse(searchRequest.getQuery().get(), null, true); + } + } catch (Exception e) { + return new TestResponse(null, e.getMessage(), false); + } + + } + + + @SuppressWarnings("OptionalGetWithoutIsPresent") + protected void mapSearchRequest(SearchRequest searchRequest, Mapping mapping) { + //What should happen: q=Boku no Hero Academia S4, season=4, ep=21 -> Boku no Hero Academia s04e21 + //What the user should enter roughly: {0:(my hero academia|Boku no Hero Academia) {ignore:.*} -> {0} s{season:00} e{episode:00} + //How it's configured: "TVSEARCH;QUERY;{0:(my hero academia|Boku no Hero Academia) {ignore:.*};{0} s{season:00} e{episode:00}" + + //{title:the haunting} {0:.*} -> The Haunting of Bly Manor {0} + + if (mapping.affectedValue == AffectedValue.QUERY) { + final String newQuery = mapValue(searchRequest, mapping, searchRequest.getQuery().get()); + searchRequest.setQuery(newQuery); + } else if (mapping.affectedValue == AffectedValue.TITLE) { + final String newTitle = mapValue(searchRequest, mapping, searchRequest.getTitle().get()); + searchRequest.setTitle(newTitle); + } + } + + private String mapValue(SearchRequest searchRequest, Mapping mapping, String value) { + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "Mapping input \"{}\" using dataset \"{}\"", value, mapping); + String mappedValue = value; + + String replacementRegex = mapping.to; + if (mapping.searchType == SearchType.TVSEARCH) { + if (searchRequest.getSeason().isPresent()) { + replacementRegex = replacementRegex.replace("{season:00}", String.format("%02d", searchRequest.getSeason().get())); + replacementRegex = replacementRegex.replace("{season:0}", String.valueOf(searchRequest.getSeason().get())); + } + if (searchRequest.getEpisode().isPresent()) { + try { + Integer episode = Integer.parseInt(searchRequest.getEpisode().get()); + replacementRegex = replacementRegex.replace("{episode:00}", String.format("%02d", episode)); + replacementRegex = replacementRegex.replace("{episode:0}", episode.toString()); + } catch (NumberFormatException ignored) { + } + replacementRegex = replacementRegex.replace("{episode}", searchRequest.getEpisode().get()); + } + } + replacementRegex = replacementRegex.replaceAll("\\{(?[^\\^}].*)}", "\\$\\{hydra${groupName}\\}"); + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "Mapping input \"{}\" using replacement regex \"{}\"", value, replacementRegex); + mappedValue = mappedValue.replaceAll(mapping.getFromPattern().pattern(), replacementRegex); + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "Mapped input \"{}\" to \"{}\"", value, mappedValue); + return mappedValue; + } + + protected boolean isDatasetMatch(SearchRequest searchRequest, Mapping mapping) { + if (mapping.affectedValue == AffectedValue.QUERY && searchRequest.getQuery().isPresent()) { + final boolean matches = mapping.getFromPattern().matcher(searchRequest.getQuery().get()).matches(); + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "Query \"{}\" matches regex \"{}\": {}", searchRequest.getQuery().get(), mapping.getFromPattern().pattern(), matches); + return matches; + } + if (mapping.affectedValue == AffectedValue.TITLE && searchRequest.getTitle().isPresent()) { + final boolean matches = mapping.getFromPattern().matcher(searchRequest.getTitle().get()).matches(); + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "Title \"{}\" matches regex \"{}\": {}", searchRequest.getTitle().get(), mapping.getFromPattern().pattern(), matches); + return matches; + } + logger.debug(LoggingMarkers.CUSTOM_MAPPING, "Dataset does not match search request.\nDataset: {}\nSearch request:{}", mapping.from, searchRequest.simpleToString()); + return false; + } + + @Data + public static class Mapping { + + private SearchType searchType; + private AffectedValue affectedValue; + private String from; + private String to; + @JsonIgnore + private Pattern fromPattern; + + public Mapping() { + } + + public Mapping(String configValue) { + final String[] split = configValue.split(";"); + if (split.length != 4) { + throw new IllegalArgumentException("Unable to parse value: " + configValue); + } + this.searchType = SearchType.valueOf(split[0].toUpperCase()); + this.affectedValue = AffectedValue.valueOf(split[1].toUpperCase()); + this.from = split[2]; + this.to = split[3]; + } + + @JsonIgnore + public Pattern getFromPattern() { + if (fromPattern == null) { + String regex = from.replaceAll("\\{(?[^:]*):(?[^\\{\\}]*)\\}", "(?${hydraContent})"); + fromPattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); + } + return fromPattern; + } + + @Override + public String toString() { + return new StringJoiner(", ", Mapping.class.getSimpleName() + "[", "]") + .add("from='" + from + "'") + .add("to='" + to + "'") + .toString(); + } + } + + @Data + static class TestRequest { + private Mapping mapping; + private String exampleInput; + } + + + @Data + @AllArgsConstructor + static class TestResponse { + private final String output; + private final String error; + private boolean isMatch; + + + } + +} diff --git a/core/src/main/java/org/nzbhydra/searching/SearchWeb.java b/core/src/main/java/org/nzbhydra/searching/SearchWeb.java index cef46d0e1..279eb4b12 100644 --- a/core/src/main/java/org/nzbhydra/searching/SearchWeb.java +++ b/core/src/main/java/org/nzbhydra/searching/SearchWeb.java @@ -51,6 +51,8 @@ public class SearchWeb { private InternalSearchResultProcessor searchResultProcessor; @Autowired private SimpMessageSendingOperations messagingTemplate; + @Autowired + private CustomSearchRequestMapping customSearchRequestMapping; private final Lock lock = new ReentrantLock(); @@ -142,6 +144,7 @@ public class SearchWeb { } searchRequest = searchRequestFactory.extendWithSavedIdentifiers(searchRequest); + searchRequest = customSearchRequestMapping.mapSearchRequest(searchRequest); //Initialize messages for this search request final SearchState searchState = new SearchState(searchRequest.getSearchRequestId()); diff --git a/core/src/main/java/org/nzbhydra/searching/searchrequests/SearchRequest.java b/core/src/main/java/org/nzbhydra/searching/searchrequests/SearchRequest.java index 00bd97e0b..7e0d625e1 100644 --- a/core/src/main/java/org/nzbhydra/searching/searchrequests/SearchRequest.java +++ b/core/src/main/java/org/nzbhydra/searching/searchrequests/SearchRequest.java @@ -161,6 +161,20 @@ public class SearchRequest { .toString(); } + public String simpleToString() { + return MoreObjects.toStringHelper(this) + .add("searchType", searchType) + .add("category", category.getName()) + .add("query", query) + .add("identifiers", identifiers) + .add("title", title) + .add("season", season) + .add("episode", episode) + .add("author", author) + .omitNullValues() + .toString(); + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/core/src/main/java/org/nzbhydra/searching/searchrequests/SearchRequestFactory.java b/core/src/main/java/org/nzbhydra/searching/searchrequests/SearchRequestFactory.java index 96c4b791a..aa8beaa99 100644 --- a/core/src/main/java/org/nzbhydra/searching/searchrequests/SearchRequestFactory.java +++ b/core/src/main/java/org/nzbhydra/searching/searchrequests/SearchRequestFactory.java @@ -64,4 +64,5 @@ public class SearchRequestFactory { return request; } + } diff --git a/core/src/main/resources/changelog.json b/core/src/main/resources/changelog.json index 94a952e49..ed2e2aa0d 100644 --- a/core/src/main/resources/changelog.json +++ b/core/src/main/resources/changelog.json @@ -1,3204 +1,4380 @@ -[ { - "version" : "v3.13.2", - "date" : "2021-03-20", - "changes" : [ { - "type" : "fix", - "text" : "Fix connection check for nzbgeek. See #695." - }, { - "type" : "note", - "text" : "Java 16 is not supported. See #697." - } ], - "final" : true -}, { - "version" : "v3.13.1", - "date" : "2021-03-10", - "changes" : [ { - "type" : "fix", - "text" : "Fix external configuration of Readarr (0.1.0.520+). See #693." - } ], - "final" : true -}, { - "version" : "v3.13.0", - "date" : "2021-02-23", - "changes" : [ { - "type" : "feature", - "text" : "From now on I'll refer to the appropriate GitHub issues in the changelog (if I don't forget it)." - }, { - "type" : "fix", - "text" : "Improve category detection for MyAnonaMouse. See #689." - }, { - "type" : "fix", - "text" : "Don't crash GUI when result titles are empty. See #690." - }, { - "type" : "fix", - "text" : "Clarify the restrictions section in the auth config. See #687." - } ], - "final" : true -}, { - "version" : "v3.12.0", - "date" : "2021-02-13", - "changes" : [ { - "type" : "feature", - "text" : "Add button to send results to black hole from download history. See #685" - }, { - "type" : "feature", - "text" : "Add support for custom parameters to be sent to indexers while searching. See #647" - }, { - "type" : "fix", - "text" : "Download status bar did not update properly when the downloader was idle after a download. The bar will now be updated until either a new download is started or the bar is properly filled, representing the downloader's idle state. This should hopefully also fix the long-standing issue with the browser tab freezing / crashing after a while." - }, { - "type" : "fix", - "text" : "Ensure that threads which send data to the frontend (like notifications or downloader status) are only active when a UI session (=browser tab) is open. Also only send downloader data if it's actually new (instead of e.g. repeatedly sending information that the downloader is idle." - }, { - "type" : "fix", - "text" : "Remove code for nzbs.org :-(" - } ], - "final" : true -}, { - "version" : "v3.11.4", - "date" : "2021-02-08", - "changes" : [ { - "type" : "fix", - "text" : "Fix warning \"Destroy method on bean...\" when shutting down NZBHydra." - }, { - "type" : "fix", - "text" : "Fix automatic configuration of Sonarr and Radarr v3." - } ], - "final" : true -}, { - "version" : "v3.11.3", - "date" : "2021-01-31", - "changes" : [ { - "type" : "fix", - "text" : "Fix an issue where the backup folder was not properly validated when saving the config. Too bad I don't get paid by the update (=bug)." - } ], - "final" : true -}, { - "version" : "v3.11.2", - "date" : "2021-01-31", - "changes" : [ { - "type" : "fix", - "text" : "Fix a websocket issue when using a reverse proxy. Should've tested that better... If you're running NZBHydra behind a reverse proxy please see https://github.com/theotherp/nzbhydra2/issues/683#issuecomment-770444576." - } ], - "final" : true -}, { - "version" : "v3.11.1", - "date" : "2021-01-31", - "changes" : [ { - "type" : "fix", - "text" : "Introduced a stupid bug in v3.11.0 which prevented all but one particular indexer from being selected. Sorry about that." - } ], - "final" : true -}, { - "version" : "v3.11.0", - "date" : "2021-01-31", - "changes" : [ { - "type" : "feature", - "text" : "Implemented rate limiting for certain indexers which don't allow more than x hits in x seconds. If you know of such an indexer please let me know as this is hard coded and not configurable." - }, { - "type" : "feature", - "text" : "Added option to disable \"What's new\" button after an automatic update was installed." - }, { - "type" : "fix", - "text" : "Validate backup folder when saving config." - }, { - "type" : "fix", - "text" : "Allow direct input for indexer color." - }, { - "type" : "fix", - "text" : "Fixed an issue where animetosho results would show up as a warning in the log. The indexer contains NZB and/or torrent links combined in one feed. When you made an NZB or torrent search and a result only contained a link for the other type this would be shown as a warning. This message will now only be shown on debug level." - }, { - "type" : "fix", - "text" : "Improve the connection check to sabNZBd so that false positives should be reduced (.i.e in NZBHydra connecting successfully to a proxy or other server is not interpreted as successful connection check)." - } ], - "final" : true -}, { - "version" : "v3.10.1", - "date" : "2021-01-28", - "changes" : [ { - "type" : "fix", - "text" : "Fix an issue with hydra using a base URL (e.g. /nzbhydra2)." - } ], - "final" : true -}, { - "version" : "v3.10.0", - "date" : "2021-01-28", - "changes" : [ { - "type" : "feature", - "text" : "Enabled compression for resources sent to the browser. This shouldn't matter on local connections but save bandwidth should you want to use UI on a mobile browser (horrible as it looks)." - }, { - "type" : "feature", - "text" : "The GUI will now retrieve notifications, the downloader status and search state via WebSocket. This means that the browser keeps a connection to the server open and is only sent data when new data is available (e.g. when the downloader status actually changed). This should result in considerably fewer requests and (negligible) faster UI update times." - } ], - "final" : false -}, { - "version" : "v3.9.2", - "date" : "2021-01-16", - "changes" : [ { - "type" : "feature", - "text" : "Added some code that allows me to post a link to adapt the logging config and to download the debug infos." - }, { - "type" : "feature", - "text" : "Added config switch to add NZBs to downloader paused." - }, { - "type" : "fix", - "text" : "Added some more logging and handling of edge cases for API limits." - } ], - "final" : true -}, { - "version" : "v3.9.1", - "date" : "2021-01-16", - "changes" : [ { - "type" : "fix", - "text" : "Fixed an issue with time zones related to indexer API limits. It may only affect the log output but may also fix some problems with limit detection." - } ], - "final" : true -}, { - "version" : "v3.9.0", - "date" : "2020-12-28", - "changes" : [ { - "type" : "feature", - "text" : "NZBHydra will now show the search results table even if all results were rejected. This way you can see the reason for the rejections without having to check the log." - }, { - "type" : "fix", - "text" : "Show advanced features in downloader config if selected." - } ], - "final" : true -}, { - "version" : "v3.8.1", - "date" : "2020-12-28", - "changes" : [ { - "type" : "fix", - "text" : "Remove NZBGeek from list of domains for which do disable SNI." - }, { - "type" : "fix", - "text" : "Change text for toggle of advanced options in the config to \"Advanced hidden\" and \"Advanced shown\"." - } ], - "final" : true -}, { - "version" : "v3.8.0", - "date" : "2020-12-13", - "changes" : [ { - "type" : "feature", - "text" : "Add 'Show advanced' switch to config. I'd already tried to get this working twice - third time's the charm!." - }, { - "type" : "feature", - "text" : "Add button to clear color for an indexer." - }, { - "type" : "fix", - "text" : "Apply indexer colors to expanded results as well. To mark expanded results they're shown in a darker shade so it's recommended to use indexer colors which not only differ in lightness." - } ], - "final" : true -}, { - "version" : "v3.7.0", - "date" : "2020-12-13", - "changes" : [ { - "type" : "feature", - "text" : "New display option to hide 'Results as ZIP' button." - }, { - "type" : "feature", - "text" : "New option to choose quickfilters that should be preselected." - }, { - "type" : "feature", - "text" : "New option to select the primary downloader for which the footer will show the status." - }, { - "type" : "fix", - "text" : "Re-add 'No category' to category selection which got lost in 3.5.0." - }, { - "type" : "fix", - "text" : "The multiselect widgets in the config will now show the labels of the selected values, not their internal ID." - }, { - "type" : "fix", - "text" : "'Searching...' window was not closed when all found results were being filtered." - }, { - "type" : "fix", - "text" : "Don't show the blue loading bar when checking for notifications." - }, { - "type" : "fix", - "text" : "Report API errors as JSON instead of XML when appropriate." - } ], - "final" : false -}, { - "version" : "v3.6.0", - "date" : "2020-12-05", - "changes" : [ { - "type" : "feature", - "text" : "When aborting an indexer search because no ID conversion was possible Hydra will now show a less... serious message. This is an expected problem, not an error." - }, { - "type" : "fix", - "text" : "Remove ampersand (&) from titles when searching indexers as they're interpreted specially." - } ], - "final" : true -}, { - "version" : "v3.5.1", - "date" : "2020-11-15", - "changes" : [ { - "type" : "fix", - "text" : "Fix linux wrapper executable." - } ], - "final" : true -}, { - "version" : "v3.5.0", - "date" : "2020-11-15", - "changes" : [ { - "type" : "feature", - "text" : "Use (bigger) buttons for downloader category selection." - }, { - "type" : "fix", - "text" : "Fix recognition of java version with recet OpenJDK update." - } ], - "final" : true -}, { - "version" : "v3.4.3", - "date" : "2020-10-31", - "changes" : [ { - "type" : "fix", - "text" : "Fix error that ocurred when notifications without Apprise URLs were sent." - } ], - "final" : true -}, { - "version" : "v3.4.2", - "date" : "2020-10-29", - "changes" : [ { - "type" : "fix", - "text" : "Fix error that ocurred when notifications without Apprise URLs were sent." - } ], - "final" : true -}, { - "version" : "v3.4.1", - "date" : "2020-10-25", - "changes" : [ { - "type" : "fix", - "text" : "Fixed external configuration of Radarr and Sonarr V3 (wrt torrents)." - } ], - "final" : true -}, { - "version" : "v3.4.0", - "date" : "2020-10-25", - "changes" : [ { - "type" : "feature", - "text" : "Added age and source variables to download notification." - }, { - "type" : "feature", - "text" : "The previously added \"Download\" notification was only for when a result was grabbed from Hydra. I've aded a notification for download completion, i.e. when the download finishes the download." - }, { - "type" : "fix", - "text" : "Fixed external configuration of Radarr and Sonarr V3." - } ], - "final" : true -}, { - "version" : "v3.3.0", - "date" : "2020-10-22", - "changes" : [ { - "type" : "feature", - "text" : "Added notifications for downloads." - }, { - "type" : "fix", - "text" : "The button to send results to the downloader was not displayed in some cases." - }, { - "type" : "fix", - "text" : "Apprise notifications sent via CLI containing quotation marks were truncated." - } ], - "final" : true -}, { - "version" : "v3.2.1", - "date" : "2020-10-21", - "changes" : [ { - "type" : "fix", - "text" : "Prevent startup errors when migrating from certain older versions." - } ], - "final" : true -}, { - "version" : "v3.2.0", - "date" : "2020-10-20", - "changes" : [ { - "type" : "feature", - "text" : "Allow using Apprise CLI to send notifications instead of Apprise API." - }, { - "type" : "fix", - "text" : "Don't require Apprise API URL to end with /notify (will still work if you've already configured it that way)." - }, { - "type" : "fix", - "text" : "Anonymize notification URLs when writing debug infos." - }, { - "type" : "fix", - "text" : "Prevent invalid expiry date setting and fix startup failing due to invalid setting." - } ], - "final" : true -}, { - "version" : "v3.1.0", - "date" : "2020-10-18", - "changes" : [ { - "type" : "feature", - "text" : "Add button to test notifications." - } ], - "final" : true -}, { - "version" : "v3.0.0", - "date" : "2020-10-17", - "changes" : [ { - "type" : "feature", - "text" : "NZBHydra now allows to send and show notifications for certain events. You can request events on the Github Issue." - }, { - "type" : "fix", - "text" : "Reduced the percentage of correct results an indexer must return for an ID based search for that ID to be determined to be usable for searches. This will hopefully make the caps check recognize more supported IDs without any false positives." - }, { - "type" : "fix", - "text" : "Shorten torrent file names exceeding the maximum path length." - }, { - "type" : "fix", - "text" : "Query generation was not properly used for indexers which support a certain search type but no IDs." - }, { - "type" : "fix", - "text" : "Show a warning when more than 3 logging markers are enabled. Please only enabled them when requested by me. They reduce the performance and produce lots of irritating log output which hurts more than it helps unless I actually need it." - } ], - "final" : false -}, { - "version" : "v2.29.1", - "date" : "2020-09-12", - "changes" : [ { - "type" : "fix", - "text" : "Use better name for indexer entries added to *arr." - }, { - "type" : "fix", - "text" : "Fix issue with indexer names containing special characters when configuring *arr." - } ], - "final" : true -}, { - "version" : "v2.29.0", - "date" : "2020-09-08", - "changes" : [ { - "type" : "feature", - "text" : "Added support for indexer priority when configuring Sonarr v3 and Radarr v3." - }, { - "type" : "feature", - "text" : "Added support for automatic configuration of Readarr." - }, { - "type" : "fix", - "text" : "Anonymize API key and URLs when logging *arr requests and responses." - } ], - "final" : true -}, { - "version" : "v2.28.1", - "date" : "2020-09-08", - "changes" : [ { - "type" : "feature", - "text" : "Added Lidarr and Readarr to list of known user agents." - }, { - "type" : "feature", - "text" : "The dialog for the configuration of external tools will now save the input for each tool and restore it the next time you open the dialog for that tool again." - }, { - "type" : "feature", - "text" : "Support for indexer VIP expiry date 'Lifetime'. No logic behind it, just so you can enter and see that information." - }, { - "type" : "fix", - "text" : "Improve layout of quick filter buttons in search results." - } ], - "final" : true -}, { - "version" : "v2.28.0", - "date" : "2020-09-03", - "changes" : [ { - "type" : "feature", - "text" : "When using \"Add links\" to add NZBs to your downloader the links are usually calculated using the URL with which you accessed NZBHydra. This might be a URL that's not accessible by the downloader (e.g. when it's inside a docker container). You can now configure a URL in the downloading config that will be used for these links instead." - }, { - "type" : "fix", - "text" : "Don't let the invisible update footer catch clicks meant for the elements behind it." - } ], - "final" : true -}, { - "version" : "v2.27.2", - "date" : "2020-09-01", - "changes" : [ { - "type" : "fix", - "text" : "Use proper version for Radarr v3 (I used a develop version which returns 10.x)." - }, { - "type" : "fix", - "text" : "Reduce log output of exceptions." - }, { - "type" : "fix", - "text" : "(Hopefully) improve detection of local IP address when binding to 0.0.0.0." - } ], - "final" : true -}, { - "version" : "v2.27.1", - "date" : "2020-09-01", - "changes" : [ { - "type" : "feature", - "text" : "Support for Radarr v3 (see v2.27.0)." - } ], - "final" : true -}, { - "version" : "v2.27.0", - "date" : "2020-08-31", - "changes" : [ { - "type" : "feature", - "text" : "You can now automatically add NZBHydra as an indexer to Sonarr / Radarr / Lidarr. You can choose to add it as a single entry or one for every configured indexer and if it should be added as newznab and/or torznab indexer." - }, { - "type" : "fix", - "text" : "Close search history dropdown in search dialog when it was dragged." - }, { - "type" : "fix", - "text" : "Make quick filters case insensitive." - } ], - "final" : false -}, { - "version" : "v2.26.0", - "date" : "2020-08-24", - "changes" : [ { - "type" : "feature", - "text" : "Drag an entry from the search history to the search input to prefill it with the history entry's values. Then you can adapt them and search." - }, { - "type" : "feature", - "text" : "Added quick filters for HEVC and x265. Added an option to always show quick filter buttons (i.e. for any type of search). You can also define custom quick filters." - }, { - "type" : "feature", - "text" : "Show number of filtered and number of duplicate results on search results page." - }, { - "type" : "fix", - "text" : "Fix layout of search input for movies and shows." - }, { - "type" : "fix", - "text" : "Fix download of magnet links to black hole for some trackers." - } ], - "final" : true -}, { - "version" : "v2.25.0", - "date" : "2020-07-02", - "changes" : [ { - "type" : "feature", - "text" : "When creating debug infos log all changes made to the config." - }, { - "type" : "feature", - "text" : "Show dl/ul ratio indicator for torznab results (if not 100%). E.g. when '50%' is shown only half the download's size will be counted towards your ratio. Freelech torrents will be shown as such." - } ], - "final" : true -}, { - "version" : "v2.24.1", - "date" : "2020-06-29", - "changes" : [ { - "type" : "fix", - "text" : "Generate query for book searches if enabled and book search not supported by indexer." - }, { - "type" : "fix", - "text" : "Autofocus search input field (pretty sure that worked at some point)." - }, { - "type" : "fix", - "text" : "Catch illegal characters in hostname when configuring sabnzbd." - } ], - "final" : true -}, { - "version" : "v2.24.0", - "date" : "2020-06-22", - "changes" : [ { - "type" : "note", - "text" : "I've upgraded some of the libraries I used. This should ideally not change anything but to be sure I'll release this as prerelase first." - }, { - "type" : "fix", - "text" : "Remove API keys in URL encoded log entries." - } ], - "final" : false -}, { - "version" : "v2.23.0", - "date" : "2020-06-03", - "changes" : [ { - "type" : "feature", - "text" : "Double-click system tray icon to open GUI in browser." - }, { - "type" : "feature", - "text" : "Click downloader image in footer to open it in a new tab." - }, { - "type" : "feature", - "text" : "Add toggle to display options for search result groups being expanded by default." - }, { - "type" : "feature", - "text" : "Add toggle to display options for the indicator of already downloaded results." - }, { - "type" : "feature", - "text" : "Add toggle to display options to control display of already downloaded results. It's basically a filter." - } ], - "final" : true -}, { - "version" : "v2.22.5", - "date" : "2020-05-27", - "changes" : [ { - "type" : "fix", - "text" : "Indexers which report the API and download limits were not properly selected when the hit limit was reached but the latest hit was more than 24 hours ago." - }, { - "type" : "fix", - "text" : "Error while searching Animetosho." - }, { - "type" : "fix", - "text" : "Properly recognize ID based searches returning too many results." - } ], - "final" : true -}, { - "version" : "v2.22.4", - "date" : "2020-05-24", - "changes" : [ { - "type" : "fix", - "text" : "Fix problem with torznab introduced in last version (looking at me again, in this case)." - } ], - "final" : true -}, { - "version" : "v2.22.3", - "date" : "2020-05-24", - "changes" : [ { - "type" : "fix", - "text" : "Fix problem with paging introduced in last version (looking at me, in this case)." - } ], - "final" : true -}, { - "version" : "v2.22.2", - "date" : "2020-05-20", - "changes" : [ { - "type" : "feature", - "text" : "Add refresh buttons to search and download history." - }, { - "type" : "fix", - "text" : "Properly handle indexers which report more results in an API response than they actually return (looking at you, wtfnzbs)." - } ], - "final" : true -}, { - "version" : "v2.22.1", - "date" : "2020-05-13", - "changes" : [ { - "type" : "fix", - "text" : "Last release was broken a bit..." - } ], - "final" : true -}, { - "version" : "v2.22.0", - "date" : "2020-05-13", - "changes" : [ { - "type" : "feature", - "text" : "Add filter for minimum # of seeders (in general and per tracker)." - }, { - "type" : "fix", - "text" : "It appears that the hashing algorithm used to check for the outdated wrapper files behaves differently on some machines / OSes. I switched to SHA1 which should reduce false positives. If you still get the wrapper warning and really updated all files let me know." - }, { - "type" : "fix", - "text" : "Made sure that torznab results are never considered duplicates to anything. It could be argued that in some cases two torrents from public trackers may actually be the same but I consider that an edge case." - } ], - "final" : true -}, { - "version" : "v2.21.1", - "date" : "2020-05-09", - "changes" : [ { - "type" : "feature", - "text" : "Make instructions what to update when your wrapper is outdated extra clear: Any wrapper file found in the folder must be updated, not just the one you're using to run hydra. If the message says to extract the ZIP into your nzbhydra folder I mean ALL THE FILES." - }, { - "type" : "note", - "text" : "I moved my mail address from theotherp@gmx.de to theotherp@posteo.net." - } ], - "final" : true -}, { - "version" : "v2.21.0", - "date" : "2020-05-08", - "changes" : [ { - "type" : "feature", - "text" : "NZBHydra will now try to fall back to similar results when an NZB download fails. This is only possible if it proxies the results instead of redirecting to the indexer so I've made that the default *for new installs*. It works by looking for results with the same title from other indexers which were found in the same search as the result of which the download failed." - }, { - "type" : "fix", - "text" : "Covers were not shown for search results." - }, { - "type" : "fix", - "text" : "Fix layout of tooltip icons (\"?\") in config in safari browser." - } ], - "final" : true -}, { - "version" : "v2.20.7", - "date" : "2020-05-07", - "changes" : [ { - "type" : "fix", - "text" : "Execute check of outdated wrapper on startup to properly detect updated wrapper." - }, { - "type" : "fix", - "text" : "Fix some more layout issues." - } ], - "final" : true -}, { - "version" : "v2.20.6", - "date" : "2020-05-07", - "changes" : [ { - "type" : "fix", - "text" : "Revert tool to compile python wrapper to exe to older version as new exe files were (falsely!) recognized as a virus by *some* tools. To be clear, the files were never problematic. That means you'll have update the exe files or python scripts again." - }, { - "type" : "fix", - "text" : "Fix decoding issue of settings file by python3 wrapper." - } ], - "final" : true -}, { - "version" : "v2.20.5", - "date" : "2020-05-06", - "changes" : [ { - "type" : "feature", - "text" : "Mark results in GUI that already have been downloaded." - }, { - "type" : "fix", - "text" : "Fix issue with notification about outdated wrapper files not being shown. NZBHydra will now nag you until you refresh the files." - }, { - "type" : "fix", - "text" : "Revert layout fixes made in v2.20.4 because fuck CSS." - } ], - "final" : true -}, { - "version" : "v2.20.4", - "date" : "2020-05-06", - "changes" : [ { - "type" : "feature", - "text" : "GC logging (for debugging of memory issues) is now configurable and disabled by default. This has required a change in the wrapper which means you'll have to manually update them if you're running NZBHydra on windows or are using the linux executable." - }, { - "type" : "feature", - "text" : "Show current version and (if applicable) docker container infos on about page." - }, { - "type" : "fix", - "text" : "Fix parsing of API limits from indexers' API responses using different formats." - }, { - "type" : "fix", - "text" : "Don't show news for fresh installs." - }, { - "type" : "fix", - "text" : "Fix some (minor) layout issues on the search page." - } ], - "final" : true -}, { - "version" : "v2.20.3", - "date" : "2020-05-01", - "changes" : [ { - "type" : "feature", - "text" : "NZBHydra will recognize renamed indexers when saving the config. Renaming will no longer cause loss of stats and history for those indexers. You should have two indexers configured with the same host, API key and search type as this messes with the rename detection." - }, { - "type" : "feature", - "text" : "Click covers in search results to show them in a pop-up." - }, { - "type" : "fix", - "text" : "In some cases the download history could not be opened." - } ], - "final" : true -}, { - "version" : "v2.20.2", - "date" : "2020-04-29", - "changes" : [ { - "type" : "feature", - "text" : "Added more substructures to the config GUI to make it a bit more clear." - }, { - "type" : "feature", - "text" : "Replaced the config help pop-up pages with contextual help. Click the question marks neach to each field to get a bit more in-depth info." - }, { - "type" : "feature", - "text" : "Add button to clear search input." - }, { - "type" : "fix", - "text" : "Automatic update notification was also shown for manual updates." - } ], - "final" : true -}, { - "version" : "v2.20.1", - "date" : "2020-04-28", - "changes" : [ { - "type" : "feature", - "text" : "Add button to debug infos tab to list all HTTP endpoints (useful for reverse proxy config)." - }, { - "type" : "fix", - "text" : "Search type SEARCH wasn't displayed in indexer config." - }, { - "type" : "fix", - "text" : "Improve matching of indexer configs when reading jackett config." - }, { - "type" : "fix", - "text" : "Restore display of button to send torrents to black hole." - }, { - "type" : "fix", - "text" : "Try to fix circular loading error when creating backup." - } ], - "final" : true -}, { - "version" : "v2.20.0", - "date" : "2020-04-26", - "changes" : [ { - "type" : "feature", - "text" : "Option to filter out results by language. Very few indexers provide the language in the results, though." - }, { - "type" : "feature", - "text" : "You can now add self-signed certificates for any hosts you want to connect to. Just create a folder named 'certificates' inside the data folder, put your .crt files there and reload NZBHydra." - }, { - "type" : "feature", - "text" : "Option to disable SSL verification for local hosts. (This was on by default so far)." - }, { - "type" : "feature", - "text" : "Support for saving NZBs to a black hole." - }, { - "type" : "fix", - "text" : "Fix sorting by age in download history." - }, { - "type" : "fix", - "text" : "NZBGet connection didn't honor SSL verification settings." - }, { - "type" : "fix", - "text" : "Properly display last errror on indexer statuses page." - }, { - "type" : "fix", - "text" : "Fix parsing of binsearch date on non-english locales." - }, { - "type" : "fix", - "text" : "Properly recognize duplicate NZBs not added to sabNZBd." - }, { - "type" : "fix", - "text" : "Improve matching of downloads to downloader entries where no external ID exists, i.e. those downloads resulting from API accesses." - }, { - "type" : "fix", - "text" : "When using NZBGet the wrong NZB would be shown as downloading if the first entry in the queue wasn't the one downloading." - }, { - "type" : "fix", - "text" : "Handle errors better while adding torrents to black hole or sending magnet links." - }, { - "type" : "fix", - "text" : "Filter out quotation marks (\") when searching NZBGeek." - }, { - "type" : "note", - "text" : "I've added two settings for the database. Just ignore them unless told otherwise ;-)" - } ], - "final" : true -}, { - "version" : "v2.19.6", - "date" : "2020-04-23", - "changes" : [ { - "type" : "fix", - "text" : "With v2.15.0 I added the option to configure the backup folder and changed the path from being relative to the data folder to being relative to the main folder. That's not compatible with docker containers and broke the backup but I always insisted it wasn't my fault - it was, sorry." - } ], - "final" : true -}, { - "version" : "v2.19.5", - "date" : "2020-04-20", - "changes" : [ { - "type" : "fix", - "text" : "Indexer caps check was not executed when adding a new indexer." - }, { - "type" : "note", - "text" : "Happy 420. Stay inside. Stay healthy. Sorry for all the bugfix releases..." - } ], - "final" : true -}, { - "version" : "v2.19.4", - "date" : "2020-04-20", - "changes" : [ { - "type" : "fix", - "text" : "Fix error while reading API limits response from indexers which don't report oldest access time." - } ], - "final" : true -}, { - "version" : "v2.19.3", - "date" : "2020-04-20", - "changes" : [ { - "type" : "fix", - "text" : "Fix error when searching torznab." - } ], - "final" : true -}, { - "version" : "v2.19.2", - "date" : "2020-04-20", - "changes" : [ { - "type" : "fix", - "text" : "Fix error related to fallback." - } ], - "final" : true -}, { - "version" : "v2.19.1", - "date" : "2020-04-20", - "changes" : [ { - "type" : "feature", - "text" : "Add debug output for determination of API/download limits." - }, { - "type" : "fix", - "text" : "Corectly parse API/download limit information from NNTmux." - } ], - "final" : true -}, { - "version" : "v2.19.0", - "date" : "2020-04-19", - "changes" : [ { - "type" : "feature", - "text" : "Add option to set VIP expiry date for an indexer. You will be warned when the expiry date is near or has been reached." - } ], - "final" : false -}, { - "version" : "v2.18.0", - "date" : "2020-04-19", - "changes" : [ { - "type" : "feature", - "text" : "Added option to define a color for an indexer. Results from that indexer will be marked using that color." - }, { - "type" : "fix", - "text" : "Some indexers apparently return all results for ID based searches when actually no results were found. In this case it will be handled as if no results were found." - }, { - "type" : "fix", - "text" : "Adjust width of title box in search form when displaying results." - }, { - "type" : "fix", - "text" : "Fallback to query generation was often not executed when it should've." - } ], - "final" : false -}, { - "version" : "v2.17.6", - "date" : "2020-04-17", - "changes" : [ { - "type" : "fix", - "text" : "Fix passworded releases not being included for a certain indexer." - }, { - "type" : "note", - "text" : "Added logging to debug query generation fallback." - }, { - "type" : "note", - "text" : "Added thank-you to newsgroup.ninja for sponsoring me." - } ], - "final" : true -}, { - "version" : "v2.17.5", - "date" : "2020-04-05", - "changes" : [ { - "type" : "fix", - "text" : "Fix copy & paste error introduced with last version." - } ], - "final" : true -}, { - "version" : "v2.17.4", - "date" : "2020-04-05", - "changes" : [ { - "type" : "fix", - "text" : "Min and max size were not filled on page load with a custom default category was configured." - } ], - "final" : true -}, { - "version" : "v2.17.3", - "date" : "2020-04-01", - "changes" : [ { - "type" : "feature", - "text" : "Add option to always convert media IDs. This might make sense for indexers that only sometimes support a certain ID, i.e. don't have all results tagged with a certain ID but may have tagged them with others." - } ], - "final" : true -}, { - "version" : "v2.17.2", - "date" : "2020-04-01", - "changes" : [ { - "type" : "fix", - "text" : "Fix database error when searching with disabled history." - }, { - "type" : "fix", - "text" : "Don't show option how long to keep stats with disabled history." - } ], - "final" : true -}, { - "version" : "v2.17.1", - "date" : "2020-03-31", - "changes" : [ { - "type" : "fix", - "text" : "When reading the jackett configuration update existing tracker configs instead of replacing them." - }, { - "type" : "note", - "text" : "Enable query generation for internal searches by default." - } ], - "final" : true -}, { - "version" : "v2.17.0", - "date" : "2020-03-30", - "changes" : [ { - "type" : "feature", - "text" : "Add option to read Jackett config and automatically add all configured trackers. Already configured trackers will be updated. Thanks for Davide Campagna for the tip." - }, { - "type" : "feature", - "text" : "Add option to configure downloader to never send a category." - }, { - "type" : "fix", - "text" : "Some time ago I implemented a feature that recognized OutOfMemory errors in the log which might've been not recognized by the user because the program automatically restarts after such a crash. Ironically this check caused OutOfMemory errors with huge log files..." - } ], - "final" : true -}, { - "version" : "v2.16.5", - "date" : "2020-03-23", - "changes" : [ { - "type" : "feature", - "text" : "Enable some more logging to debug slow server responses." - } ], - "final" : true -}, { - "version" : "v2.16.3", - "date" : "2020-03-23", - "changes" : [ { - "type" : "feature", - "text" : "Fancy new graph for CPU usage per thread in the debug infos section. Enable the logging marker 'Performance' for the graph to show data. In this case NZBHydra will also log memory usage and any threads using more than 5% CPU. This might have an overhead on some systems so I don't recommend running it by default." - }, { - "type" : "feature", - "text" : "Add option to create and log a thread dump directly from the GUI. You can also create a heap dump for me to analyze but this will only work with non-J9 JREs." - }, { - "type" : "feature", - "text" : "Log more data in the debug report. If you're curious you can visit http://127.0.0.1:5076/actuator (or whatever your IP and port are) and take a look. There's a lot of data you could display in a dashboard." - } ], - "final" : true -}, { - "version" : "v2.16.2", - "date" : "2020-03-22", - "changes" : [ { - "type" : "feature", - "text" : "Extend performance logging." - } ], - "final" : true -}, { - "version" : "v2.16.1", - "date" : "2020-03-15", - "changes" : [ { - "type" : "fix", - "text" : "Fix display of version history." - } ], - "final" : false -}, { - "version" : "v2.16.0", - "date" : "2020-03-15", - "changes" : [ { - "type" : "feature", - "text" : "Add an extra option for how long stats data is kept. Set this to 4 weeks or so. I've also updated the wiki's memory page to explain which settings impact the database size which is usually the reason for high memory usage." - }, { - "type" : "note", - "text" : "I've reduced the default for how long search results are kept in the database to mitigate some memory issues with large databases. Only very few users should be affected by this negatively." - }, { - "type" : "note", - "text" : "I've moved the settings for the history to the main config section." - } ], - "final" : false -}, { - "version" : "v2.15.2", - "date" : "2020-03-15", - "changes" : [ { - "type" : "feature", - "text" : "Increased the number of entries in the search history dropdown to 25." - }, { - "type" : "feature", - "text" : "Added option to configure the number of results shown per page. Default is 100. Max is 500." - }, { - "type" : "fix", - "text" : "Properly display full width of selected titles from the search autocomplete." - }, { - "type" : "fix", - "text" : "Remove apostrophe (') from generated queries again. Seems like there is no right way to do this as some trackers return more results with and some without; but it also seems that more indexers prefer it to be removed. If you know a tracker / indexer that works better with apostrophes in the query please tell me and I will make an exclusion for them." - } ], - "final" : false -}, { - "version" : "v2.15.1", - "date" : "2020-03-14", - "changes" : [ { - "type" : "fix", - "text" : "Contents of the generic storage were not properly migrated." - } ], - "final" : false -}, { - "version" : "v2.15.0", - "date" : "2020-03-14", - "changes" : [ { - "type" : "feature", - "text" : "Option to disable history of searches and downloads." - }, { - "type" : "feature", - "text" : "Option to configure folder for backups." - }, { - "type" : "feature", - "text" : "Option to not send newznab categories for torznab indexers (trackers). See #516." - }, { - "type" : "note", - "text" : "Previously a couple of settings (Time of last backup, time of first start, latest news shown, etc.) were stored in the database. That meant they were lost when starting with a new database. I've moved the settings to the config file wherey they belong." - }, { - "type" : "feature", - "text" : "Show a notification footer when an automatic update was installed." - }, { - "type" : "fix", - "text" : "Don't crash py3 wrapper when trying to log unicode characters." - }, { - "type" : "fix", - "text" : "Keep result selection when changing pages. (To be precise, the result selection was actually already kept but upon page change \"selected\" results' checkboxes would not be checked.)" - }, { - "type" : "fix", - "text" : "Fix download of results as ZIP (which apparently nobody uses as it seems to have been broken forever...)." - } ], - "final" : false -}, { - "version" : "v2.14.2", - "date" : "2020-03-09", - "changes" : [ { - "type" : "fix", - "text" : "Ensure passworded results are included for certain indexers when configured not to ignore them." - }, { - "type" : "fix", - "text" : "Fix link to downloading help." - } ], - "final" : true -}, { - "version" : "v2.14.1", - "date" : "2020-02-23", - "changes" : [ { - "type" : "fix", - "text" : "Fix failing startup of fresh instance on Linux. Thanks, hotio." - } ], - "final" : true -}, { - "version" : "v2.14.0", - "date" : "2020-02-23", - "changes" : [ { - "type" : "feature", - "text" : "Allow setting a default category to be preselected." - }, { - "type" : "feature", - "text" : "Add supported SSL ciphers to debug infos output." - }, { - "type" : "feature", - "text" : "Update indexer presets." - }, { - "type" : "fix", - "text" : "Fix errors in py3 wrapper." - } ], - "final" : true -}, { - "version" : "v2.13.14", - "date" : "2020-02-19", - "changes" : [ { - "type" : "fix", - "text" : "Fix error in URL calculation, resulting in failing API downloads when other programs access Hydra via a reverse proxy with SSL." - } ], - "final" : true -}, { - "version" : "v2.13.13", - "date" : "2020-02-17", - "changes" : [ { - "type" : "fix", - "text" : "Redirect system.out to log file for SSL debug infos even on windows" - } ], - "final" : true -}, { - "version" : "v2.13.12", - "date" : "2020-02-15", - "changes" : [ { - "type" : "fix", - "text" : "Don't use value of X-Forwarded-For when recognizing secure IPs." - }, { - "type" : "fix", - "text" : "Don't use search IDs in fallback queries. The indexer already returned 0 results for the last search and providing them may prevent the query from returning results." - } ], - "final" : false -}, { - "version" : "v2.13.11", - "date" : "2020-02-15", - "changes" : [ { - "type" : "fix", - "text" : "Fix invalid config created by v2.13.9." - } ], - "final" : false -}, { - "version" : "v2.13.10", - "date" : "2020-02-15", - "changes" : [ { - "type" : "fix", - "text" : "Fix error while saving config." - } ], - "final" : false -}, { - "version" : "v2.13.9", - "date" : "2020-02-15", - "changes" : [ { - "type" : "feature", - "text" : "Replace auth token implementation with auth header. You may define an header that provides a username and a range of IP addresses from which this header will be accepted. The user will automatically be logged in." - } ], - "final" : false -}, { - "version" : "v2.13.8", - "date" : "2020-02-15", - "changes" : [ { - "type" : "feature", - "text" : "Allow authorization via predefined OAuth2 / (X-)Authorization header. The token must be unique for each user in order to identify him." - }, { - "type" : "fix", - "text" : "Improve matching of downloader history entries." - }, { - "type" : "fix", - "text" : "Use dereferer for links in config help texts." - }, { - "type" : "fix", - "text" : "Improve readability of error messages in dark and grey themes." - } ], - "final" : false -}, { - "version" : "v2.13.7", - "date" : "2020-02-11", - "changes" : [ { - "type" : "fix", - "text" : "Further extend logging if logging marker 'HTTP Server' is selected. Don't hide local IP addresses in log. Replace other IP files with hashes to hide them but make them comparable." - } ], - "final" : true -}, { - "version" : "v2.13.6", - "date" : "2020-02-09", - "changes" : [ { - "type" : "fix", - "text" : "Improve matching of hidden download entries from NZBGet history." - } ], - "final" : true -}, { - "version" : "v2.13.5", - "date" : "2020-02-09", - "changes" : [ { - "type" : "feature", - "text" : "Extend logging if logging marker 'HTTP Server' is selected." - } ], - "final" : true -}, { - "version" : "v2.13.4", - "date" : "2020-02-08", - "changes" : [ { - "type" : "fix", - "text" : "Improve wording of config description on how to apply newznab categories by pressing enter." - }, { - "type" : "fix", - "text" : "Include hidden results from NZBGet history when checking download status. That way entries removed by *arr and other programs will be considered, too." - } ], - "final" : true -}, { - "version" : "v2.13.3", - "date" : "2020-02-06", - "changes" : [ { - "type" : "fix", - "text" : "Fixed a very rare issue where a file stored in temp directory could not be read or deleted which prevented successful database migration." - } ], - "final" : true -}, { - "version" : "v2.13.2", - "date" : "2020-02-02", - "changes" : [ { - "type" : "fix", - "text" : "Uniqueness score was not saved for torrent downloads." - }, { - "type" : "fix", - "text" : "Apostrophes were removed from generated queries resulting in less results." - } ], - "final" : true -}, { - "version" : "v2.13.1", - "date" : "2020-02-01", - "changes" : [ { - "type" : "fix", - "text" : "Don't verify hostnames for hosts for which to ignore SSL certificate checks." - } ], - "final" : true -}, { - "version" : "v2.13.0", - "date" : "2020-02-01", - "changes" : [ { - "type" : "note", - "text" : "I've removed the option to use the packaged cacerts file which will now always be loaded by default. A future version will allow to add custom certificates to the chain. Most likely this will not affect many users anyway." - }, { - "type" : "fix", - "text" : "Fixed issue where SSL verification was not properly disabled for some hosts. Certificate checks are now also automatically disabled for local hosts." - } ], - "final" : false -}, { - "version" : "v2.12.8", - "date" : "2020-01-29", - "changes" : [ { - "type" : "fix", - "text" : "Same shit, different release. Thanks to reloxx13 for helping me reproduce this." - } ], - "final" : false -}, { - "version" : "v2.12.7", - "date" : "2020-01-29", - "changes" : [ { - "type" : "fix", - "text" : "Fix another issue with database migration. I'll switch to a different approach soon, this is too fragile." - } ], - "final" : false -}, { - "version" : "v2.12.6", - "date" : "2020-01-29", - "changes" : [ { - "type" : "fix", - "text" : "Fix issue with new installations not starting due to updated database library. So much for more stability..." - } ], - "final" : false -}, { - "version" : "v2.12.5", - "date" : "2020-01-28", - "changes" : [ { - "type" : "fix", - "text" : "Update database library. Should have no effect on you except hopefully more stability." - } ], - "final" : false -}, { - "version" : "v2.12.4", - "date" : "2020-01-27", - "changes" : [ { - "type" : "fix", - "text" : "Fix exception that occurs when an indexer's API limit was reached as reported by the indexer but Hydra can't find any of those hits in its database." - } ], - "final" : true -}, { - "version" : "v2.12.3", - "date" : "2020-01-26", - "changes" : [ { - "type" : "fix", - "text" : "Updated included SSL certificates." - }, { - "type" : "fix", - "text" : "Include beta releases in changelog when they have been released between the currently installed final version and the newest final version." - } ], - "final" : true -}, { - "version" : "v2.12.2", - "date" : "2020-01-20", - "changes" : [ { - "type" : "fix", - "text" : "Made some improvements in the way certificates are loaded. This should hopefully improve connectivity with NZBGeek on systems where it previously failed (due to incorrect JDK installations)." - } ], - "final" : true -}, { - "version" : "v2.12.1", - "date" : "2020-01-19", - "changes" : [ { - "type" : "fix", - "text" : "Fix error in indexer selection when indexers report their API hits but don't report the expiry timestamp." - }, { - "type" : "fix", - "text" : "Caching results for external API didn't work with some combination of parameters." - } ], - "final" : false -}, { - "version" : "v2.12.0", - "date" : "2020-01-18", - "changes" : [ { - "type" : "feature", - "text" : "Show API and download limit related values in the indexer statuses page." - }, { - "type" : "feature", - "text" : "If an indexer reports API and download limits and current hits in the response (as far as I know only nntmux does this) this will be stored and used to determine if the indexer's limits are reached. This will allow more precise results when any other programs (or you) happen to make API calls or downloads that Hydra is not aware of. As a fallback the logged API hits and downloads from the database are used (as before)." - } ], - "final" : false -}, { - "version" : "v2.11.2", - "date" : "2020-01-15", - "changes" : [ { - "type" : "fix", - "text" : "Fix SSL logging introduced in v2.11.1 when running in linux." - } ], - "final" : true -}, { - "version" : "v2.11.1", - "date" : "2020-01-14", - "changes" : [ { - "type" : "feature", - "text" : "Added code to help debug SSL / certificate issues when connecting to indexers." - }, { - "type" : "fix", - "text" : "Fix all versions in version history being displayed as beta." - }, { - "type" : "fix", - "text" : "Handle unexpected response when checking caps better." - } ], - "final" : true -}, { - "version" : "v2.11.0", - "date" : "2020-01-12", - "changes" : [ { - "type" : "feature", - "text" : "Restored old \"Load all results\" behavior. Now when enabled Hydra will display all already retrieved results from the cache. You still need to click \"Load all\" on the search results page to load all results available from indexers, resulting in more API hits. I've renamed the setting in the config to \"Display all cached results\"." - } ], - "final" : true -}, { - "version" : "v2.10.13", - "date" : "2020-01-11", - "changes" : [ { - "type" : "feature", - "text" : "Provide wrapper file for Python 3. Would be nice if you could test it and let me know if it works." - } ], - "final" : false -}, { - "version" : "v2.10.12", - "date" : "2020-01-11", - "changes" : [ { - "type" : "feature", - "text" : "Add validation to category config that warns users when a category contains a newznab main category (like 2000) and a subcategory already covered by that (like 2020)." - }, { - "type" : "feature", - "text" : "Provide wrapper file for Python 3." - }, { - "type" : "fix", - "text" : "Recognize error thrown when search IDs not supported by Animetosho." - } ], - "final" : false -}, { - "version" : "v2.10.11", - "date" : "2020-01-07", - "changes" : [ { - "type" : "fix", - "text" : "Allow users with access to stats to see the downloader bar. Prevent error message for the others." - } ], - "final" : false -}, { - "version" : "v2.10.10", - "date" : "2020-01-07", - "changes" : [ { - "type" : "fix", - "text" : "Add missing UI config entry for backup added in last update." - } ], - "final" : false -}, { - "version" : "v2.10.9", - "date" : "2020-01-06", - "changes" : [ { - "type" : "feature", - "text" : "Switched option for backup to an interval of days which allows you to have a finer control over when backups are created (e.g. more often if your system tends to crash...)." - } ], - "final" : false -}, { - "version" : "v2.10.8", - "date" : "2020-01-05", - "changes" : [ { - "type" : "feature", - "text" : "Added option to update to prereleases. If you enable this you will get 'beta' releases which I consider kinda stable but which contain bigger changes which might still break stuff. If you want to help with development please enable this and report any problems you encounter. Please note that any older instance older than v2.10.8 (this one) will always update to prereleases because they don't know the difference. Docker containers by popular maintainers will soon support prerelease tags (or already do so by now)." - } ], - "final" : true -}, { - "version" : "v2.10.7", - "date" : "2020-01-05", - "changes" : [ { - "type" : "note", - "text" : "Happy new year!" - }, { - "type" : "fix", - "text" : "Fix memory leak when using a proxy." - } ], - "final" : true -}, { - "version" : "v2.10.6", - "date" : "2019-12-29", - "changes" : [ { - "type" : "fix", - "text" : "The last changes made a pretty big change in the searching behavior with the option 'Load all' enabled. I'm completely rolling that back until I have an idea how to get what I want without causing excessive search behavior." - } ], - "final" : true -}, { - "version" : "v2.10.5", - "date" : "2019-12-29", - "changes" : [ { - "type" : "fix", - "text" : "Last udate (which reverted 2.10.3) was incomplete. Sorry, still drowsy from too much christmas food ;-)" - } ], - "final" : true -}, { - "version" : "v2.10.4", - "date" : "2019-12-28", - "changes" : [ { - "type" : "fix", - "text" : "Revert 'load all' change made with last version as it causes some search loops. Will need to take a closer look." - } ], - "final" : true -}, { - "version" : "v2.10.3", - "date" : "2019-12-28", - "changes" : [ { - "type" : "fix", - "text" : "With the option to load all results enabled now all available results will actually be loaded." - }, { - "type" : "note", - "text" : "I've removed the feature to migrate from v1 (to reduce the install size and memory usage a bit). It's still possible to migrate in older versions and then update to a current version." - } ], - "final" : true -}, { - "version" : "v2.10.2", - "date" : "2019-12-04", - "changes" : [ { - "type" : "feature", - "text" : "Add option to log HTTP server requests and their response times. The log messages will be written to a file nzbhydra.serv.log and not contained in the debug infos. They might help debug some performance related problems." - } ], - "final" : true -}, { - "version" : "v2.10.1", - "date" : "2019-12-01", - "changes" : [ { - "type" : "fix", - "text" : "Fix db error when trying to save downloaded NZB." - } ], - "final" : true -}, { - "version" : "v2.10.0", - "date" : "2019-11-30", - "changes" : [ { - "type" : "fix", - "text" : "I've changed (fixed) the way indexers are queried when searches are being made. In essence this will fix paging, allowing Radarr/Sonarr to properly read NZBHydra's results over multiple pages. What does that mean for you? *arr will probably find more results when doing backlog searches and NZBHydra will do more indexer searches, resulting in increased API hits (but not more than if you had configured them directly in *arr). For more (technical) details see this GitHub issue." - }, { - "type" : "fix", - "text" : "Recognize indexers reporting -1 for api or download limit for \"unlimited\"." - }, { - "type" : "fix", - "text" : "Fixed a minor layout issue in the config." - }, { - "type" : "fix", - "text" : "Make sure \"Keep history for ... weeks\" is either empty or set to a positive value." - }, { - "type" : "fix", - "text" : "The download history didn't load properly when the option to delete old searches from the history was set." - } ], - "final" : true -}, { - "version" : "v2.9.5", - "date" : "2019-11-23", - "changes" : [ { - "type" : "feature", - "text" : "I realised the indexer score is too complex to show in a chart and replaced it with a table, that shows more information. It will now contain the average uniqueness score, the number of unique downloads and the number of searches which resulted in a download and where an indexer was involved. " - } ], - "final" : true -}, { - "version" : "v2.9.4", - "date" : "2019-11-21", - "changes" : [ { - "type" : "fix", - "text" : "Further improvements regarding uniqueness score." - } ], - "final" : true -}, { - "version" : "v2.9.3", - "date" : "2019-11-20", - "changes" : [ { - "type" : "feature", - "text" : "Some indexers report their API and download limits in their XMLs. NZBHydra will detect that when the indexer's caps are checked and will automatically fill out the config accordingly (keeping already set values as they are)." - } ], - "final" : true -}, { - "version" : "v2.9.2", - "date" : "2019-11-17", - "changes" : [ { - "type" : "fix", - "text" : "Actually show version dates in the updates page..." - } ], - "final" : true -}, { - "version" : "v2.9.1", - "date" : "2019-11-17", - "changes" : [ { - "type" : "fix", - "text" : "Further adjustment to uniqueness score." - } ], - "final" : true -}, { - "version" : "v2.9.0", - "date" : "2019-11-17", - "changes" : [ { - "type" : "feature", - "text" : "I've updated the indexer uniqueness score calculation so that indexers which are often involved in searches get a higher score than those rarely involved. I also found a bug in the way the data was stored to the database so the old values will be removed." - }, { - "type" : "feature", - "text" : "The changelog now contains release dates along with the version." - }, { - "type" : "feature", - "text" : "Added option to disable update banner when running docker." - } ], - "final" : true -}, { - "version" : "v2.8.4", - "date" : "2019-11-14", - "changes" : [ { - "type" : "fix", - "text" : "Cached torznab results were returned as wrong XML. Also cached torznab and newznab queries could conflict." - } ], - "final" : true -}, { - "version" : "v2.8.3", - "date" : "2019-11-14", - "changes" : [ { - "type" : "fix", - "text" : "Improve logging and handling of torznab/newznab XML transformation." - } ], - "final" : true -}, { - "version" : "v2.8.2", - "date" : "2019-11-13", - "changes" : [ { - "type" : "feature", - "text" : "Support for pourcesoir.in, a french indexer. Their dev approached me with an idea on how to work around laws forbidding hosting NZB files. The indexer provides a certain text for each result using which you will find the result using a raw search engine like binsearch. NZBHydra will display a search icon in the search results GUI via which you can search for the result on Binsearch. I'll be honest, I'm not sure how viable that approach is, but I'm open to new ideas." - }, { - "type" : "fix", - "text" : "Fix pagination display error with." - } ], - "final" : true -}, { - "version" : "v2.8.1", - "date" : "2019-11-11", - "changes" : [ { - "type" : "feature", - "text" : "Allow to define sorting for the search results via URL parameters. Use &sortby= and, optionally, &sortdirection=asc or &sortdirection=desc. This will take preference to the sorting settings saved in a cookie but not overwrite them." - } ], - "final" : true -}, { - "version" : "v2.8.0", - "date" : "2019-11-08", - "changes" : [ { - "type" : "fix", - "text" : "Hydra will use proper HTTP status codes when NZB download fails to signal that an indexer's API limit is reached. This will be recognized by *arr, which will skip the release and try another one. This will also prevent *arr from disabling NZBHydra in such cases." - }, { - "type" : "fix", - "text" : "Fix minor issue in indexer uniqueness score calculation." - } ], - "final" : true -}, { - "version" : "v2.7.7", - "date" : "2019-11-04", - "changes" : [ { - "type" : "fix", - "text" : "Indexer uniqueness score had wrong axis labels in the stats page." - } ], - "final" : true -}, { - "version" : "v2.7.6", - "date" : "2019-11-04", - "changes" : [ { - "type" : "feature", - "text" : "Restore the indexer uniqueness score introduced with 2.7.0 and then rolled back due to database migration problems. The database is now restored on startup which should prevent any migration errors. The startup will take a while for this update." - } ], - "final" : true -}, { - "version" : "v2.7.5", - "date" : "2019-10-30", - "changes" : [ { - "type" : "fix", - "text" : "Fix 'You're not allowed...' error caused by the fix in 2.7.4... :-/" - } ], - "final" : true -}, { - "version" : "v2.7.4", - "date" : "2019-10-29", - "changes" : [ { - "type" : "fix", - "text" : "Fix 'You're not allowed...' error related to security cookie. Thanks to /u/routhinator for the hint." - } ], - "final" : true -}, { - "version" : "v2.7.3", - "date" : "2019-10-27", - "changes" : [ { - "type" : "feature", - "text" : "Added option to configure cover width in search results." - }, { - "type" : "fix", - "text" : "TMDB capabilities were not correctly checked." - }, { - "type" : "note", - "text" : "I've added instructions to send one-time donations via PayPal and recurring donations via Github Sponsors." - } ], - "final" : true -}, { - "version" : "v2.7.2", - "date" : "2019-10-06", - "changes" : [ { - "type" : "fix", - "text" : "I had to revert the changes from 2.7.0 because for some reason some databases could not be migrated. I'll need to take a closer look first, sorry." - } ], - "final" : true -}, { - "version" : "v2.7.1", - "date" : "2019-10-06", - "changes" : [ { - "type" : "fix", - "text" : "Hopefully fix a problem which might prevent a successful database migration for some instances." - } ], - "final" : true -}, { - "version" : "v2.7.0", - "date" : "2019-10-06", - "changes" : [ { - "type" : "feature", - "text" : "I've added a new statistics value called \"Indexer result uniqueness score\" (which is is a mouthful, if you have a better name please let me know). This score attempts to answer the question: Which indexer should I keep and which can I let go? See the wiki for more information. The score will only work for new downloads." - } ], - "final" : true -}, { - "version" : "v2.6.18", - "date" : "2019-09-29", - "changes" : [ { - "type" : "feature", - "text" : "Add global cache time config parameter" - } ], - "final" : true -}, { - "version" : "v2.6.17", - "date" : "2019-09-07", - "changes" : [ { - "type" : "feature", - "text" : "Allow indexers to be used only for API update queries" - }, { - "type" : "feature", - "text" : "Allow regular expressions to be used in the search results title filter" - } ], - "final" : true -}, { - "version" : "v2.6.16", - "date" : "2019-09-05", - "changes" : [ { - "type" : "fix", - "text" : "Fix problems with special characters when using autocomplete" - } ], - "final" : true -}, { - "version" : "v2.6.15", - "date" : "2019-09-04", - "changes" : [ { - "type" : "fix", - "text" : "Fix form auth and remember-me cookies" - } ], - "final" : true -}, { - "version" : "v2.6.14", - "date" : "2019-08-12", - "changes" : [ { - "type" : "fix", - "text" : "Minor changes" - } ], - "final" : true -}, { - "version" : "v2.6.13", - "date" : "2019-08-12", - "changes" : [ { - "type" : "fix", - "text" : "Hopefully fix error with CookieTheftException introduced with v2.6.12" - } ], - "final" : true -}, { - "version" : "v2.6.12", - "date" : "2019-08-04", - "changes" : [ { - "type" : "features", - "text" : "Allow limiting the indexers to be used via API. Use \"&indexers=,\"." - }, { - "type" : "fix", - "text" : "Reduce how long sessions are kept open, possible reducing memory usage in some cases" - } ], - "final" : true -}, { - "version" : "v2.6.11", - "date" : "2019-06-09", - "changes" : [ { - "type" : "fix", - "text" : "Improve handling and performance of wildcards for removal of trailing words" - }, { - "type" : "fix", - "text" : "Added option to define how long Hydra will try to compress the database file when shutting down. With big databases shutting down may take up to 15 seconds by default. I'm still working on analyzing why some databases grow very large. Until I've found a way to prevent the root cause this option may help a bit but it will still require Hydra to shut down (or restart)" - } ], - "final" : true -}, { - "version" : "v2.6.10", - "date" : "2019-05-21", - "changes" : [ { - "type" : "fix", - "text" : "Changing result selection using \"Invert selection\" and \"Select/deselect all\" wasn't properly registered, making mass download buttons unusable" - }, { - "type" : "fix", - "text" : "Error on startup on headless windows server" - } ], - "final" : true -}, { - "version" : "v2.6.9", - "date" : "2019-05-17", - "changes" : [ { - "type" : "fix", - "text" : "Remove trailing didn't work with words containing \"s\"... How do you explain stuff to that to non-programmers..." - }, { - "type" : "fix", - "text" : "USe localhost:8080 as preset sabNZBd URL" - } ], - "final" : true -}, { - "version" : "v2.6.8", - "date" : null, - "changes" : [ { - "type" : "fix", - "text" : "IMDB link in search history was invalid" - } ], - "final" : true -}, { - "version" : "v2.6.7", - "date" : "2019-05-15", - "changes" : [ { - "type" : "fix", - "text" : "Hopefully fix corruption of nzbhydra.yml when machine crashes (or user switches off power deliberately -.-)" - } ], - "final" : true -}, { - "version" : "v2.6.6", - "date" : "2019-05-14", - "changes" : [ { - "type" : "fix", - "text" : "Fix NoClassDefFoundError (only occurred with HTTP logging marker enabled)" - } ], - "final" : true -}, { - "version" : "v2.6.5", - "date" : "2019-05-14", - "changes" : [ { - "type" : "fix", - "text" : "Fix shift-click for selecting multiple results." - } ], - "final" : true -}, { - "version" : "v2.6.4", - "date" : "2019-05-14", - "changes" : [ { - "type" : "fix", - "text" : "Searches will always use the IDs provided in API calls and not replace them by different IDs provided by IMDB or TVMaze. In very few instances TVMaze had wrong IDs mapped which resulted in wrong searches." - }, { - "type" : "fix", - "text" : "Entering domains to bypass when using proxy didn't work." - }, { - "type" : "fix", - "text" : "Selecting multiple results in the same title group was not accepted." - } ], - "final" : true -}, { - "version" : "v2.6.3", - "date" : "2019-05-13", - "changes" : [ { - "type" : "feature", - "text" : "Extended logging for download status updates." - }, { - "type" : "feature", - "text" : "Allow wildcards in \"Remove trailing...\"" - }, { - "type" : "fix", - "text" : "Disable HSTS security header" - } ], - "final" : true -}, { - "version" : "v2.6.2", - "date" : "2019-05-05", - "changes" : [ { - "type" : "fix", - "text" : "The warning that the wrapper is outdated will be also displayed in the updates section. You can also choose to be reminded again." - }, { - "type" : "fix", - "text" : "Update link to Font Awesome in downloader config to the version actually supported." - } ], - "final" : true -}, { - "version" : "v2.6.1", - "date" : "2019-05-02", - "changes" : [ { - "type" : "feature", - "text" : "Allow indexers to be enabled for all searches but API update searches, i.e. those periodically done by Sonarr and others to get the latest releases." - }, { - "type" : "fix", - "text" : "Correctly report torznab caps (taking into regard only torznab indexers). Also disregard any disabled indexers or those not enabled for API searches and include IDs convertible to any of the supported IDs." - } ], - "final" : true -}, { - "version" : "v2.6.0", - "date" : "2019-05-01", - "changes" : [ { - "type" : "feature", - "text" : "Warn when using config that violates indexer rules and that will result in your API account being disabled." - }, { - "type" : "feature", - "text" : "Support IMDB IDs for TV search. This seems to be supported by few indexers but by many trackers." - }, { - "type" : "feature", - "text" : "Add option to ignore load limiting for internal searches." - }, { - "type" : "feature", - "text" : "Sort indexers in config by state first, then score, then name." - }, { - "type" : "fix", - "text" : "NZBHydra used to always report all ID types (e.g. IMDB IDs) in the caps to be supported. Now IDs will only be reported as supported if either at least one configured indexer supports it or query generation is enabled." - }, { - "type" : "fix", - "text" : "Prevent log file download from accessing files outside data folder." - }, { - "type" : "fix", - "text" : "Parse indexer results with provided passwords correctly (although they don't follow the spec...)." - } ], - "final" : true -}, { - "version" : "v2.5.9", - "date" : "2019-04-27", - "changes" : [ { - "type" : "fix", - "text" : "I used a discord invitation link that expires after one day. Use this one: [https://discord.gg/uh9W3rd](https://discord.gg/uh9W3rd)." - } ], - "final" : true -}, { - "version" : "v2.5.8", - "date" : "2019-04-27", - "changes" : [ { - "type" : "feature", - "text" : "Recognize when an outdated wrapper is being used and ask the user to update it manually." - }, { - "type" : "fix", - "text" : "Don't complain about mixed newznab and torznab results when adding Anime Tosho." - }, { - "type" : "fix", - "text" : "Removed nzbs.org from the presets :-( RIP" - } ], - "final" : true -}, { - "version" : "v2.5.7", - "date" : "2019-04-27", - "changes" : [ { - "type" : "feature", - "text" : "Attempt to automatically detect certain problems and inform the user (admin) about it. For now this will only detect OutOfMemory errors which cannot be properly handled when they occur." - }, { - "type" : "fix", - "text" : "Disable the grouping of TV results by episode when searching for a specific episode. Also show information about the grouping the first time it is used." - }, { - "type" : "note", - "text" : "The python wrapper nzbhydra2wrapper.py which is the main entry point for the program is now included in the linux release. If you start Hydra using that python file it will be updated automatically although changes will only take effect after the next restart of the main process." - }, { - "type" : "note", - "text" : "I was asked for a discord channel. This is it: [https://discord.gg/uh9W3rd](https://discord.gg/uh9W3rd). I can't promise I'll be the regularly but feel free to join. Some users there and on reddit are always willing to help (thanks, guys!)." - } ], - "final" : true -}, { - "version" : "v2.5.6", - "date" : null, - "changes" : [ { - "type" : "fix", - "text" : "Provide a (better) error message when clicking the infos for a show with TVRage ID for which no infos could be found." - } ], - "final" : true -}, { - "version" : "v2.5.5", - "date" : "2019-04-17", - "changes" : [ { - "type" : "feature", - "text" : "Option to log/display hosts instead of IP addresses. I haven't found a proper way of testing this so let me know if it works ;-)" - } ], - "final" : true -}, { - "version" : "v2.5.4", - "date" : "2019-04-16", - "changes" : [ { - "type" : "fix", - "text" : "Allow empty movie searches for NZBPlanet which should result in covers being shown." - } ], - "final" : true -}, { - "version" : "v2.5.3", - "date" : "2019-04-16", - "changes" : [ { - "type" : "fix", - "text" : "Update of downloader status failed with newsbin (which claims to be compatible with the sabnzbd API)." - } ], - "final" : true -}, { - "version" : "v2.5.2", - "date" : "2019-04-15", - "changes" : [ { - "type" : "fix", - "text" : "Minor downloader status bar related fixes." - } ], - "final" : true -}, { - "version" : "v2.5.1", - "date" : "2019-04-14", - "changes" : [ { - "type" : "feature", - "text" : "Display status of configured downloader on the bottom of the page. This can be disabled in the downloading config. If multiple downloaders are configured the first one is used." - }, { - "type" : "fix", - "text" : "Toggling the grouping of TV episodes or the display of TV/movie covers will take effect without having to reload the search." - } ], - "final" : true -}, { - "version" : "v2.4.4", - "date" : "2019-04-12", - "changes" : [ { - "type" : "feature", - "text" : "Reduced font size across the board to fit more results / buttons / whatever on the page. Let me know if it's too tiny :-)" - }, { - "type" : "fix", - "text" : "Add 6box and NZBPlanet to list of indexers which do not support TV or movie searches without identifiers." - } ], - "final" : true -}, { - "version" : "v2.4.3", - "date" : "2019-04-10", - "changes" : [ { - "type" : "fix", - "text" : "Make sure that 100 rows are shown when grouping results (either by season/episode or by title)." - }, { - "type" : "fix", - "text" : "Passwords for users were not properly migrated from v1." - } ], - "final" : true -}, { - "version" : "v2.4.2", - "date" : "2019-04-10", - "changes" : [ { - "type" : "fix", - "text" : "As is tradition every feature release (2.4.0) is followed by a couple of bug fix releases... The tv episode sorting should not throw any errors now and actually work properly :-)" - } ], - "final" : true -}, { - "version" : "v2.4.1", - "date" : "2019-04-10", - "changes" : [ { - "type" : "fix", - "text" : "Daily episodes (like 04/08) were not parsed correctly, resulting in an error (see 2.4.0 feature)." - } ], - "final" : true -}, { - "version" : "v2.4.0", - "date" : "2019-04-09", - "changes" : [ { - "type" : "feature", - "text" : "When searching in the TV categories in the GUI by default the results will be grouped by season & episode instead of by title. This should make it easier to select one result for every episode which is usually what you want. This behavior can be switched off in the display options (do a new search after the switch)." - }, { - "type" : "fix", - "text" : "Minor improvements to colors in bright theme." - } ], - "final" : true -}, { - "version" : "v2.3.22", - "date" : "2019-04-04", - "changes" : [ { - "type" : "feature", - "text" : "Logging marker to log HTTPS related stuff on debug level." - }, { - "type" : "fix", - "text" : "Removed an SSL related parameter from the wrapper. I already did this months ago but forgot to update the binary for linux. So if you have problems with SSL and are running Hydra on linux (not in docker) you might want to update the binary. This needs to be done manually." - } ], - "final" : true -}, { - "version" : "v2.3.21", - "date" : "2019-03-31", - "changes" : [ { - "type" : "feature", - "text" : "Option to send the mapped category name to downloaders." - }, { - "type" : "fix", - "text" : "/api/stats/indexers endpoint was accessible without authorization." - }, { - "type" : "fix", - "text" : "Show unit for average response times in stats (ms)." - } ], - "final" : true -}, { - "version" : "v2.3.20", - "date" : null, - "changes" : [ { - "type" : "fix", - "text" : "Revert revert because, as it turns out, it wasn't the libary at fault but the new version just failed to read a file already corrupted." - } ], - "final" : true -}, { - "version" : "v2.3.19", - "date" : "2019-03-20", - "changes" : [ { - "type" : "fix", - "text" : "Revert update of database library as it caused errors on startup in some issues." - } ], - "final" : true -}, { - "version" : "v2.3.18", - "date" : "2019-03-18", - "changes" : [ { - "type" : "fix", - "text" : "Not all API keys were anonymized when creating the debug infos." - } ], - "final" : true -}, { - "version" : "v2.3.17", - "date" : "2019-03-17", - "changes" : [ { - "type" : "feature", - "text" : "Binsearch is knowing for returning a 503 error every now and then. In that case Hydra will retry the search up to two times." - }, { - "type" : "fix", - "text" : "An indexer not selected due to load limiting was displayed as being disabled in the GUI." - }, { - "type" : "fix", - "text" : "Reduce frequency of config file being written." - } ], - "final" : true -}, { - "version" : "v2.3.16", - "date" : "2019-03-14", - "changes" : [ { - "type" : "fix", - "text" : "Add database index to improve loading of search history on initial page load." - }, { - "type" : "fix", - "text" : "Try to prevent config file from being corrupted." - } ], - "final" : true -}, { - "version" : "v2.3.15", - "date" : "2019-02-16", - "changes" : [ { - "type" : "note", - "text" : "I need to make something clear: If Hydra shows you 100 results on the GUI and says that x results are not yet loaded then that means that some results you're looking for may be missing. You will always only get the newest 100 results from any indexer at first. Even if you sort by name then other results which should be somewhere in that list may be 'hidden' because they were not yet retrieved from the indexer." - }, { - "type" : null, - "text" : "Delay writing of config file so that not too many concurrent writes occur. This should hopefully reduce the risk of file corruption." - } ], - "final" : true -}, { - "version" : "v2.3.14", - "date" : "2019-02-15", - "changes" : [ { - "type" : "fix", - "text" : "Change how SNI verification is disabled so that nzbgeek.info should work with Java 10+." - }, { - "type" : "fix", - "text" : "Fix NZBIndex parsing. Thanks to BenoitCharret." - } ], - "final" : true -}, { - "version" : "v2.3.13", - "date" : "2019-02-12", - "changes" : [ { - "type" : "feature", - "text" : "Improve HTTP debug logging" - }, { - "type" : "fix", - "text" : "Revert some more SSL related changes. If you still have problems connecting to indexer please manually update the binaries. Unfortunately the update process can't do that." - } ], - "final" : true -}, { - "version" : "v2.3.12", - "date" : "2019-02-10", - "changes" : [ { - "type" : "fix", - "text" : "I don't know if I should laugh or cry, but the last version actually made matters worse as 2.3.11 is unable to connect to GitHub (among others) which disables the built in update function. So if you read this and don't run docker, you'll have to update manually." - } ], - "final" : true -}, { - "version" : "v2.3.11", - "date" : "2019-02-10", - "changes" : [ { - "type" : "fix", - "text" : "Cautiously optimistic that *some* SSL issues have been solved... ;-)" - }, { - "type" : "fix", - "text" : "When implementing the display of covers I managed to mistakenly think that posters and covers are the same. Actually the poster in this context is the uploader but my code used the poster (username) as cover URL. If you've disabled the display of 'posters' in the search results you'll have to disable it again." - } ], - "final" : true -}, { - "version" : "v2.3.10", - "date" : "2019-02-09", - "changes" : [ { - "type" : "fix", - "text" : "Fix another issue with SSL. I should probably pause development until I'm fit of mind enough to do this properly..." - } ], - "final" : true -}, { - "version" : "v2.3.9", - "date" : "2019-02-09", - "changes" : [ { - "type" : "fix", - "text" : "Revert SSL changes made in 2.3.7 as Hydra didn't start for some users. I give up." - } ], - "final" : true -}, { - "version" : "v2.3.8", - "date" : "2019-02-09", - "changes" : [ { - "type" : "fix", - "text" : "Updated executable to provide a java flag which should fix SSL related problems introduced with 2.3.7. If you're not running Hydra inside a container you may need to manually update the binary (nzbhydra*.exe or just nzbhydra on linux)" - } ], - "final" : true -}, { - "version" : "v2.3.7", - "date" : "2019-02-09", - "changes" : [ { - "type" : "fix", - "text" : "Changed the way SSL certificates are checked. Connection to indexers like NZBGeek or althub should now work as expected. Removed the option 'Disable SNI'." - }, { - "type" : "fix", - "text" : "Count API hits used for connection and caps checks when calculating hit limits." - }, { - "type" : "fix", - "text" : "When results are sorted by title the title groups are now sorted by indexer score instead of age, meaning results from the indexer with the highest score are shown when the title group is collapsed." - } ], - "final" : true -}, { - "version" : "v2.3.6", - "date" : "2019-02-06", - "changes" : [ { - "type" : "fix", - "text" : "The audio category was preconfigured to require both mp3 and flac in the results which doesn't make any sense. You might want to remove them in your category config." - }, { - "type" : "fix", - "text" : "Old downloads were not removed from history even if the option to only keep them for a certain time was set." - }, { - "type" : "fix", - "text" : "Check cover/poster URLs provided by indexers to catch some invalid URLs." - } ], - "final" : true -}, { - "version" : "v2.3.5", - "date" : "2019-02-05", - "changes" : [ { - "type" : "feature", - "text" : "Show posters for movie results. Can be toggled in the display options." - } ], - "final" : true -}, { - "version" : "v2.3.4", - "date" : "2019-01-31", - "changes" : [ { - "type" : "fix", - "text" : "Move cancel button in dialog shown while searching because you're all too slow to click it." - }, { - "type" : "fix", - "text" : "Prevent database trace file becoming too large" - }, { - "type" : "fix", - "text" : "Keep less gclog files in the log folder" - } ], - "final" : true -}, { - "version" : "v2.3.3", - "date" : "2019-01-28", - "changes" : [ { - "type" : "fix", - "text" : "Connection to hosts like 'sabnzd' would fail" - } ], - "final" : true -}, { - "version" : "v2.3.2", - "date" : "2019-01-27", - "changes" : [ { - "type" : "fix", - "text" : "2.3.1 didn't start for users updating from 2.2.5 to 2.3.1. Fuck this shit" - } ], - "final" : true -}, { - "version" : "v2.3.1", - "date" : "2019-01-27", - "changes" : [ { - "type" : "fix", - "text" : "2.2.5 unfortunately may have caused database corruption in some cases. Hopefully no more... The fix may need some time the first time this new version is started." - } ], - "final" : true -}, { - "version" : "v2.3.0", - "date" : "2019-01-27", - "changes" : [ { - "type" : "feature", - "text" : "Java 11 is now supported. This required an update of the internal framework which might have some unforseen side effects (bugs), especially regarding authentification and handling of reverse proxies. Let me know if something doesn't work as expected." - }, { - "type" : "feature", - "text" : "Rename searching option 'Ignore temporarily disabled' to 'Ignore temporary errors'. If enabled indexers will not be temporarily disabled at all if a recoverable error occurs." - }, { - "type" : "fix", - "text" : "Opening magnet links under Windows 7 doesn't require administrator rights anymore." - } ], - "final" : true -}, { - "version" : "v2.2.5", - "date" : "2019-01-26", - "changes" : [ { - "type" : "fix", - "text" : "In some cases (with really big databases) the check of the API hit limit could take very long. This was hopefully improved. Migration to this version might take a bit for such instances." - } ], - "final" : true -}, { - "version" : "v2.2.4", - "date" : "2019-01-26", - "changes" : [ { - "type" : "feature", - "text" : "Add indexer specific limit to caps check. Background: RARBG only allows one request every two seconds so the caps check, which until now used two concurrent threads and a delay of 1 second, would result in errors. The limits are hard coded. Hydra will not attempt to do any rate limiting for regular search requests." - } ], - "final" : true -}, { - "version" : "v2.2.3", - "date" : "2019-01-26", - "changes" : [ { - "type" : "feature", - "text" : "Include database metadata in debug infos" - } ], - "final" : true -}, { - "version" : "v2.2.2", - "date" : "2019-01-26", - "changes" : [ { - "type" : "feature", - "text" : "Minor improvements to performance logging" - } ], - "final" : true -}, { - "version" : "v2.2.1", - "date" : "2019-01-21", - "changes" : [ { - "type" : "feature", - "text" : "Improve logging of unparseable indexer responses" - } ], - "final" : true -}, { - "version" : "v2.2.0", - "date" : "2019-01-02", - "changes" : [ { - "type" : "note", - "text" : "This release brings some major changes regarding categories and the handling of newznab categories. Please let me know if it breaks anything or has unexpected side effects (or if you love what I've done ;-))" - }, { - "type" : "feature", - "text" : "Allow combinations of newznab categories which must all be found in a search result for that category to be applied. For example 4090&11000 will only match items with both 4090 and 11000. This should allow for even finer category tuning with trackers accessed via Jackett." - }, { - "type" : "feature", - "text" : "Replace newznab categories incoming API searches with newznab categories of mapped category. For example when you have 2040,2050 configured for Movies HD and a search comes in using 2040 then indexers will be queried using 2040,2050. Until now only the supplied category was used (2040 in the example). This should result in more results to be found and so far I can't tell if it will return just better results or more crap. You can disable this with the 'Transform newznab categories' setting in the searching config." - }, { - "type" : "feature", - "text" : "Related to above: The categories on the caps page are created from the configured categories. To keep this clean only one newznab category will be used for every category (e.g. Movies HD using 2040,2050 will only be included once with 2040 as ID." - }, { - "type" : "fix", - "text" : "Use dereferer for NZB details site" - } ], - "final" : true -}, { - "version" : "v2.1.7", - "date" : "2018-12-30", - "changes" : [ { - "type" : "fix", - "text" : "Fix/improve category mapping introduced in 2.1.6. Use custom newznab categories if none from the predefined range are provided." - } ], - "final" : true -}, { - "version" : "v2.1.6", - "date" : "2018-12-30", - "changes" : [ { - "type" : "fix", - "text" : "When uploading a backup file the UI didn't update to inform the user about the progress after the file was uploaded." - }, { - "type" : "fix", - "text" : "Improve category mapping for (torznab) indexers. Some use custom newznab category numbers (>9999) which could not be properly mapped to preconfigured categories." - } ], - "final" : true -}, { - "version" : "v2.1.5", - "date" : "2018-12-29", - "changes" : [ { - "type" : "fix", - "text" : "Improve handling of movie and tv searches with some indexers (see v2.0.23). I just wish all indexers could work the same... :-/" - }, { - "type" : "fix", - "text" : "Prevent indexers without caps from being caps checked (NZBIndex, Binsearch)" - }, { - "type" : "fix", - "text" : "Improve wording indexer state when disabled by the system due to an error from which it cannot recover automatically" - } ], - "final" : true -}, { - "version" : "v2.1.4", - "date" : "2018-12-28", - "changes" : [ { - "type" : "feature", - "text" : "Allow retrieval of history and stats via API. See https://github.com/theotherp/nzbhydra2/wiki/External-API,-RSS-and-cached-queries" - }, { - "type" : "fix", - "text" : "Repeat of searches from history sometimes used wrong parameters" - }, { - "type" : "fix", - "text" : "Added nzbs.org to list of indexers unable to process type searches without IDs" - } ], - "final" : true -}, { - "version" : "v2.1.3", - "date" : "2018-12-27", - "changes" : [ { - "type" : "fix", - "text" : "Removed dead indexers from presets" - }, { - "type" : "fix", - "text" : "Prevent exception related to duplicate TV infos in database" - } ], - "final" : true -}, { - "version" : "v2.1.2", - "date" : "2018-12-18", - "changes" : [ { - "type" : "fix", - "text" : "Indexer added as newznab indexer even when selected as torznab in the config GUI" - } ], - "final" : true -}, { - "version" : "v2.1.1", - "date" : "2018-12-18", - "changes" : [ { - "type" : "fix", - "text" : "Validate config to prevent indexers with duplicate names" - }, { - "type" : "fix", - "text" : "Validate config to prevent torznab indexers being added as newznab indexer and vice versa" - } ], - "final" : true -}, { - "version" : "v2.1.0", - "date" : "2018-12-15", - "changes" : [ { - "type" : "fix", - "text" : "Search query was not built properly when conversion of search IDs did not provide any IDs usable by an indexer" - }, { - "type" : "feature", - "text" : "Support API caps in JSON" - } ], - "final" : true -}, { - "version" : "v2.0.24", - "date" : "2018-12-14", - "changes" : [ { - "type" : "note", - "text" : "Added NZBGeek to the list mentioned in v2.0.23. Thanks to the user letting me know about it." - } ], - "final" : true -}, { - "version" : "v2.0.23", - "date" : "2018-12-11", - "changes" : [ { - "type" : "note", - "text" : "Previously when an API call with search type 'movie' or 'tvsearch' was made without any identifiers or category I would call indexers with search type 'search' instead because some indexers don't like that. This causes some other problems so I've reverted that behavior except for a certain list of indexers. I have hardcoded list of indexers for which the switch will be done. I'm not sure which indexers actually behave that way. So if you find an indexer where browsing the movie or TV releases (e.g. using NZB360) will return a lot of crap please let me know so I can add the indexer to the list." - }, { - "type" : "note", - "text" : "I've changed the java runtime that is used in the docker container maintained by me (although I actually don't want to really support that...). In my tests it nearly halved memory usage in some scenarios (199MB compared to 380MB). If this proves to be stable I'll recommend the other maintainers to use this as well." - } ], - "final" : true -}, { - "version" : "v2.0.22", - "date" : "2018-12-09", - "changes" : [ { - "type" : "fix", - "text" : "Upload of large ZIP files for restoration was disabled" - } ], - "final" : true -}, { - "version" : "v2.0.21", - "date" : "2018-12-09", - "changes" : [ { - "type" : "feature", - "text" : "Some users have reported corrupted config files. I can't explain how that could ever happen but I've added code that tries to recognize this on startuppu and attempts to repair it automatically" - }, { - "type" : "fix", - "text" : "New instances were not properly initialized, in some instances resulting in a crash on startup. Sorry about that" - } ], - "final" : true -}, { - "version" : "v2.0.20", - "date" : "2018-12-08", - "changes" : [ { - "type" : "feature", - "text" : "Make sure existing configuration or database is not loaded by an older version of a program than it was created with" - } ], - "final" : true -}, { - "version" : "v2.0.19", - "date" : "2018-12-08", - "changes" : [ { - "type" : "fix", - "text" : "Restoration from uploaded backup file wouldn't work" - } ], - "final" : true -}, { - "version" : "v2.0.18", - "date" : "2018-12-05", - "changes" : [ { - "type" : "fix", - "text" : "Details link was hidden even if not restricted by auth config" - }, { - "type" : "fix", - "text" : "Redirects to torrent magnet links are now recognized and properly handled" - }, { - "type" : "fix", - "text" : "Downloads of NZBs with spaces in the filename are now properly handled" - }, { - "type" : "fix", - "text" : "Suffix NZBs sent to sabnzbd with .nzb to increase compatibility with newsbin" - } ], - "final" : true -}, { - "version" : "v2.0.17", - "date" : "2018-11-22", - "changes" : [ { - "type" : "feature", - "text" : "Automatic update. This feature has been requested for ages. Ironically, now that I rarely release new versions I've finally implemented it. It's opt-in for now even though the update process has been really stable for a while. Now that the startup is faster Hydra shouldn't be unavailable during the update process for more than 20 seconds or so. Any tools calling during that time should recover fine." - }, { - "type" : "fix", - "text" : "Make sure to load resources from TVMaze using HTTPS" - }, { - "type" : "fix", - "text" : "Handle (invalid) spaces in URLs" - } ], - "final" : true -}, { - "version" : "v2.0.16", - "date" : "2018-11-21", - "changes" : [ { - "type" : "fix", - "text" : "Size tag was not forwarded from torznab results" - } ], - "final" : true -}, { - "version" : "v2.0.15", - "date" : "2018-11-02", - "changes" : [ { - "type" : "fix", - "text" : "ID lookup for TV shows didn't always work" - } ], - "final" : true -}, { - "version" : "v2.0.14", - "date" : "2018-11-02", - "changes" : [ { - "type" : "note", - "text" : "The URL base has to start with a / from now on. Configs without URL base will be migrated" - }, { - "type" : "fix", - "text" : "ID based TV search from GUI would sometimes ignore ID" - } ], - "final" : true -}, { - "version" : "v2.0.13", - "date" : "2018-10-26", - "changes" : [ { - "type" : "feature", - "text" : "Warn when changing the host to an invalid IP" - }, { - "type" : "fix", - "text" : "api.althub.co.za should hopefully actually work now" - } ], - "final" : true -}, { - "version" : "v2.0.12", - "date" : "2018-10-24", - "changes" : [ { - "type" : "fix", - "text" : "SSL error when accessing althub from docker. Should be fixed with the setting to use the packaged cacerts file enabled" - }, { - "type" : "fix", - "text" : "Detection and handling of required restart after changing config was broken" - } ], - "final" : true -}, { - "version" : "v2.0.11", - "date" : "2018-10-23", - "changes" : [ { - "type" : "feature", - "text" : "Allow to disable SSL verification only for certain hosts" - }, { - "type" : "feature", - "text" : "Warn when host is changed from 0.0.0.0 and run in docker. This seems to cause some problems" - } ], - "final" : true -}, { - "version" : "v2.0.10", - "date" : "2018-10-20", - "changes" : [ { - "type" : "fix", - "text" : "Sometimes search IDs would be used even if the indexer wasn't configured to use them, resulting in failing searches" - } ], - "final" : true -}, { - "version" : "v2.0.9", - "date" : "2018-10-06", - "changes" : [ { - "type" : "fix", - "text" : "Caps check with Jackett indexers wouldn't complete properly due to a change in their code" - } ], - "final" : true -}, { - "version" : "v2.0.8", - "date" : "2018-10-01", - "changes" : [ { - "type" : "fix", - "text" : "Adapt database to store long torrent magnet links" - } ], - "final" : true -}, { - "version" : "v2.0.7", - "date" : null, - "changes" : [ { - "type" : "fix", - "text" : "Sabnzbd API key was not migrated" - } ], - "final" : true -}, { - "version" : "v2.0.6", - "date" : "2018-09-26", - "changes" : [ { - "type" : "fix", - "text" : "Torznab queries were limited to 100 results. I've removed the limit altogether. As torznab doesn't require or support paging there's no reason for a request limit" - } ], - "final" : true -}, { - "version" : "v2.0.5", - "date" : "2018-09-14", - "changes" : [ { - "type" : "fix", - "text" : "Adding to downloader via result button would always show failed (introduced with 2.0.3)" - } ], - "final" : true -}, { - "version" : "v2.0.4", - "date" : "2018-09-13", - "changes" : [ { - "type" : "fix", - "text" : "Improved feedback when adding NZBs to downloader failed" - } ], - "final" : true -}, { - "version" : "v2.0.3", - "date" : "2018-09-05", - "changes" : [ { - "type" : "fix", - "text" : "In some cases an incorrect NZB URL was used for downloads" - }, { - "type" : "fix", - "text" : "Saving the config would sometimes show confusing or wrong warnings" - }, { - "type" : "fix", - "text" : "Restoring from web UI had no effect" - }, { - "type" : "fix", - "text" : "Category mapping would sometimes not work for incoming searches" - } ], - "final" : true -}, { - "version" : "v2.0.2", - "date" : null, - "changes" : [ { - "type" : "fix", - "text" : "Minor stability improvements" - } ], - "final" : true -}, { - "version" : "v2.0.1", - "date" : "2018-08-19", - "changes" : [ { - "type" : "fix", - "text" : "New installations would generate a faulty default configuration, resulting in failed searches" - } ], - "final" : true -}, { - "version" : "v2.0.0", - "date" : "2018-08-18", - "changes" : [ { - "type" : "feature", - "text" : "NZBHydra 2 can now run with Java 8, 9 or 10. It shouldn't matter much which version you use as long as it's up to date. If you want to use 9 or 10 you'll need to manually update the wrapper (i.e. the executable(s) in the main folder)" - }, { - "type" : "feature", - "text" : "Reduced startup time. My instance starts in 8 seconds instead of 22 but YRMV" - }, { - "type" : "feature", - "text" : "I updated the underlying libraries and main framework. This doesn't change much for you except that NZBHydra 2 is a bit more future proof and may have some new bugs :-)" - }, { - "type" : "feature", - "text" : "Added an option to keep the history (searches, downloads, stats) only for a certain time (see Searching options). This may reduce the database size and stats calculation time and may improve performance a bit." - }, { - "type" : "fix", - "text" : "Hydra will correctly recognize if run in the windows program files folder" - }, { - "type" : "fix", - "text" : "When shutting down or restarting Hydra will try to defrag the database file. In some cases this should drastically reduce the database size. It may grow again but for now I don't have a better fix than restarting the instance..." - }, { - "type" : "fix", - "text" : "Remove multiple trailing words from titles if found" - } ], - "final" : true -}, { - "version" : "v1.5.2", - "date" : "2018-07-31", - "changes" : [ { - "type" : "fix", - "text" : "Adding new categories resulted in an exception" - }, { - "type" : "note", - "text" : "Increased the default XMX value to 256" - } ], - "final" : true -}, { - "version" : "v1.5.1", - "date" : "2018-06-11", - "changes" : [ { - "type" : "fix", - "text" : "Adding of downloaders to config was broken with last version" - } ], - "final" : true -}, { - "version" : "v1.5.0", - "date" : "2018-06-10", - "changes" : [ { - "type" : "feature", - "text" : "Redesigned the button to add new indexers. Inspired by Sonarr" - }, { - "type" : "feature", - "text" : "When a torrent black hole is configured magnet links will be saved as files there. Let me know if you need a switch to disable that. Thanks to wh0cares" - }, { - "type" : "fix", - "text" : "Config validation was not executed properly, sometimes allowing invalid values or even preventing the config from being changed" - }, { - "type" : "note", - "text" : "Added a small note to the readme that \"linux\" releases mean any platform but windows. Renaming the releases would break updates for running instances" - } ], - "final" : true -}, { - "version" : "v1.4.18", - "date" : "2018-05-22", - "changes" : [ { - "type" : "fix", - "text" : "Previous version was missing readme.md which resulted in broken updates" - } ], - "final" : true -}, { - "version" : "v1.4.16", - "date" : "2018-05-22", - "changes" : [ { - "type" : "fix", - "text" : "Small error in API? help from last version" - } ], - "final" : true -}, { - "version" : "v1.4.15", - "date" : "2018-05-22", - "changes" : [ { - "type" : "feature", - "text" : "Support animetosho (both newznab and torznab)" - }, { - "type" : "feature", - "text" : "Add small 'API?' button in config to display newznab and torznab endpoints and the api key" - } ], - "final" : true -}, { - "version" : "v1.4.14", - "date" : "2018-05-21", - "changes" : [ { - "type" : "fix", - "text" : "Error with TMDB IDs introduced with last version" - }, { - "type" : "note", - "text" : "In some cases long running instances of Hydra use a lot of CPU when they should be idle. I've made some changes which should reduce the problem to a degree. Please let me know at https://github.com/theotherp/nzbhydra2/issues/96 if you have similar problems or, even better, if they've gone away with this version" - } ], - "final" : true -}, { - "version" : "v1.4.13", - "date" : "2018-05-12", - "changes" : [ { - "type" : "fix", - "text" : "Conversion of IMDB to TMDB ID failed with missing tt prefix" - } ], - "final" : true -}, { - "version" : "v1.4.12", - "date" : "2018-05-05", - "changes" : [ { - "type" : "fix", - "text" : "Prevent database error when ignoring too many updates..." - } ], - "final" : true -}, { - "version" : "v1.4.11", - "date" : "2018-05-05", - "changes" : [ { - "type" : "fix", - "text" : "Prevent rare database error when converting between movie IDs" - }, { - "type" : "fix", - "text" : "Prevent API keys from leaking in debug infos ZIP when included in last error property" - } ], - "final" : true -}, { - "version" : "v1.4.10", - "date" : "2018-05-05", - "changes" : [ { - "type" : "feature", - "text" : "Option to disable download status updates. *Might* help in some rare cases where CPU usage is high when NZBHydra2 is supposed to idle" - } ], - "final" : true -}, { - "version" : "v1.4.9", - "date" : null, - "changes" : [ { - "type" : "fix", - "text" : "Log levels for console and file were not honored properly." - } ], - "final" : true -}, { - "version" : "v1.4.8", - "date" : "2018-03-17", - "changes" : [ { - "type" : "note", - "text" : "Updated the wrapper to create a memory dump file if the main process crashes when it's out of memory. As before you need to update the wrapper manually (except when you use docker and don't use the internal update mechanism). This is not strictly necessary but will improve chances of me debugging memory problems." - } ], - "final" : true -}, { - "version" : "v1.4.7", - "date" : "2018-03-14", - "changes" : [ { - "type" : "fix", - "text" : "Bug in internal logic would throw exception and cause indexers to be disabled for no reason" - }, { - "type" : "fix", - "text" : "API hit limit reached on omg would disable indexer permanently" - }, { - "type" : "fix", - "text" : "Indexer config state would change when switching config tabs" - }, { - "type" : "fix", - "text" : "Indexer priority field was not displayed in config" - } ], - "final" : true -}, { - "version" : "v1.4.6", - "date" : "2018-03-08", - "changes" : [ { - "type" : "feature", - "text" : "Prepend words in the results filter box with ! to exclude them" - }, { - "type" : "fix", - "text" : "Shift-click for selecting multiple results in a row didn't work on firefox" - } ], - "final" : true -}, { - "version" : "v1.4.5", - "date" : "2018-03-05", - "changes" : [ { - "type" : "fix", - "text" : "Improve caps check for some results using a TV show's initialism instead of the full name in the title" - } ], - "final" : true -}, { - "version" : "v1.4.4", - "date" : "2018-02-27", - "changes" : [ { - "type" : "fix", - "text" : "Handle LL searches better that request a general category and a subcategory (e.g. 7000,7020)" - } ], - "final" : true -}, { - "version" : "v1.4.3", - "date" : "2018-02-23", - "changes" : [ { - "type" : "fix", - "text" : "Migration failed because of missing datatabase table" - } ], - "final" : true -}, { - "version" : "v1.4.2", - "date" : "2018-02-17", - "changes" : [ { - "type" : "fix", - "text" : "Allow configuration of basic auth credentials for jackett" - } ], - "final" : true -}, { - "version" : "v1.4.1", - "date" : "2018-02-13", - "changes" : [ { - "type" : "fix", - "text" : "Indexers with incomplete config were shown in selection list but not actually usable" - }, { - "type" : "fix", - "text" : "Some issues with indexers not beeing reenabled and some confusing messages being shown. The whole thing with indexers being disabled after errors is still a bit wonky" - }, { - "type" : "fix", - "text" : "Some potential memory leaks" - } ], - "final" : true -}, { - "version" : "v1.4.0", - "date" : "2018-02-10", - "changes" : [ { - "type" : "feature", - "text" : "Rewrote the display of indexer statuses. An indexer's status is now displayed in the indexer config section (where you would probably expect it). The 'Enabled' switch was extended and now will show one of the states 'Enabled', 'Temporarily disabled', 'Permanently disabled' or 'User disabled' and an explanation. THe Indexer statuses view does still show alle the indexers' statuses but is less cluttered" - }, { - "type" : "feature", - "text" : "Show search results filter box in table header because some users didn't find the filter icons" - }, { - "type" : "fix", - "text" : "Prevent weird 'Unexpected error in hydra code. Sorry...'" - } ], - "final" : true -}, { - "version" : "v1.3.3", - "date" : "2018-02-08", - "changes" : [ { - "type" : "feature", - "text" : "Improve conversion of newznab categories to internal categories" - }, { - "type" : "fix", - "text" : "Exception in migration when providing no database file even when migration of database was requested" - }, { - "type" : "feature", - "text" : "Allow loading of UI files from local folder to allow proper development of UI" - } ], - "final" : true -}, { - "version" : "v1.3.2", - "date" : "2018-02-05", - "changes" : [ { - "type" : "fix", - "text" : "Settings file was sometimes corrupted (wrong charset) and could not be loaded anymore" - }, { - "type" : "fix", - "text" : "Delete error column in indexer status page when indexer is reenabled" - }, { - "type" : "fix", - "text" : "Button to browse file system for selecting torrent folder would fail on some systems (e.g. docker)" - } ], - "final" : true -}, { - "version" : "v1.3.1", - "date" : "2018-02-04", - "changes" : [ { - "type" : "feature", - "text" : "Display serious errors on windows in message box" - }, { - "type" : "fix", - "text" : "Hopefully reduced chance of empty config files being written" - }, { - "type" : "fix", - "text" : "Handle duplicate results from indexers better (should rarely happen)" - }, { - "type" : "note", - "text" : "NZBHydra will recognize if it's running on windows and in folder like c:\\program files or c:\\program files (x86) and refuse to start. Those folders have special read/write rights which might cause some problems. I recommend putting any programs that are not installed by a setup in a \"regular\" folder" - } ], - "final" : true -}, { - "version" : "v1.3.0", - "date" : "2018-02-03", - "changes" : [ { - "type" : "feature", - "text" : "Experimental feature to use a packaged CA certs file. This probably doesn't concern you but it may solve some SSL related issues with some newer or different JREs" - }, { - "type" : "fix", - "text" : "Sort indexer download shares by share" - }, { - "type" : "fix", - "text" : "Made the migration process a tiny bit more robust wrt wrong input" - }, { - "type" : "fix", - "text" : "Display caps check button for indexers without API key (e.g. spotweb instances). Hide button and search type and ID fields for new indexer. The check is done automatically" - } ], - "final" : true -}, { - "version" : "v1.2.6", - "date" : "2018-02-02", - "changes" : [ { - "type" : "fix", - "text" : "Sabnzbd history could not be properly parsed, preventing download status updates" - } ], - "final" : true -}, { - "version" : "v1.2.5", - "date" : "2018-01-31", - "changes" : [ { - "type" : "fix", - "text" : "Completely fix spotweb support..." - } ], - "final" : true -}, { - "version" : "v1.2.4", - "date" : "2018-01-31", - "changes" : [ { - "type" : "fix", - "text" : "Help headphones parse Hydra's results" - }, { - "type" : "fix", - "text" : "Indexer connection check used empty API key parameter, preventing check to spotweb to work" - } ], - "final" : true -}, { - "version" : "v1.2.3", - "date" : "2018-01-30", - "changes" : [ { - "type" : "fix", - "text" : "Prevent session timeout" - } ], - "final" : true -}, { - "version" : "v1.2.2", - "date" : "2018-01-29", - "changes" : [ { - "type" : "note", - "text" : "I've added debug logging to the wrapper for better, well, debugging of problems related to updating. To enable debug logging create a file DEBUG in the data folder and restart the program. As before, any non-docker installations will need to update the wrapper files manually. I'm working on a better solution." - }, { - "type" : "fix", - "text" : "Adding binsearch/NZBIndex/anizb would fail the connection check" - }, { - "type" : "fix", - "text" : "Periodic check of downloader status was not executed as expected, resulting in incomplete status NZB reports in the history" - }, { - "type" : "fix", - "text" : "Logger sometimes swallowed information when anonymizing data" - } ], - "final" : true -}, { - "version" : "v1.2.1", - "date" : "2018-01-27", - "changes" : [ { - "type" : "note", - "text" : "I've changed how some data is kept in the database. Deleting an indexer will remove it completely from the database, also deleting all related stats, search results and downloads. This might take a while on the next startup or whenever you delete an indexer with many related entries" - }, { - "type" : "feature", - "text" : "Option to delete backups after x weeks. 4 is the default" - }, { - "type" : "fix", - "text" : "Improve layout on mobile devices. Thanks nemchik" - }, { - "type" : "fix", - "text" : "Updated the wrapper to delete older JAR files which previously caused some trouble. Any existing installations will have to update this manually. Docker containers must be updated." - } ], - "final" : true -}, { - "version" : "v1.2.0", - "date" : "2018-01-25", - "changes" : [ { - "type" : "feature", - "text" : "Send torrent magnet links to associated program" - }, { - "type" : "fix", - "text" : "Results without recognizable category were rejected" - } ], - "final" : true -}, { - "version" : "v1.1.4", - "date" : "2018-01-22", - "changes" : [ { - "type" : "fix", - "text" : "Hide torrent black hole buttons for magnet links" - }, { - "type" : "fix", - "text" : "Torrents were sometimes not correctly downloaded and would have extension .nzb" - } ], - "final" : true -}, { - "version" : "v1.1.3", - "date" : "2018-01-21", - "changes" : [ { - "type" : "fix", - "text" : "Fix NZB links not being constructed correctly. Sorry about that" - } ], - "final" : true -}, { - "version" : "v1.1.2", - "date" : "2018-01-21", - "changes" : [ { - "type" : "feature", - "text" : "Improved handling of XML generation for newznab/torznab API calls. Should improve compatibility with calling tools" - }, { - "type" : "feature", - "text" : "Hydra attempts to recognize if it's running inside docker. It will not allow you call the internal update mechanism from the main page. You may still call it from the Updates page but a warning will be shown. Let me know if this works" - }, { - "type" : "fix", - "text" : "The URL code change introduced with 1.1.0 might've caused some problems and should be fixed now" - }, { - "type" : "fix", - "text" : "Sending NZBs from the download history to downloaders didn't work. You'll have to manually choose a category because the original category isn't available in the download history anymore" - }, { - "type" : "fix", - "text" : "NZB filenames were not sanitized before being written to ZIP, resulting in an error" - }, { - "type" : "fix", - "text" : "Improved dialog during update installation (no more error messages when everything is fine, hopefully)" - }, { - "type" : "fix", - "text" : "Download history was not filterable by indexer" - }, { - "type" : "fix", - "text" : "SickBeard/-rage/Medusa did not find all relevant categories. I've changed the way Hydra reports itscategories to calling tools. It follows the predefined categories of the newznab standard." - } ], - "final" : true -}, { - "version" : "v1.1.1", - "date" : "2018-01-17", - "changes" : [ { - "type" : "fix", - "text" : "Fix results not being recognized by SickRage" - }, { - "type" : "fix", - "text" : "The URL code change introduced with 1.1.0 might've caused some problems and should be fixed now" - } ], - "final" : true -}, { - "version" : "v1.1.0", - "date" : "2018-01-15", - "changes" : [ { - "type" : "feature", - "text" : "Completely rewrote handling of scheme, port, host and context path. Should solve some issues and prevent others from happening where reverse proxies are involved. Also extended the Wiki. There's no need to set an external URL anymore. Please report back if this causes any issues" - }, { - "type" : "note", - "text" : "I'll remove the option to send links to downloaders in one of the coming versions. Only upload of NZBs to downloaders will be supported. v2 is capable of handling it without issues and it allows for better control and upload status recognition" - } ], - "final" : true -}, { - "version" : "v1.0.18", - "date" : "2018-01-13", - "changes" : [ { - "type" : "fix", - "text" : "Remove test data left in by mistake" - } ], - "final" : true -}, { - "version" : "v1.0.17", - "date" : "2018-01-13", - "changes" : [ { - "type" : "feature", - "text" : "Don't require restart for change of log level" - }, { - "type" : "feature", - "text" : "Show status updates during update" - }, { - "type" : "fix", - "text" : "In some cases restarting resulted in shutdown. If you are affected by this you will to manually update the wrapper from this release" - }, { - "type" : "fix", - "text" : "In some cases duplicate detection would throw an exception" - }, { - "type" : "feature", - "text" : "Support JSON output for API searches" - } ], - "final" : true -}, { - "version" : "v1.0.16", - "date" : "2018-01-11", - "changes" : [ { - "type" : "fix", - "text" : "Make sure users don't enter an insane download limit value" - }, { - "type" : "fix", - "text" : "Fix forbidden regexes which might've let some results through" - }, { - "type" : "feature", - "text" : "Add option to disable CSRF protection and disable it by default" - } ], - "final" : true -}, { - "version" : "v1.0.15", - "date" : "2018-01-10", - "changes" : [ { - "type" : "feature", - "text" : "Pull NZB download status from configured downloaders instead of relying on extension scripts" - }, { - "type" : "feature", - "text" : "Add button to check caps for all/all incomplete (yellow) indexers" - }, { - "type" : "fix", - "text" : "Anonymize username:password pairs in URLs in logs" - }, { - "type" : "fix", - "text" : "Torznab results were returned wrong, preventing Hydra from being added to radarr" - } ], - "final" : true -}, { - "version" : "v1.0.14", - "date" : "2018-01-09", - "changes" : [ { - "type" : "fix", - "text" : "Gracefully shutdown when restarting or quitting while search requests are handled" - } ], - "final" : true -}, { - "version" : "v1.0.13", - "date" : "2018-01-09", - "changes" : [ { - "type" : "fix", - "text" : "NZBs proxied from indexers were returned with wrong / random seeming file name" - } ], - "final" : true -}, { - "version" : "v1.0.12", - "date" : "2018-01-07", - "changes" : [ { - "type" : "feature", - "text" : "Allow migrating only the config, skipping the database migration" - } ], - "final" : true -}, { - "version" : "v1.0.11", - "date" : "2018-01-07", - "changes" : [ { - "type" : "fix", - "text" : "Fix error in auth introduced in a previous version" - } ], - "final" : true -}, { - "version" : "v1.0.10", - "date" : "2018-01-07", - "changes" : [ { - "type" : "feature", - "text" : "Improve the logging for web exceptions (which are often swallowed which makes debugging harder)" - }, { - "type" : "fix", - "text" : "Name of the category would not update in the category dropdown box on the search page" - }, { - "type" : "fix", - "text" : "Allow searching without a query in the UI" - } ], - "final" : true -}, { - "version" : "v1.0.9", - "date" : "2018-01-07", - "changes" : [ { - "type" : "fix", - "text" : "Allow NZBHydra2 to be shown in an iFrame (e.g. organizr)" - } ], - "final" : true -}, { - "version" : "v1.0.8", - "date" : "2018-01-06", - "changes" : [ { - "type" : "fix", - "text" : "Increase lengths for columns which may contain very long texts (errors, queries)" - } ], - "final" : true -}, { - "version" : "v1.0.7", - "date" : "2018-01-06", - "changes" : [ { - "type" : "fix", - "text" : "Fix bug in wrapper that I introduced in last version. Oh well..." - } ], - "final" : true -}, { - "version" : "v1.0.6", - "date" : "2018-01-06", - "changes" : [ { - "type" : "note", - "text" : "Improve the way the host is determined. External URL should not need to be set when not using a reverse proxy" - }, { - "type" : "note", - "text" : "Remove PyYAML dependency from wrapper" - } ], - "final" : true -}, { - "version" : "v1.0.5", - "date" : "2018-01-06", - "changes" : [ { - "type" : "note", - "text" : "Make migration a bit more stable" - }, { - "type" : "note", - "text" : "Make sure wrapper is started from correct folder" - } ], - "final" : true -}, { - "version" : "v1.0.4", - "date" : "2018-01-06", - "changes" : [ { - "type" : "note", - "text" : "So many fixes" - } ], - "final" : true -}, { - "version" : "v1.0.3", - "date" : "2018-01-06", - "changes" : [ { - "type" : "note", - "text" : "So many fixes" - } ], - "final" : true -}, { - "version" : "v1.0.2", - "date" : "2018-01-06", - "changes" : [ { - "type" : "note", - "text" : "First public release. Welcome!" - } ], - "final" : true -} ] \ No newline at end of file +[ + { + "version": "v3.14.2", + "changes": [ + { + "type": "feature", + "text": "Custom mapping for queries and titles. This allows you to customize / change the values used by external tools or returned by metadata providers like TVDB. See #700." + } + ], + "final": true + }, + { + "version": "v3.13.2", + "date": "2021-03-20", + "changes": [ + { + "type": "fix", + "text": "Fix connection check for nzbgeek. See #695." + }, + { + "type": "note", + "text": "Java 16 is not supported. See #697." + } + ], + "final": true + }, + { + "version": "v3.13.1", + "date": "2021-03-10", + "changes": [ + { + "type": "fix", + "text": "Fix external configuration of Readarr (0.1.0.520+). See #693." + } + ], + "final": true + }, + { + "version": "v3.13.0", + "date": "2021-02-23", + "changes": [ + { + "type": "feature", + "text": "From now on I'll refer to the appropriate GitHub issues in the changelog (if I don't forget it)." + }, + { + "type": "fix", + "text": "Improve category detection for MyAnonaMouse. See #689." + }, + { + "type": "fix", + "text": "Don't crash GUI when result titles are empty. See #690." + }, + { + "type": "fix", + "text": "Clarify the restrictions section in the auth config. See #687." + } + ], + "final": true + }, + { + "version": "v3.12.0", + "date": "2021-02-13", + "changes": [ + { + "type": "feature", + "text": "Add button to send results to black hole from download history. See #685" + }, + { + "type": "feature", + "text": "Add support for custom parameters to be sent to indexers while searching. See #647" + }, + { + "type": "fix", + "text": "Download status bar did not update properly when the downloader was idle after a download. The bar will now be updated until either a new download is started or the bar is properly filled, representing the downloader's idle state. This should hopefully also fix the long-standing issue with the browser tab freezing / crashing after a while." + }, + { + "type": "fix", + "text": "Ensure that threads which send data to the frontend (like notifications or downloader status) are only active when a UI session (=browser tab) is open. Also only send downloader data if it's actually new (instead of e.g. repeatedly sending information that the downloader is idle." + }, + { + "type": "fix", + "text": "Remove code for nzbs.org :-(" + } + ], + "final": true + }, + { + "version": "v3.11.4", + "date": "2021-02-08", + "changes": [ + { + "type": "fix", + "text": "Fix warning \"Destroy method on bean...\" when shutting down NZBHydra." + }, + { + "type": "fix", + "text": "Fix automatic configuration of Sonarr and Radarr v3." + } + ], + "final": true + }, + { + "version": "v3.11.3", + "date": "2021-01-31", + "changes": [ + { + "type": "fix", + "text": "Fix an issue where the backup folder was not properly validated when saving the config. Too bad I don't get paid by the update (=bug)." + } + ], + "final": true + }, + { + "version": "v3.11.2", + "date": "2021-01-31", + "changes": [ + { + "type": "fix", + "text": "Fix a websocket issue when using a reverse proxy. Should've tested that better... If you're running NZBHydra behind a reverse proxy please see https://github.com/theotherp/nzbhydra2/issues/683#issuecomment-770444576." + } + ], + "final": true + }, + { + "version": "v3.11.1", + "date": "2021-01-31", + "changes": [ + { + "type": "fix", + "text": "Introduced a stupid bug in v3.11.0 which prevented all but one particular indexer from being selected. Sorry about that." + } + ], + "final": true + }, + { + "version": "v3.11.0", + "date": "2021-01-31", + "changes": [ + { + "type": "feature", + "text": "Implemented rate limiting for certain indexers which don't allow more than x hits in x seconds. If you know of such an indexer please let me know as this is hard coded and not configurable." + }, + { + "type": "feature", + "text": "Added option to disable \"What's new\" button after an automatic update was installed." + }, + { + "type": "fix", + "text": "Validate backup folder when saving config." + }, + { + "type": "fix", + "text": "Allow direct input for indexer color." + }, + { + "type": "fix", + "text": "Fixed an issue where animetosho results would show up as a warning in the log. The indexer contains NZB and/or torrent links combined in one feed. When you made an NZB or torrent search and a result only contained a link for the other type this would be shown as a warning. This message will now only be shown on debug level." + }, + { + "type": "fix", + "text": "Improve the connection check to sabNZBd so that false positives should be reduced (.i.e in NZBHydra connecting successfully to a proxy or other server is not interpreted as successful connection check)." + } + ], + "final": true + }, + { + "version": "v3.10.1", + "date": "2021-01-28", + "changes": [ + { + "type": "fix", + "text": "Fix an issue with hydra using a base URL (e.g. /nzbhydra2)." + } + ], + "final": true + }, + { + "version": "v3.10.0", + "date": "2021-01-28", + "changes": [ + { + "type": "feature", + "text": "Enabled compression for resources sent to the browser. This shouldn't matter on local connections but save bandwidth should you want to use UI on a mobile browser (horrible as it looks)." + }, + { + "type": "feature", + "text": "The GUI will now retrieve notifications, the downloader status and search state via WebSocket. This means that the browser keeps a connection to the server open and is only sent data when new data is available (e.g. when the downloader status actually changed). This should result in considerably fewer requests and (negligible) faster UI update times." + } + ], + "final": false + }, + { + "version": "v3.9.2", + "date": "2021-01-16", + "changes": [ + { + "type": "feature", + "text": "Added some code that allows me to post a link to adapt the logging config and to download the debug infos." + }, + { + "type": "feature", + "text": "Added config switch to add NZBs to downloader paused." + }, + { + "type": "fix", + "text": "Added some more logging and handling of edge cases for API limits." + } + ], + "final": true + }, + { + "version": "v3.9.1", + "date": "2021-01-16", + "changes": [ + { + "type": "fix", + "text": "Fixed an issue with time zones related to indexer API limits. It may only affect the log output but may also fix some problems with limit detection." + } + ], + "final": true + }, + { + "version": "v3.9.0", + "date": "2020-12-28", + "changes": [ + { + "type": "feature", + "text": "NZBHydra will now show the search results table even if all results were rejected. This way you can see the reason for the rejections without having to check the log." + }, + { + "type": "fix", + "text": "Show advanced features in downloader config if selected." + } + ], + "final": true + }, + { + "version": "v3.8.1", + "date": "2020-12-28", + "changes": [ + { + "type": "fix", + "text": "Remove NZBGeek from list of domains for which do disable SNI." + }, + { + "type": "fix", + "text": "Change text for toggle of advanced options in the config to \"Advanced hidden\" and \"Advanced shown\"." + } + ], + "final": true + }, + { + "version": "v3.8.0", + "date": "2020-12-13", + "changes": [ + { + "type": "feature", + "text": "Add 'Show advanced' switch to config. I'd already tried to get this working twice - third time's the charm!." + }, + { + "type": "feature", + "text": "Add button to clear color for an indexer." + }, + { + "type": "fix", + "text": "Apply indexer colors to expanded results as well. To mark expanded results they're shown in a darker shade so it's recommended to use indexer colors which not only differ in lightness." + } + ], + "final": true + }, + { + "version": "v3.7.0", + "date": "2020-12-13", + "changes": [ + { + "type": "feature", + "text": "New display option to hide 'Results as ZIP' button." + }, + { + "type": "feature", + "text": "New option to choose quickfilters that should be preselected." + }, + { + "type": "feature", + "text": "New option to select the primary downloader for which the footer will show the status." + }, + { + "type": "fix", + "text": "Re-add 'No category' to category selection which got lost in 3.5.0." + }, + { + "type": "fix", + "text": "The multiselect widgets in the config will now show the labels of the selected values, not their internal ID." + }, + { + "type": "fix", + "text": "'Searching...' window was not closed when all found results were being filtered." + }, + { + "type": "fix", + "text": "Don't show the blue loading bar when checking for notifications." + }, + { + "type": "fix", + "text": "Report API errors as JSON instead of XML when appropriate." + } + ], + "final": false + }, + { + "version": "v3.6.0", + "date": "2020-12-05", + "changes": [ + { + "type": "feature", + "text": "When aborting an indexer search because no ID conversion was possible Hydra will now show a less... serious message. This is an expected problem, not an error." + }, + { + "type": "fix", + "text": "Remove ampersand (&) from titles when searching indexers as they're interpreted specially." + } + ], + "final": true + }, + { + "version": "v3.5.1", + "date": "2020-11-15", + "changes": [ + { + "type": "fix", + "text": "Fix linux wrapper executable." + } + ], + "final": true + }, + { + "version": "v3.5.0", + "date": "2020-11-15", + "changes": [ + { + "type": "feature", + "text": "Use (bigger) buttons for downloader category selection." + }, + { + "type": "fix", + "text": "Fix recognition of java version with recet OpenJDK update." + } + ], + "final": true + }, + { + "version": "v3.4.3", + "date": "2020-10-31", + "changes": [ + { + "type": "fix", + "text": "Fix error that ocurred when notifications without Apprise URLs were sent." + } + ], + "final": true + }, + { + "version": "v3.4.2", + "date": "2020-10-29", + "changes": [ + { + "type": "fix", + "text": "Fix error that ocurred when notifications without Apprise URLs were sent." + } + ], + "final": true + }, + { + "version": "v3.4.1", + "date": "2020-10-25", + "changes": [ + { + "type": "fix", + "text": "Fixed external configuration of Radarr and Sonarr V3 (wrt torrents)." + } + ], + "final": true + }, + { + "version": "v3.4.0", + "date": "2020-10-25", + "changes": [ + { + "type": "feature", + "text": "Added age and source variables to download notification." + }, + { + "type": "feature", + "text": "The previously added \"Download\" notification was only for when a result was grabbed from Hydra. I've aded a notification for download completion, i.e. when the download finishes the download." + }, + { + "type": "fix", + "text": "Fixed external configuration of Radarr and Sonarr V3." + } + ], + "final": true + }, + { + "version": "v3.3.0", + "date": "2020-10-22", + "changes": [ + { + "type": "feature", + "text": "Added notifications for downloads." + }, + { + "type": "fix", + "text": "The button to send results to the downloader was not displayed in some cases." + }, + { + "type": "fix", + "text": "Apprise notifications sent via CLI containing quotation marks were truncated." + } + ], + "final": true + }, + { + "version": "v3.2.1", + "date": "2020-10-21", + "changes": [ + { + "type": "fix", + "text": "Prevent startup errors when migrating from certain older versions." + } + ], + "final": true + }, + { + "version": "v3.2.0", + "date": "2020-10-20", + "changes": [ + { + "type": "feature", + "text": "Allow using Apprise CLI to send notifications instead of Apprise API." + }, + { + "type": "fix", + "text": "Don't require Apprise API URL to end with /notify (will still work if you've already configured it that way)." + }, + { + "type": "fix", + "text": "Anonymize notification URLs when writing debug infos." + }, + { + "type": "fix", + "text": "Prevent invalid expiry date setting and fix startup failing due to invalid setting." + } + ], + "final": true + }, + { + "version": "v3.1.0", + "date": "2020-10-18", + "changes": [ + { + "type": "feature", + "text": "Add button to test notifications." + } + ], + "final": true + }, + { + "version": "v3.0.0", + "date": "2020-10-17", + "changes": [ + { + "type": "feature", + "text": "NZBHydra now allows to send and show notifications for certain events. You can request events on the Github Issue." + }, + { + "type": "fix", + "text": "Reduced the percentage of correct results an indexer must return for an ID based search for that ID to be determined to be usable for searches. This will hopefully make the caps check recognize more supported IDs without any false positives." + }, + { + "type": "fix", + "text": "Shorten torrent file names exceeding the maximum path length." + }, + { + "type": "fix", + "text": "Query generation was not properly used for indexers which support a certain search type but no IDs." + }, + { + "type": "fix", + "text": "Show a warning when more than 3 logging markers are enabled. Please only enabled them when requested by me. They reduce the performance and produce lots of irritating log output which hurts more than it helps unless I actually need it." + } + ], + "final": false + }, + { + "version": "v2.29.1", + "date": "2020-09-12", + "changes": [ + { + "type": "fix", + "text": "Use better name for indexer entries added to *arr." + }, + { + "type": "fix", + "text": "Fix issue with indexer names containing special characters when configuring *arr." + } + ], + "final": true + }, + { + "version": "v2.29.0", + "date": "2020-09-08", + "changes": [ + { + "type": "feature", + "text": "Added support for indexer priority when configuring Sonarr v3 and Radarr v3." + }, + { + "type": "feature", + "text": "Added support for automatic configuration of Readarr." + }, + { + "type": "fix", + "text": "Anonymize API key and URLs when logging *arr requests and responses." + } + ], + "final": true + }, + { + "version": "v2.28.1", + "date": "2020-09-08", + "changes": [ + { + "type": "feature", + "text": "Added Lidarr and Readarr to list of known user agents." + }, + { + "type": "feature", + "text": "The dialog for the configuration of external tools will now save the input for each tool and restore it the next time you open the dialog for that tool again." + }, + { + "type": "feature", + "text": "Support for indexer VIP expiry date 'Lifetime'. No logic behind it, just so you can enter and see that information." + }, + { + "type": "fix", + "text": "Improve layout of quick filter buttons in search results." + } + ], + "final": true + }, + { + "version": "v2.28.0", + "date": "2020-09-03", + "changes": [ + { + "type": "feature", + "text": "When using \"Add links\" to add NZBs to your downloader the links are usually calculated using the URL with which you accessed NZBHydra. This might be a URL that's not accessible by the downloader (e.g. when it's inside a docker container). You can now configure a URL in the downloading config that will be used for these links instead." + }, + { + "type": "fix", + "text": "Don't let the invisible update footer catch clicks meant for the elements behind it." + } + ], + "final": true + }, + { + "version": "v2.27.2", + "date": "2020-09-01", + "changes": [ + { + "type": "fix", + "text": "Use proper version for Radarr v3 (I used a develop version which returns 10.x)." + }, + { + "type": "fix", + "text": "Reduce log output of exceptions." + }, + { + "type": "fix", + "text": "(Hopefully) improve detection of local IP address when binding to 0.0.0.0." + } + ], + "final": true + }, + { + "version": "v2.27.1", + "date": "2020-09-01", + "changes": [ + { + "type": "feature", + "text": "Support for Radarr v3 (see v2.27.0)." + } + ], + "final": true + }, + { + "version": "v2.27.0", + "date": "2020-08-31", + "changes": [ + { + "type": "feature", + "text": "You can now automatically add NZBHydra as an indexer to Sonarr / Radarr / Lidarr. You can choose to add it as a single entry or one for every configured indexer and if it should be added as newznab and/or torznab indexer." + }, + { + "type": "fix", + "text": "Close search history dropdown in search dialog when it was dragged." + }, + { + "type": "fix", + "text": "Make quick filters case insensitive." + } + ], + "final": false + }, + { + "version": "v2.26.0", + "date": "2020-08-24", + "changes": [ + { + "type": "feature", + "text": "Drag an entry from the search history to the search input to prefill it with the history entry's values. Then you can adapt them and search." + }, + { + "type": "feature", + "text": "Added quick filters for HEVC and x265. Added an option to always show quick filter buttons (i.e. for any type of search). You can also define custom quick filters." + }, + { + "type": "feature", + "text": "Show number of filtered and number of duplicate results on search results page." + }, + { + "type": "fix", + "text": "Fix layout of search input for movies and shows." + }, + { + "type": "fix", + "text": "Fix download of magnet links to black hole for some trackers." + } + ], + "final": true + }, + { + "version": "v2.25.0", + "date": "2020-07-02", + "changes": [ + { + "type": "feature", + "text": "When creating debug infos log all changes made to the config." + }, + { + "type": "feature", + "text": "Show dl/ul ratio indicator for torznab results (if not 100%). E.g. when '50%' is shown only half the download's size will be counted towards your ratio. Freelech torrents will be shown as such." + } + ], + "final": true + }, + { + "version": "v2.24.1", + "date": "2020-06-29", + "changes": [ + { + "type": "fix", + "text": "Generate query for book searches if enabled and book search not supported by indexer." + }, + { + "type": "fix", + "text": "Autofocus search input field (pretty sure that worked at some point)." + }, + { + "type": "fix", + "text": "Catch illegal characters in hostname when configuring sabnzbd." + } + ], + "final": true + }, + { + "version": "v2.24.0", + "date": "2020-06-22", + "changes": [ + { + "type": "note", + "text": "I've upgraded some of the libraries I used. This should ideally not change anything but to be sure I'll release this as prerelase first." + }, + { + "type": "fix", + "text": "Remove API keys in URL encoded log entries." + } + ], + "final": false + }, + { + "version": "v2.23.0", + "date": "2020-06-03", + "changes": [ + { + "type": "feature", + "text": "Double-click system tray icon to open GUI in browser." + }, + { + "type": "feature", + "text": "Click downloader image in footer to open it in a new tab." + }, + { + "type": "feature", + "text": "Add toggle to display options for search result groups being expanded by default." + }, + { + "type": "feature", + "text": "Add toggle to display options for the indicator of already downloaded results." + }, + { + "type": "feature", + "text": "Add toggle to display options to control display of already downloaded results. It's basically a filter." + } + ], + "final": true + }, + { + "version": "v2.22.5", + "date": "2020-05-27", + "changes": [ + { + "type": "fix", + "text": "Indexers which report the API and download limits were not properly selected when the hit limit was reached but the latest hit was more than 24 hours ago." + }, + { + "type": "fix", + "text": "Error while searching Animetosho." + }, + { + "type": "fix", + "text": "Properly recognize ID based searches returning too many results." + } + ], + "final": true + }, + { + "version": "v2.22.4", + "date": "2020-05-24", + "changes": [ + { + "type": "fix", + "text": "Fix problem with torznab introduced in last version (looking at me again, in this case)." + } + ], + "final": true + }, + { + "version": "v2.22.3", + "date": "2020-05-24", + "changes": [ + { + "type": "fix", + "text": "Fix problem with paging introduced in last version (looking at me, in this case)." + } + ], + "final": true + }, + { + "version": "v2.22.2", + "date": "2020-05-20", + "changes": [ + { + "type": "feature", + "text": "Add refresh buttons to search and download history." + }, + { + "type": "fix", + "text": "Properly handle indexers which report more results in an API response than they actually return (looking at you, wtfnzbs)." + } + ], + "final": true + }, + { + "version": "v2.22.1", + "date": "2020-05-13", + "changes": [ + { + "type": "fix", + "text": "Last release was broken a bit..." + } + ], + "final": true + }, + { + "version": "v2.22.0", + "date": "2020-05-13", + "changes": [ + { + "type": "feature", + "text": "Add filter for minimum # of seeders (in general and per tracker)." + }, + { + "type": "fix", + "text": "It appears that the hashing algorithm used to check for the outdated wrapper files behaves differently on some machines / OSes. I switched to SHA1 which should reduce false positives. If you still get the wrapper warning and really updated all files let me know." + }, + { + "type": "fix", + "text": "Made sure that torznab results are never considered duplicates to anything. It could be argued that in some cases two torrents from public trackers may actually be the same but I consider that an edge case." + } + ], + "final": true + }, + { + "version": "v2.21.1", + "date": "2020-05-09", + "changes": [ + { + "type": "feature", + "text": "Make instructions what to update when your wrapper is outdated extra clear: Any wrapper file found in the folder must be updated, not just the one you're using to run hydra. If the message says to extract the ZIP into your nzbhydra folder I mean ALL THE FILES." + }, + { + "type": "note", + "text": "I moved my mail address from theotherp@gmx.de to theotherp@posteo.net." + } + ], + "final": true + }, + { + "version": "v2.21.0", + "date": "2020-05-08", + "changes": [ + { + "type": "feature", + "text": "NZBHydra will now try to fall back to similar results when an NZB download fails. This is only possible if it proxies the results instead of redirecting to the indexer so I've made that the default *for new installs*. It works by looking for results with the same title from other indexers which were found in the same search as the result of which the download failed." + }, + { + "type": "fix", + "text": "Covers were not shown for search results." + }, + { + "type": "fix", + "text": "Fix layout of tooltip icons (\"?\") in config in safari browser." + } + ], + "final": true + }, + { + "version": "v2.20.7", + "date": "2020-05-07", + "changes": [ + { + "type": "fix", + "text": "Execute check of outdated wrapper on startup to properly detect updated wrapper." + }, + { + "type": "fix", + "text": "Fix some more layout issues." + } + ], + "final": true + }, + { + "version": "v2.20.6", + "date": "2020-05-07", + "changes": [ + { + "type": "fix", + "text": "Revert tool to compile python wrapper to exe to older version as new exe files were (falsely!) recognized as a virus by *some* tools. To be clear, the files were never problematic. That means you'll have update the exe files or python scripts again." + }, + { + "type": "fix", + "text": "Fix decoding issue of settings file by python3 wrapper." + } + ], + "final": true + }, + { + "version": "v2.20.5", + "date": "2020-05-06", + "changes": [ + { + "type": "feature", + "text": "Mark results in GUI that already have been downloaded." + }, + { + "type": "fix", + "text": "Fix issue with notification about outdated wrapper files not being shown. NZBHydra will now nag you until you refresh the files." + }, + { + "type": "fix", + "text": "Revert layout fixes made in v2.20.4 because fuck CSS." + } + ], + "final": true + }, + { + "version": "v2.20.4", + "date": "2020-05-06", + "changes": [ + { + "type": "feature", + "text": "GC logging (for debugging of memory issues) is now configurable and disabled by default. This has required a change in the wrapper which means you'll have to manually update them if you're running NZBHydra on windows or are using the linux executable." + }, + { + "type": "feature", + "text": "Show current version and (if applicable) docker container infos on about page." + }, + { + "type": "fix", + "text": "Fix parsing of API limits from indexers' API responses using different formats." + }, + { + "type": "fix", + "text": "Don't show news for fresh installs." + }, + { + "type": "fix", + "text": "Fix some (minor) layout issues on the search page." + } + ], + "final": true + }, + { + "version": "v2.20.3", + "date": "2020-05-01", + "changes": [ + { + "type": "feature", + "text": "NZBHydra will recognize renamed indexers when saving the config. Renaming will no longer cause loss of stats and history for those indexers. You should have two indexers configured with the same host, API key and search type as this messes with the rename detection." + }, + { + "type": "feature", + "text": "Click covers in search results to show them in a pop-up." + }, + { + "type": "fix", + "text": "In some cases the download history could not be opened." + } + ], + "final": true + }, + { + "version": "v2.20.2", + "date": "2020-04-29", + "changes": [ + { + "type": "feature", + "text": "Added more substructures to the config GUI to make it a bit more clear." + }, + { + "type": "feature", + "text": "Replaced the config help pop-up pages with contextual help. Click the question marks neach to each field to get a bit more in-depth info." + }, + { + "type": "feature", + "text": "Add button to clear search input." + }, + { + "type": "fix", + "text": "Automatic update notification was also shown for manual updates." + } + ], + "final": true + }, + { + "version": "v2.20.1", + "date": "2020-04-28", + "changes": [ + { + "type": "feature", + "text": "Add button to debug infos tab to list all HTTP endpoints (useful for reverse proxy config)." + }, + { + "type": "fix", + "text": "Search type SEARCH wasn't displayed in indexer config." + }, + { + "type": "fix", + "text": "Improve matching of indexer configs when reading jackett config." + }, + { + "type": "fix", + "text": "Restore display of button to send torrents to black hole." + }, + { + "type": "fix", + "text": "Try to fix circular loading error when creating backup." + } + ], + "final": true + }, + { + "version": "v2.20.0", + "date": "2020-04-26", + "changes": [ + { + "type": "feature", + "text": "Option to filter out results by language. Very few indexers provide the language in the results, though." + }, + { + "type": "feature", + "text": "You can now add self-signed certificates for any hosts you want to connect to. Just create a folder named 'certificates' inside the data folder, put your .crt files there and reload NZBHydra." + }, + { + "type": "feature", + "text": "Option to disable SSL verification for local hosts. (This was on by default so far)." + }, + { + "type": "feature", + "text": "Support for saving NZBs to a black hole." + }, + { + "type": "fix", + "text": "Fix sorting by age in download history." + }, + { + "type": "fix", + "text": "NZBGet connection didn't honor SSL verification settings." + }, + { + "type": "fix", + "text": "Properly display last errror on indexer statuses page." + }, + { + "type": "fix", + "text": "Fix parsing of binsearch date on non-english locales." + }, + { + "type": "fix", + "text": "Properly recognize duplicate NZBs not added to sabNZBd." + }, + { + "type": "fix", + "text": "Improve matching of downloads to downloader entries where no external ID exists, i.e. those downloads resulting from API accesses." + }, + { + "type": "fix", + "text": "When using NZBGet the wrong NZB would be shown as downloading if the first entry in the queue wasn't the one downloading." + }, + { + "type": "fix", + "text": "Handle errors better while adding torrents to black hole or sending magnet links." + }, + { + "type": "fix", + "text": "Filter out quotation marks (\") when searching NZBGeek." + }, + { + "type": "note", + "text": "I've added two settings for the database. Just ignore them unless told otherwise ;-)" + } + ], + "final": true + }, + { + "version": "v2.19.6", + "date": "2020-04-23", + "changes": [ + { + "type": "fix", + "text": "With v2.15.0 I added the option to configure the backup folder and changed the path from being relative to the data folder to being relative to the main folder. That's not compatible with docker containers and broke the backup but I always insisted it wasn't my fault - it was, sorry." + } + ], + "final": true + }, + { + "version": "v2.19.5", + "date": "2020-04-20", + "changes": [ + { + "type": "fix", + "text": "Indexer caps check was not executed when adding a new indexer." + }, + { + "type": "note", + "text": "Happy 420. Stay inside. Stay healthy. Sorry for all the bugfix releases..." + } + ], + "final": true + }, + { + "version": "v2.19.4", + "date": "2020-04-20", + "changes": [ + { + "type": "fix", + "text": "Fix error while reading API limits response from indexers which don't report oldest access time." + } + ], + "final": true + }, + { + "version": "v2.19.3", + "date": "2020-04-20", + "changes": [ + { + "type": "fix", + "text": "Fix error when searching torznab." + } + ], + "final": true + }, + { + "version": "v2.19.2", + "date": "2020-04-20", + "changes": [ + { + "type": "fix", + "text": "Fix error related to fallback." + } + ], + "final": true + }, + { + "version": "v2.19.1", + "date": "2020-04-20", + "changes": [ + { + "type": "feature", + "text": "Add debug output for determination of API/download limits." + }, + { + "type": "fix", + "text": "Corectly parse API/download limit information from NNTmux." + } + ], + "final": true + }, + { + "version": "v2.19.0", + "date": "2020-04-19", + "changes": [ + { + "type": "feature", + "text": "Add option to set VIP expiry date for an indexer. You will be warned when the expiry date is near or has been reached." + } + ], + "final": false + }, + { + "version": "v2.18.0", + "date": "2020-04-19", + "changes": [ + { + "type": "feature", + "text": "Added option to define a color for an indexer. Results from that indexer will be marked using that color." + }, + { + "type": "fix", + "text": "Some indexers apparently return all results for ID based searches when actually no results were found. In this case it will be handled as if no results were found." + }, + { + "type": "fix", + "text": "Adjust width of title box in search form when displaying results." + }, + { + "type": "fix", + "text": "Fallback to query generation was often not executed when it should've." + } + ], + "final": false + }, + { + "version": "v2.17.6", + "date": "2020-04-17", + "changes": [ + { + "type": "fix", + "text": "Fix passworded releases not being included for a certain indexer." + }, + { + "type": "note", + "text": "Added logging to debug query generation fallback." + }, + { + "type": "note", + "text": "Added thank-you to newsgroup.ninja for sponsoring me." + } + ], + "final": true + }, + { + "version": "v2.17.5", + "date": "2020-04-05", + "changes": [ + { + "type": "fix", + "text": "Fix copy & paste error introduced with last version." + } + ], + "final": true + }, + { + "version": "v2.17.4", + "date": "2020-04-05", + "changes": [ + { + "type": "fix", + "text": "Min and max size were not filled on page load with a custom default category was configured." + } + ], + "final": true + }, + { + "version": "v2.17.3", + "date": "2020-04-01", + "changes": [ + { + "type": "feature", + "text": "Add option to always convert media IDs. This might make sense for indexers that only sometimes support a certain ID, i.e. don't have all results tagged with a certain ID but may have tagged them with others." + } + ], + "final": true + }, + { + "version": "v2.17.2", + "date": "2020-04-01", + "changes": [ + { + "type": "fix", + "text": "Fix database error when searching with disabled history." + }, + { + "type": "fix", + "text": "Don't show option how long to keep stats with disabled history." + } + ], + "final": true + }, + { + "version": "v2.17.1", + "date": "2020-03-31", + "changes": [ + { + "type": "fix", + "text": "When reading the jackett configuration update existing tracker configs instead of replacing them." + }, + { + "type": "note", + "text": "Enable query generation for internal searches by default." + } + ], + "final": true + }, + { + "version": "v2.17.0", + "date": "2020-03-30", + "changes": [ + { + "type": "feature", + "text": "Add option to read Jackett config and automatically add all configured trackers. Already configured trackers will be updated. Thanks for Davide Campagna for the tip." + }, + { + "type": "feature", + "text": "Add option to configure downloader to never send a category." + }, + { + "type": "fix", + "text": "Some time ago I implemented a feature that recognized OutOfMemory errors in the log which might've been not recognized by the user because the program automatically restarts after such a crash. Ironically this check caused OutOfMemory errors with huge log files..." + } + ], + "final": true + }, + { + "version": "v2.16.5", + "date": "2020-03-23", + "changes": [ + { + "type": "feature", + "text": "Enable some more logging to debug slow server responses." + } + ], + "final": true + }, + { + "version": "v2.16.3", + "date": "2020-03-23", + "changes": [ + { + "type": "feature", + "text": "Fancy new graph for CPU usage per thread in the debug infos section. Enable the logging marker 'Performance' for the graph to show data. In this case NZBHydra will also log memory usage and any threads using more than 5% CPU. This might have an overhead on some systems so I don't recommend running it by default." + }, + { + "type": "feature", + "text": "Add option to create and log a thread dump directly from the GUI. You can also create a heap dump for me to analyze but this will only work with non-J9 JREs." + }, + { + "type": "feature", + "text": "Log more data in the debug report. If you're curious you can visit http://127.0.0.1:5076/actuator (or whatever your IP and port are) and take a look. There's a lot of data you could display in a dashboard." + } + ], + "final": true + }, + { + "version": "v2.16.2", + "date": "2020-03-22", + "changes": [ + { + "type": "feature", + "text": "Extend performance logging." + } + ], + "final": true + }, + { + "version": "v2.16.1", + "date": "2020-03-15", + "changes": [ + { + "type": "fix", + "text": "Fix display of version history." + } + ], + "final": false + }, + { + "version": "v2.16.0", + "date": "2020-03-15", + "changes": [ + { + "type": "feature", + "text": "Add an extra option for how long stats data is kept. Set this to 4 weeks or so. I've also updated the wiki's memory page to explain which settings impact the database size which is usually the reason for high memory usage." + }, + { + "type": "note", + "text": "I've reduced the default for how long search results are kept in the database to mitigate some memory issues with large databases. Only very few users should be affected by this negatively." + }, + { + "type": "note", + "text": "I've moved the settings for the history to the main config section." + } + ], + "final": false + }, + { + "version": "v2.15.2", + "date": "2020-03-15", + "changes": [ + { + "type": "feature", + "text": "Increased the number of entries in the search history dropdown to 25." + }, + { + "type": "feature", + "text": "Added option to configure the number of results shown per page. Default is 100. Max is 500." + }, + { + "type": "fix", + "text": "Properly display full width of selected titles from the search autocomplete." + }, + { + "type": "fix", + "text": "Remove apostrophe (') from generated queries again. Seems like there is no right way to do this as some trackers return more results with and some without; but it also seems that more indexers prefer it to be removed. If you know a tracker / indexer that works better with apostrophes in the query please tell me and I will make an exclusion for them." + } + ], + "final": false + }, + { + "version": "v2.15.1", + "date": "2020-03-14", + "changes": [ + { + "type": "fix", + "text": "Contents of the generic storage were not properly migrated." + } + ], + "final": false + }, + { + "version": "v2.15.0", + "date": "2020-03-14", + "changes": [ + { + "type": "feature", + "text": "Option to disable history of searches and downloads." + }, + { + "type": "feature", + "text": "Option to configure folder for backups." + }, + { + "type": "feature", + "text": "Option to not send newznab categories for torznab indexers (trackers). See #516." + }, + { + "type": "note", + "text": "Previously a couple of settings (Time of last backup, time of first start, latest news shown, etc.) were stored in the database. That meant they were lost when starting with a new database. I've moved the settings to the config file wherey they belong." + }, + { + "type": "feature", + "text": "Show a notification footer when an automatic update was installed." + }, + { + "type": "fix", + "text": "Don't crash py3 wrapper when trying to log unicode characters." + }, + { + "type": "fix", + "text": "Keep result selection when changing pages. (To be precise, the result selection was actually already kept but upon page change \"selected\" results' checkboxes would not be checked.)" + }, + { + "type": "fix", + "text": "Fix download of results as ZIP (which apparently nobody uses as it seems to have been broken forever...)." + } + ], + "final": false + }, + { + "version": "v2.14.2", + "date": "2020-03-09", + "changes": [ + { + "type": "fix", + "text": "Ensure passworded results are included for certain indexers when configured not to ignore them." + }, + { + "type": "fix", + "text": "Fix link to downloading help." + } + ], + "final": true + }, + { + "version": "v2.14.1", + "date": "2020-02-23", + "changes": [ + { + "type": "fix", + "text": "Fix failing startup of fresh instance on Linux. Thanks, hotio." + } + ], + "final": true + }, + { + "version": "v2.14.0", + "date": "2020-02-23", + "changes": [ + { + "type": "feature", + "text": "Allow setting a default category to be preselected." + }, + { + "type": "feature", + "text": "Add supported SSL ciphers to debug infos output." + }, + { + "type": "feature", + "text": "Update indexer presets." + }, + { + "type": "fix", + "text": "Fix errors in py3 wrapper." + } + ], + "final": true + }, + { + "version": "v2.13.14", + "date": "2020-02-19", + "changes": [ + { + "type": "fix", + "text": "Fix error in URL calculation, resulting in failing API downloads when other programs access Hydra via a reverse proxy with SSL." + } + ], + "final": true + }, + { + "version": "v2.13.13", + "date": "2020-02-17", + "changes": [ + { + "type": "fix", + "text": "Redirect system.out to log file for SSL debug infos even on windows" + } + ], + "final": true + }, + { + "version": "v2.13.12", + "date": "2020-02-15", + "changes": [ + { + "type": "fix", + "text": "Don't use value of X-Forwarded-For when recognizing secure IPs." + }, + { + "type": "fix", + "text": "Don't use search IDs in fallback queries. The indexer already returned 0 results for the last search and providing them may prevent the query from returning results." + } + ], + "final": false + }, + { + "version": "v2.13.11", + "date": "2020-02-15", + "changes": [ + { + "type": "fix", + "text": "Fix invalid config created by v2.13.9." + } + ], + "final": false + }, + { + "version": "v2.13.10", + "date": "2020-02-15", + "changes": [ + { + "type": "fix", + "text": "Fix error while saving config." + } + ], + "final": false + }, + { + "version": "v2.13.9", + "date": "2020-02-15", + "changes": [ + { + "type": "feature", + "text": "Replace auth token implementation with auth header. You may define an header that provides a username and a range of IP addresses from which this header will be accepted. The user will automatically be logged in." + } + ], + "final": false + }, + { + "version": "v2.13.8", + "date": "2020-02-15", + "changes": [ + { + "type": "feature", + "text": "Allow authorization via predefined OAuth2 / (X-)Authorization header. The token must be unique for each user in order to identify him." + }, + { + "type": "fix", + "text": "Improve matching of downloader history entries." + }, + { + "type": "fix", + "text": "Use dereferer for links in config help texts." + }, + { + "type": "fix", + "text": "Improve readability of error messages in dark and grey themes." + } + ], + "final": false + }, + { + "version": "v2.13.7", + "date": "2020-02-11", + "changes": [ + { + "type": "fix", + "text": "Further extend logging if logging marker 'HTTP Server' is selected. Don't hide local IP addresses in log. Replace other IP files with hashes to hide them but make them comparable." + } + ], + "final": true + }, + { + "version": "v2.13.6", + "date": "2020-02-09", + "changes": [ + { + "type": "fix", + "text": "Improve matching of hidden download entries from NZBGet history." + } + ], + "final": true + }, + { + "version": "v2.13.5", + "date": "2020-02-09", + "changes": [ + { + "type": "feature", + "text": "Extend logging if logging marker 'HTTP Server' is selected." + } + ], + "final": true + }, + { + "version": "v2.13.4", + "date": "2020-02-08", + "changes": [ + { + "type": "fix", + "text": "Improve wording of config description on how to apply newznab categories by pressing enter." + }, + { + "type": "fix", + "text": "Include hidden results from NZBGet history when checking download status. That way entries removed by *arr and other programs will be considered, too." + } + ], + "final": true + }, + { + "version": "v2.13.3", + "date": "2020-02-06", + "changes": [ + { + "type": "fix", + "text": "Fixed a very rare issue where a file stored in temp directory could not be read or deleted which prevented successful database migration." + } + ], + "final": true + }, + { + "version": "v2.13.2", + "date": "2020-02-02", + "changes": [ + { + "type": "fix", + "text": "Uniqueness score was not saved for torrent downloads." + }, + { + "type": "fix", + "text": "Apostrophes were removed from generated queries resulting in less results." + } + ], + "final": true + }, + { + "version": "v2.13.1", + "date": "2020-02-01", + "changes": [ + { + "type": "fix", + "text": "Don't verify hostnames for hosts for which to ignore SSL certificate checks." + } + ], + "final": true + }, + { + "version": "v2.13.0", + "date": "2020-02-01", + "changes": [ + { + "type": "note", + "text": "I've removed the option to use the packaged cacerts file which will now always be loaded by default. A future version will allow to add custom certificates to the chain. Most likely this will not affect many users anyway." + }, + { + "type": "fix", + "text": "Fixed issue where SSL verification was not properly disabled for some hosts. Certificate checks are now also automatically disabled for local hosts." + } + ], + "final": false + }, + { + "version": "v2.12.8", + "date": "2020-01-29", + "changes": [ + { + "type": "fix", + "text": "Same shit, different release. Thanks to reloxx13 for helping me reproduce this." + } + ], + "final": false + }, + { + "version": "v2.12.7", + "date": "2020-01-29", + "changes": [ + { + "type": "fix", + "text": "Fix another issue with database migration. I'll switch to a different approach soon, this is too fragile." + } + ], + "final": false + }, + { + "version": "v2.12.6", + "date": "2020-01-29", + "changes": [ + { + "type": "fix", + "text": "Fix issue with new installations not starting due to updated database library. So much for more stability..." + } + ], + "final": false + }, + { + "version": "v2.12.5", + "date": "2020-01-28", + "changes": [ + { + "type": "fix", + "text": "Update database library. Should have no effect on you except hopefully more stability." + } + ], + "final": false + }, + { + "version": "v2.12.4", + "date": "2020-01-27", + "changes": [ + { + "type": "fix", + "text": "Fix exception that occurs when an indexer's API limit was reached as reported by the indexer but Hydra can't find any of those hits in its database." + } + ], + "final": true + }, + { + "version": "v2.12.3", + "date": "2020-01-26", + "changes": [ + { + "type": "fix", + "text": "Updated included SSL certificates." + }, + { + "type": "fix", + "text": "Include beta releases in changelog when they have been released between the currently installed final version and the newest final version." + } + ], + "final": true + }, + { + "version": "v2.12.2", + "date": "2020-01-20", + "changes": [ + { + "type": "fix", + "text": "Made some improvements in the way certificates are loaded. This should hopefully improve connectivity with NZBGeek on systems where it previously failed (due to incorrect JDK installations)." + } + ], + "final": true + }, + { + "version": "v2.12.1", + "date": "2020-01-19", + "changes": [ + { + "type": "fix", + "text": "Fix error in indexer selection when indexers report their API hits but don't report the expiry timestamp." + }, + { + "type": "fix", + "text": "Caching results for external API didn't work with some combination of parameters." + } + ], + "final": false + }, + { + "version": "v2.12.0", + "date": "2020-01-18", + "changes": [ + { + "type": "feature", + "text": "Show API and download limit related values in the indexer statuses page." + }, + { + "type": "feature", + "text": "If an indexer reports API and download limits and current hits in the response (as far as I know only nntmux does this) this will be stored and used to determine if the indexer's limits are reached. This will allow more precise results when any other programs (or you) happen to make API calls or downloads that Hydra is not aware of. As a fallback the logged API hits and downloads from the database are used (as before)." + } + ], + "final": false + }, + { + "version": "v2.11.2", + "date": "2020-01-15", + "changes": [ + { + "type": "fix", + "text": "Fix SSL logging introduced in v2.11.1 when running in linux." + } + ], + "final": true + }, + { + "version": "v2.11.1", + "date": "2020-01-14", + "changes": [ + { + "type": "feature", + "text": "Added code to help debug SSL / certificate issues when connecting to indexers." + }, + { + "type": "fix", + "text": "Fix all versions in version history being displayed as beta." + }, + { + "type": "fix", + "text": "Handle unexpected response when checking caps better." + } + ], + "final": true + }, + { + "version": "v2.11.0", + "date": "2020-01-12", + "changes": [ + { + "type": "feature", + "text": "Restored old \"Load all results\" behavior. Now when enabled Hydra will display all already retrieved results from the cache. You still need to click \"Load all\" on the search results page to load all results available from indexers, resulting in more API hits. I've renamed the setting in the config to \"Display all cached results\"." + } + ], + "final": true + }, + { + "version": "v2.10.13", + "date": "2020-01-11", + "changes": [ + { + "type": "feature", + "text": "Provide wrapper file for Python 3. Would be nice if you could test it and let me know if it works." + } + ], + "final": false + }, + { + "version": "v2.10.12", + "date": "2020-01-11", + "changes": [ + { + "type": "feature", + "text": "Add validation to category config that warns users when a category contains a newznab main category (like 2000) and a subcategory already covered by that (like 2020)." + }, + { + "type": "feature", + "text": "Provide wrapper file for Python 3." + }, + { + "type": "fix", + "text": "Recognize error thrown when search IDs not supported by Animetosho." + } + ], + "final": false + }, + { + "version": "v2.10.11", + "date": "2020-01-07", + "changes": [ + { + "type": "fix", + "text": "Allow users with access to stats to see the downloader bar. Prevent error message for the others." + } + ], + "final": false + }, + { + "version": "v2.10.10", + "date": "2020-01-07", + "changes": [ + { + "type": "fix", + "text": "Add missing UI config entry for backup added in last update." + } + ], + "final": false + }, + { + "version": "v2.10.9", + "date": "2020-01-06", + "changes": [ + { + "type": "feature", + "text": "Switched option for backup to an interval of days which allows you to have a finer control over when backups are created (e.g. more often if your system tends to crash...)." + } + ], + "final": false + }, + { + "version": "v2.10.8", + "date": "2020-01-05", + "changes": [ + { + "type": "feature", + "text": "Added option to update to prereleases. If you enable this you will get 'beta' releases which I consider kinda stable but which contain bigger changes which might still break stuff. If you want to help with development please enable this and report any problems you encounter. Please note that any older instance older than v2.10.8 (this one) will always update to prereleases because they don't know the difference. Docker containers by popular maintainers will soon support prerelease tags (or already do so by now)." + } + ], + "final": true + }, + { + "version": "v2.10.7", + "date": "2020-01-05", + "changes": [ + { + "type": "note", + "text": "Happy new year!" + }, + { + "type": "fix", + "text": "Fix memory leak when using a proxy." + } + ], + "final": true + }, + { + "version": "v2.10.6", + "date": "2019-12-29", + "changes": [ + { + "type": "fix", + "text": "The last changes made a pretty big change in the searching behavior with the option 'Load all' enabled. I'm completely rolling that back until I have an idea how to get what I want without causing excessive search behavior." + } + ], + "final": true + }, + { + "version": "v2.10.5", + "date": "2019-12-29", + "changes": [ + { + "type": "fix", + "text": "Last udate (which reverted 2.10.3) was incomplete. Sorry, still drowsy from too much christmas food ;-)" + } + ], + "final": true + }, + { + "version": "v2.10.4", + "date": "2019-12-28", + "changes": [ + { + "type": "fix", + "text": "Revert 'load all' change made with last version as it causes some search loops. Will need to take a closer look." + } + ], + "final": true + }, + { + "version": "v2.10.3", + "date": "2019-12-28", + "changes": [ + { + "type": "fix", + "text": "With the option to load all results enabled now all available results will actually be loaded." + }, + { + "type": "note", + "text": "I've removed the feature to migrate from v1 (to reduce the install size and memory usage a bit). It's still possible to migrate in older versions and then update to a current version." + } + ], + "final": true + }, + { + "version": "v2.10.2", + "date": "2019-12-04", + "changes": [ + { + "type": "feature", + "text": "Add option to log HTTP server requests and their response times. The log messages will be written to a file nzbhydra.serv.log and not contained in the debug infos. They might help debug some performance related problems." + } + ], + "final": true + }, + { + "version": "v2.10.1", + "date": "2019-12-01", + "changes": [ + { + "type": "fix", + "text": "Fix db error when trying to save downloaded NZB." + } + ], + "final": true + }, + { + "version": "v2.10.0", + "date": "2019-11-30", + "changes": [ + { + "type": "fix", + "text": "I've changed (fixed) the way indexers are queried when searches are being made. In essence this will fix paging, allowing Radarr/Sonarr to properly read NZBHydra's results over multiple pages. What does that mean for you? *arr will probably find more results when doing backlog searches and NZBHydra will do more indexer searches, resulting in increased API hits (but not more than if you had configured them directly in *arr). For more (technical) details see this GitHub issue." + }, + { + "type": "fix", + "text": "Recognize indexers reporting -1 for api or download limit for \"unlimited\"." + }, + { + "type": "fix", + "text": "Fixed a minor layout issue in the config." + }, + { + "type": "fix", + "text": "Make sure \"Keep history for ... weeks\" is either empty or set to a positive value." + }, + { + "type": "fix", + "text": "The download history didn't load properly when the option to delete old searches from the history was set." + } + ], + "final": true + }, + { + "version": "v2.9.5", + "date": "2019-11-23", + "changes": [ + { + "type": "feature", + "text": "I realised the indexer score is too complex to show in a chart and replaced it with a table, that shows more information. It will now contain the average uniqueness score, the number of unique downloads and the number of searches which resulted in a download and where an indexer was involved. " + } + ], + "final": true + }, + { + "version": "v2.9.4", + "date": "2019-11-21", + "changes": [ + { + "type": "fix", + "text": "Further improvements regarding uniqueness score." + } + ], + "final": true + }, + { + "version": "v2.9.3", + "date": "2019-11-20", + "changes": [ + { + "type": "feature", + "text": "Some indexers report their API and download limits in their XMLs. NZBHydra will detect that when the indexer's caps are checked and will automatically fill out the config accordingly (keeping already set values as they are)." + } + ], + "final": true + }, + { + "version": "v2.9.2", + "date": "2019-11-17", + "changes": [ + { + "type": "fix", + "text": "Actually show version dates in the updates page..." + } + ], + "final": true + }, + { + "version": "v2.9.1", + "date": "2019-11-17", + "changes": [ + { + "type": "fix", + "text": "Further adjustment to uniqueness score." + } + ], + "final": true + }, + { + "version": "v2.9.0", + "date": "2019-11-17", + "changes": [ + { + "type": "feature", + "text": "I've updated the indexer uniqueness score calculation so that indexers which are often involved in searches get a higher score than those rarely involved. I also found a bug in the way the data was stored to the database so the old values will be removed." + }, + { + "type": "feature", + "text": "The changelog now contains release dates along with the version." + }, + { + "type": "feature", + "text": "Added option to disable update banner when running docker." + } + ], + "final": true + }, + { + "version": "v2.8.4", + "date": "2019-11-14", + "changes": [ + { + "type": "fix", + "text": "Cached torznab results were returned as wrong XML. Also cached torznab and newznab queries could conflict." + } + ], + "final": true + }, + { + "version": "v2.8.3", + "date": "2019-11-14", + "changes": [ + { + "type": "fix", + "text": "Improve logging and handling of torznab/newznab XML transformation." + } + ], + "final": true + }, + { + "version": "v2.8.2", + "date": "2019-11-13", + "changes": [ + { + "type": "feature", + "text": "Support for pourcesoir.in, a french indexer. Their dev approached me with an idea on how to work around laws forbidding hosting NZB files. The indexer provides a certain text for each result using which you will find the result using a raw search engine like binsearch. NZBHydra will display a search icon in the search results GUI via which you can search for the result on Binsearch. I'll be honest, I'm not sure how viable that approach is, but I'm open to new ideas." + }, + { + "type": "fix", + "text": "Fix pagination display error with." + } + ], + "final": true + }, + { + "version": "v2.8.1", + "date": "2019-11-11", + "changes": [ + { + "type": "feature", + "text": "Allow to define sorting for the search results via URL parameters. Use &sortby= and, optionally, &sortdirection=asc or &sortdirection=desc. This will take preference to the sorting settings saved in a cookie but not overwrite them." + } + ], + "final": true + }, + { + "version": "v2.8.0", + "date": "2019-11-08", + "changes": [ + { + "type": "fix", + "text": "Hydra will use proper HTTP status codes when NZB download fails to signal that an indexer's API limit is reached. This will be recognized by *arr, which will skip the release and try another one. This will also prevent *arr from disabling NZBHydra in such cases." + }, + { + "type": "fix", + "text": "Fix minor issue in indexer uniqueness score calculation." + } + ], + "final": true + }, + { + "version": "v2.7.7", + "date": "2019-11-04", + "changes": [ + { + "type": "fix", + "text": "Indexer uniqueness score had wrong axis labels in the stats page." + } + ], + "final": true + }, + { + "version": "v2.7.6", + "date": "2019-11-04", + "changes": [ + { + "type": "feature", + "text": "Restore the indexer uniqueness score introduced with 2.7.0 and then rolled back due to database migration problems. The database is now restored on startup which should prevent any migration errors. The startup will take a while for this update." + } + ], + "final": true + }, + { + "version": "v2.7.5", + "date": "2019-10-30", + "changes": [ + { + "type": "fix", + "text": "Fix 'You're not allowed...' error caused by the fix in 2.7.4... :-/" + } + ], + "final": true + }, + { + "version": "v2.7.4", + "date": "2019-10-29", + "changes": [ + { + "type": "fix", + "text": "Fix 'You're not allowed...' error related to security cookie. Thanks to /u/routhinator for the hint." + } + ], + "final": true + }, + { + "version": "v2.7.3", + "date": "2019-10-27", + "changes": [ + { + "type": "feature", + "text": "Added option to configure cover width in search results." + }, + { + "type": "fix", + "text": "TMDB capabilities were not correctly checked." + }, + { + "type": "note", + "text": "I've added instructions to send one-time donations via PayPal and recurring donations via Github Sponsors." + } + ], + "final": true + }, + { + "version": "v2.7.2", + "date": "2019-10-06", + "changes": [ + { + "type": "fix", + "text": "I had to revert the changes from 2.7.0 because for some reason some databases could not be migrated. I'll need to take a closer look first, sorry." + } + ], + "final": true + }, + { + "version": "v2.7.1", + "date": "2019-10-06", + "changes": [ + { + "type": "fix", + "text": "Hopefully fix a problem which might prevent a successful database migration for some instances." + } + ], + "final": true + }, + { + "version": "v2.7.0", + "date": "2019-10-06", + "changes": [ + { + "type": "feature", + "text": "I've added a new statistics value called \"Indexer result uniqueness score\" (which is is a mouthful, if you have a better name please let me know). This score attempts to answer the question: Which indexer should I keep and which can I let go? See the wiki for more information. The score will only work for new downloads." + } + ], + "final": true + }, + { + "version": "v2.6.18", + "date": "2019-09-29", + "changes": [ + { + "type": "feature", + "text": "Add global cache time config parameter" + } + ], + "final": true + }, + { + "version": "v2.6.17", + "date": "2019-09-07", + "changes": [ + { + "type": "feature", + "text": "Allow indexers to be used only for API update queries" + }, + { + "type": "feature", + "text": "Allow regular expressions to be used in the search results title filter" + } + ], + "final": true + }, + { + "version": "v2.6.16", + "date": "2019-09-05", + "changes": [ + { + "type": "fix", + "text": "Fix problems with special characters when using autocomplete" + } + ], + "final": true + }, + { + "version": "v2.6.15", + "date": "2019-09-04", + "changes": [ + { + "type": "fix", + "text": "Fix form auth and remember-me cookies" + } + ], + "final": true + }, + { + "version": "v2.6.14", + "date": "2019-08-12", + "changes": [ + { + "type": "fix", + "text": "Minor changes" + } + ], + "final": true + }, + { + "version": "v2.6.13", + "date": "2019-08-12", + "changes": [ + { + "type": "fix", + "text": "Hopefully fix error with CookieTheftException introduced with v2.6.12" + } + ], + "final": true + }, + { + "version": "v2.6.12", + "date": "2019-08-04", + "changes": [ + { + "type": "features", + "text": "Allow limiting the indexers to be used via API. Use \"&indexers=,\"." + }, + { + "type": "fix", + "text": "Reduce how long sessions are kept open, possible reducing memory usage in some cases" + } + ], + "final": true + }, + { + "version": "v2.6.11", + "date": "2019-06-09", + "changes": [ + { + "type": "fix", + "text": "Improve handling and performance of wildcards for removal of trailing words" + }, + { + "type": "fix", + "text": "Added option to define how long Hydra will try to compress the database file when shutting down. With big databases shutting down may take up to 15 seconds by default. I'm still working on analyzing why some databases grow very large. Until I've found a way to prevent the root cause this option may help a bit but it will still require Hydra to shut down (or restart)" + } + ], + "final": true + }, + { + "version": "v2.6.10", + "date": "2019-05-21", + "changes": [ + { + "type": "fix", + "text": "Changing result selection using \"Invert selection\" and \"Select/deselect all\" wasn't properly registered, making mass download buttons unusable" + }, + { + "type": "fix", + "text": "Error on startup on headless windows server" + } + ], + "final": true + }, + { + "version": "v2.6.9", + "date": "2019-05-17", + "changes": [ + { + "type": "fix", + "text": "Remove trailing didn't work with words containing \"s\"... How do you explain stuff to that to non-programmers..." + }, + { + "type": "fix", + "text": "USe localhost:8080 as preset sabNZBd URL" + } + ], + "final": true + }, + { + "version": "v2.6.8", + "date": null, + "changes": [ + { + "type": "fix", + "text": "IMDB link in search history was invalid" + } + ], + "final": true + }, + { + "version": "v2.6.7", + "date": "2019-05-15", + "changes": [ + { + "type": "fix", + "text": "Hopefully fix corruption of nzbhydra.yml when machine crashes (or user switches off power deliberately -.-)" + } + ], + "final": true + }, + { + "version": "v2.6.6", + "date": "2019-05-14", + "changes": [ + { + "type": "fix", + "text": "Fix NoClassDefFoundError (only occurred with HTTP logging marker enabled)" + } + ], + "final": true + }, + { + "version": "v2.6.5", + "date": "2019-05-14", + "changes": [ + { + "type": "fix", + "text": "Fix shift-click for selecting multiple results." + } + ], + "final": true + }, + { + "version": "v2.6.4", + "date": "2019-05-14", + "changes": [ + { + "type": "fix", + "text": "Searches will always use the IDs provided in API calls and not replace them by different IDs provided by IMDB or TVMaze. In very few instances TVMaze had wrong IDs mapped which resulted in wrong searches." + }, + { + "type": "fix", + "text": "Entering domains to bypass when using proxy didn't work." + }, + { + "type": "fix", + "text": "Selecting multiple results in the same title group was not accepted." + } + ], + "final": true + }, + { + "version": "v2.6.3", + "date": "2019-05-13", + "changes": [ + { + "type": "feature", + "text": "Extended logging for download status updates." + }, + { + "type": "feature", + "text": "Allow wildcards in \"Remove trailing...\"" + }, + { + "type": "fix", + "text": "Disable HSTS security header" + } + ], + "final": true + }, + { + "version": "v2.6.2", + "date": "2019-05-05", + "changes": [ + { + "type": "fix", + "text": "The warning that the wrapper is outdated will be also displayed in the updates section. You can also choose to be reminded again." + }, + { + "type": "fix", + "text": "Update link to Font Awesome in downloader config to the version actually supported." + } + ], + "final": true + }, + { + "version": "v2.6.1", + "date": "2019-05-02", + "changes": [ + { + "type": "feature", + "text": "Allow indexers to be enabled for all searches but API update searches, i.e. those periodically done by Sonarr and others to get the latest releases." + }, + { + "type": "fix", + "text": "Correctly report torznab caps (taking into regard only torznab indexers). Also disregard any disabled indexers or those not enabled for API searches and include IDs convertible to any of the supported IDs." + } + ], + "final": true + }, + { + "version": "v2.6.0", + "date": "2019-05-01", + "changes": [ + { + "type": "feature", + "text": "Warn when using config that violates indexer rules and that will result in your API account being disabled." + }, + { + "type": "feature", + "text": "Support IMDB IDs for TV search. This seems to be supported by few indexers but by many trackers." + }, + { + "type": "feature", + "text": "Add option to ignore load limiting for internal searches." + }, + { + "type": "feature", + "text": "Sort indexers in config by state first, then score, then name." + }, + { + "type": "fix", + "text": "NZBHydra used to always report all ID types (e.g. IMDB IDs) in the caps to be supported. Now IDs will only be reported as supported if either at least one configured indexer supports it or query generation is enabled." + }, + { + "type": "fix", + "text": "Prevent log file download from accessing files outside data folder." + }, + { + "type": "fix", + "text": "Parse indexer results with provided passwords correctly (although they don't follow the spec...)." + } + ], + "final": true + }, + { + "version": "v2.5.9", + "date": "2019-04-27", + "changes": [ + { + "type": "fix", + "text": "I used a discord invitation link that expires after one day. Use this one: [https://discord.gg/uh9W3rd](https://discord.gg/uh9W3rd)." + } + ], + "final": true + }, + { + "version": "v2.5.8", + "date": "2019-04-27", + "changes": [ + { + "type": "feature", + "text": "Recognize when an outdated wrapper is being used and ask the user to update it manually." + }, + { + "type": "fix", + "text": "Don't complain about mixed newznab and torznab results when adding Anime Tosho." + }, + { + "type": "fix", + "text": "Removed nzbs.org from the presets :-( RIP" + } + ], + "final": true + }, + { + "version": "v2.5.7", + "date": "2019-04-27", + "changes": [ + { + "type": "feature", + "text": "Attempt to automatically detect certain problems and inform the user (admin) about it. For now this will only detect OutOfMemory errors which cannot be properly handled when they occur." + }, + { + "type": "fix", + "text": "Disable the grouping of TV results by episode when searching for a specific episode. Also show information about the grouping the first time it is used." + }, + { + "type": "note", + "text": "The python wrapper nzbhydra2wrapper.py which is the main entry point for the program is now included in the linux release. If you start Hydra using that python file it will be updated automatically although changes will only take effect after the next restart of the main process." + }, + { + "type": "note", + "text": "I was asked for a discord channel. This is it: [https://discord.gg/uh9W3rd](https://discord.gg/uh9W3rd). I can't promise I'll be the regularly but feel free to join. Some users there and on reddit are always willing to help (thanks, guys!)." + } + ], + "final": true + }, + { + "version": "v2.5.6", + "date": null, + "changes": [ + { + "type": "fix", + "text": "Provide a (better) error message when clicking the infos for a show with TVRage ID for which no infos could be found." + } + ], + "final": true + }, + { + "version": "v2.5.5", + "date": "2019-04-17", + "changes": [ + { + "type": "feature", + "text": "Option to log/display hosts instead of IP addresses. I haven't found a proper way of testing this so let me know if it works ;-)" + } + ], + "final": true + }, + { + "version": "v2.5.4", + "date": "2019-04-16", + "changes": [ + { + "type": "fix", + "text": "Allow empty movie searches for NZBPlanet which should result in covers being shown." + } + ], + "final": true + }, + { + "version": "v2.5.3", + "date": "2019-04-16", + "changes": [ + { + "type": "fix", + "text": "Update of downloader status failed with newsbin (which claims to be compatible with the sabnzbd API)." + } + ], + "final": true + }, + { + "version": "v2.5.2", + "date": "2019-04-15", + "changes": [ + { + "type": "fix", + "text": "Minor downloader status bar related fixes." + } + ], + "final": true + }, + { + "version": "v2.5.1", + "date": "2019-04-14", + "changes": [ + { + "type": "feature", + "text": "Display status of configured downloader on the bottom of the page. This can be disabled in the downloading config. If multiple downloaders are configured the first one is used." + }, + { + "type": "fix", + "text": "Toggling the grouping of TV episodes or the display of TV/movie covers will take effect without having to reload the search." + } + ], + "final": true + }, + { + "version": "v2.4.4", + "date": "2019-04-12", + "changes": [ + { + "type": "feature", + "text": "Reduced font size across the board to fit more results / buttons / whatever on the page. Let me know if it's too tiny :-)" + }, + { + "type": "fix", + "text": "Add 6box and NZBPlanet to list of indexers which do not support TV or movie searches without identifiers." + } + ], + "final": true + }, + { + "version": "v2.4.3", + "date": "2019-04-10", + "changes": [ + { + "type": "fix", + "text": "Make sure that 100 rows are shown when grouping results (either by season/episode or by title)." + }, + { + "type": "fix", + "text": "Passwords for users were not properly migrated from v1." + } + ], + "final": true + }, + { + "version": "v2.4.2", + "date": "2019-04-10", + "changes": [ + { + "type": "fix", + "text": "As is tradition every feature release (2.4.0) is followed by a couple of bug fix releases... The tv episode sorting should not throw any errors now and actually work properly :-)" + } + ], + "final": true + }, + { + "version": "v2.4.1", + "date": "2019-04-10", + "changes": [ + { + "type": "fix", + "text": "Daily episodes (like 04/08) were not parsed correctly, resulting in an error (see 2.4.0 feature)." + } + ], + "final": true + }, + { + "version": "v2.4.0", + "date": "2019-04-09", + "changes": [ + { + "type": "feature", + "text": "When searching in the TV categories in the GUI by default the results will be grouped by season & episode instead of by title. This should make it easier to select one result for every episode which is usually what you want. This behavior can be switched off in the display options (do a new search after the switch)." + }, + { + "type": "fix", + "text": "Minor improvements to colors in bright theme." + } + ], + "final": true + }, + { + "version": "v2.3.22", + "date": "2019-04-04", + "changes": [ + { + "type": "feature", + "text": "Logging marker to log HTTPS related stuff on debug level." + }, + { + "type": "fix", + "text": "Removed an SSL related parameter from the wrapper. I already did this months ago but forgot to update the binary for linux. So if you have problems with SSL and are running Hydra on linux (not in docker) you might want to update the binary. This needs to be done manually." + } + ], + "final": true + }, + { + "version": "v2.3.21", + "date": "2019-03-31", + "changes": [ + { + "type": "feature", + "text": "Option to send the mapped category name to downloaders." + }, + { + "type": "fix", + "text": "/api/stats/indexers endpoint was accessible without authorization." + }, + { + "type": "fix", + "text": "Show unit for average response times in stats (ms)." + } + ], + "final": true + }, + { + "version": "v2.3.20", + "date": null, + "changes": [ + { + "type": "fix", + "text": "Revert revert because, as it turns out, it wasn't the libary at fault but the new version just failed to read a file already corrupted." + } + ], + "final": true + }, + { + "version": "v2.3.19", + "date": "2019-03-20", + "changes": [ + { + "type": "fix", + "text": "Revert update of database library as it caused errors on startup in some issues." + } + ], + "final": true + }, + { + "version": "v2.3.18", + "date": "2019-03-18", + "changes": [ + { + "type": "fix", + "text": "Not all API keys were anonymized when creating the debug infos." + } + ], + "final": true + }, + { + "version": "v2.3.17", + "date": "2019-03-17", + "changes": [ + { + "type": "feature", + "text": "Binsearch is knowing for returning a 503 error every now and then. In that case Hydra will retry the search up to two times." + }, + { + "type": "fix", + "text": "An indexer not selected due to load limiting was displayed as being disabled in the GUI." + }, + { + "type": "fix", + "text": "Reduce frequency of config file being written." + } + ], + "final": true + }, + { + "version": "v2.3.16", + "date": "2019-03-14", + "changes": [ + { + "type": "fix", + "text": "Add database index to improve loading of search history on initial page load." + }, + { + "type": "fix", + "text": "Try to prevent config file from being corrupted." + } + ], + "final": true + }, + { + "version": "v2.3.15", + "date": "2019-02-16", + "changes": [ + { + "type": "note", + "text": "I need to make something clear: If Hydra shows you 100 results on the GUI and says that x results are not yet loaded then that means that some results you're looking for may be missing. You will always only get the newest 100 results from any indexer at first. Even if you sort by name then other results which should be somewhere in that list may be 'hidden' because they were not yet retrieved from the indexer." + }, + { + "type": null, + "text": "Delay writing of config file so that not too many concurrent writes occur. This should hopefully reduce the risk of file corruption." + } + ], + "final": true + }, + { + "version": "v2.3.14", + "date": "2019-02-15", + "changes": [ + { + "type": "fix", + "text": "Change how SNI verification is disabled so that nzbgeek.info should work with Java 10+." + }, + { + "type": "fix", + "text": "Fix NZBIndex parsing. Thanks to BenoitCharret." + } + ], + "final": true + }, + { + "version": "v2.3.13", + "date": "2019-02-12", + "changes": [ + { + "type": "feature", + "text": "Improve HTTP debug logging" + }, + { + "type": "fix", + "text": "Revert some more SSL related changes. If you still have problems connecting to indexer please manually update the binaries. Unfortunately the update process can't do that." + } + ], + "final": true + }, + { + "version": "v2.3.12", + "date": "2019-02-10", + "changes": [ + { + "type": "fix", + "text": "I don't know if I should laugh or cry, but the last version actually made matters worse as 2.3.11 is unable to connect to GitHub (among others) which disables the built in update function. So if you read this and don't run docker, you'll have to update manually." + } + ], + "final": true + }, + { + "version": "v2.3.11", + "date": "2019-02-10", + "changes": [ + { + "type": "fix", + "text": "Cautiously optimistic that *some* SSL issues have been solved... ;-)" + }, + { + "type": "fix", + "text": "When implementing the display of covers I managed to mistakenly think that posters and covers are the same. Actually the poster in this context is the uploader but my code used the poster (username) as cover URL. If you've disabled the display of 'posters' in the search results you'll have to disable it again." + } + ], + "final": true + }, + { + "version": "v2.3.10", + "date": "2019-02-09", + "changes": [ + { + "type": "fix", + "text": "Fix another issue with SSL. I should probably pause development until I'm fit of mind enough to do this properly..." + } + ], + "final": true + }, + { + "version": "v2.3.9", + "date": "2019-02-09", + "changes": [ + { + "type": "fix", + "text": "Revert SSL changes made in 2.3.7 as Hydra didn't start for some users. I give up." + } + ], + "final": true + }, + { + "version": "v2.3.8", + "date": "2019-02-09", + "changes": [ + { + "type": "fix", + "text": "Updated executable to provide a java flag which should fix SSL related problems introduced with 2.3.7. If you're not running Hydra inside a container you may need to manually update the binary (nzbhydra*.exe or just nzbhydra on linux)" + } + ], + "final": true + }, + { + "version": "v2.3.7", + "date": "2019-02-09", + "changes": [ + { + "type": "fix", + "text": "Changed the way SSL certificates are checked. Connection to indexers like NZBGeek or althub should now work as expected. Removed the option 'Disable SNI'." + }, + { + "type": "fix", + "text": "Count API hits used for connection and caps checks when calculating hit limits." + }, + { + "type": "fix", + "text": "When results are sorted by title the title groups are now sorted by indexer score instead of age, meaning results from the indexer with the highest score are shown when the title group is collapsed." + } + ], + "final": true + }, + { + "version": "v2.3.6", + "date": "2019-02-06", + "changes": [ + { + "type": "fix", + "text": "The audio category was preconfigured to require both mp3 and flac in the results which doesn't make any sense. You might want to remove them in your category config." + }, + { + "type": "fix", + "text": "Old downloads were not removed from history even if the option to only keep them for a certain time was set." + }, + { + "type": "fix", + "text": "Check cover/poster URLs provided by indexers to catch some invalid URLs." + } + ], + "final": true + }, + { + "version": "v2.3.5", + "date": "2019-02-05", + "changes": [ + { + "type": "feature", + "text": "Show posters for movie results. Can be toggled in the display options." + } + ], + "final": true + }, + { + "version": "v2.3.4", + "date": "2019-01-31", + "changes": [ + { + "type": "fix", + "text": "Move cancel button in dialog shown while searching because you're all too slow to click it." + }, + { + "type": "fix", + "text": "Prevent database trace file becoming too large" + }, + { + "type": "fix", + "text": "Keep less gclog files in the log folder" + } + ], + "final": true + }, + { + "version": "v2.3.3", + "date": "2019-01-28", + "changes": [ + { + "type": "fix", + "text": "Connection to hosts like 'sabnzd' would fail" + } + ], + "final": true + }, + { + "version": "v2.3.2", + "date": "2019-01-27", + "changes": [ + { + "type": "fix", + "text": "2.3.1 didn't start for users updating from 2.2.5 to 2.3.1. Fuck this shit" + } + ], + "final": true + }, + { + "version": "v2.3.1", + "date": "2019-01-27", + "changes": [ + { + "type": "fix", + "text": "2.2.5 unfortunately may have caused database corruption in some cases. Hopefully no more... The fix may need some time the first time this new version is started." + } + ], + "final": true + }, + { + "version": "v2.3.0", + "date": "2019-01-27", + "changes": [ + { + "type": "feature", + "text": "Java 11 is now supported. This required an update of the internal framework which might have some unforseen side effects (bugs), especially regarding authentification and handling of reverse proxies. Let me know if something doesn't work as expected." + }, + { + "type": "feature", + "text": "Rename searching option 'Ignore temporarily disabled' to 'Ignore temporary errors'. If enabled indexers will not be temporarily disabled at all if a recoverable error occurs." + }, + { + "type": "fix", + "text": "Opening magnet links under Windows 7 doesn't require administrator rights anymore." + } + ], + "final": true + }, + { + "version": "v2.2.5", + "date": "2019-01-26", + "changes": [ + { + "type": "fix", + "text": "In some cases (with really big databases) the check of the API hit limit could take very long. This was hopefully improved. Migration to this version might take a bit for such instances." + } + ], + "final": true + }, + { + "version": "v2.2.4", + "date": "2019-01-26", + "changes": [ + { + "type": "feature", + "text": "Add indexer specific limit to caps check. Background: RARBG only allows one request every two seconds so the caps check, which until now used two concurrent threads and a delay of 1 second, would result in errors. The limits are hard coded. Hydra will not attempt to do any rate limiting for regular search requests." + } + ], + "final": true + }, + { + "version": "v2.2.3", + "date": "2019-01-26", + "changes": [ + { + "type": "feature", + "text": "Include database metadata in debug infos" + } + ], + "final": true + }, + { + "version": "v2.2.2", + "date": "2019-01-26", + "changes": [ + { + "type": "feature", + "text": "Minor improvements to performance logging" + } + ], + "final": true + }, + { + "version": "v2.2.1", + "date": "2019-01-21", + "changes": [ + { + "type": "feature", + "text": "Improve logging of unparseable indexer responses" + } + ], + "final": true + }, + { + "version": "v2.2.0", + "date": "2019-01-02", + "changes": [ + { + "type": "note", + "text": "This release brings some major changes regarding categories and the handling of newznab categories. Please let me know if it breaks anything or has unexpected side effects (or if you love what I've done ;-))" + }, + { + "type": "feature", + "text": "Allow combinations of newznab categories which must all be found in a search result for that category to be applied. For example 4090&11000 will only match items with both 4090 and 11000. This should allow for even finer category tuning with trackers accessed via Jackett." + }, + { + "type": "feature", + "text": "Replace newznab categories incoming API searches with newznab categories of mapped category. For example when you have 2040,2050 configured for Movies HD and a search comes in using 2040 then indexers will be queried using 2040,2050. Until now only the supplied category was used (2040 in the example). This should result in more results to be found and so far I can't tell if it will return just better results or more crap. You can disable this with the 'Transform newznab categories' setting in the searching config." + }, + { + "type": "feature", + "text": "Related to above: The categories on the caps page are created from the configured categories. To keep this clean only one newznab category will be used for every category (e.g. Movies HD using 2040,2050 will only be included once with 2040 as ID." + }, + { + "type": "fix", + "text": "Use dereferer for NZB details site" + } + ], + "final": true + }, + { + "version": "v2.1.7", + "date": "2018-12-30", + "changes": [ + { + "type": "fix", + "text": "Fix/improve category mapping introduced in 2.1.6. Use custom newznab categories if none from the predefined range are provided." + } + ], + "final": true + }, + { + "version": "v2.1.6", + "date": "2018-12-30", + "changes": [ + { + "type": "fix", + "text": "When uploading a backup file the UI didn't update to inform the user about the progress after the file was uploaded." + }, + { + "type": "fix", + "text": "Improve category mapping for (torznab) indexers. Some use custom newznab category numbers (>9999) which could not be properly mapped to preconfigured categories." + } + ], + "final": true + }, + { + "version": "v2.1.5", + "date": "2018-12-29", + "changes": [ + { + "type": "fix", + "text": "Improve handling of movie and tv searches with some indexers (see v2.0.23). I just wish all indexers could work the same... :-/" + }, + { + "type": "fix", + "text": "Prevent indexers without caps from being caps checked (NZBIndex, Binsearch)" + }, + { + "type": "fix", + "text": "Improve wording indexer state when disabled by the system due to an error from which it cannot recover automatically" + } + ], + "final": true + }, + { + "version": "v2.1.4", + "date": "2018-12-28", + "changes": [ + { + "type": "feature", + "text": "Allow retrieval of history and stats via API. See https://github.com/theotherp/nzbhydra2/wiki/External-API,-RSS-and-cached-queries" + }, + { + "type": "fix", + "text": "Repeat of searches from history sometimes used wrong parameters" + }, + { + "type": "fix", + "text": "Added nzbs.org to list of indexers unable to process type searches without IDs" + } + ], + "final": true + }, + { + "version": "v2.1.3", + "date": "2018-12-27", + "changes": [ + { + "type": "fix", + "text": "Removed dead indexers from presets" + }, + { + "type": "fix", + "text": "Prevent exception related to duplicate TV infos in database" + } + ], + "final": true + }, + { + "version": "v2.1.2", + "date": "2018-12-18", + "changes": [ + { + "type": "fix", + "text": "Indexer added as newznab indexer even when selected as torznab in the config GUI" + } + ], + "final": true + }, + { + "version": "v2.1.1", + "date": "2018-12-18", + "changes": [ + { + "type": "fix", + "text": "Validate config to prevent indexers with duplicate names" + }, + { + "type": "fix", + "text": "Validate config to prevent torznab indexers being added as newznab indexer and vice versa" + } + ], + "final": true + }, + { + "version": "v2.1.0", + "date": "2018-12-15", + "changes": [ + { + "type": "fix", + "text": "Search query was not built properly when conversion of search IDs did not provide any IDs usable by an indexer" + }, + { + "type": "feature", + "text": "Support API caps in JSON" + } + ], + "final": true + }, + { + "version": "v2.0.24", + "date": "2018-12-14", + "changes": [ + { + "type": "note", + "text": "Added NZBGeek to the list mentioned in v2.0.23. Thanks to the user letting me know about it." + } + ], + "final": true + }, + { + "version": "v2.0.23", + "date": "2018-12-11", + "changes": [ + { + "type": "note", + "text": "Previously when an API call with search type 'movie' or 'tvsearch' was made without any identifiers or category I would call indexers with search type 'search' instead because some indexers don't like that. This causes some other problems so I've reverted that behavior except for a certain list of indexers. I have hardcoded list of indexers for which the switch will be done. I'm not sure which indexers actually behave that way. So if you find an indexer where browsing the movie or TV releases (e.g. using NZB360) will return a lot of crap please let me know so I can add the indexer to the list." + }, + { + "type": "note", + "text": "I've changed the java runtime that is used in the docker container maintained by me (although I actually don't want to really support that...). In my tests it nearly halved memory usage in some scenarios (199MB compared to 380MB). If this proves to be stable I'll recommend the other maintainers to use this as well." + } + ], + "final": true + }, + { + "version": "v2.0.22", + "date": "2018-12-09", + "changes": [ + { + "type": "fix", + "text": "Upload of large ZIP files for restoration was disabled" + } + ], + "final": true + }, + { + "version": "v2.0.21", + "date": "2018-12-09", + "changes": [ + { + "type": "feature", + "text": "Some users have reported corrupted config files. I can't explain how that could ever happen but I've added code that tries to recognize this on startuppu and attempts to repair it automatically" + }, + { + "type": "fix", + "text": "New instances were not properly initialized, in some instances resulting in a crash on startup. Sorry about that" + } + ], + "final": true + }, + { + "version": "v2.0.20", + "date": "2018-12-08", + "changes": [ + { + "type": "feature", + "text": "Make sure existing configuration or database is not loaded by an older version of a program than it was created with" + } + ], + "final": true + }, + { + "version": "v2.0.19", + "date": "2018-12-08", + "changes": [ + { + "type": "fix", + "text": "Restoration from uploaded backup file wouldn't work" + } + ], + "final": true + }, + { + "version": "v2.0.18", + "date": "2018-12-05", + "changes": [ + { + "type": "fix", + "text": "Details link was hidden even if not restricted by auth config" + }, + { + "type": "fix", + "text": "Redirects to torrent magnet links are now recognized and properly handled" + }, + { + "type": "fix", + "text": "Downloads of NZBs with spaces in the filename are now properly handled" + }, + { + "type": "fix", + "text": "Suffix NZBs sent to sabnzbd with .nzb to increase compatibility with newsbin" + } + ], + "final": true + }, + { + "version": "v2.0.17", + "date": "2018-11-22", + "changes": [ + { + "type": "feature", + "text": "Automatic update. This feature has been requested for ages. Ironically, now that I rarely release new versions I've finally implemented it. It's opt-in for now even though the update process has been really stable for a while. Now that the startup is faster Hydra shouldn't be unavailable during the update process for more than 20 seconds or so. Any tools calling during that time should recover fine." + }, + { + "type": "fix", + "text": "Make sure to load resources from TVMaze using HTTPS" + }, + { + "type": "fix", + "text": "Handle (invalid) spaces in URLs" + } + ], + "final": true + }, + { + "version": "v2.0.16", + "date": "2018-11-21", + "changes": [ + { + "type": "fix", + "text": "Size tag was not forwarded from torznab results" + } + ], + "final": true + }, + { + "version": "v2.0.15", + "date": "2018-11-02", + "changes": [ + { + "type": "fix", + "text": "ID lookup for TV shows didn't always work" + } + ], + "final": true + }, + { + "version": "v2.0.14", + "date": "2018-11-02", + "changes": [ + { + "type": "note", + "text": "The URL base has to start with a / from now on. Configs without URL base will be migrated" + }, + { + "type": "fix", + "text": "ID based TV search from GUI would sometimes ignore ID" + } + ], + "final": true + }, + { + "version": "v2.0.13", + "date": "2018-10-26", + "changes": [ + { + "type": "feature", + "text": "Warn when changing the host to an invalid IP" + }, + { + "type": "fix", + "text": "api.althub.co.za should hopefully actually work now" + } + ], + "final": true + }, + { + "version": "v2.0.12", + "date": "2018-10-24", + "changes": [ + { + "type": "fix", + "text": "SSL error when accessing althub from docker. Should be fixed with the setting to use the packaged cacerts file enabled" + }, + { + "type": "fix", + "text": "Detection and handling of required restart after changing config was broken" + } + ], + "final": true + }, + { + "version": "v2.0.11", + "date": "2018-10-23", + "changes": [ + { + "type": "feature", + "text": "Allow to disable SSL verification only for certain hosts" + }, + { + "type": "feature", + "text": "Warn when host is changed from 0.0.0.0 and run in docker. This seems to cause some problems" + } + ], + "final": true + }, + { + "version": "v2.0.10", + "date": "2018-10-20", + "changes": [ + { + "type": "fix", + "text": "Sometimes search IDs would be used even if the indexer wasn't configured to use them, resulting in failing searches" + } + ], + "final": true + }, + { + "version": "v2.0.9", + "date": "2018-10-06", + "changes": [ + { + "type": "fix", + "text": "Caps check with Jackett indexers wouldn't complete properly due to a change in their code" + } + ], + "final": true + }, + { + "version": "v2.0.8", + "date": "2018-10-01", + "changes": [ + { + "type": "fix", + "text": "Adapt database to store long torrent magnet links" + } + ], + "final": true + }, + { + "version": "v2.0.7", + "date": null, + "changes": [ + { + "type": "fix", + "text": "Sabnzbd API key was not migrated" + } + ], + "final": true + }, + { + "version": "v2.0.6", + "date": "2018-09-26", + "changes": [ + { + "type": "fix", + "text": "Torznab queries were limited to 100 results. I've removed the limit altogether. As torznab doesn't require or support paging there's no reason for a request limit" + } + ], + "final": true + }, + { + "version": "v2.0.5", + "date": "2018-09-14", + "changes": [ + { + "type": "fix", + "text": "Adding to downloader via result button would always show failed (introduced with 2.0.3)" + } + ], + "final": true + }, + { + "version": "v2.0.4", + "date": "2018-09-13", + "changes": [ + { + "type": "fix", + "text": "Improved feedback when adding NZBs to downloader failed" + } + ], + "final": true + }, + { + "version": "v2.0.3", + "date": "2018-09-05", + "changes": [ + { + "type": "fix", + "text": "In some cases an incorrect NZB URL was used for downloads" + }, + { + "type": "fix", + "text": "Saving the config would sometimes show confusing or wrong warnings" + }, + { + "type": "fix", + "text": "Restoring from web UI had no effect" + }, + { + "type": "fix", + "text": "Category mapping would sometimes not work for incoming searches" + } + ], + "final": true + }, + { + "version": "v2.0.2", + "date": null, + "changes": [ + { + "type": "fix", + "text": "Minor stability improvements" + } + ], + "final": true + }, + { + "version": "v2.0.1", + "date": "2018-08-19", + "changes": [ + { + "type": "fix", + "text": "New installations would generate a faulty default configuration, resulting in failed searches" + } + ], + "final": true + }, + { + "version": "v2.0.0", + "date": "2018-08-18", + "changes": [ + { + "type": "feature", + "text": "NZBHydra 2 can now run with Java 8, 9 or 10. It shouldn't matter much which version you use as long as it's up to date. If you want to use 9 or 10 you'll need to manually update the wrapper (i.e. the executable(s) in the main folder)" + }, + { + "type": "feature", + "text": "Reduced startup time. My instance starts in 8 seconds instead of 22 but YRMV" + }, + { + "type": "feature", + "text": "I updated the underlying libraries and main framework. This doesn't change much for you except that NZBHydra 2 is a bit more future proof and may have some new bugs :-)" + }, + { + "type": "feature", + "text": "Added an option to keep the history (searches, downloads, stats) only for a certain time (see Searching options). This may reduce the database size and stats calculation time and may improve performance a bit." + }, + { + "type": "fix", + "text": "Hydra will correctly recognize if run in the windows program files folder" + }, + { + "type": "fix", + "text": "When shutting down or restarting Hydra will try to defrag the database file. In some cases this should drastically reduce the database size. It may grow again but for now I don't have a better fix than restarting the instance..." + }, + { + "type": "fix", + "text": "Remove multiple trailing words from titles if found" + } + ], + "final": true + }, + { + "version": "v1.5.2", + "date": "2018-07-31", + "changes": [ + { + "type": "fix", + "text": "Adding new categories resulted in an exception" + }, + { + "type": "note", + "text": "Increased the default XMX value to 256" + } + ], + "final": true + }, + { + "version": "v1.5.1", + "date": "2018-06-11", + "changes": [ + { + "type": "fix", + "text": "Adding of downloaders to config was broken with last version" + } + ], + "final": true + }, + { + "version": "v1.5.0", + "date": "2018-06-10", + "changes": [ + { + "type": "feature", + "text": "Redesigned the button to add new indexers. Inspired by Sonarr" + }, + { + "type": "feature", + "text": "When a torrent black hole is configured magnet links will be saved as files there. Let me know if you need a switch to disable that. Thanks to wh0cares" + }, + { + "type": "fix", + "text": "Config validation was not executed properly, sometimes allowing invalid values or even preventing the config from being changed" + }, + { + "type": "note", + "text": "Added a small note to the readme that \"linux\" releases mean any platform but windows. Renaming the releases would break updates for running instances" + } + ], + "final": true + }, + { + "version": "v1.4.18", + "date": "2018-05-22", + "changes": [ + { + "type": "fix", + "text": "Previous version was missing readme.md which resulted in broken updates" + } + ], + "final": true + }, + { + "version": "v1.4.16", + "date": "2018-05-22", + "changes": [ + { + "type": "fix", + "text": "Small error in API? help from last version" + } + ], + "final": true + }, + { + "version": "v1.4.15", + "date": "2018-05-22", + "changes": [ + { + "type": "feature", + "text": "Support animetosho (both newznab and torznab)" + }, + { + "type": "feature", + "text": "Add small 'API?' button in config to display newznab and torznab endpoints and the api key" + } + ], + "final": true + }, + { + "version": "v1.4.14", + "date": "2018-05-21", + "changes": [ + { + "type": "fix", + "text": "Error with TMDB IDs introduced with last version" + }, + { + "type": "note", + "text": "In some cases long running instances of Hydra use a lot of CPU when they should be idle. I've made some changes which should reduce the problem to a degree. Please let me know at https://github.com/theotherp/nzbhydra2/issues/96 if you have similar problems or, even better, if they've gone away with this version" + } + ], + "final": true + }, + { + "version": "v1.4.13", + "date": "2018-05-12", + "changes": [ + { + "type": "fix", + "text": "Conversion of IMDB to TMDB ID failed with missing tt prefix" + } + ], + "final": true + }, + { + "version": "v1.4.12", + "date": "2018-05-05", + "changes": [ + { + "type": "fix", + "text": "Prevent database error when ignoring too many updates..." + } + ], + "final": true + }, + { + "version": "v1.4.11", + "date": "2018-05-05", + "changes": [ + { + "type": "fix", + "text": "Prevent rare database error when converting between movie IDs" + }, + { + "type": "fix", + "text": "Prevent API keys from leaking in debug infos ZIP when included in last error property" + } + ], + "final": true + }, + { + "version": "v1.4.10", + "date": "2018-05-05", + "changes": [ + { + "type": "feature", + "text": "Option to disable download status updates. *Might* help in some rare cases where CPU usage is high when NZBHydra2 is supposed to idle" + } + ], + "final": true + }, + { + "version": "v1.4.9", + "date": null, + "changes": [ + { + "type": "fix", + "text": "Log levels for console and file were not honored properly." + } + ], + "final": true + }, + { + "version": "v1.4.8", + "date": "2018-03-17", + "changes": [ + { + "type": "note", + "text": "Updated the wrapper to create a memory dump file if the main process crashes when it's out of memory. As before you need to update the wrapper manually (except when you use docker and don't use the internal update mechanism). This is not strictly necessary but will improve chances of me debugging memory problems." + } + ], + "final": true + }, + { + "version": "v1.4.7", + "date": "2018-03-14", + "changes": [ + { + "type": "fix", + "text": "Bug in internal logic would throw exception and cause indexers to be disabled for no reason" + }, + { + "type": "fix", + "text": "API hit limit reached on omg would disable indexer permanently" + }, + { + "type": "fix", + "text": "Indexer config state would change when switching config tabs" + }, + { + "type": "fix", + "text": "Indexer priority field was not displayed in config" + } + ], + "final": true + }, + { + "version": "v1.4.6", + "date": "2018-03-08", + "changes": [ + { + "type": "feature", + "text": "Prepend words in the results filter box with ! to exclude them" + }, + { + "type": "fix", + "text": "Shift-click for selecting multiple results in a row didn't work on firefox" + } + ], + "final": true + }, + { + "version": "v1.4.5", + "date": "2018-03-05", + "changes": [ + { + "type": "fix", + "text": "Improve caps check for some results using a TV show's initialism instead of the full name in the title" + } + ], + "final": true + }, + { + "version": "v1.4.4", + "date": "2018-02-27", + "changes": [ + { + "type": "fix", + "text": "Handle LL searches better that request a general category and a subcategory (e.g. 7000,7020)" + } + ], + "final": true + }, + { + "version": "v1.4.3", + "date": "2018-02-23", + "changes": [ + { + "type": "fix", + "text": "Migration failed because of missing datatabase table" + } + ], + "final": true + }, + { + "version": "v1.4.2", + "date": "2018-02-17", + "changes": [ + { + "type": "fix", + "text": "Allow configuration of basic auth credentials for jackett" + } + ], + "final": true + }, + { + "version": "v1.4.1", + "date": "2018-02-13", + "changes": [ + { + "type": "fix", + "text": "Indexers with incomplete config were shown in selection list but not actually usable" + }, + { + "type": "fix", + "text": "Some issues with indexers not beeing reenabled and some confusing messages being shown. The whole thing with indexers being disabled after errors is still a bit wonky" + }, + { + "type": "fix", + "text": "Some potential memory leaks" + } + ], + "final": true + }, + { + "version": "v1.4.0", + "date": "2018-02-10", + "changes": [ + { + "type": "feature", + "text": "Rewrote the display of indexer statuses. An indexer's status is now displayed in the indexer config section (where you would probably expect it). The 'Enabled' switch was extended and now will show one of the states 'Enabled', 'Temporarily disabled', 'Permanently disabled' or 'User disabled' and an explanation. THe Indexer statuses view does still show alle the indexers' statuses but is less cluttered" + }, + { + "type": "feature", + "text": "Show search results filter box in table header because some users didn't find the filter icons" + }, + { + "type": "fix", + "text": "Prevent weird 'Unexpected error in hydra code. Sorry...'" + } + ], + "final": true + }, + { + "version": "v1.3.3", + "date": "2018-02-08", + "changes": [ + { + "type": "feature", + "text": "Improve conversion of newznab categories to internal categories" + }, + { + "type": "fix", + "text": "Exception in migration when providing no database file even when migration of database was requested" + }, + { + "type": "feature", + "text": "Allow loading of UI files from local folder to allow proper development of UI" + } + ], + "final": true + }, + { + "version": "v1.3.2", + "date": "2018-02-05", + "changes": [ + { + "type": "fix", + "text": "Settings file was sometimes corrupted (wrong charset) and could not be loaded anymore" + }, + { + "type": "fix", + "text": "Delete error column in indexer status page when indexer is reenabled" + }, + { + "type": "fix", + "text": "Button to browse file system for selecting torrent folder would fail on some systems (e.g. docker)" + } + ], + "final": true + }, + { + "version": "v1.3.1", + "date": "2018-02-04", + "changes": [ + { + "type": "feature", + "text": "Display serious errors on windows in message box" + }, + { + "type": "fix", + "text": "Hopefully reduced chance of empty config files being written" + }, + { + "type": "fix", + "text": "Handle duplicate results from indexers better (should rarely happen)" + }, + { + "type": "note", + "text": "NZBHydra will recognize if it's running on windows and in folder like c:\\program files or c:\\program files (x86) and refuse to start. Those folders have special read/write rights which might cause some problems. I recommend putting any programs that are not installed by a setup in a \"regular\" folder" + } + ], + "final": true + }, + { + "version": "v1.3.0", + "date": "2018-02-03", + "changes": [ + { + "type": "feature", + "text": "Experimental feature to use a packaged CA certs file. This probably doesn't concern you but it may solve some SSL related issues with some newer or different JREs" + }, + { + "type": "fix", + "text": "Sort indexer download shares by share" + }, + { + "type": "fix", + "text": "Made the migration process a tiny bit more robust wrt wrong input" + }, + { + "type": "fix", + "text": "Display caps check button for indexers without API key (e.g. spotweb instances). Hide button and search type and ID fields for new indexer. The check is done automatically" + } + ], + "final": true + }, + { + "version": "v1.2.6", + "date": "2018-02-02", + "changes": [ + { + "type": "fix", + "text": "Sabnzbd history could not be properly parsed, preventing download status updates" + } + ], + "final": true + }, + { + "version": "v1.2.5", + "date": "2018-01-31", + "changes": [ + { + "type": "fix", + "text": "Completely fix spotweb support..." + } + ], + "final": true + }, + { + "version": "v1.2.4", + "date": "2018-01-31", + "changes": [ + { + "type": "fix", + "text": "Help headphones parse Hydra's results" + }, + { + "type": "fix", + "text": "Indexer connection check used empty API key parameter, preventing check to spotweb to work" + } + ], + "final": true + }, + { + "version": "v1.2.3", + "date": "2018-01-30", + "changes": [ + { + "type": "fix", + "text": "Prevent session timeout" + } + ], + "final": true + }, + { + "version": "v1.2.2", + "date": "2018-01-29", + "changes": [ + { + "type": "note", + "text": "I've added debug logging to the wrapper for better, well, debugging of problems related to updating. To enable debug logging create a file DEBUG in the data folder and restart the program. As before, any non-docker installations will need to update the wrapper files manually. I'm working on a better solution." + }, + { + "type": "fix", + "text": "Adding binsearch/NZBIndex/anizb would fail the connection check" + }, + { + "type": "fix", + "text": "Periodic check of downloader status was not executed as expected, resulting in incomplete status NZB reports in the history" + }, + { + "type": "fix", + "text": "Logger sometimes swallowed information when anonymizing data" + } + ], + "final": true + }, + { + "version": "v1.2.1", + "date": "2018-01-27", + "changes": [ + { + "type": "note", + "text": "I've changed how some data is kept in the database. Deleting an indexer will remove it completely from the database, also deleting all related stats, search results and downloads. This might take a while on the next startup or whenever you delete an indexer with many related entries" + }, + { + "type": "feature", + "text": "Option to delete backups after x weeks. 4 is the default" + }, + { + "type": "fix", + "text": "Improve layout on mobile devices. Thanks nemchik" + }, + { + "type": "fix", + "text": "Updated the wrapper to delete older JAR files which previously caused some trouble. Any existing installations will have to update this manually. Docker containers must be updated." + } + ], + "final": true + }, + { + "version": "v1.2.0", + "date": "2018-01-25", + "changes": [ + { + "type": "feature", + "text": "Send torrent magnet links to associated program" + }, + { + "type": "fix", + "text": "Results without recognizable category were rejected" + } + ], + "final": true + }, + { + "version": "v1.1.4", + "date": "2018-01-22", + "changes": [ + { + "type": "fix", + "text": "Hide torrent black hole buttons for magnet links" + }, + { + "type": "fix", + "text": "Torrents were sometimes not correctly downloaded and would have extension .nzb" + } + ], + "final": true + }, + { + "version": "v1.1.3", + "date": "2018-01-21", + "changes": [ + { + "type": "fix", + "text": "Fix NZB links not being constructed correctly. Sorry about that" + } + ], + "final": true + }, + { + "version": "v1.1.2", + "date": "2018-01-21", + "changes": [ + { + "type": "feature", + "text": "Improved handling of XML generation for newznab/torznab API calls. Should improve compatibility with calling tools" + }, + { + "type": "feature", + "text": "Hydra attempts to recognize if it's running inside docker. It will not allow you call the internal update mechanism from the main page. You may still call it from the Updates page but a warning will be shown. Let me know if this works" + }, + { + "type": "fix", + "text": "The URL code change introduced with 1.1.0 might've caused some problems and should be fixed now" + }, + { + "type": "fix", + "text": "Sending NZBs from the download history to downloaders didn't work. You'll have to manually choose a category because the original category isn't available in the download history anymore" + }, + { + "type": "fix", + "text": "NZB filenames were not sanitized before being written to ZIP, resulting in an error" + }, + { + "type": "fix", + "text": "Improved dialog during update installation (no more error messages when everything is fine, hopefully)" + }, + { + "type": "fix", + "text": "Download history was not filterable by indexer" + }, + { + "type": "fix", + "text": "SickBeard/-rage/Medusa did not find all relevant categories. I've changed the way Hydra reports itscategories to calling tools. It follows the predefined categories of the newznab standard." + } + ], + "final": true + }, + { + "version": "v1.1.1", + "date": "2018-01-17", + "changes": [ + { + "type": "fix", + "text": "Fix results not being recognized by SickRage" + }, + { + "type": "fix", + "text": "The URL code change introduced with 1.1.0 might've caused some problems and should be fixed now" + } + ], + "final": true + }, + { + "version": "v1.1.0", + "date": "2018-01-15", + "changes": [ + { + "type": "feature", + "text": "Completely rewrote handling of scheme, port, host and context path. Should solve some issues and prevent others from happening where reverse proxies are involved. Also extended the Wiki. There's no need to set an external URL anymore. Please report back if this causes any issues" + }, + { + "type": "note", + "text": "I'll remove the option to send links to downloaders in one of the coming versions. Only upload of NZBs to downloaders will be supported. v2 is capable of handling it without issues and it allows for better control and upload status recognition" + } + ], + "final": true + }, + { + "version": "v1.0.18", + "date": "2018-01-13", + "changes": [ + { + "type": "fix", + "text": "Remove test data left in by mistake" + } + ], + "final": true + }, + { + "version": "v1.0.17", + "date": "2018-01-13", + "changes": [ + { + "type": "feature", + "text": "Don't require restart for change of log level" + }, + { + "type": "feature", + "text": "Show status updates during update" + }, + { + "type": "fix", + "text": "In some cases restarting resulted in shutdown. If you are affected by this you will to manually update the wrapper from this release" + }, + { + "type": "fix", + "text": "In some cases duplicate detection would throw an exception" + }, + { + "type": "feature", + "text": "Support JSON output for API searches" + } + ], + "final": true + }, + { + "version": "v1.0.16", + "date": "2018-01-11", + "changes": [ + { + "type": "fix", + "text": "Make sure users don't enter an insane download limit value" + }, + { + "type": "fix", + "text": "Fix forbidden regexes which might've let some results through" + }, + { + "type": "feature", + "text": "Add option to disable CSRF protection and disable it by default" + } + ], + "final": true + }, + { + "version": "v1.0.15", + "date": "2018-01-10", + "changes": [ + { + "type": "feature", + "text": "Pull NZB download status from configured downloaders instead of relying on extension scripts" + }, + { + "type": "feature", + "text": "Add button to check caps for all/all incomplete (yellow) indexers" + }, + { + "type": "fix", + "text": "Anonymize username:password pairs in URLs in logs" + }, + { + "type": "fix", + "text": "Torznab results were returned wrong, preventing Hydra from being added to radarr" + } + ], + "final": true + }, + { + "version": "v1.0.14", + "date": "2018-01-09", + "changes": [ + { + "type": "fix", + "text": "Gracefully shutdown when restarting or quitting while search requests are handled" + } + ], + "final": true + }, + { + "version": "v1.0.13", + "date": "2018-01-09", + "changes": [ + { + "type": "fix", + "text": "NZBs proxied from indexers were returned with wrong / random seeming file name" + } + ], + "final": true + }, + { + "version": "v1.0.12", + "date": "2018-01-07", + "changes": [ + { + "type": "feature", + "text": "Allow migrating only the config, skipping the database migration" + } + ], + "final": true + }, + { + "version": "v1.0.11", + "date": "2018-01-07", + "changes": [ + { + "type": "fix", + "text": "Fix error in auth introduced in a previous version" + } + ], + "final": true + }, + { + "version": "v1.0.10", + "date": "2018-01-07", + "changes": [ + { + "type": "feature", + "text": "Improve the logging for web exceptions (which are often swallowed which makes debugging harder)" + }, + { + "type": "fix", + "text": "Name of the category would not update in the category dropdown box on the search page" + }, + { + "type": "fix", + "text": "Allow searching without a query in the UI" + } + ], + "final": true + }, + { + "version": "v1.0.9", + "date": "2018-01-07", + "changes": [ + { + "type": "fix", + "text": "Allow NZBHydra2 to be shown in an iFrame (e.g. organizr)" + } + ], + "final": true + }, + { + "version": "v1.0.8", + "date": "2018-01-06", + "changes": [ + { + "type": "fix", + "text": "Increase lengths for columns which may contain very long texts (errors, queries)" + } + ], + "final": true + }, + { + "version": "v1.0.7", + "date": "2018-01-06", + "changes": [ + { + "type": "fix", + "text": "Fix bug in wrapper that I introduced in last version. Oh well..." + } + ], + "final": true + }, + { + "version": "v1.0.6", + "date": "2018-01-06", + "changes": [ + { + "type": "note", + "text": "Improve the way the host is determined. External URL should not need to be set when not using a reverse proxy" + }, + { + "type": "note", + "text": "Remove PyYAML dependency from wrapper" + } + ], + "final": true + }, + { + "version": "v1.0.5", + "date": "2018-01-06", + "changes": [ + { + "type": "note", + "text": "Make migration a bit more stable" + }, + { + "type": "note", + "text": "Make sure wrapper is started from correct folder" + } + ], + "final": true + }, + { + "version": "v1.0.4", + "date": "2018-01-06", + "changes": [ + { + "type": "note", + "text": "So many fixes" + } + ], + "final": true + }, + { + "version": "v1.0.3", + "date": "2018-01-06", + "changes": [ + { + "type": "note", + "text": "So many fixes" + } + ], + "final": true + }, + { + "version": "v1.0.2", + "date": "2018-01-06", + "changes": [ + { + "type": "note", + "text": "First public release. Welcome!" + } + ], + "final": true + } +] diff --git a/core/src/main/resources/config/baseConfig.yml b/core/src/main/resources/config/baseConfig.yml index 454efbb81..740158abf 100644 --- a/core/src/main/resources/config/baseConfig.yml +++ b/core/src/main/resources/config/baseConfig.yml @@ -336,6 +336,7 @@ searching: applyRestrictions: "NONE" coverSize: 128 customQuickFilterButtons: [] + customQueryMappings: [ ] duplicateAgeThreshold: 2.0 duplicateSizeThresholdInPercent: 1.0 forbiddenGroups: [] diff --git a/core/src/main/resources/static/css/dark.css.map b/core/src/main/resources/static/css/dark.css.map index 737e5bac2..bdf1daa0d 100644 --- a/core/src/main/resources/static/css/dark.css.map +++ b/core/src/main/resources/static/css/dark.css.map @@ -1 +1 @@ -{"version":3,"sources":["dark.css","../../bower_components/bootstrap-less/less/normalize.less","../../bower_components/bootstrap-less/less/print.less","../../bower_components/bootstrap-less/less/glyphicons.less","../../bower_components/bootstrap-less/less/scaffolding.less","../../bower_components/bootstrap-less/less/mixins/vendor-prefixes.less","nzbhydra.less","../../bower_components/bootstrap-less/less/mixins/tab-focus.less","../../bower_components/bootstrap-less/less/carousel.less","../../bower_components/bootstrap-less/less/thumbnails.less","../../bower_components/bootstrap-less/less/mixins/image.less","../../bower_components/bootstrap-less/less/type.less","../../bower_components/bootstrap-less/less/mixins/text-emphasis.less","../../bower_components/bootstrap-less/less/mixins/background-variant.less","../../bower_components/bootstrap-less/less/mixins/text-overflow.less","../../bower_components/bootstrap-less/less/code.less","../../bower_components/bootstrap-less/less/variables.less","../../bower_components/bootstrap-less/less/grid.less","../../bower_components/bootstrap-less/less/mixins/grid.less","../../bower_components/bootstrap-less/less/mixins/grid-framework.less","../../bower_components/bootstrap-less/less/tables.less","../../bower_components/bootstrap-less/less/mixins/table-row.less","../../bower_components/bootstrap-less/less/forms.less","../../bower_components/bootstrap-less/less/mixins/forms.less","../../bower_components/bootstrap-less/less/buttons.less","../../bower_components/bootstrap-less/less/mixins/buttons.less","../../bower_components/bootstrap-less/less/mixins/opacity.less","../../bower_components/bootstrap-less/less/button-groups.less","../../bower_components/bootstrap-less/less/component-animations.less","../../bower_components/bootstrap-less/less/dropdowns.less","../../bower_components/bootstrap-less/less/mixins/nav-divider.less","../../bower_components/bootstrap-less/less/mixins/border-radius.less","../../bower_components/bootstrap-less/less/input-groups.less","../../bower_components/bootstrap-less/less/navs.less","../../bower_components/bootstrap-less/less/navbar.less","../../bower_components/bootstrap-less/less/mixins/nav-vertical-align.less","../../bower_components/bootstrap-less/less/utilities.less","../../bower_components/bootstrap-less/less/breadcrumbs.less","../../bower_components/bootstrap-less/less/pagination.less","../../bower_components/bootstrap-less/less/mixins/pagination.less","../../bower_components/bootstrap-less/less/pager.less","../../bower_components/bootstrap-less/less/labels.less","../../bower_components/bootstrap-less/less/mixins/labels.less","../../bower_components/bootstrap-less/less/badges.less","../../bower_components/bootstrap-less/less/jumbotron.less","../../bower_components/bootstrap-less/less/alerts.less","../../bower_components/bootstrap-less/less/mixins/alerts.less","../../bower_components/bootstrap-less/less/progress-bars.less","../../bower_components/bootstrap-less/less/mixins/gradients.less","../../bower_components/bootstrap-less/less/mixins/progress-bar.less","../../bower_components/bootstrap-less/less/media.less","../../bower_components/bootstrap-less/less/list-group.less","../../bower_components/bootstrap-less/less/mixins/list-group.less","../../bower_components/bootstrap-less/less/panels.less","../../bower_components/bootstrap-less/less/mixins/panels.less","../../bower_components/bootstrap-less/less/responsive-embed.less","../../bower_components/bootstrap-less/less/wells.less","../../bower_components/bootstrap-less/less/close.less","../../bower_components/bootstrap-less/less/modals.less","../../bower_components/bootstrap-less/less/tooltip.less","../../bower_components/bootstrap-less/less/popovers.less","../../bower_components/bootstrap-less/less/mixins/clearfix.less","../../bower_components/bootstrap-less/less/mixins/center-block.less","../../bower_components/bootstrap-less/less/mixins/hide-text.less","../../bower_components/bootstrap-less/less/responsive-utilities.less","../../bower_components/bootstrap-less/less/mixins/responsive-visibility.less","../../bower_components/bootstrap-switch/src/less/bootstrap3/bootstrap-switch.less","dark.less","grey.less"],"names":[],"mappings":"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E,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,GAIF,eACE,MAAA,KAhBF,gBACE,KAAA,KADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,GAIF,eACE,KAAA,KAcF,kBACE,YAAA,KADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,GADF,iBACE,YAAA,EFTJ,yBEzBI,UAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,UAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UACE,MAAA,KAOJ,WACE,MAAA,KADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,GAcF,gBACE,MAAA,KADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,GAIF,eACE,MAAA,KAhBF,gBACE,KAAA,KADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,GAIF,eACE,KAAA,KAcF,kBACE,YAAA,KADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,GADF,iBACE,YAAA,GFAJ,yBElCI,UAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,UAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UACE,MAAA,KAOJ,WACE,MAAA,KADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,GAcF,gBACE,MAAA,KADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,GAIF,eACE,MAAA,KAhBF,gBACE,KAAA,KADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,GAIF,eACE,KAAA,KAcF,kBACE,YAAA,KADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,kBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,IADF,iBACE,YAAA,GADF,iBACE,YAAA,GFSJ,0BE3CI,UAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,WAAA,UAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UACE,MAAA,KAOJ,WACE,MAAA,KADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,WACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,IADF,UACE,MAAA,GAcF,gBACE,MAAA,KADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,gBACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,IADF,eACE,MAAA,GAIF,eACE,MAAA,KAhBF,gBACE,KAAA,KADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,gBACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA,IADF,eACE,KAAA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GF,kEACE,KAAA,kBATF,iEACE,KAAA,kBAGF,kEACE,KAAA,kBAGF,kEACE,KAAA,kBATF,iEACE,KAAA,kBAGF,kEACE,KAAA,kBAGF,kEACE,KAAA,kBATF,iEACE,KAAA,kBAGF,kEACE,KAAA,kBAGF,kEACE,KAAA,kBATF,iEACE,KAAA,kBAGF,kEACE,KAAA,kBAGF,kEACE,KAAA,kBATF,iEACE,KAAA,kBAGF,kEACE,KAAA,kBAGF,kEACE,KAAA,kBATF,iEACE,KAAA,kBAGF,kEACE,KAAA,kBAGF,kEACE,KAAA,kBATF,iEACE,KAAA,kBAGF,kEACE,KAAA,kBAGF,kEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,kBATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,eATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,eATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,eATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,eATF,kEACE,KAAA,kBAGF,mEACE,KAAA,kBAGF,mEACE,KAAA,eATF,kEACE,KAAA,eAGF,mEACE,KAAA,eAGF,mEACE,KAAA,eATF,kEACE,KAAA,eAGF,mEACE,KAAA,eAGF,mEACE,KAAA,eATF,kEACE,KAAA,eAGF,mEACE,KAAA,eAGF,mEACE,KAAA,eATF,kEACE,KAAA,eAGF,mEACE,KAAA,eAGF,mEACE,KAAA,eATF,kEACE,KAAA,eAGF,mEACE,KAAA,eAGF,mEACE,KAAA,eATF,kEACE,KAAA,eAGF,mEACE,KAAA,eAGF,mEACE,KAAA,eAOF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBAOF,sEACE,KAAA,kBADF,sEACE,KAAA,kBADF,sEACE,KAAA,kBADF,sEACE,KAAA,kBADF,sEACE,KAAA,kBADF,sEACE,KAAA,kBADF,sEACE,KAAA,kBADF,sEACE,KAAA,kBADF,sEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA,kBADF,uEACE,KAAA","file":"dark.css","sourcesContent":[null,"/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n //\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n// Upstream patch for normalize.css submitted: https://github.com/necolas/normalize.css/pull/379 - remove this fix once that is merged\n\n[role=\"button\"] {\n cursor: pointer;\n}","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","@import \"../../bower_components/bootstrap-less/less/bootstrap.less\";\n@import \"../../bower_components/bootstrap-switch/src/less/bootstrap3/bootstrap-switch.less\";\n//@import \"../../bower_components/font-awesome/less/font-awesome.less\";\n\n@grid-columns: 20;\n\n@font-family-sans-serif: \"Roboto\", \"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@headings-font-weight: 400;\n@line-height-large: 1.33;\n@font-size-base: 13px;\n@border-radius-large: 5px;\n@border-radius-small: 2px;\n@zindex-popover: 1010;\n@zindex-tooltip: 1030;\n@container-tablet: ((720px + @grid-gutter-width));\n@container-desktop: ((940px + @grid-gutter-width));\n@container-large-desktop: ((1140px + @grid-gutter-width));\n@modal-inner-padding: 20px;\n@badge-font-weight: normal;\n@breadcrumb-separator: \">\";\n\n//Will be redefined by theme later\n@chart-bar-color: pink;\n@chart-bar-color-alt: pink;\n@chart-text-color: pink;\n\nhtml,\nbody {\n height: 100%;\n background: @body-bg;\n}\n\n.padding-bottom-70 {\n padding-bottom: 70px;\n}\n\n.padding-bottom-40 {\n padding-bottom: 40px;\n}\n\n.padding-bottom-30 {\n padding-bottom: 30px;\n}\n\n.padding-bottom-0 {\n padding-bottom: 0;\n}\n\n#push,\n#footer {\n height: 70px;\n z-index: 100;\n}\n\n#update-footer {\n position: fixed;\n left: 0;\n //bottom:35px;\n height: 70px;\n width: 100%;\n}\n\n#downloader-status-footer {\n position: fixed;\n left: 0;\n bottom: 0;\n height: 35px;\n width: 100%;\n z-index: 100;\n}\n\n/* ------ featurette */\n.featurette {\n display: table;\n width: 100%;\n height: 10%; /* set a pixel height and then remove the body,html height */\n vertical-align: middle;\n color: @body-bg;\n}\n\n.featurette-inner {\n display: table-cell;\n vertical-align: middle;\n}\n\n.featurette .search {\n padding: 3%;\n max-width: 980px; /*max width of search*/\n margin: 0 auto;\n}\n\n.no-margin-top {\n margin-top: 0\n}\n\n/* ------ form-control-lg */\n.form-control-lg {\n min-height: 46px;\n border-radius: 6px;\n font-size: 18px;\n line-height: normal;\n}\n\n\n.td-embedded:first-child {\n padding-left: 15px;\n}\n\na.expand-collapse:focus {\n text-decoration: none;\n}\n\n.expand-collapse-hidden {\n visibility: hidden;\n}\n\n.hidden-keep-space {\n visibility: hidden;\n}\n\n.caret-reversed {\n transform: rotate(180deg);\n}\n\n.search-input {\n width: 80%;\n}\n\n.episode-input {\n border-left-width: 0 !important;\n border-right-width: 0 !important;\n border-radius: 0;\n}\n\n.season-input {\n border-radius: 0;\n}\n\n.search-border {\n border-bottom-right-radius: @border-radius-base !important;\n border-top-right-radius: @border-radius-base !important;\n //border-right-width: 0px !important;\n}\n\n.search-category-button {\n min-width: 105px; //Enough for \"Movies HD\"\n text-align: left;\n}\n\n.by-id-checkbox {\n\n font-size: @font-size-base;\n\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-right: 0px;\n\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n.cursor-default {\n cursor: pointer;\n}\n\n.no-underline {\n text-decoration: none !important;\n}\n\n.nzb-spinning {\n background-image: url('../img/spinner.gif');\n}\n\n.addable-nzb {\n display: inline-block;\n}\n\n.sabnzbd {\n background-image: url('../img/sab.png');\n}\n\n.sabnzbd-success {\n background-image: url('../img/sabsuccess.png');\n}\n\n.sabnzbd-error {\n background-image: url('../img/saberror.png');\n}\n\n.nzbget {\n background-image: url('../img/nzbget.png');\n}\n\n.nzbget-success {\n background-image: url('../img/nzbgetsuccess.png');\n}\n\n.nzbget-error {\n background-image: url('../img/nzbgeterror.png');\n}\n\n.icon {\n width: 16px;\n height: 16px;\n background-repeat: no-repeat;\n vertical-align: middle;\n}\n\n.config-field {\n width: 400px;\n}\n\n.checkbox-field {\n width: auto;\n}\n\n.config-select {\n margin: 30px;\n text-align: left;\n\n}\n\n.config-field-container {\n margin: 30px;\n text-align: left;\n}\n\n.control-label {\n\n}\n\n.config-select-field > button {\n background-color: @gray-darker;\n}\n\n.growl-container > .icon {\n width: inherit;\n height: inherit;\n}\n\n.navbar .nav,\n.navbar .nav > li {\n float: none;\n display: inline-block;\n *display: inline; /* ie7 fix */\n *zoom: 1; /* hasLayout ie7 trigger */\n vertical-align: top;\n}\n\n.navbar-inner {\n text-align: center;\n}\n\na.disabled {\n color: @gray-dark;\n text-decoration: none;\n cursor: default;\n}\n\na.disabled:hover {\n color: @gray-dark;\n text-decoration: none;\n cursor: default;\n}\n\n.visibility-hidden {\n visibility: hidden;\n}\n\n.search-results-table {\n display: table;\n width: 100%;\n background-color: @table-bg;\n border-collapse: separate;\n}\n\n.search-results-header {\n //display: table-header-group;\n text-align: center;\n}\n\n.search-results-body {\n //display: table-row-group;\n}\n\n.search-results-row {\n //display: table-row;\n\n}\n\n.other-duplicate-toggle {\n margin-left: 18px;\n}\n\n.toggle-placeholder {\n margin-left: 36px\n}\n\n.search-results-cell {\n //display: table-cell;\n text-align: left;\n border-top-width: 1px;\n}\n\n.nav-tabs > li, .nav-pills > li {\n float: none;\n display: inline-block;\n *display: inline; /* ie7 fix */\n zoom: 1; /* hasLayout ie7 trigger */\n}\n\n.nav-tabs, .nav-pills {\n text-align: center;\n}\n\n.table > tbody > tr > td {\n text-align: left;\n}\n\n.table > thead > tr > th {\n text-align: left;\n}\n\n.table > tbody + tbody {\n border-top: 1px solid @table-border-color;\n}\n\n.tab-content {\n padding-top: 30px;\n}\n\n.glyphicon-refresh-animate {\n -webkit-animation: spinw .7s infinite linear;\n -moz-animation: spinm .7s infinite linear;\n}\n\n@-webkit-keyframes spinw {\n from {\n -webkit-transform: rotate(0deg);\n }\n to {\n -webkit-transform: rotate(360deg);\n }\n}\n\n@-moz-keyframes spinm {\n from {\n -moz-transform: rotate(0deg);\n }\n to {\n -moz-transform: rotate(360deg);\n }\n}\n\n/*\n * Pulse animation\n*/\n\n@-webkit-keyframes pulsew {\n 0% {\n -webkit-transform: scale(1);\n }\n 50% {\n -webkit-transform: scale(1.1);\n }\n 100% {\n -webkit-transform: scale(1);\n }\n}\n\n@-moz-keyframes pulsem {\n 0% {\n -moz-transform: scale(1);\n }\n 50% {\n -moz-transform: scale(1.1);\n }\n 100% {\n -moz-transform: scale(1);\n }\n}\n\n.pulse {\n -webkit-animation-name: pulsew;\n -moz-animation: pulsem;\n}\n\n.config-button {\n border: 1px solid #1c1e22;\n border-bottom-color: transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n margin-top: 7px\n\n}\n\n.config-help-button {\n margin-right: 10px;\n}\n\n.pulse2 {\n animation: pulse2 1s linear infinite;\n animation-direction: alternate-reverse;\n}\n\n@keyframes pulse2 {\n 0% {\n\n transform: scale(1);\n }\n 50% {\n\n transform: scale(1.1);\n }\n 100% {\n\n transform: scale(1.2);\n }\n\n}\n\n.fuzzy-nfo {\n color: lighten(@gray, 30%);\n}\n\n.no-nfo {\n visibility: hidden;\n}\n\n.pagination {\n margin: 0;\n}\n\n.ui-select-bootstrap .ui-select-choices-row > a {\n background-color: @input-bg;\n color: @input-color;\n}\n\n.ui-select-match > .btn {\n background-color: @input-bg;\n color: @input-color;\n}\n\n.dropdown-menu {\n background-color: @input-bg;\n\n #freetext-filter-input {\n color: black;\n }\n}\n\n.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary {\n background-color: @brand-success;\n color: @switch-color;\n}\n\n.bootstrap-switch-handle-off {\n //padding: 6px !important;\n}\n\n.input-group-btn1 {\n border: 1px solid @input-border;\n border-left-width: 0;\n border-radius: @border-radius-base;\n}\n\n.input-group-btn2 {\n border: 1px solid @input-border;\n border-radius: @border-radius-base;\n}\n\n.input-group-btn:first-child {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n\n.input-group-btn:last-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n border-left-width: 0;\n}\n\n.search-results-table {\n border: 1px solid @brand-primary;\n}\n\n.search-results-table > tbody:nth-child(3) > tr > td {\n border-top-width: 0 !important;\n}\n\n.odd {\n background-color: darken(@table-bg, 5%);\n}\n\n.title-group-expanded {\n background-color: fade(darken(@table-bg, 5%), 35%);\n}\n\n.search-results-cell:focus {\n outline: none;\n}\n\n@font-size-result-title: 13px;\n@font-size-result-non-title: 12px;\n\n.duplicate {\n background-color: fade(darken(@table-bg, 15%), 35%);\n}\n\n.result-title {\n font-size: @font-size-result-title;\n width: 47.5%;\n}\n\n.result-indexer {\n font-size: @font-size-result-non-title;\n width: 8%;\n}\n\n.result-category {\n font-size: @font-size-result-non-title;\n width: 6%;\n}\n\n.result-size {\n font-size: @font-size-result-non-title;\n width: 6%;\n}\n\n.result-details {\n font-size: @font-size-result-non-title;\n width: 6%;\n}\n\n.result-age {\n font-size: @font-size-result-non-title;\n width: 4.5%;\n}\n\n.result-links {\n font-size: @font-size-result-non-title;\n width: 8%;\n padding-right: 4px !important;\n}\n\n.form-control {\n height: 36px;\n}\n\n.form-control::-webkit-input-placeholder {\n color: @input-color-placeholder;\n}\n\n.form-control:-moz-placeholder {\n color: @input-color-placeholder;\n}\n\n.form-control::-moz-placeholder {\n color: @input-color-placeholder;\n}\n\n.form-control:-ms-input-placeholder {\n color: @input-color-placeholder;\n}\n\n.bootstrap-switch {\n border: 1px solid @input-border;\n}\n\n.indexer-checkbox {\n margin-left: 10px !important;\n}\n\n.block-ui-overlay {\n width: 100%;\n height: 100%;\n opacity: 0.5;\n background-color: @block-overlay-bg;\n}\n\n.block-ui-message {\n background-color: @block-message-bg;\n color: @block-message-color;\n}\n\n.nfo {\n background-color: transparent;\n border-width: 0;\n text-align: left;\n color: @text-color;\n}\n\ninput[type='number'] {\n -moz-appearance: textfield;\n}\n\ninput::-webkit-outer-spin-button,\ninput::-webkit-inner-spin-button {\n -webkit-appearance: none;\n}\n\n[ng\\:cloak], [ng-cloak], .ng-cloak {\n display: none !important;\n}\n\npre {\n min-height: 50px;\n}\n\n.system-tab-content {\n //width: 900px;\n margin: auto;\n}\n\n.panel {\n border-color: @navbar-default-border;\n}\n\n.panel-default > .panel-heading {\n background-color: @navbar-default-bg;\n\n h3 {\n color: @navbar-inverse-bg;\n }\n}\n\n.help-block {\n text-align: left;\n\n a {\n text-decoration: underline;\n }\n}\n\ninput:focus + .input-group-addon {\n @color-rgba: rgba(red(@input-border-focus), green(@input-border-focus), blue(@input-border-focus), .6);\n border-color: @input-border-focus;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n}\n\n.input-group-addon {\n cursor: default;\n}\n\n#banner {\n background: @banner-url no-repeat center;\n background-size: contain;\n height: 150px;\n margin: 0 auto 25px auto;\n display: block;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n\n}\n\n.input-group-addon {\n color: @input-group-addon-color;\n}\n\n.history-title {\n font-style: italic;\n color: @input-color-placeholder;\n}\n\n.has-error .control-label {\n color: @brand-danger;\n}\n\n.indexer-button {\n margin-right: 10px;\n width: 170px;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.config-incomplete {\n background-color: @brand-danger;\n border-color: @brand-danger;\n }\n\n &.not-all-checked {\n background-color: @brand-warning;\n border-color: @brand-warning;\n }\n\n}\n\n.spinner {\n display: inline-block;\n opacity: 0;\n max-width: 0;\n -webkit-transition: opacity 0.25s, max-width 0.45s;\n -moz-transition: opacity 0.25s, max-width 0.45s;\n -o-transition: opacity 0.25s, max-width 0.45s;\n transition: opacity 0.25s, max-width 0.45s;\n /* Duration fixed since we animate additional hidden width */\n}\n\n.has-spinner.active {\n cursor: progress;\n}\n\n.has-spinner.active .spinner {\n opacity: 1;\n max-width: 50px;\n /* More than it will ever come, notice that this affects on animation duration */\n}\n\n.indexer-score-input {\n border-left-width: 0px !important;\n border-right-width: 0px !important;\n border-radius: 0;\n}\n\n.indexer-score-input-enabled {\n border-color: @brand-success;\n}\n\n.indexer-input-input-enabled:focus {\n border-color: @brand-success;\n}\n\n.indexer-score-input-disabled {\n border-color: @btn-default-border;\n}\n\n.indexer-score-input-disabled:focus {\n border-color: @btn-default-border;\n}\n\n.indexer-score-addon-disabled {\n}\n\n.btn:focus {\n outline: none;\n}\n\n.btn-default:active {\n background-color: @btn-default-bg;\n}\n\n.filter-button.btn-default:focus\n //.filter-button.active\n{\n background-color: @btn-default-bg !important;\n border-color: @btn-default-bg !important;\n color: @btn-default-color !important;\n\n &.active {\n background-color: @btn-default-active-bg !important;\n color: @btn-default-color !important;\n }\n}\n\n.inline-filter { //Filter box\n display: inline;\n width: 300px;\n padding-left: 5px;\n font-size: @font-size-base;\n height: 24px;\n margin-left: 5px;\n}\n\n.indexer-input:focus {\n outline: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n\n.indexer-input-focused {\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.table .table {\n background-color: @table-bg;\n}\n\n.results-table-expanded {\n border-color: red;\n}\n\n.indexer-statuses-accordion {\n color: @text-color;\n}\n\n.tooltip-inner {\n max-width: 350px;\n}\n\n.caption {\n padding-top: 8px;\n padding-bottom: 8px;\n margin-bottom: 5px;\n color: @brand-primary;\n text-align: left;\n}\n\n//Charts\n\n.nv-axis text {\n fill: @chart-text-color;\n}\n\n.nv-bar text {\n fill: @chart-text-color !important;\n}\n\n.nvd3 .nv-discretebar .nv-groups rect {\n fill: @chart-bar-color !important;\n}\n\n.nvd3 .nv-multibarHorizontal .nv-groups rect {\n fill: @chart-bar-color !important;\n}\n\n.nv-groups .nv-series-0 rect {\n fill: @chart-bar-color !important;\n}\n\n//Legend\ng.nv-multiBarWithLegend > g > g.nv-legendWrap.nvd3-svg > g > g > g:nth-child(1) > circle {\n //.nv-series:nth-child(1) > circle {\n fill: @chart-bar-color !important;\n stroke: @chart-bar-color !important;\n}\n\n.nv-groups .nv-series-1 rect {\n fill: @chart-bar-color-alt !important;\n}\n\n//Legend\ng.nv-multiBarWithLegend > g > g.nv-legendWrap.nvd3-svg > g > g > g:nth-child(2) > circle {\n fill: @chart-bar-color-alt !important;\n stroke: @chart-bar-color-alt !important;\n}\n\n.nv-legend-text {\n fill: @chart-text-color;\n}\n\ng.nv-multiBarHorizontalChart > g > g > g > g > g > text {\n transform: rotate(-31deg);\n}\n\n.nvtooltip {\n background-color: @modal-content-bg;\n color: @text-color;\n}\n\n.tick line {\n opacity: 0 !important;\n}\n\n.generate-multibar-colors(@n, @i: 1) when (@i =< @n) {\n .nvd3 .nv-multibarHorizontal > g > g.nv-groups > g > g:nth-child(@{i}) > rect {\n fill: lighten(@chart-bar-color, (@i * 2%)) !important;\n }\n\n .nvd3 .nv-multibar > g > g.nv-groups > g:nth-child(1) > rect:nth-child(@{i}) {\n fill: lighten(@chart-bar-color, (@i * 2%)) !important;\n }\n\n .nvd3 .nv-multibar > g > g.nv-groups > g:nth-child(1) > rect:nth-child(@{i}) {\n fill: lighten(@chart-bar-color-alt, (@i * 2%)) !important;\n }\n\n .generate-multibar-colors(@n, (@i + 1));\n}\n\n.generate-week-colors(@n, @i: 1) when (@i =< @n) {\n .weeklyChart .nvd3 .nv-discretebar > g > g.nv-groups > g > g:nth-child(@{i}) > rect {\n fill: lighten(@chart-bar-color, (@i * 7%)) !important;\n }\n\n .generate-week-colors(@n, (@i + 1));\n}\n\n.generate-day-colors(@n, @i: 1) when (@i =< @n) {\n .dailyChart .nvd3 .nv-discretebar > g > g.nv-groups > g > g:nth-child(@{i}) > rect {\n fill: lighten(@chart-bar-color, (@i * 2%)) !important;\n }\n\n .generate-day-colors(@n, (@i + 1));\n}\n\n.column-filter {\n border: none !important;\n background: none !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n -moz-box-shadow: none !important;\n padding: 0;\n margin-left: 3px;\n font-size: 80% !important;\n}\n\n.column-filter-boolean {\n margin-bottom: 0;\n\n .radio {\n margin-top: 5px;\n margin-bottom: 5px;\n margin-left: 5px;\n\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n}\n\n.narrow-row {\n padding-top: 2px !important;\n padding-bottom: 2px !important;\n}\n\n.filter-active {\n color: @brand-success;\n}\n\n.help-block {\n margin-top: 0;\n margin-bottom: 0;\n\n}\n\n.rejected-tooltip {\n width: unset;\n}\n\n.rejected-tooltip-table {\n margin-top: 10px;\n background-color: transparent;\n}\n\n.warning {\n color: @brand-warning;\n}\n\n.error, .danger {\n color: @brand-danger;\n}\n\n.error-message {\n color: @brand-danger-message;\n}\n\n@media (min-width: 1000px) {\n .modal-xl {\n width: 950px;\n }\n}\n\n@media (min-width: 1500px) {\n .modal-xl {\n width: 1400px;\n }\n}\n\n.chip-tmpl {\n display: inline-block;\n margin: 0 5px 5px 0;\n}\n\n.default-chip {\n border: 1px solid @input-border;\n border-radius: 5px;\n background: @input-bg;\n color: @input-color;\n padding: 0 2px 0 2px;\n}\n\n.chip-tmpl:focus {\n outline: none;\n}\n\nchip-tmpl:focus .default-chip {\n border: 2px solid #9e9e9e;\n background: @input-bg;\n color: @input-color;\n}\n\n.chip-failed .default-chip {\n color: @brand-danger;\n}\n\n.chips {\n display: block;\n padding: 2px 5px 1px 12px;\n background: @input-bg;\n height: unset;\n min-height: 34px;\n text-align: left;\n}\n\n.chip-control {\n background: @input-bg;\n color: @input-color;\n margin-top: 5px;\n}\n\n.chips > div {\n display: inline;\n}\n\n.chips > div > input {\n height: 100%;\n border: none;\n font-size: @font-size-base;\n}\n\n.chips > div > input:focus {\n outline: none;\n}\n\n.chip-out-focus {\n border: 1px solid @input-border;\n}\n\n.chip-in-focus {\n border: 1px solid @input-border-focus;\n}\n\n.remove-chip {\n font-size: 10px;\n}\n\nselect.form-control {\n padding-left: 8px; //Content has some paddding, so reduce padding to make actual/visual padding the same as the others\n}\n\n.input-lg {\n font-size: 16px;\n}\n\n.stat-box {\n border-radius: @border-radius-small;\n border: 1px solid @table-border-color;\n\n .caption {\n margin-top: 10px;\n padding-left: 15px;\n\n .bootstrap-switch {\n margin-right: 20px;\n }\n }\n}\n\n.formly-field-duoSetting > div {\n margin-bottom: 0;\n}\n\n.formly-multiselect {\n float: left;\n}\n\n\n.popover {\n max-width: 450px;\n\n .popover-content {\n min-width: 400px;\n }\n}\n\n\n.config-label {\n width: 20%;\n}\n\n.config-content {\n width: 30%;\n padding-right: 0;\n}\n\n.config-tooltip {\n padding-left: 10px;\n padding-right: 10px;\n width: 3%;\n display: block;\n}\n\n\n.config-help {\n padding-left: 0;\n width: 47%;\n padding-right: 20px;\n}\n\n.setting-wrapper {\n\n\n .config-content {\n padding-right: 0;\n }\n\n\n .config-help {\n padding-left: 0;\n width: 47%;\n padding-right: 20px;\n }\n\n .align-middle {\n vertical-align: middle;\n height: 36px;\n display: table-cell;\n }\n}\n\n\n.config-box {\n\n .config-tooltip {\n padding-left: 15px;\n padding-right: 15px;\n }\n\n .config-help {\n padding-left: 15px;\n padding-right: 20px;\n width: 45%;\n }\n\n}\n\n\n.config-field-tooltip {\n max-width: 400px;\n}\n\n.config {\n .config-left-space {\n width: 10%;\n }\n}\n\n.config-fieldset-legend {\n float: left;\n margin-left: 292px;\n}\n\n\n.formly > .formly-field-group {\n position: relative;\n background-color: fade(@modal-content-bg, 50%);\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n //.box-shadow(0 1px 5px rgba(0, 0, 0, .5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n\n\n}\n\n.formly-field-repeatSection {\n\n .repeatsection {\n box-shadow: none;\n border: none;\n margin-top: 25px;\n }\n\n}\n\n.repeatWrapperClass {\n background-color: fade(@modal-content-bg, 25%);\n border: 1px solid @modal-content-border-color;\n margin-top: 25px;\n padding-bottom: 45px;\n\n legend {\n display: inline-block;\n margin-bottom: 0;\n overflow: hidden;\n }\n\n\n .repeatsection {\n margin-left: 20px;\n margin-right: 20px;\n background-color: fade(darken(@modal-content-bg, 7%), 25%);\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n\n &:not(:first-child) {\n margin-top: 20px;\n }\n\n fieldset {\n margin-left: -15px\n }\n\n\n legend {\n //(@font-size-base * 1.5) for regular legends in forms.less\n font-size: (@font-size-base * 1.3);\n padding: 3px;\n margin-left: -7px;\n border: none;\n margin-bottom: 10px;\n overflow: hidden;\n }\n }\n\n .remove-button, .add-button {\n float: left;\n margin-left: 286px;\n margin-bottom: 15px;\n }\n\n .remove-button {\n margin-top: 10px;\n }\n\n}\n\n\n.formly-field-group:not(:first-child) {\n margin-top: 25px;\n}\n\n.formly-field-group:first-child {\n margin-top: -25px;\n}\n\n\na.glyph-link, a.glyph-link:hover {\n text-decoration: none;\n}\n\n.dropdown-multiselect {\n\n &.form-control {\n background-color: transparent;\n border: none;\n padding: 0;\n }\n\n .dropdown-toggle {\n width: 100%;\n overflow: hidden;\n -ms-text-overflow: ellipsis;\n text-overflow: ellipsis;\n }\n\n a:focus {\n outline: none;\n }\n}\n\n.indexer-statuses-table {\n .label {\n font-size: 100%;\n font-weight: 100;\n }\n\n .indexer-status-reason {\n word-break: break-all;\n }\n}\n\n.scrollable-menu {\n height: auto;\n max-height: 600px;\n overflow-x: hidden;\n}\n\n.log > tr > td.log-line {\n padding-top: 5px !important;\n padding-bottom: 5px !important;\n font-size: small;\n}\n\n.nvtooltip {\n display: none !important;\n}\n\n.downloader-status {\n\n .nvtooltip, .nv-point {\n display: none !important;\n }\n\n .nv-noData {\n display: none !important;\n }\n\n path.domain {\n display: none;\n }\n\n padding-right: 0;\n\n .nvd3 text {\n display: none;\n }\n\n .nvd3 {\n .nv-bars {\n rect {\n width: 2px !important;\n }\n }\n }\n\n chart {\n float: right;\n }\n\n}\n\n.pagination > .active > a {\n //z-index: -1 !important;\n}\n\n\n.cover-modal-dialog {\n .modal-dialog {\n width: min-content;\n }\n}\n\n.category-button {\n min-width: 115px;\n margin: 6px;\n height: 35px;\n}\n\n.bootstrap-switch-advanced-toggle-wrapper {\n border: none;\n margin-top: 10px;\n}","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base: #000;\n@gray-darker: lighten(@gray-base, 13.5%); // #222\n@gray-dark: lighten(@gray-base, 20%); // #333\n@gray: lighten(@gray-base, 33.5%); // #555\n@gray-light: lighten(@gray-base, 46.7%); // #777\n@gray-lighter: lighten(@gray-base, 93.5%); // #eee\n\n@brand-primary: darken(#428bca, 6.5%); // #337ab7\n@brand-success: #5cb85c;\n@brand-info: #5bc0de;\n@brand-warning: #f0ad4e;\n@brand-danger: #d9534f;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for ``.\n@body-bg: #fff;\n//** Global text color on ``.\n@text-color: @gray-dark;\n\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif: Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for ``, ``, and `
`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the ``.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n@icon-font-path:          \"../fonts/\";\n//** File name for all font files.\n@icon-font-name:          \"glyphicons-halflings-regular\";\n//** Element ID within SVG icon file.\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ``s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n@input-bg:                       #fff;\n//** `` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for ``s\n@input-color:                    @gray;\n//** `` border color\n@input-border:                   #ccc;\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on ``s in CSS.\n@input-border-radius:            @border-radius-base;\n//** Large `.form-control` border radius\n@input-border-radius-large:      @border-radius-large;\n//** Small `.form-control` border radius\n@input-border-radius-small:      @border-radius-small;\n\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        #999;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n//** `.form-group` margin\n@form-group-margin-bottom:       15px;\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled:                not-allowed;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n//** Deprecated `@dropdown-caret-color` as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1060;\n@zindex-tooltip:           1070;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `@screen-xs` as of v3.0.1\n@screen-xs:                  480px;\n//** Deprecated `@screen-xs-min` as of v3.2.0\n@screen-xs-min:              @screen-xs;\n//** Deprecated `@screen-phone` as of v3.0.1\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n//** Deprecated `@screen-sm` as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n//** Deprecated `@screen-tablet` as of v3.0.1\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n//** Deprecated `@screen-md` as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n//** Deprecated `@screen-desktop` as of v3.0.1\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n//** Deprecated `@screen-lg` as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n//** Deprecated `@screen-lg-desktop` as of v3.0.1\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             (720px + @grid-gutter-width);\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            (940px + @grid-gutter-width);\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      (1140px + @grid-gutter-width);\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      lighten(@gray-light, 15%);\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 lighten(@gray-light, 15%);\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #fff;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 @popover-bg;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         15px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n//** Variable for setting rounded corners on progress bar.\n@progress-border-radius:      @border-radius-base;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list items\n@list-group-active-color:       @component-active-color;\n//** Background color of active list items\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n//** Text color for content within active list items\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color:      @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg:         @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color:         #555;\n@list-group-link-hover-color:   @list-group-link-color;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-heading-padding:       10px 15px;\n@panel-footer-padding:        @panel-heading-padding;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n//** Width of horizontal description list titles\n@dl-horizontal-offset:        @component-offset-horizontal;\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  (@grid-gutter-width / 2);\n      padding-right: (@grid-gutter-width / 2);\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n  .col-@{class}-push-0 {\n    left: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n  .col-@{class}-pull-0 {\n    right: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: @table-bg;\n}\ncaption {\n  padding-top: @table-cell-padding;\n  padding-bottom: @table-cell-padding;\n  color: @text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: @table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: @table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: @screen-xs-max) {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &:hover > .@{state},\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n  }\n\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: @input-height-base;\n\n    &.input-sm,\n    .input-group-sm & {\n      line-height: @input-height-small;\n    }\n\n    &.input-lg,\n    .input-group-lg & {\n      line-height: @input-height-large;\n    }\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because