mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-17 21:44:48 -04:00
Compare commits
36 Commits
v1.35.0.50
...
v1.36.3.50
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3ee3f2320 | ||
|
|
e8c26d0fea | ||
|
|
9c936121e8 | ||
|
|
40d2e40d94 | ||
|
|
837f50c91c | ||
|
|
f0a0202e5c | ||
|
|
708c94bc56 | ||
|
|
5ed82eaf09 | ||
|
|
7d77ad68fd | ||
|
|
6725358db5 | ||
|
|
c410e23460 | ||
|
|
903b86b9a2 | ||
|
|
52a49e6a34 | ||
|
|
a7d99f351c | ||
|
|
b0212dd780 | ||
|
|
c8f5099423 | ||
|
|
5cc4c3f302 | ||
|
|
c0d2cb42e9 | ||
|
|
8081f13052 | ||
|
|
84b672e617 | ||
|
|
ed586c2d72 | ||
|
|
233176e321 | ||
|
|
d1e3390bae | ||
|
|
1cd60c7a40 | ||
|
|
c61cfcd312 | ||
|
|
5eb4d112ca | ||
|
|
70f2361d69 | ||
|
|
1d6babaa15 | ||
|
|
0427add8d0 | ||
|
|
010c2b836d | ||
|
|
22c4c1fc9a | ||
|
|
d5f6cc94b8 | ||
|
|
411e96ef2a | ||
|
|
2b0e52ebca | ||
|
|
c6fa26ca7b | ||
|
|
c85f170d41 |
@@ -78,6 +78,6 @@ Thank you to [<img src="https://resources.jetbrains.com/storage/products/company
|
||||
### License
|
||||
|
||||
- [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
||||
- Copyright 2010-2024
|
||||
- Copyright 2010-2025
|
||||
|
||||
Icon Credit - [Box vector created by freepik - www.freepik.com](https://www.freepik.com/vectors/box)
|
||||
|
||||
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '1.35.0'
|
||||
majorVersion: '1.36.3'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
prowlarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
|
||||
@@ -476,6 +476,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: '$(testName) Unit Tests'
|
||||
failTaskOnFailedTests: true
|
||||
failTaskOnMissingResultsFile: ne(variables['testName'], 'freebsd-x64')
|
||||
|
||||
- job: Unit_Docker
|
||||
displayName: Unit Docker
|
||||
@@ -532,7 +533,8 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: '$(testName) Unit Tests'
|
||||
failTaskOnFailedTests: true
|
||||
|
||||
failTaskOnMissingResultsFile: true
|
||||
|
||||
- job: Unit_LinuxCore_Postgres14
|
||||
displayName: Unit Native LinuxCore with Postgres14 Database
|
||||
dependsOn: Prepare
|
||||
@@ -585,6 +587,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: 'LinuxCore Postgres14 Unit Tests'
|
||||
failTaskOnFailedTests: true
|
||||
failTaskOnMissingResultsFile: true
|
||||
|
||||
- job: Unit_LinuxCore_Postgres15
|
||||
displayName: Unit Native LinuxCore with Postgres15 Database
|
||||
@@ -638,6 +641,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: 'LinuxCore Postgres15 Unit Tests'
|
||||
failTaskOnFailedTests: true
|
||||
failTaskOnMissingResultsFile: true
|
||||
|
||||
- stage: Integration
|
||||
displayName: Integration
|
||||
@@ -720,6 +724,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: '$(testName) Integration Tests'
|
||||
failTaskOnFailedTests: true
|
||||
failTaskOnMissingResultsFile: true
|
||||
displayName: Publish Test Results
|
||||
|
||||
- job: Integration_LinuxCore_Postgres14
|
||||
@@ -782,6 +787,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: 'Integration LinuxCore Postgres14 Database Integration Tests'
|
||||
failTaskOnFailedTests: true
|
||||
failTaskOnMissingResultsFile: true
|
||||
displayName: Publish Test Results
|
||||
|
||||
|
||||
@@ -845,6 +851,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: 'Integration LinuxCore Postgres15 Database Integration Tests'
|
||||
failTaskOnFailedTests: true
|
||||
failTaskOnMissingResultsFile: true
|
||||
displayName: Publish Test Results
|
||||
|
||||
- job: Integration_FreeBSD
|
||||
@@ -891,6 +898,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: 'FreeBSD Integration Tests'
|
||||
failTaskOnFailedTests: true
|
||||
failTaskOnMissingResultsFile: false
|
||||
displayName: Publish Test Results
|
||||
|
||||
- job: Integration_Docker
|
||||
@@ -960,6 +968,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: '$(testName) Integration Tests'
|
||||
failTaskOnFailedTests: true
|
||||
failTaskOnMissingResultsFile: true
|
||||
displayName: Publish Test Results
|
||||
|
||||
- stage: Automation
|
||||
@@ -1041,6 +1050,7 @@ stages:
|
||||
testResultsFiles: '**/TestResult.xml'
|
||||
testRunTitle: '$(osName) Automation Tests'
|
||||
failTaskOnFailedTests: $(failBuild)
|
||||
failTaskOnMissingResultsFile: $(failBuild)
|
||||
displayName: Publish Test Results
|
||||
|
||||
- stage: Analyze
|
||||
|
||||
@@ -170,7 +170,7 @@ module.exports = (env) => {
|
||||
loose: true,
|
||||
debug: false,
|
||||
useBuiltIns: 'entry',
|
||||
corejs: '3.39'
|
||||
corejs: '3.42'
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
@@ -65,17 +65,30 @@ class VirtualTable extends Component {
|
||||
|
||||
if (this._grid && scrollTop !== undefined && scrollTop !== 0 && !scrollRestored) {
|
||||
this.setState({ scrollRestored: true });
|
||||
this._grid.scrollToPosition({ scrollTop });
|
||||
this._gridScrollToPosition({ scrollTop });
|
||||
}
|
||||
|
||||
if (scrollIndex != null && scrollIndex !== prevProps.scrollIndex) {
|
||||
this._grid.scrollToCell({
|
||||
this._gridScrollToCell({
|
||||
rowIndex: scrollIndex,
|
||||
columnIndex: 0
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_gridScrollToCell = ({ rowIndex = 0, columnIndex = 0 }) => {
|
||||
const scrollOffset = this._grid.getOffsetForCell({
|
||||
rowIndex,
|
||||
columnIndex
|
||||
});
|
||||
|
||||
this._gridScrollToPosition(scrollOffset);
|
||||
};
|
||||
|
||||
_gridScrollToPosition = ({ scrollTop = 0, scrollLeft = 0 }) => {
|
||||
this.props.scroller?.scrollTo({ top: scrollTop, left: scrollLeft });
|
||||
};
|
||||
|
||||
//
|
||||
// Control
|
||||
|
||||
|
||||
30
package.json
30
package.json
@@ -23,17 +23,17 @@
|
||||
"defaults"
|
||||
],
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-free": "6.7.1",
|
||||
"@fortawesome/fontawesome-svg-core": "6.7.1",
|
||||
"@fortawesome/free-regular-svg-icons": "6.7.1",
|
||||
"@fortawesome/free-solid-svg-icons": "6.7.1",
|
||||
"@fortawesome/fontawesome-free": "6.7.2",
|
||||
"@fortawesome/fontawesome-svg-core": "6.7.2",
|
||||
"@fortawesome/free-regular-svg-icons": "6.7.2",
|
||||
"@fortawesome/free-solid-svg-icons": "6.7.2",
|
||||
"@fortawesome/react-fontawesome": "0.2.2",
|
||||
"@juggle/resize-observer": "3.4.0",
|
||||
"@microsoft/signalr": "6.0.25",
|
||||
"@sentry/browser": "7.119.1",
|
||||
"@sentry/integrations": "7.119.1",
|
||||
"@types/node": "20.16.11",
|
||||
"@types/react": "18.2.79",
|
||||
"@types/react": "18.3.21",
|
||||
"@types/react-dom": "18.2.25",
|
||||
"chart.js": "4.4.4",
|
||||
"classnames": "2.5.1",
|
||||
@@ -71,9 +71,9 @@
|
||||
"react-router-dom": "5.2.0",
|
||||
"react-tabs": "4.3.0",
|
||||
"react-text-truncate": "0.19.0",
|
||||
"react-use-measure": "2.1.1",
|
||||
"react-virtualized": "9.21.1",
|
||||
"react-window": "1.8.10",
|
||||
"react-use-measure": "2.1.7",
|
||||
"react-virtualized": "9.22.6",
|
||||
"react-window": "1.8.11",
|
||||
"redux": "4.2.1",
|
||||
"redux-actions": "2.6.5",
|
||||
"redux-batched-actions": "0.5.0",
|
||||
@@ -84,13 +84,13 @@
|
||||
"typescript": "5.7.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.26.0",
|
||||
"@babel/eslint-parser": "7.25.9",
|
||||
"@babel/plugin-proposal-export-default-from": "7.25.9",
|
||||
"@babel/core": "7.27.1",
|
||||
"@babel/eslint-parser": "7.27.1",
|
||||
"@babel/plugin-proposal-export-default-from": "7.27.1",
|
||||
"@babel/plugin-syntax-dynamic-import": "7.8.3",
|
||||
"@babel/preset-env": "7.26.0",
|
||||
"@babel/preset-react": "7.26.3",
|
||||
"@babel/preset-typescript": "7.26.0",
|
||||
"@babel/preset-env": "7.27.2",
|
||||
"@babel/preset-react": "7.27.1",
|
||||
"@babel/preset-typescript": "7.27.1",
|
||||
"@types/lodash": "4.14.195",
|
||||
"@types/react-document-title": "2.0.10",
|
||||
"@types/react-router-dom": "5.3.3",
|
||||
@@ -104,7 +104,7 @@
|
||||
"babel-loader": "9.2.1",
|
||||
"babel-plugin-inline-classnames": "2.0.1",
|
||||
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
|
||||
"core-js": "3.39.0",
|
||||
"core-js": "3.42.0",
|
||||
"css-loader": "6.7.3",
|
||||
"css-modules-typescript-loader": "4.0.1",
|
||||
"eslint": "8.57.1",
|
||||
|
||||
@@ -16,6 +16,8 @@ namespace NzbDrone.Common.Test.Http
|
||||
[TestCase("Readarr/1.0.0.2300 (ubuntu 20.04)", "Readarr")]
|
||||
[TestCase("Sonarr/3.0.6.9999 (ubuntu 20.04)", "Sonarr")]
|
||||
[TestCase("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36", "Other")]
|
||||
[TestCase("appbrr", "appbrr")]
|
||||
[TestCase(" appbrr ", "appbrr")]
|
||||
public void should_parse_user_agent(string userAgent, string parsedAgent)
|
||||
{
|
||||
UserAgentParser.ParseSource(userAgent).Should().Be(parsedAgent);
|
||||
|
||||
@@ -167,7 +167,7 @@ namespace NzbDrone.Common.Http.Dispatchers
|
||||
}
|
||||
catch (OperationCanceledException ex) when (cts.IsCancellationRequested)
|
||||
{
|
||||
throw new WebException("Http request timed out", ex.InnerException, WebExceptionStatus.Timeout, null);
|
||||
throw new WebException("Http request timed out", ex, WebExceptionStatus.Timeout, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace NzbDrone.Common.Http
|
||||
{
|
||||
public static class UserAgentParser
|
||||
{
|
||||
private static readonly Regex AppSourceRegex = new Regex(@"(?<agent>[a-z0-9]*)\/.*(?:\(.*\))?",
|
||||
private static readonly Regex AppSourceRegex = new (@"^(?<agent>[a-z0-9]+)(?:\/.+(?:\(.*\))?|$)",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
public static string SimplifyUserAgent(string userAgent)
|
||||
{
|
||||
if (userAgent == null || userAgent.StartsWith("Mozilla/5.0"))
|
||||
if (userAgent == null || userAgent.StartsWith("Mozilla/5.0", StringComparison.Ordinal))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -19,14 +20,9 @@ namespace NzbDrone.Common.Http
|
||||
|
||||
public static string ParseSource(string userAgent)
|
||||
{
|
||||
var match = AppSourceRegex.Match(SimplifyUserAgent(userAgent) ?? string.Empty);
|
||||
var match = AppSourceRegex.Match(SimplifyUserAgent(userAgent?.Trim()) ?? string.Empty);
|
||||
|
||||
if (match.Groups["agent"].Success)
|
||||
{
|
||||
return match.Groups["agent"].Value;
|
||||
}
|
||||
|
||||
return "Other";
|
||||
return match.Groups["agent"].Success ? match.Groups["agent"].Value : "Other";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,27 +4,27 @@ namespace NzbDrone.Common.Instrumentation.Extensions
|
||||
{
|
||||
public static class LoggerExtensions
|
||||
{
|
||||
[MessageTemplateFormatMethod("message")]
|
||||
public static void ProgressInfo(this Logger logger, string message, params object[] args)
|
||||
{
|
||||
var formattedMessage = string.Format(message, args);
|
||||
LogProgressMessage(logger, LogLevel.Info, formattedMessage);
|
||||
LogProgressMessage(logger, LogLevel.Info, message, args);
|
||||
}
|
||||
|
||||
[MessageTemplateFormatMethod("message")]
|
||||
public static void ProgressDebug(this Logger logger, string message, params object[] args)
|
||||
{
|
||||
var formattedMessage = string.Format(message, args);
|
||||
LogProgressMessage(logger, LogLevel.Debug, formattedMessage);
|
||||
LogProgressMessage(logger, LogLevel.Debug, message, args);
|
||||
}
|
||||
|
||||
[MessageTemplateFormatMethod("message")]
|
||||
public static void ProgressTrace(this Logger logger, string message, params object[] args)
|
||||
{
|
||||
var formattedMessage = string.Format(message, args);
|
||||
LogProgressMessage(logger, LogLevel.Trace, formattedMessage);
|
||||
LogProgressMessage(logger, LogLevel.Trace, message, args);
|
||||
}
|
||||
|
||||
private static void LogProgressMessage(Logger logger, LogLevel level, string message)
|
||||
private static void LogProgressMessage(Logger logger, LogLevel level, string message, object[] parameters)
|
||||
{
|
||||
var logEvent = new LogEventInfo(level, logger.Name, message);
|
||||
var logEvent = new LogEventInfo(level, logger.Name, null, message, parameters);
|
||||
logEvent.Properties.Add("Status", "");
|
||||
|
||||
logger.Log(logEvent);
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.IndexerTests.PTPTests
|
||||
first.Guid.Should().Be("PassThePopcorn-452135");
|
||||
first.Title.Should().Be("The.Night.Of.S01.BluRay.AAC2.0.x264-DEPTH");
|
||||
first.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
|
||||
first.DownloadUrl.Should().Be("https://passthepopcorn.me/torrents.php?action=download&id=452135&authkey=00000000000000000000000000000000&torrent_pass=00000000000000000000000000000000");
|
||||
first.DownloadUrl.Should().Be("https://passthepopcorn.me/torrents.php?action=download&id=452135");
|
||||
first.InfoUrl.Should().Be("https://passthepopcorn.me/torrents.php?id=148131&torrentid=452135");
|
||||
|
||||
//first.PublishDate.Should().Be(DateTime.Parse("2017-04-17T12:13:42+0000").ToUniversalTime()); stupid timezones
|
||||
|
||||
@@ -121,9 +121,16 @@ namespace NzbDrone.Core.Applications.Lidarr
|
||||
{
|
||||
var indexerCapabilities = GetIndexerCapabilities(indexer);
|
||||
|
||||
if (!indexerCapabilities.MusicSearchAvailable && !indexerCapabilities.SearchAvailable)
|
||||
{
|
||||
_logger.Debug("Skipping add for indexer {0} [{1}] due to missing music or basic search support by the indexer", indexer.Name, indexer.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty())
|
||||
{
|
||||
_logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
|
||||
_logger.Debug("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -178,7 +185,8 @@ namespace NzbDrone.Core.Applications.Lidarr
|
||||
{
|
||||
_logger.Debug("Syncing remote indexer with current settings");
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
if ((indexerCapabilities.MusicSearchAvailable || indexerCapabilities.SearchAvailable) &&
|
||||
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
{
|
||||
// Retain user fields not-affiliated with Prowlarr
|
||||
lidarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => lidarrIndexer.Fields.All(s => s.Name != f.Name)));
|
||||
@@ -204,7 +212,8 @@ namespace NzbDrone.Core.Applications.Lidarr
|
||||
{
|
||||
_appIndexerMapService.Delete(indexerMapping.Id);
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
if ((indexerCapabilities.MusicSearchAvailable || indexerCapabilities.SearchAvailable) &&
|
||||
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
{
|
||||
_logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Lidarr", indexer.Name, indexer.Id);
|
||||
lidarrIndexer.Id = 0;
|
||||
|
||||
@@ -121,9 +121,16 @@ namespace NzbDrone.Core.Applications.Radarr
|
||||
{
|
||||
var indexerCapabilities = GetIndexerCapabilities(indexer);
|
||||
|
||||
if (!indexerCapabilities.MovieSearchAvailable)
|
||||
{
|
||||
_logger.Debug("Skipping add for indexer {0} [{1}] due to missing movie search support by the indexer", indexer.Name, indexer.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty())
|
||||
{
|
||||
_logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
|
||||
_logger.Debug("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -176,7 +183,7 @@ namespace NzbDrone.Core.Applications.Radarr
|
||||
|
||||
if (!radarrIndexer.Equals(remoteIndexer) || forceSync)
|
||||
{
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
if (indexerCapabilities.MovieSearchAvailable && indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
{
|
||||
// Retain user fields not-affiliated with Prowlarr
|
||||
radarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => radarrIndexer.Fields.All(s => s.Name != f.Name)));
|
||||
@@ -202,7 +209,7 @@ namespace NzbDrone.Core.Applications.Radarr
|
||||
{
|
||||
_appIndexerMapService.Delete(indexerMapping.Id);
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
if (indexerCapabilities.MovieSearchAvailable && indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
{
|
||||
_logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Radarr", indexer.Name, indexer.Id);
|
||||
radarrIndexer.Id = 0;
|
||||
|
||||
@@ -121,9 +121,16 @@ namespace NzbDrone.Core.Applications.Readarr
|
||||
{
|
||||
var indexerCapabilities = GetIndexerCapabilities(indexer);
|
||||
|
||||
if (!indexerCapabilities.BookSearchAvailable && !indexerCapabilities.SearchAvailable)
|
||||
{
|
||||
_logger.Debug("Skipping add for indexer {0} [{1}] due to missing book or basic search support by the indexer", indexer.Name, indexer.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty())
|
||||
{
|
||||
_logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
|
||||
_logger.Debug("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -178,7 +185,8 @@ namespace NzbDrone.Core.Applications.Readarr
|
||||
{
|
||||
_logger.Debug("Syncing remote indexer with current settings");
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
if ((indexerCapabilities.BookSearchAvailable || indexerCapabilities.SearchAvailable) &&
|
||||
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
{
|
||||
// Retain user fields not-affiliated with Prowlarr
|
||||
readarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => readarrIndexer.Fields.All(s => s.Name != f.Name)));
|
||||
@@ -204,7 +212,8 @@ namespace NzbDrone.Core.Applications.Readarr
|
||||
{
|
||||
_appIndexerMapService.Delete(indexerMapping.Id);
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
if ((indexerCapabilities.BookSearchAvailable || indexerCapabilities.SearchAvailable) &&
|
||||
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
|
||||
{
|
||||
_logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Readarr", indexer.Name, indexer.Id);
|
||||
readarrIndexer.Id = 0;
|
||||
|
||||
@@ -125,10 +125,17 @@ namespace NzbDrone.Core.Applications.Sonarr
|
||||
{
|
||||
var indexerCapabilities = GetIndexerCapabilities(indexer);
|
||||
|
||||
if (!indexerCapabilities.TvSearchAvailable)
|
||||
{
|
||||
_logger.Debug("Skipping add for indexer {0} [{1}] due to missing TV search support by the indexer", indexer.Name, indexer.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty() &&
|
||||
indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Empty())
|
||||
{
|
||||
_logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
|
||||
_logger.Debug("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -183,7 +190,7 @@ namespace NzbDrone.Core.Applications.Sonarr
|
||||
{
|
||||
_logger.Debug("Syncing remote indexer with current settings");
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any())
|
||||
if (indexerCapabilities.TvSearchAvailable && (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any()))
|
||||
{
|
||||
// Retain user fields not-affiliated with Prowlarr
|
||||
sonarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => sonarrIndexer.Fields.All(s => s.Name != f.Name)));
|
||||
@@ -210,7 +217,7 @@ namespace NzbDrone.Core.Applications.Sonarr
|
||||
{
|
||||
_appIndexerMapService.Delete(indexerMapping.Id);
|
||||
|
||||
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any())
|
||||
if (indexerCapabilities.TvSearchAvailable && (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any()))
|
||||
{
|
||||
_logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Sonarr", indexer.Name, indexer.Id);
|
||||
sonarrIndexer.Id = 0;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
@@ -15,39 +16,53 @@ namespace NzbDrone.Core.Download
|
||||
{
|
||||
public void Validate(byte[] fileContent)
|
||||
{
|
||||
var reader = new StreamReader(new MemoryStream(fileContent));
|
||||
|
||||
using (var xmlTextReader = XmlReader.Create(reader, new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
|
||||
try
|
||||
{
|
||||
var xDoc = XDocument.Load(xmlTextReader);
|
||||
var nzb = xDoc.Root;
|
||||
var reader = new StreamReader(new MemoryStream(fileContent));
|
||||
|
||||
if (nzb == null)
|
||||
using (var xmlTextReader = XmlReader.Create(reader,
|
||||
new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: No Root element");
|
||||
}
|
||||
var xDoc = XDocument.Load(xmlTextReader);
|
||||
var nzb = xDoc.Root;
|
||||
|
||||
// nZEDb has an bug in their error reporting code spitting out invalid http status codes
|
||||
if (nzb.Name.LocalName.Equals("error") &&
|
||||
nzb.TryGetAttributeValue("code", out var code) &&
|
||||
nzb.TryGetAttributeValue("description", out var description))
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: Contains indexer error: {0} - {1}", code, description);
|
||||
}
|
||||
if (nzb == null)
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: No Root element");
|
||||
}
|
||||
|
||||
if (!nzb.Name.LocalName.Equals("nzb"))
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}'", nzb.Name.LocalName);
|
||||
}
|
||||
// nZEDb has a bug in their error reporting code spitting out invalid http status codes
|
||||
if (nzb.Name.LocalName.Equals("error") &&
|
||||
nzb.TryGetAttributeValue("code", out var code) &&
|
||||
nzb.TryGetAttributeValue("description", out var description))
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: Contains indexer error: {0} - {1}", code, description);
|
||||
}
|
||||
|
||||
var ns = nzb.Name.Namespace;
|
||||
var files = nzb.Elements(ns + "file").ToList();
|
||||
if (!nzb.Name.LocalName.Equals("nzb"))
|
||||
{
|
||||
throw new InvalidNzbException(
|
||||
"Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}'", nzb.Name.LocalName);
|
||||
}
|
||||
|
||||
if (files.Empty())
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: No files");
|
||||
var ns = nzb.Name.Namespace;
|
||||
var files = nzb.Elements(ns + "file").ToList();
|
||||
|
||||
if (files.Empty())
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: No files");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InvalidNzbException)
|
||||
{
|
||||
// Throw the original exception
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: Unable to parse", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,6 +255,11 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
throw new IndexerException(indexerResponse, $"Unexpected response status {indexerHttpResponse.StatusCode} code from indexer request");
|
||||
}
|
||||
|
||||
if (indexerHttpResponse.Headers.ContentType.Contains("text/html"))
|
||||
{
|
||||
throw new IndexerException(indexerResponse, $"Indexer responded with HTML content. {(indexerHttpResponse.Content.ContainsIgnoreCase("site maintenance") ? "Site is under maintenance." : "Site is likely blocked or unavailable.")}");
|
||||
}
|
||||
|
||||
if (!indexerHttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value))
|
||||
{
|
||||
throw new IndexerException(indexerResponse, $"Unexpected response header {indexerHttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}");
|
||||
|
||||
@@ -227,7 +227,9 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
|
||||
{
|
||||
if (required)
|
||||
{
|
||||
throw new Exception($"Selector \"{selectorSelector}\" didn't match {parentObj.ToString(Formatting.None)}");
|
||||
var jsonContent = parentObj.ToString(Formatting.None);
|
||||
|
||||
throw new Exception($"Selector \"{selectorSelector}\" didn't match JSON content").WithData("JsonContent", jsonContent[..Math.Min(jsonContent.Length, 5 * 1024)]);
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -260,7 +262,9 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
|
||||
{
|
||||
if (required)
|
||||
{
|
||||
throw new Exception($"None of the case selectors \"{string.Join(",", selector.Case)}\" matched {parentObj.ToString(Formatting.None)}");
|
||||
var jsonContent = parentObj.ToString(Formatting.None);
|
||||
|
||||
throw new Exception($"None of the case selectors \"{string.Join(",", selector.Case)}\" matched JSON content").WithData("JsonContent", jsonContent[..Math.Min(jsonContent.Length, 5 * 1024)]);
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -739,7 +743,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
|
||||
case "hexdump":
|
||||
// this is mainly for debugging invisible special char related issues
|
||||
var hexData = string.Join("", data.Select(c => c + "(" + ((int)c).ToString("X2") + ")"));
|
||||
_logger.Debug(string.Format("CardigannIndexer ({0}): strdump: {1}", _definition.Id, hexData));
|
||||
_logger.Debug("CardigannIndexer ({0}): strdump: {1}", _definition.Id, hexData);
|
||||
break;
|
||||
case "strdump":
|
||||
// for debugging
|
||||
@@ -915,7 +919,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
|
||||
|
||||
break;
|
||||
default:
|
||||
_logger.Error(string.Format("CardigannIndexer ({0}): Unsupported selector: {1}", _definition.Id, rowSelector));
|
||||
_logger.Error("CardigannIndexer ({0}): Unsupported selector: {1}", _definition.Id, rowSelector);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,7 +226,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
|
||||
{
|
||||
results = ApplyFilters(results, search.Preprocessingfilters, variables);
|
||||
searchResultDocument = searchResultParser.ParseDocument(results);
|
||||
_logger.Trace(string.Format("CardigannIndexer ({0}): result after preprocessingfilters: {1}", _definition.Id, results));
|
||||
_logger.Trace("CardigannIndexer ({0}): result after preprocessingfilters: {1}", _definition.Id, results);
|
||||
}
|
||||
|
||||
var rowsSelector = ApplyGoTemplateText(search.Rows.Selector, variables);
|
||||
@@ -241,7 +241,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
|
||||
{
|
||||
results = ApplyFilters(results, search.Preprocessingfilters, variables);
|
||||
searchResultDocument = searchResultParser.ParseDocument(results);
|
||||
_logger.Trace(string.Format("CardigannIndexer ({0}): result after preprocessingfilters: {1}", _definition.Id, results));
|
||||
_logger.Trace("CardigannIndexer ({0}): result after preprocessingfilters: {1}", _definition.Id, results);
|
||||
}
|
||||
|
||||
var rowsSelector = ApplyGoTemplateText(search.Rows.Selector, variables);
|
||||
|
||||
@@ -148,7 +148,8 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
SupportsSearch = SupportsSearch,
|
||||
SupportsRedirect = SupportsRedirect,
|
||||
SupportsPagination = SupportsPagination,
|
||||
Capabilities = caps
|
||||
Capabilities = caps,
|
||||
Redirect = true
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
|
||||
@@ -36,7 +38,19 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
|
||||
public override IParseIndexerResponse GetParser()
|
||||
{
|
||||
return new PassThePopcornParser(Settings);
|
||||
return new PassThePopcornParser(Settings, Capabilities.Categories);
|
||||
}
|
||||
|
||||
protected override Task<HttpRequest> GetDownloadRequest(Uri link)
|
||||
{
|
||||
var requestBuilder = new HttpRequestBuilder(link.AbsoluteUri);
|
||||
|
||||
var request = requestBuilder
|
||||
.SetHeader("ApiUser", Settings.APIUser)
|
||||
.SetHeader("ApiKey", Settings.APIKey)
|
||||
.Build();
|
||||
|
||||
return Task.FromResult(request);
|
||||
}
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
@@ -45,10 +59,6 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
{
|
||||
LimitsDefault = PageSize,
|
||||
LimitsMax = PageSize,
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.ImdbId
|
||||
},
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q, MovieSearchParam.ImdbId
|
||||
|
||||
@@ -5,21 +5,20 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
public class PassThePopcornResponse
|
||||
{
|
||||
public string TotalResults { get; set; }
|
||||
public List<PassThePopcornMovie> Movies { get; set; }
|
||||
public IReadOnlyCollection<PassThePopcornMovie> Movies { get; set; }
|
||||
public string Page { get; set; }
|
||||
public string AuthKey { get; set; }
|
||||
public string PassKey { get; set; }
|
||||
}
|
||||
|
||||
public class PassThePopcornMovie
|
||||
{
|
||||
public string GroupId { get; set; }
|
||||
public string CategoryId { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Year { get; set; }
|
||||
public string Cover { get; set; }
|
||||
public List<string> Tags { get; set; }
|
||||
public IReadOnlyCollection<string> Tags { get; set; }
|
||||
public string ImdbId { get; set; }
|
||||
public List<PassThePopcornTorrent> Torrents { get; set; }
|
||||
public IReadOnlyCollection<PassThePopcornTorrent> Torrents { get; set; }
|
||||
}
|
||||
|
||||
public class PassThePopcornTorrent
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text.RegularExpressions;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Serializer;
|
||||
@@ -14,12 +14,12 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
public class PassThePopcornParser : IParseIndexerResponse
|
||||
{
|
||||
private readonly PassThePopcornSettings _settings;
|
||||
private readonly IndexerCapabilitiesCategories _categories;
|
||||
|
||||
private static Regex SeasonRegex => new (@"\bS\d{2,3}(E\d{2,3})?\b", RegexOptions.Compiled);
|
||||
|
||||
public PassThePopcornParser(PassThePopcornSettings settings)
|
||||
public PassThePopcornParser(PassThePopcornSettings settings, IndexerCapabilitiesCategories categories)
|
||||
{
|
||||
_settings = settings;
|
||||
_categories = categories;
|
||||
}
|
||||
|
||||
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
|
||||
@@ -84,13 +84,6 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
flags.Add(PassThePopcornFlag.Approved);
|
||||
}
|
||||
|
||||
var categories = new List<IndexerCategory> { NewznabStandardCategory.Movies };
|
||||
|
||||
if (title != null && SeasonRegex.Match(title).Success)
|
||||
{
|
||||
categories.Add(NewznabStandardCategory.TV);
|
||||
}
|
||||
|
||||
var uploadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch
|
||||
{
|
||||
"NEUTRAL LEECH" => 0,
|
||||
@@ -103,8 +96,8 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
Title = title,
|
||||
Year = int.Parse(result.Year),
|
||||
InfoUrl = GetInfoUrl(result.GroupId, id),
|
||||
DownloadUrl = GetDownloadUrl(id, jsonResponse.AuthKey, jsonResponse.PassKey),
|
||||
Categories = categories,
|
||||
DownloadUrl = GetDownloadUrl(id),
|
||||
Categories = _categories.MapTrackerCatToNewznab(result.CategoryId),
|
||||
Size = long.Parse(torrent.Size),
|
||||
Grabs = int.Parse(torrent.Snatched),
|
||||
Seeders = int.Parse(torrent.Seeders),
|
||||
@@ -117,7 +110,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
UploadVolumeFactor = uploadVolumeFactor,
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 345600,
|
||||
Genres = result.Tags ?? new List<string>(),
|
||||
Genres = result.Tags?.ToList() ?? new List<string>(),
|
||||
PosterUrl = GetPosterUrl(result.Cover)
|
||||
});
|
||||
}
|
||||
@@ -128,14 +121,12 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
|
||||
private string GetDownloadUrl(int torrentId, string authKey, string passKey)
|
||||
private string GetDownloadUrl(int torrentId)
|
||||
{
|
||||
var url = new HttpUri(_settings.BaseUrl)
|
||||
.CombinePath("/torrents.php")
|
||||
.AddQueryParam("action", "download")
|
||||
.AddQueryParam("id", torrentId)
|
||||
.AddQueryParam("authkey", authKey)
|
||||
.AddQueryParam("torrent_pass", passKey);
|
||||
.AddQueryParam("id", torrentId);
|
||||
|
||||
return url.FullUri;
|
||||
}
|
||||
|
||||
@@ -78,6 +78,8 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
{ "action", "advanced" },
|
||||
{ "json", "noredirect" },
|
||||
{ "grouping", "0" },
|
||||
{ "order_by", "time" },
|
||||
{ "order_way", "desc" },
|
||||
{ "searchstr", searchTerm }
|
||||
};
|
||||
|
||||
|
||||
@@ -18,6 +18,12 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
{
|
||||
private static readonly PassThePopcornSettingsValidator Validator = new ();
|
||||
|
||||
public PassThePopcornSettings()
|
||||
{
|
||||
BaseSettings.QueryLimit = 150;
|
||||
BaseSettings.LimitsUnit = (int)IndexerLimitsUnit.Hour;
|
||||
}
|
||||
|
||||
[FieldDefinition(2, Label = "IndexerSettingsApiUser", HelpText = "IndexerPassThePopcornSettingsApiUserHelpText", Privacy = PrivacyLevel.UserName)]
|
||||
public string APIUser { get; set; }
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ namespace NzbDrone.Core.Indexers
|
||||
}
|
||||
else if (settings.BaseUrl.IsNotNullOrWhiteSpace() && LegacyUrls.Contains(settings.BaseUrl))
|
||||
{
|
||||
_logger.Debug(string.Format("Changing legacy site link from {0} to {1}", settings.BaseUrl, defaultLink));
|
||||
_logger.Debug("Changing legacy site link from {0} to {1}", settings.BaseUrl, defaultLink);
|
||||
settings.BaseUrl = defaultLink;
|
||||
}
|
||||
|
||||
|
||||
@@ -362,11 +362,11 @@
|
||||
"Theme": "Tema",
|
||||
"Track": "Pista",
|
||||
"Year": "Any",
|
||||
"UpdateAvailableHealthCheckMessage": "Nova actualització disponible",
|
||||
"UpdateAvailableHealthCheckMessage": "Nova actualització disponible: {version}",
|
||||
"ConnectionLostReconnect": "{appName} intentarà connectar-se automàticament, o podeu fer clic a recarregar.",
|
||||
"ConnectionLostToBackend": "{appName} ha perdut la connexió amb el backend i s'haurà de tornar a carregar per a restaurar la funcionalitat.",
|
||||
"RecentChanges": "Canvis recents",
|
||||
"WhatsNew": "Novetats",
|
||||
"WhatsNew": "Què hi ha de nou?",
|
||||
"minutes": "minuts",
|
||||
"DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de l'aplicació '{name}'?",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Notificacions no disponibles a causa d'errors: {notificationNames}",
|
||||
@@ -496,7 +496,7 @@
|
||||
"Logout": "Tanca la sessió",
|
||||
"NoEventsFound": "No s'han trobat esdeveniments",
|
||||
"RestartReloadNote": "Nota: {appName} es reiniciarà i tornarà a carregar automàticament la interfície d'usuari durant el procés de restauració.",
|
||||
"TheLogLevelDefault": "El nivell de registre per defecte és \"Info\" i es pot canviar a [Configuració general](/configuració/general)",
|
||||
"TheLogLevelDefault": "El nivell de registre per defecte és \"Debug\" i es pot canviar a [Configuració general](/settings/general)",
|
||||
"UpdateAppDirectlyLoadError": "No es pot actualitzar {appName} directament,",
|
||||
"WouldYouLikeToRestoreBackup": "Voleu restaurar la còpia de seguretat '{name}'?",
|
||||
"InstallLatest": "Instal·la l'últim",
|
||||
@@ -740,5 +740,72 @@
|
||||
"SelectedCountOfCountReleases": "S'han seleccionat {selectedCount} de les versions {itemCount}",
|
||||
"SettingsLogRotate": "Rotació del registre",
|
||||
"AreYouSureYouWantToDeleteCategory": "Esteu segur que voleu suprimir la categoria assignada?",
|
||||
"Book": "Llibre"
|
||||
"Book": "Llibre",
|
||||
"IndexerSettingsCookie": "Cookie",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "ID d'aplicació indicat en crear accés a l'API de Freebox (ex: 'app_id')",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Nom d'amfitrió o adreça IP de l'amfitrió del Freebox, per defecte a '{url}' (només funcionarà si es troba a la mateixa xarxa)",
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "Port utilitzat per accedir a la interfície Freebox, per defecte a '{port}'",
|
||||
"DownloadClientRTorrentSettingsUrlPath": "Camí de l'Url",
|
||||
"IndexerHDBitsSettingsMediumsHelpText": "Si no s'especifica, s'utilitzen totes les opcions.",
|
||||
"NotificationsEmailSettingsUseEncryptionHelpText": "Si s'ha de preferir l'ús de l'encriptatge si es configura al servidor, per utilitzar sempre l'encriptatge mitjançant SSL (només Port 465) o StartTLS (qualsevol altre port) o per no utilitzar mai l'encriptatge",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Primer i últim",
|
||||
"DownloadClientFloodSettingsTagsHelpText": "Etiquetes inicials d'una baixada. Per ser reconegut, una baixada ha de tenir totes les etiquetes inicials. Això evita conflictes amb baixades no relacionades.",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrder": "Ordre seqüencial",
|
||||
"DownloadClientSettingsUseSslHelpText": "Usa una connexió segura quan es connecti a {clientName}",
|
||||
"InstallMajorVersionUpdate": "Instal·la l'actualització",
|
||||
"InstallMajorVersionUpdateMessageLink": "Si us plau, comproveu [{domain}]({url}) per a més informació.",
|
||||
"OverrideGrabModalTitle": "Sobreescriu i Captura - {title}",
|
||||
"SecretToken": "Testimoni secret",
|
||||
"TorrentBlackholeSaveMagnetFilesExtension": "Desa l'extensió dels fitxers magnètics",
|
||||
"FailedToFetchSettings": "No s'ha pogut recuperar la configuració",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Defineix l'URL base de l'API de Freebox amb la versió de l'API, p. ex. '{url}', per defecte a '{defaultApiUrl}'",
|
||||
"IndexerSettingsSeedTime": "Temps de la llavor",
|
||||
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Carpeta compartida opcional per posar les baixades, deixeu en blanc per utilitzar la ubicació predeterminada de l'estació de baixada",
|
||||
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Aquesta carpeta haurà de ser accessible des de XBMC",
|
||||
"DownloadClientPneumaticSettingsStrmFolder": "Carpeta Strm",
|
||||
"DownloadClientSettingsDestinationHelpText": "Especifica manualment la destinació de la baixada, deixeu-ho en blanc per a utilitzar el predeterminat",
|
||||
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Afegeix un prefix a l'URL rpc de {clientName}, ex. {url}, per defecte a ‘{defaultUrl}’",
|
||||
"IndexerSettingsApiPathHelpText": "Camí a l'api, normalment {url}",
|
||||
"LogSizeLimitHelpText": "Mida màxima del fitxer de registre en MB abans d'arxivar. Per defecte és 1MB.",
|
||||
"IndexerNewznabSettingsAdditionalParametersHelpText": "Paràmetres addicionals de Newznab",
|
||||
"InstallMajorVersionUpdateMessage": "Aquesta actualització instal·larà una nova versió principal i pot no ser compatible amb el vostre sistema. Esteu segur que voleu instal·lar aquesta actualització?",
|
||||
"PackageVersionInfo": "{packageVersion} per {packageAuthor}",
|
||||
"UpdaterLogFiles": "Fitxers de registre de l'actualitzador",
|
||||
"NotificationsEmailSettingsUseEncryption": "Utilitza l'encriptatge",
|
||||
"NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalment prefixa el títol del missatge amb {appName} per diferenciar les notificacions de diferents aplicacions",
|
||||
"DownloadClientSettingsInitialState": "Estat inicial",
|
||||
"DownloadClientSettingsInitialStateHelpText": "Estat inicial dels torrents afegits a {clientName}",
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "Aquests paràmetres es troben a la configuració de seguretat de PassThePopcorn (Edita el perfil > Seguretat).",
|
||||
"DownloadClientRTorrentSettingsUrlPathHelpText": "Camí al extrem XMLRPC, vegeu {url}. Normalment és RPC2 o [camí a ruTorrent]{url2} quan s'utilitza ruTorrent.",
|
||||
"IndexerSettingsApiPath": "Camí de l'API",
|
||||
"IndexerHDBitsSettingsCodecsHelpText": "Si no s'especifica, s'utilitzen totes les opcions.",
|
||||
"IndexerSettingsApiUser": "Usuari de l'API",
|
||||
"IndexerSettingsSeedTimeHelpText": "El temps en què s'ha de sembrar un torrent abans d'aturar-lo, el buit utilitza el valor per defecte del client de baixada",
|
||||
"IndexerSettingsSeedRatio": "Ràtio de la llavor",
|
||||
"IndexerSettingsSeedRatioHelpText": "Ràtio a la qual ha d'arribar un torrent abans d'aturar-se, buit utilitza el valor per defecte del client de baixada. La relació ha de ser com a mínim 1.0 i seguir les regles dels indexadors",
|
||||
"IndexerSettingsAdditionalParameters": "Paràmetres addicionals",
|
||||
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Afegeix les propietats dels suports com a etiquetes. Els consells són exemples.",
|
||||
"DownloadClientFloodSettingsUrlBaseHelpText": "Afegeix un prefix a l'API de Flood, com ara {url}",
|
||||
"DownloadClientFreeboxSettingsAppToken": "Testimoni d'aplicació",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "Aquesta opció requereix com a mínim la versió 16.0 de NzbGet",
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "Carpeta Nzb",
|
||||
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Els fitxers .strm d'aquesta carpeta s'importaran amb el dron",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Baixeu primer i primer les últimes peces (qBittorrent 4.1.0+)",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Baixada en ordre seqüencial (qBittorrent 4.1.0+)",
|
||||
"LabelIsRequired": "L'etiqueta és necessària",
|
||||
"NotificationsTelegramSettingsIncludeAppName": "Inclou {appName} al títol",
|
||||
"TorrentBlackholeSaveMagnetFiles": "Desa els fitxers Magnet",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extensió a utilitzar per als enllaços magnet, per defecte és '.magnet'",
|
||||
"TorrentBlackholeSaveMagnetFilesHelpText": "Desa l'enllaç magnet si no hi ha cap fitxer .torrent disponible (només útil si el client de baixada admet magnets desats a un fitxer)",
|
||||
"TorrentBlackholeTorrentFolder": "Carpeta torrent",
|
||||
"UseSsl": "Usa SSL",
|
||||
"UsenetBlackholeNzbFolder": "Carpeta Nzb",
|
||||
"XmlRpcPath": "Camí RPC XML",
|
||||
"DownloadClientRTorrentSettingsAddStopped": "Afegeix aturat",
|
||||
"DownloadClientRTorrentSettingsAddStoppedHelpText": "En activar s'afegiran torrents i imants a rTorrent en un estat aturat. Això pot trencar els fitxers magnet.",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "S'ha recuperat el testimoni de l'aplicació en crear l'accés a l'API de Freebox (ex: 'app_token')",
|
||||
"DownloadClientUTorrentProviderMessage": "uTorrent té un historial d'inclusió de criptominers, programari maliciós i anuncis, us animem a triar un client diferent.",
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Estat inicial dels torrents afegits a qBittorrent. Tingueu en compte que els torrents forçats no compleixen amb les restriccions de llavors",
|
||||
"LogSizeLimit": "Límit de la mida del registre",
|
||||
"SelectDownloadClientModalTitle": "{modalTitle} - Seleccioneu el client de baixada"
|
||||
}
|
||||
|
||||
@@ -296,7 +296,7 @@
|
||||
"Title": "Titul",
|
||||
"Today": "Dnes",
|
||||
"Tomorrow": "Zítra",
|
||||
"Torrent": "Torrenty",
|
||||
"Torrent": "Torrent",
|
||||
"Torrents": "Torrenty",
|
||||
"Type": "Typ",
|
||||
"UI": "UI",
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
"ElapsedTime": "Vergangene Zeit",
|
||||
"Enable": "Aktivieren",
|
||||
"EnableAutomaticSearch": "Automatische Suche einschalten",
|
||||
"EnableAutomaticSearchHelpText": "Wird verwendet, wenn die automatische Suche über die Benutzeroberfläche oder durch {appName} durchgeführt wird.",
|
||||
"EnableAutomaticSearchHelpText": "Wird verwendet, wenn die automatische Suche über die Benutzeroberfläche oder durch {appName} durchgeführt wird",
|
||||
"EnableIndexer": "Indexer aktivieren",
|
||||
"EnableInteractiveSearch": "Interaktive Suche einschalten",
|
||||
"EnableInteractiveSearchHelpText": "Wird verwendet, wenn die interaktive Suche verwendet wird",
|
||||
@@ -179,7 +179,7 @@
|
||||
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Alle Indexer sind aufgrund von Fehlern länger als 6 Stunden nicht verfügbar",
|
||||
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexer sind aufgrund von Fehlern länger als 6 Stunden nicht verfügbar: {indexerNames}",
|
||||
"IndexerName": "Indexer-Name",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Indexer haben keine Definition und werden nicht funktionieren: {indexerNames}. Bitte entferne und (oder) füge diese neu zu {appName} hinzu",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Indexer haben keine Definition und werden nicht funktionieren: {indexerNames}. Bitte entferne und (oder) füge diese neu zu {appName} hinzu.",
|
||||
"IndexerObsoleteCheckMessage": "Indexer sind nicht mehr verfügbar oder wurden aktualiiert: {0}. Bitte enfernen und (oder) neu zu {appName} hinzufügen",
|
||||
"IndexerPriority": "Indexer-Priorität",
|
||||
"IndexerPriorityHelpText": "Indexer Priorität von 1 (höchste) bis 50 (niedrigste). Standard: 25.",
|
||||
@@ -496,7 +496,7 @@
|
||||
"RecentChanges": "Kürzliche Änderungen",
|
||||
"WhatsNew": "Was ist neu?",
|
||||
"minutes": "Minuten",
|
||||
"DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?",
|
||||
"DeleteAppProfileMessageText": "Qualitätsprofil '{name}' wirklich löschen?",
|
||||
"AddConnection": "Verbindung hinzufügen",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Alle Benachrichtigungen sind aufgrund von Fehlern nicht verfügbar",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Benachrichtigungen nicht verfügbar wegen Fehlern: {notificationNames}",
|
||||
@@ -563,7 +563,7 @@
|
||||
"IndexerBeyondHDSettingsSearchTypes": "Suchtyp",
|
||||
"DownloadClientFloodSettingsUrlBaseHelpText": "Fügt der Flood-API ein Präfix hinzu, z. B. {url}",
|
||||
"DownloadClientFreeboxSettingsApiUrl": "API-URL",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Definiere die Freebox-API-Basis-URL mit der API-Version, z. B. '{url}', standardmäßig '{defaultApiUrl}'.",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Definiere die Freebox-API-Basis-URL mit der API-Version, z. B. '{url}', standardmäßig '{defaultApiUrl}'",
|
||||
"DownloadClientRTorrentSettingsUrlPathHelpText": "Pfad zum XMLRPC-Endpunkt, siehe {url}. Dies ist normalerweise RPC2 oder [Pfad zu ruTorrent]{url2}, wenn ruTorrent verwendet wird.",
|
||||
"DownloadClientSettingsAddPaused": "Pausiert hinzufügen",
|
||||
"SelectDownloadClientModalTitle": "{modalTitle} – Wähle Download-Client",
|
||||
@@ -596,7 +596,7 @@
|
||||
"TorrentBlackholeTorrentFolder": "Torrent-Ordner",
|
||||
"UseSsl": "SSL verwenden",
|
||||
"UsenetBlackholeNzbFolder": "NZB-Ordner",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Für Magnet-Links zu verwendende Erweiterung, standardmäßig „.magnet“.",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Für Magnet-Links zu verwendende Erweiterung, standardmäßig „.magnet“",
|
||||
"XmlRpcPath": "XML-RPC-Pfad",
|
||||
"ProxyValidationBadRequest": "Proxy konnte nicht getestet werden. StatusCode: {statusCode}",
|
||||
"SecretToken": "Geheimer Token",
|
||||
@@ -612,15 +612,15 @@
|
||||
"BuiltIn": "Eingebaut",
|
||||
"PublishedDate": "Veröffentlichungsdatum",
|
||||
"Redirected": "Umleiten",
|
||||
"AllSearchResultsHiddenByFilter": "Alle Ergebnisse werden durch den angewendeten Filter ausgeblendet",
|
||||
"AllSearchResultsHiddenByFilter": "Alle Ergebnisse werden durch den angewendeten Filter ausgeblendet.",
|
||||
"DockerUpdater": "Aktualisieren Sie den Docker-Container, um das Update zu erhalten",
|
||||
"Download": "Herunterladen",
|
||||
"ErrorRestoringBackup": "Fehler beim Wiederherstellen der Sicherung",
|
||||
"ExternalUpdater": "{appName} ist so konfiguriert, dass es einen externen Aktualisierungsmechanismus verwendet",
|
||||
"NoEventsFound": "Keine Ereignisse gefunden",
|
||||
"RestartReloadNote": "Hinweis: {appName} startet während des Wiederherstellungsvorgangs automatisch neu und lädt die Benutzeroberfläche neu.",
|
||||
"TheLogLevelDefault": "Die Protokollebene ist standardmäßig auf „Info“ eingestellt und kann unter „Allgemeine Einstellungen“ (/settings/general) geändert werden.",
|
||||
"UpdateAppDirectlyLoadError": "{appName} kann nicht direkt aktualisiert werden.",
|
||||
"TheLogLevelDefault": "Die Protokollebene ist standardmäßig auf „Debug“ eingestellt und kann unter „Allgemeine Einstellungen“ (/settings/general) geändert werden",
|
||||
"UpdateAppDirectlyLoadError": "{appName} kann nicht direkt aktualisiert werden,",
|
||||
"UpdaterLogFiles": "Updater-Protokolldateien",
|
||||
"WouldYouLikeToRestoreBackup": "Willst du das Backup '{name}' wiederherstellen?",
|
||||
"AptUpdater": "Verwenden Sie apt, um das Update zu installieren",
|
||||
@@ -658,7 +658,7 @@
|
||||
"IndexerSettingsApiPath": "API-Pfad",
|
||||
"IndexerSettingsApiPathHelpText": "Pfad zur API, normalerweise {url}",
|
||||
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Fügt der {clientName}-rpc-URL ein Präfix hinzu, z. B. {url}, standardmäßig '{defaultUrl}'",
|
||||
"IndexerSettingsSeedRatioHelpText": "Das Verhältnis, das ein Torrent erreichen muss, bevor er gestoppt wird. Leer verwendet das Standardverhältnis des Download-Clients. Das Verhältnis sollte mindestens 1,0 betragen und den Regeln des Indexers folgen.",
|
||||
"IndexerSettingsSeedRatioHelpText": "Das Verhältnis, das ein Torrent erreichen muss, bevor er gestoppt wird. Leer verwendet das Standardverhältnis des Download-Clients. Das Verhältnis sollte mindestens 1,0 betragen und den Regeln des Indexers folgen",
|
||||
"IndexerSettingsSeedTimeHelpText": "Die Zeit, die ein Torrent gesät werden sollte, bevor er gestoppt wird. Leer verwendet die Standardzeit des Download-Clients",
|
||||
"InstallMajorVersionUpdate": "Update installieren",
|
||||
"InstallMajorVersionUpdateMessage": "Dieses Update wird eine neue Hauptversion installieren und ist möglicherweise nicht mit deinem System kompatibel. Bist du sicher, dass du dieses Update installieren möchtest?",
|
||||
@@ -806,5 +806,6 @@
|
||||
"IndexerSettingsBaseUrlHelpText": "Wähle die Basis-Url aus, die {appName} für Anfragen an die Seite verwenden soll",
|
||||
"RepeatSearch": "Suche wiederholen",
|
||||
"AverageResponseTimesMs": "Durchschnittliche Indexer-Antwortzeiten (ms)",
|
||||
"BasicSearch": "Einfache Suche"
|
||||
"BasicSearch": "Einfache Suche",
|
||||
"DownloadClientUTorrentProviderMessage": "uTorrent ist dafür bekannt, dass es Kryptominer, Malware und Werbung enthält. Wir empfehlen dringend einen anderen Client zu wählen."
|
||||
}
|
||||
|
||||
@@ -485,7 +485,7 @@
|
||||
"Theme": "Θέμα",
|
||||
"Track": "Ιχνος",
|
||||
"Year": "Ετος",
|
||||
"UpdateAvailableHealthCheckMessage": "Νέα ενημέρωση είναι διαθέσιμη",
|
||||
"UpdateAvailableHealthCheckMessage": "Νέα ενημέρωση είναι διαθέσιμη: {version}",
|
||||
"Artist": "Καλλιτέχνης",
|
||||
"Author": "Συγγραφέας",
|
||||
"Book": "Βιβλίο",
|
||||
|
||||
@@ -724,7 +724,7 @@
|
||||
"TestAllApps": "Test All Apps",
|
||||
"TestAllClients": "Test All Clients",
|
||||
"TestAllIndexers": "Test All Indexers",
|
||||
"TheLogLevelDefault": "The log level defaults to 'Info' and can be changed in [General Settings](/settings/general)",
|
||||
"TheLogLevelDefault": "The log level defaults to 'Debug' and can be changed in [General Settings](/settings/general)",
|
||||
"Theme": "Theme",
|
||||
"ThemeHelpText": "Change Application UI Theme, 'Auto' Theme will use your OS Theme to set Light or Dark mode. Inspired by {inspiredBy}.",
|
||||
"Time": "Time",
|
||||
|
||||
@@ -710,7 +710,7 @@
|
||||
"Logout": "Kirjaudu ulos",
|
||||
"NoEventsFound": "Tapahtumia ei löytynyt",
|
||||
"RestartReloadNote": "Huomioi: {appName} käynnistyy palautusprosessin aikana automaattisesti uudelleen.",
|
||||
"TheLogLevelDefault": "Lokikirjauksen oletusarvoinen laajuus on \"Informatiivinen\". Laajuutta voidaan muuttaa [Yleisistä asetuksista](/settings/general).",
|
||||
"TheLogLevelDefault": "Lokikirjauksen oletusarvoinen laajuus on \"Vianselvitys\". Laajuutta voidaan muuttaa [Yleisistä asetuksista](/settings/general).",
|
||||
"UpdateAppDirectlyLoadError": "{appName}ia ei voida päivittää suoraan,",
|
||||
"UpdaterLogFiles": "Päivittäjän lokitiedostot",
|
||||
"WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion \"{name}\"?",
|
||||
@@ -806,5 +806,6 @@
|
||||
"IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Etsi vain ns. kultaisella pocornilla merkittyjä julkaisuja.",
|
||||
"IndexerSettingsFreeleechOnly": "Vain \"Freeleech\"",
|
||||
"IndexerSettingsCookieHelpText": "Jos sivusto vaatii kirjautumisevästeen, on se noudettava selaimen avulla.",
|
||||
"IndexerAvistazSettingsPasswordHelpText": "Sivuston salasana"
|
||||
"IndexerAvistazSettingsPasswordHelpText": "Sivuston salasana",
|
||||
"DownloadClientUTorrentProviderMessage": "Koska uTorrent on tullut tunnetuksi kryptolouhinnasta sekä haitta- ja mainossisällöstä, suosittelemme valitsemaan jonkin muun työkalun."
|
||||
}
|
||||
|
||||
@@ -481,7 +481,7 @@
|
||||
"Genre": "Műfajok",
|
||||
"Theme": "Téma",
|
||||
"Track": "Dal",
|
||||
"UpdateAvailableHealthCheckMessage": "Új frissítés elérhető",
|
||||
"UpdateAvailableHealthCheckMessage": "Új frissítés elérhető: {version}",
|
||||
"Year": "Év",
|
||||
"Book": "Könyv",
|
||||
"Season": "Évad",
|
||||
|
||||
@@ -482,7 +482,7 @@
|
||||
"More": "Altro",
|
||||
"Season": "Stagione",
|
||||
"Year": "Anno",
|
||||
"UpdateAvailableHealthCheckMessage": "Nuovo aggiornamento disponibile",
|
||||
"UpdateAvailableHealthCheckMessage": "Nuovo aggiornamento disponibile: {version}",
|
||||
"Author": "Autore",
|
||||
"ApplyChanges": "Applica Cambiamenti",
|
||||
"ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {length} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione",
|
||||
|
||||
@@ -161,5 +161,6 @@
|
||||
"Discord": "Discord",
|
||||
"AddCustomFilter": "Legg til eget filter",
|
||||
"Clone": "Lukk",
|
||||
"AddDownloadClientImplementation": "Ny Nedlastingsklient - {implementationName}"
|
||||
"AddDownloadClientImplementation": "Ny Nedlastingsklient - {implementationName}",
|
||||
"History": "Historikk"
|
||||
}
|
||||
|
||||
@@ -438,7 +438,7 @@
|
||||
"DownloadClientPriorityHelpText": "Geef prioriteit aan meerdere downloaders. Round-Robin wordt gebruikt voor downloaders met dezelfde prioriteit.",
|
||||
"Genre": "Genres",
|
||||
"Year": "Jaar",
|
||||
"UpdateAvailableHealthCheckMessage": "Nieuwe update is beschikbaar",
|
||||
"UpdateAvailableHealthCheckMessage": "Nieuwe update is beschikbaar: {version}",
|
||||
"Label": "Label",
|
||||
"Publisher": "Uitgever",
|
||||
"ApplyChanges": "Pas Wijzigingen Toe",
|
||||
|
||||
@@ -357,7 +357,7 @@
|
||||
"DeleteSelectedIndexersMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?",
|
||||
"DownloadClientPriorityHelpText": "Nadaj priorytet wielu klientom pobierania. W przypadku klientów o tym samym priorytecie używane jest działanie okrężne.",
|
||||
"Track": "Ślad",
|
||||
"UpdateAvailableHealthCheckMessage": "Dostępna jest aktualizacja",
|
||||
"UpdateAvailableHealthCheckMessage": "Dostępna jest aktualizacja: {version}",
|
||||
"Genre": "Gatunki",
|
||||
"ApplyChanges": "Zastosuj zmiany",
|
||||
"ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {length} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny",
|
||||
|
||||
@@ -431,7 +431,7 @@
|
||||
"Season": "Temporada",
|
||||
"Theme": "Tema",
|
||||
"Track": "Rastreio",
|
||||
"UpdateAvailableHealthCheckMessage": "Nova atualização disponível",
|
||||
"UpdateAvailableHealthCheckMessage": "Nova atualização disponível: {version}",
|
||||
"Label": "Rótulo",
|
||||
"ConnectionLostReconnect": "O {appName} tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.",
|
||||
"ConnectionLostToBackend": "O {appName} perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.",
|
||||
@@ -503,5 +503,10 @@
|
||||
"UpdateAppDirectlyLoadError": "Não foi possível atualizar o {appName} diretamente,",
|
||||
"InstallLatest": "Instalar o mais recente",
|
||||
"CurrentlyInstalled": "Atualmente instalado",
|
||||
"Mixed": "Corrigido"
|
||||
"Mixed": "Corrigido",
|
||||
"FailedToFetchSettings": "Falha ao obter as definições",
|
||||
"FailedToFetchUpdates": "Falha a obter atualizações",
|
||||
"External": "Externo",
|
||||
"Categories": "Categorias",
|
||||
"days": "dias"
|
||||
}
|
||||
|
||||
@@ -794,7 +794,7 @@
|
||||
"LogFilesLocation": "Os arquivos de log estão localizados em: {location}",
|
||||
"Logout": "Sair",
|
||||
"NoEventsFound": "Nenhum evento encontrado",
|
||||
"TheLogLevelDefault": "O nível de registro é padronizado como 'Info' e pode ser alterado em [Configurações Gerais](/settings/general)",
|
||||
"TheLogLevelDefault": "O nível de log padrão é ' Debug ' e pode ser alterado em [ Configurações gerais](/ configurações/geral)",
|
||||
"UpdateAppDirectlyLoadError": "Incapaz de atualizar o {appName} diretamente,",
|
||||
"UpdaterLogFiles": "Arquivos de log do atualizador",
|
||||
"WouldYouLikeToRestoreBackup": "Gostaria de restaurar o backup '{name}'?",
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
"LogFilesLocation": "Log kayıtlarının bulunduğu konum: {location}",
|
||||
"NoEventsFound": "Etkinlik bulunamadı",
|
||||
"RestartReloadNote": "Not: {appName} geri yükleme işlemi sırasında otomatik olarak yeniden başlatılacak ve kullanıcı arayüzünü yeniden yükleyecektir.",
|
||||
"TheLogLevelDefault": "Log seviyesi varsayılan olarak 'Bilgi' şeklindedir ve [Genel Ayarlar](/ayarlar/genel) bölümünden değiştirilebilir",
|
||||
"TheLogLevelDefault": "Günlük düzeyi varsayılan olarak 'Hata Ayıklama'dır ve [Genel Ayarlar](/ayarlar/genel) bölümünden değiştirilebilir",
|
||||
"UpdateAppDirectlyLoadError": "{appName} doğrudan güncellenemiyor,",
|
||||
"DockerUpdater": "Güncellemeyi almak için docker konteynerini güncelleyin",
|
||||
"FailedToFetchUpdates": "Güncellemeler alınamadı",
|
||||
|
||||
@@ -353,7 +353,7 @@
|
||||
"More": "Більше",
|
||||
"Track": "Трасувати",
|
||||
"Year": "Рік",
|
||||
"UpdateAvailableHealthCheckMessage": "Доступне нове оновлення",
|
||||
"UpdateAvailableHealthCheckMessage": "Доступне нове оновлення: {version}",
|
||||
"Genre": "Жанри",
|
||||
"ConnectionLostReconnect": "{appName} спробує підключитися автоматично, або ви можете натиснути «Перезавантажити» нижче.",
|
||||
"ConnectionLostToBackend": "{appName} втратив з’єднання з серверною частиною, і його потрібно перезавантажити, щоб відновити роботу.",
|
||||
@@ -449,5 +449,103 @@
|
||||
"Author": "Автор",
|
||||
"OnHealthRestoredHelpText": "При відновленні стану",
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "Якщо не вказано, використовуються всі параметри.",
|
||||
"days": "дні(в)"
|
||||
"days": "дні(в)",
|
||||
"XmlRpcPath": "Шлях XML RPC",
|
||||
"Directory": "Тека",
|
||||
"DownloadClientFreeboxSettingsAppId": "ID додатку",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Перше і останнє спочатку",
|
||||
"FailedToFetchUpdates": "Не вдалося завантажити оновлення",
|
||||
"OverrideGrabModalTitle": "Перевизначити та захопити - {title}",
|
||||
"UpdaterLogFiles": "Файли журналу оновлення",
|
||||
"UseSsl": "Використовувати SSL",
|
||||
"WouldYouLikeToRestoreBackup": "Бажаєте відновити резервну копію '{name}'?",
|
||||
"DownloadClientSettingsInitialState": "Початковий стан",
|
||||
"Install": "Встановити",
|
||||
"InstallMajorVersionUpdateMessage": "Це оновлення встановить нову основну версію і може бути несумісним з вашою системою. Ви впевнені, що хочете встановити це оновлення?",
|
||||
"Logout": "Завершити сеанс",
|
||||
"NoDownloadClientsFound": "Клієнти завантаження не знайдено",
|
||||
"PackageVersionInfo": "{packageVersion} створено {packageAuthor}",
|
||||
"SecretToken": "Таємний токен",
|
||||
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Додає властивості мультимедіа у вигляді тегів. Підказки є прикладами.",
|
||||
"DownloadClientRTorrentSettingsUrlPathHelpText": "Шлях до кінцевої точки XMLRPC див. {url}. Зазвичай це RPC2 або [шлях до ruTorrent]{url2}, коли використовується ruTorrent.",
|
||||
"DownloadClientSettingsAddPaused": "Додати призупинені",
|
||||
"FailedToFetchSettings": "Не вдалося отримати налаштування",
|
||||
"IndexerNewznabSettingsAdditionalParametersHelpText": "Додаткові параметри Newznab",
|
||||
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Ця тека повинна бути доступна з XBMC",
|
||||
"DownloadClientPneumaticSettingsStrmFolder": "Тека STRM",
|
||||
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Файли .strm у цій теці будуть імпортовані дроном",
|
||||
"InfoUrl": "URL-адреса інформації",
|
||||
"DownloadClientUTorrentProviderMessage": "uTorrent має історію включення криптомайнерів, шкідливого програмного забезпечення та реклами. Ми наполегливо рекомендуємо вибрати інший клієнт.",
|
||||
"EditSelectedDownloadClients": "Редагувати вибрані клієнти завантаження",
|
||||
"IndexerHDBitsSettingsMediumsHelpText": "Якщо не вказано, використовуються всі параметри.",
|
||||
"IndexerSettingsAdditionalParameters": "Додаткові параметри",
|
||||
"IndexerSettingsCookie": "Cookie",
|
||||
"InstallMajorVersionUpdateMessageLink": "Будь ласка, перевірте [{domain}]({url}) для отримання додаткової інформації.",
|
||||
"InvalidUILanguage": "У вашому інтерфейсі встановлена недопустима мова. Виправте її та збережіть налаштування",
|
||||
"LogFilesLocation": "Файли журналу знаходяться в: {location}",
|
||||
"Menu": "Меню",
|
||||
"OnHealthRestored": "При відновленні стану",
|
||||
"PasswordConfirmation": "Підтвердження пароля",
|
||||
"PreviouslyInstalled": "Раніше встановлений",
|
||||
"LogSizeLimit": "Обмеження розміру журналу",
|
||||
"LogSizeLimitHelpText": "Максимальний розмір файлу журналу в МБ перед архівацією. За замовчуванням - 1 МБ.",
|
||||
"SelectDownloadClientModalTitle": "{modalTitle} - Вибрати клієнт завантаження",
|
||||
"IndexerSettingsApiPath": "Шлях API",
|
||||
"IndexerSettingsApiPathHelpText": "Шлях до API, зазвичай {url}",
|
||||
"IndexerSettingsApiUser": "API Користувач",
|
||||
"Implementation": "Реалізація",
|
||||
"ManageDownloadClients": "Керування клієнтами завантаження",
|
||||
"No": "Ні",
|
||||
"IndexerSettingsSeedRatioHelpText": "Рейтинг, якого має досягти торрент перед зупинкою. Якщо порожньо — використовується значення за замовчуванням клієнта завантаження. Рейтинг має бути не менше 1,0 і відповідати правилам індексаторів",
|
||||
"IndexerSettingsSeedTimeHelpText": "Час, протягом якого торрент має залишатися на роздачі перед зупинкою, якщо порожньо — використовується значення клієнта завантаження за замовчуванням",
|
||||
"NotificationsTelegramSettingsIncludeAppName": "Включити {appName} у заголовок",
|
||||
"NotificationsTelegramSettingsIncludeAppNameHelpText": "При необхідності додати до заголовка повідомлення префікс {appName}, щоб відрізняти сповіщення від різних додатків",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Макет контента",
|
||||
"External": "Зовнішній",
|
||||
"TorrentBlackholeTorrentFolder": "Тека торрента",
|
||||
"Donate": "Задонатити",
|
||||
"EditSelectedIndexers": "Редагувати вибраний індексатор",
|
||||
"IndexerSettingsSeedTime": "Час сидіння",
|
||||
"Label": "Мітка",
|
||||
"LabelIsRequired": "Необхідна мітка",
|
||||
"UsenetBlackholeNzbFolder": "Тека NZB",
|
||||
"NoHistoryFound": "Історія не знайдена",
|
||||
"NoIndexersFound": "Индексаторі не знайдено",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "Для роботи цього параметра потрібна версія NzbGet не нижче 16.0",
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "Тека NZB",
|
||||
"IndexerHDBitsSettingsCodecsHelpText": "Якщо не вказано, використовуються всі параметри.",
|
||||
"DefaultNameCopiedProfile": "{name} - Копіювати",
|
||||
"Destination": "Місце призначення",
|
||||
"DownloadClientFloodSettingsTagsHelpText": "Початкові теги завантаження. Щоб бути розпізнаним, завантаження повинно мати всі початкові теги. Це запобігає конфліктам з незв'язаними завантаженнями.",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "ID програми, отримане під час створення доступу до Freebox API (наприклад, 'app_id')",
|
||||
"DownloadClientFreeboxSettingsAppToken": "Токен додатку",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "Токен додатку, отриманий під час створення доступу до Freebox API (наприклад, 'app_token')",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Ім'я хоста або IP-адреса хоста Freebox, за замовчуванням — '{url}' (працює тільки якщо знаходиться в тій самій мережі)",
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "Порт, що використовується для доступу до інтерфейсу Freebox, за замовчуванням — '{port}'",
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Початковий стан торрентів, доданих до qBittorrent. Зверніть увагу, що примусові торренти не дотримуються обмежень на роздачу",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrder": "Завантажувати послідовно",
|
||||
"DownloadClientRTorrentSettingsAddStopped": "Додати зупинені",
|
||||
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Увімкнення додасть торренти та магнет-посилання в rTorrent у зупиненому стані. Це може призвести до пошкодження магнет-файлів.",
|
||||
"DownloadClientRTorrentSettingsUrlPath": "URL-путь",
|
||||
"NotificationsEmailSettingsUseEncryptionHelpText": "Виберіть режим шифрування: віддавати перевагу шифруванню, якщо воно налаштоване на сервері; завжди використовувати шифрування через SSL (тільки порт 465) або StartTLS (будь-який інший порт); ніколи не використовувати шифрування",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Вкажіть базову URL-адресу Freebox API з версією API, наприклад, '{url}', за замовчуванням — '{defaultApiUrl}'",
|
||||
"DownloadClientSettingsDestinationHelpText": "Ручне налаштування місця для завантаження, залиште порожнім для використання значення за замовчуванням",
|
||||
"DownloadClientSettingsUseSslHelpText": "Використовувати захищене з'єднання при підключенні до {clientName}",
|
||||
"HealthMessagesInfoBox": "Додаткову інформацію про причину появи цих повідомлень перевірки працездатності можна знайти, перейшовши за посиланням wiki (іконка книги) в кінці рядка або перевірити [журнали]({link}). Якщо у вас виникли труднощі з розумінням цих повідомлень, ви можете звернутися до нашої служби підтримки за посиланнями нижче.",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Індексатори з недопустимими клієнтами завантаження: {indexerNames}.",
|
||||
"Episode": "Епізод",
|
||||
"InstallMajorVersionUpdate": "Встановити оновлення",
|
||||
"ManageClients": "Керування клієнтами",
|
||||
"PrioritySettings": "Пріоритет: {0}",
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "Ці налаштування можна знайти в налаштуваннях безпеки вашого PassThePopcorn (Редагувати профіль > Безпека).",
|
||||
"NotificationsEmailSettingsUseEncryption": "Використовувати шифрування",
|
||||
"TorrentBlackholeSaveMagnetFiles": "Зберігати магнітні файли",
|
||||
"TorrentBlackholeSaveMagnetFilesExtension": "Зберегти магнет-файли з розширенням",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Розширення для магнет-посилань, за замовчуванням '.magnet'",
|
||||
"TorrentBlackholeSaveMagnetFilesHelpText": "Зберегти магнет-посилання, якщо файл .torrent недоступний (корисно тільки в разі, якщо клієнт завантаження підтримує магнет-посилання, збережені у файлі)",
|
||||
"DownloadClientDelugeSettingsUrlBaseHelpText": "Додає префікс до URL-адреси json, {url}",
|
||||
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Додає префікс до URL-адреси RPC {clientName}, наприклад {url}, за замовчуванням — '{defaultUrl}'",
|
||||
"IndexerSettingsSeedRatio": "Коефіцієнт роздачі",
|
||||
"ManualGrab": "Захват вручну",
|
||||
"StopSelecting": "Скасувати вибір"
|
||||
}
|
||||
|
||||
@@ -464,7 +464,7 @@
|
||||
"UnsavedChanges": "未保存更改",
|
||||
"UnselectAll": "取消全选",
|
||||
"UpdateAutomaticallyHelpText": "自动下载并安装更新。您还可以在「“系统”->“更新”」中安装",
|
||||
"UpdateAvailableHealthCheckMessage": "有新的更新可用",
|
||||
"UpdateAvailableHealthCheckMessage": "有新的更新可用: {version}",
|
||||
"UpdateStartupNotWritableHealthCheckMessage": "无法安装更新,因为用户“{userName}”对于启动文件夹“{startupFolder}”没有写入权限。",
|
||||
"UpdateStartupTranslocationHealthCheckMessage": "无法安装更新,因为启动文件夹“{0}”在一个应用程序迁移文件夹。Cannot install update because startup folder '{startupFolder}' is in an App Translocation folder.",
|
||||
"UpdateUiNotWritableHealthCheckMessage": "无法安装升级,因为用户“{userName}”不可写入界面文件夹“{uiFolder}”。",
|
||||
|
||||
@@ -3,5 +3,7 @@
|
||||
"Add": "添加",
|
||||
"Analytics": "分析",
|
||||
"Username": "用户名",
|
||||
"AcceptConfirmationModal": "中文"
|
||||
"AcceptConfirmationModal": "中文",
|
||||
"Backup": "备份",
|
||||
"BackupNow": "立即备份"
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ namespace NzbDrone.Core.Notifications.Apprise
|
||||
{
|
||||
if (httpException.Response.StatusCode == HttpStatusCode.Unauthorized)
|
||||
{
|
||||
_logger.Error(ex, $"HTTP Auth credentials are invalid: {0}", ex.Message);
|
||||
_logger.Error(ex, "HTTP Auth credentials are invalid: {0}", ex.Message);
|
||||
return new ValidationFailure("AuthUsername", $"HTTP Auth credentials are invalid: {ex.Message}");
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ namespace NzbDrone.Core.Notifications.Apprise
|
||||
{
|
||||
var error = Json.Deserialize<AppriseError>(httpException.Response.Content);
|
||||
|
||||
_logger.Error(ex, $"Unable to send test message. Response from API: {0}", error.Error);
|
||||
_logger.Error(ex, "Unable to send test message. Response from API: {0}", error.Error);
|
||||
return new ValidationFailure(string.Empty, $"Unable to send test message. Response from API: {error.Error}");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user