mirror of
https://github.com/Readarr/Readarr.git
synced 2026-03-12 15:29:59 -04:00
Compare commits
1 Commits
v0.4.9.273
...
sonarr-pul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e739a93a2a |
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '0.4.9'
|
||||
majorVersion: '0.4.6'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
readarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
|
||||
@@ -1102,19 +1102,19 @@ stages:
|
||||
vmImage: ${{ variables.windowsImage }}
|
||||
steps:
|
||||
- checkout: self # Need history for Sonar analysis
|
||||
- task: SonarCloudPrepare@3
|
||||
- task: SonarCloudPrepare@2
|
||||
env:
|
||||
SONAR_SCANNER_OPTS: ''
|
||||
inputs:
|
||||
SonarCloud: 'SonarCloud'
|
||||
organization: 'readarr'
|
||||
scannerMode: 'cli'
|
||||
scannerMode: 'CLI'
|
||||
configMode: 'manual'
|
||||
cliProjectKey: 'readarrui'
|
||||
cliProjectName: 'ReadarrUI'
|
||||
cliProjectVersion: '$(readarrVersion)'
|
||||
cliSources: './frontend'
|
||||
- task: SonarCloudAnalyze@3
|
||||
- task: SonarCloudAnalyze@2
|
||||
|
||||
- job: Api_Docs
|
||||
displayName: API Docs
|
||||
@@ -1190,12 +1190,12 @@ stages:
|
||||
submodules: true
|
||||
- powershell: Set-Service SCardSvr -StartupType Manual
|
||||
displayName: Enable Windows Test Service
|
||||
- task: SonarCloudPrepare@3
|
||||
- task: SonarCloudPrepare@2
|
||||
condition: eq(variables['System.PullRequest.IsFork'], 'False')
|
||||
inputs:
|
||||
SonarCloud: 'SonarCloud'
|
||||
organization: 'readarr'
|
||||
scannerMode: 'dotnet'
|
||||
scannerMode: 'MSBuild'
|
||||
projectKey: 'Readarr_Readarr'
|
||||
projectName: 'Readarr'
|
||||
projectVersion: '$(readarrVersion)'
|
||||
@@ -1208,7 +1208,7 @@ stages:
|
||||
./build.sh --backend -f net6.0 -r win-x64
|
||||
TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage
|
||||
displayName: Coverage Unit Tests
|
||||
- task: SonarCloudAnalyze@3
|
||||
- task: SonarCloudAnalyze@2
|
||||
condition: eq(variables['System.PullRequest.IsFork'], 'False')
|
||||
displayName: Publish SonarCloud Results
|
||||
- task: reportgenerator@5.3.11
|
||||
|
||||
@@ -182,7 +182,7 @@ module.exports = (env) => {
|
||||
loose: true,
|
||||
debug: false,
|
||||
useBuiltIns: 'entry',
|
||||
corejs: '3.39'
|
||||
corejs: 3
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
@@ -8,6 +8,7 @@ window.console.debug = window.console.debug || function() {};
|
||||
window.console.warn = window.console.warn || function() {};
|
||||
window.console.assert = window.console.assert || function() {};
|
||||
|
||||
// TODO: Remove in v5, well suppoprted in browsers
|
||||
if (!String.prototype.startsWith) {
|
||||
Object.defineProperty(String.prototype, 'startsWith', {
|
||||
enumerable: false,
|
||||
@@ -20,6 +21,7 @@ if (!String.prototype.startsWith) {
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: Remove in v5, well suppoprted in browsers
|
||||
if (!String.prototype.endsWith) {
|
||||
Object.defineProperty(String.prototype, 'endsWith', {
|
||||
enumerable: false,
|
||||
@@ -34,8 +36,14 @@ if (!String.prototype.endsWith) {
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: Remove in v5, use `includes` instead
|
||||
if (!('contains' in String.prototype)) {
|
||||
String.prototype.contains = function(str, startIndex) {
|
||||
return String.prototype.indexOf.call(this, str, startIndex) !== -1;
|
||||
};
|
||||
}
|
||||
|
||||
// For Firefox ESR 115 support
|
||||
if (!Object.groupBy) {
|
||||
import('core-js/actual/object/group-by');
|
||||
}
|
||||
|
||||
22
package.json
22
package.json
@@ -25,10 +25,10 @@
|
||||
"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.6.0",
|
||||
"@fortawesome/fontawesome-svg-core": "6.6.0",
|
||||
"@fortawesome/free-regular-svg-icons": "6.6.0",
|
||||
"@fortawesome/free-solid-svg-icons": "6.6.0",
|
||||
"@fortawesome/react-fontawesome": "0.2.2",
|
||||
"@microsoft/signalr": "6.0.25",
|
||||
"@sentry/browser": "7.119.1",
|
||||
@@ -86,13 +86,13 @@
|
||||
"typescript": "5.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.26.0",
|
||||
"@babel/eslint-parser": "7.25.9",
|
||||
"@babel/plugin-proposal-export-default-from": "7.25.9",
|
||||
"@babel/core": "7.25.8",
|
||||
"@babel/eslint-parser": "7.25.8",
|
||||
"@babel/plugin-proposal-export-default-from": "7.25.8",
|
||||
"@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.25.8",
|
||||
"@babel/preset-react": "7.25.7",
|
||||
"@babel/preset-typescript": "7.25.7",
|
||||
"@types/lodash": "4.14.195",
|
||||
"@types/react-lazyload": "3.2.3",
|
||||
"@types/redux-actions": "2.6.5",
|
||||
@@ -102,7 +102,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.38.1",
|
||||
"css-loader": "6.8.1",
|
||||
"css-modules-typescript-loader": "4.0.1",
|
||||
"eslint": "8.57.1",
|
||||
|
||||
@@ -99,35 +99,6 @@
|
||||
<RootNamespace Condition="'$(ReadarrProject)'=='true'">$(MSBuildProjectName.Replace('Readarr','NzbDrone'))</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TestProject)'!='true'">
|
||||
<!-- Annotates .NET assemblies with repository information including SHA -->
|
||||
<!-- Sentry uses this to link directly to GitHub at the exact version/file/line -->
|
||||
<!-- This is built-in on .NET 8 and can be removed once the project is updated -->
|
||||
<PackageReference Include="Microsoft.SourceLink.GitHub" />
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Sentry specific configuration: Only in Release mode -->
|
||||
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||
<!-- https://docs.sentry.io/platforms/dotnet/configuration/msbuild/ -->
|
||||
<!-- OrgSlug, ProjectSlug and AuthToken are required.
|
||||
They can be set below, via argument to 'msbuild -p:' or environment variable -->
|
||||
<SentryOrg></SentryOrg>
|
||||
<SentryProject></SentryProject>
|
||||
<SentryUrl></SentryUrl> <!-- If empty, assumed to be sentry.io -->
|
||||
<SentryAuthToken></SentryAuthToken> <!-- Use env var instead: SENTRY_AUTH_TOKEN -->
|
||||
|
||||
<!-- Upload PDBs to Sentry, enabling stack traces with line numbers and file paths
|
||||
without the need to deploy the application with PDBs -->
|
||||
<SentryUploadSymbols>true</SentryUploadSymbols>
|
||||
|
||||
<!-- Source Link settings -->
|
||||
<!-- https://github.com/dotnet/sourcelink/blob/main/docs/README.md#publishrepositoryurl -->
|
||||
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||
<!-- Embeds all source code in the respective PDB. This can make it a bit bigger but since it'll be uploaded
|
||||
to Sentry and not distributed to run on the server, it helps debug crashes while making releases smaller -->
|
||||
<EmbedAllSources>true</EmbedAllSources>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Standard testing packages -->
|
||||
<ItemGroup Condition="'$(TestProject)'=='true'">
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" />
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
|
||||
<PackageVersion Include="Equ" Version="2.3.0" />
|
||||
<PackageVersion Include="FluentAssertions" Version="5.10.3" />
|
||||
<PackageVersion Include="Polly" Version="8.5.1" />
|
||||
<PackageVersion Include="Polly" Version="8.5.0" />
|
||||
<PackageVersion Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" />
|
||||
<PackageVersion Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" />
|
||||
<PackageVersion Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
|
||||
@@ -17,16 +17,14 @@
|
||||
<PackageVersion Include="Ical.Net" Version="4.3.1" />
|
||||
<PackageVersion Include="ImpromptuInterface" Version="7.0.1" />
|
||||
<PackageVersion Include="LazyCache" Version="2.4.0" />
|
||||
<PackageVersion Include="Mailkit" Version="4.8.0" />
|
||||
<PackageVersion Include="Mailkit" Version="3.6.0" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.35" />
|
||||
<PackageVersion Include="Microsoft.Data.SqlClient" Version="2.1.7" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.2" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
|
||||
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
|
||||
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
||||
<PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr22" />
|
||||
<PackageVersion Include="Moq" Version="4.17.2" />
|
||||
@@ -45,19 +43,19 @@
|
||||
<PackageVersion Include="RestSharp" Version="106.15.0" />
|
||||
<PackageVersion Include="Selenium.Support" Version="3.141.0" />
|
||||
<PackageVersion Include="Selenium.WebDriver.ChromeDriver" Version="91.0.4472.10100" />
|
||||
<PackageVersion Include="Sentry" Version="4.0.2" />
|
||||
<PackageVersion Include="Sentry" Version="3.31.0" />
|
||||
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
|
||||
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.6" />
|
||||
<PackageVersion Include="StyleCop.Analyzers" Version="1.1.118" />
|
||||
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.6.2" />
|
||||
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
|
||||
<PackageVersion Include="System.Buffers" Version="4.6.0" />
|
||||
<PackageVersion Include="System.Buffers" Version="4.5.1" />
|
||||
<PackageVersion Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
|
||||
<PackageVersion Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
<PackageVersion Include="System.IO.Abstractions.TestingHelpers" Version="17.0.24" />
|
||||
<PackageVersion Include="System.IO.Abstractions" Version="17.0.24" />
|
||||
<PackageVersion Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
|
||||
<PackageVersion Include="System.Memory" Version="4.6.0" />
|
||||
<PackageVersion Include="System.Memory" Version="4.5.5" />
|
||||
<PackageVersion Include="System.Reflection.TypeExtensions" Version="4.7.0" />
|
||||
<PackageVersion Include="System.Resources.Extensions" Version="6.0.0" />
|
||||
<PackageVersion Include="System.Runtime.Loader" Version="4.3.0" />
|
||||
|
||||
@@ -4,7 +4,6 @@ using System.Linq;
|
||||
using FluentAssertions;
|
||||
using NLog;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Instrumentation.Sentry;
|
||||
using NzbDrone.Test.Common;
|
||||
|
||||
@@ -28,7 +27,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
_subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111", Mocker.GetMock<IAppFolderInfo>().Object);
|
||||
_subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111");
|
||||
}
|
||||
|
||||
private LogEventInfo GivenLogEvent(LogLevel level, Exception ex, string message)
|
||||
|
||||
@@ -42,18 +42,17 @@ namespace NzbDrone.Common
|
||||
|
||||
public void CreateZip(string path, IEnumerable<string> files)
|
||||
{
|
||||
_logger.Debug("Creating archive {0}", path);
|
||||
|
||||
using var zipFile = ZipFile.Create(path);
|
||||
|
||||
zipFile.BeginUpdate();
|
||||
|
||||
foreach (var file in files)
|
||||
using (var zipFile = ZipFile.Create(path))
|
||||
{
|
||||
zipFile.Add(file, Path.GetFileName(file));
|
||||
}
|
||||
zipFile.BeginUpdate();
|
||||
|
||||
zipFile.CommitUpdate();
|
||||
foreach (var file in files)
|
||||
{
|
||||
zipFile.Add(file, Path.GetFileName(file));
|
||||
}
|
||||
|
||||
zipFile.CommitUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
private void ExtractZip(string compressedFile, string destination)
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
RegisterDebugger();
|
||||
}
|
||||
|
||||
RegisterSentry(updateApp, appFolderInfo);
|
||||
RegisterSentry(updateApp);
|
||||
|
||||
if (updateApp)
|
||||
{
|
||||
@@ -62,7 +62,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
LogManager.ReconfigExistingLoggers();
|
||||
}
|
||||
|
||||
private static void RegisterSentry(bool updateClient, IAppFolderInfo appFolderInfo)
|
||||
private static void RegisterSentry(bool updateClient)
|
||||
{
|
||||
string dsn;
|
||||
|
||||
@@ -77,7 +77,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
: "https://31e00a6c63ea42c8b5fe70358526a30d@sentry.servarr.com/4";
|
||||
}
|
||||
|
||||
var target = new SentryTarget(dsn, appFolderInfo)
|
||||
var target = new SentryTarget(dsn)
|
||||
{
|
||||
Name = "sentryTarget",
|
||||
Layout = "${message}"
|
||||
|
||||
@@ -9,7 +9,6 @@ using NLog;
|
||||
using NLog.Common;
|
||||
using NLog.Targets;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using Sentry;
|
||||
|
||||
namespace NzbDrone.Common.Instrumentation.Sentry
|
||||
@@ -100,7 +99,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
|
||||
public bool FilterEvents { get; set; }
|
||||
public bool SentryEnabled { get; set; }
|
||||
|
||||
public SentryTarget(string dsn, IAppFolderInfo appFolderInfo)
|
||||
public SentryTarget(string dsn)
|
||||
{
|
||||
_sdk = SentrySdk.Init(o =>
|
||||
{
|
||||
@@ -108,33 +107,9 @@ namespace NzbDrone.Common.Instrumentation.Sentry
|
||||
o.AttachStacktrace = true;
|
||||
o.MaxBreadcrumbs = 200;
|
||||
o.Release = $"{BuildInfo.AppName}@{BuildInfo.Release}";
|
||||
o.SetBeforeSend(x => SentryCleanser.CleanseEvent(x));
|
||||
o.SetBeforeBreadcrumb(x => SentryCleanser.CleanseBreadcrumb(x));
|
||||
o.BeforeSend = x => SentryCleanser.CleanseEvent(x);
|
||||
o.BeforeBreadcrumb = x => SentryCleanser.CleanseBreadcrumb(x);
|
||||
o.Environment = BuildInfo.Branch;
|
||||
|
||||
// Crash free run statistics (sends a ping for healthy and for crashes sessions)
|
||||
o.AutoSessionTracking = false;
|
||||
|
||||
// Caches files in the event device is offline
|
||||
// Sentry creates a 'sentry' sub directory, no need to concat here
|
||||
o.CacheDirectoryPath = appFolderInfo.GetAppDataPath();
|
||||
|
||||
// default environment is production
|
||||
if (!RuntimeInfo.IsProduction)
|
||||
{
|
||||
if (RuntimeInfo.IsDevelopment)
|
||||
{
|
||||
o.Environment = "development";
|
||||
}
|
||||
else if (RuntimeInfo.IsTesting)
|
||||
{
|
||||
o.Environment = "testing";
|
||||
}
|
||||
else
|
||||
{
|
||||
o.Environment = "other";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
InitializeScope();
|
||||
@@ -152,7 +127,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
|
||||
{
|
||||
SentrySdk.ConfigureScope(scope =>
|
||||
{
|
||||
scope.User = new SentryUser
|
||||
scope.User = new User
|
||||
{
|
||||
Id = HashUtil.AnonymousToken()
|
||||
};
|
||||
@@ -194,7 +169,9 @@ namespace NzbDrone.Common.Instrumentation.Sentry
|
||||
|
||||
private void OnError(Exception ex)
|
||||
{
|
||||
if (ex is WebException webException)
|
||||
var webException = ex as WebException;
|
||||
|
||||
if (webException != null)
|
||||
{
|
||||
var response = webException.Response as HttpWebResponse;
|
||||
var statusCode = response?.StatusCode;
|
||||
@@ -313,21 +290,13 @@ namespace NzbDrone.Common.Instrumentation.Sentry
|
||||
}
|
||||
}
|
||||
|
||||
var level = LoggingLevelMap[logEvent.Level];
|
||||
var sentryEvent = new SentryEvent(logEvent.Exception)
|
||||
{
|
||||
Level = level,
|
||||
Level = LoggingLevelMap[logEvent.Level],
|
||||
Logger = logEvent.LoggerName,
|
||||
Message = logEvent.FormattedMessage
|
||||
};
|
||||
|
||||
if (level is SentryLevel.Fatal && logEvent.Exception is not null)
|
||||
{
|
||||
// Usages of 'fatal' here indicates the process will crash. In Sentry this is represented with
|
||||
// the 'unhandled' exception flag
|
||||
logEvent.Exception.SetSentryMechanism("Logger.Fatal", "Logger.Fatal was called", false);
|
||||
}
|
||||
|
||||
sentryEvent.SetExtras(extras);
|
||||
sentryEvent.SetFingerprint(fingerPrint);
|
||||
|
||||
|
||||
@@ -711,30 +711,6 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[TestCase("pausedUP")]
|
||||
[TestCase("stoppedUP")]
|
||||
public void should_be_removable_and_should_allow_move_files_if_max_ratio_reached_after_rounding_and_paused(string state)
|
||||
{
|
||||
GivenGlobalSeedLimits(1.0f);
|
||||
GivenCompletedTorrent(state, ratio: 1.1006066990976857f);
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeTrue();
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[TestCase("pausedUP")]
|
||||
[TestCase("stoppedUP")]
|
||||
public void should_be_removable_and_should_allow_move_files_if_just_under_max_ratio_reached_after_rounding_and_paused(string state)
|
||||
{
|
||||
GivenGlobalSeedLimits(1.0f);
|
||||
GivenCompletedTorrent(state, ratio: 0.9999f);
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeTrue();
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[TestCase("pausedUP")]
|
||||
[TestCase("stoppedUP")]
|
||||
public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused(string state)
|
||||
@@ -747,30 +723,6 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[TestCase("pausedUP")]
|
||||
[TestCase("stoppedUP")]
|
||||
public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_after_rounding_and_paused(string state)
|
||||
{
|
||||
GivenGlobalSeedLimits(2.0f);
|
||||
GivenCompletedTorrent(state, ratio: 1.1006066990976857f, ratioLimit: 1.1f);
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeTrue();
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[TestCase("pausedUP")]
|
||||
[TestCase("stoppedUP")]
|
||||
public void should_be_removable_and_should_allow_move_files_if_just_under_overridden_max_ratio_reached_after_rounding_and_paused(string state)
|
||||
{
|
||||
GivenGlobalSeedLimits(2.0f);
|
||||
GivenCompletedTorrent(state, ratio: 0.9999f, ratioLimit: 1.0f);
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeTrue();
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[TestCase("pausedUP")]
|
||||
[TestCase("stoppedUP")]
|
||||
public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused(string state)
|
||||
|
||||
@@ -66,19 +66,12 @@ namespace NzbDrone.Core.Backup
|
||||
{
|
||||
_logger.ProgressInfo("Starting Backup");
|
||||
|
||||
var backupFolder = GetBackupFolder(backupType);
|
||||
|
||||
_diskProvider.EnsureFolder(_backupTempFolder);
|
||||
_diskProvider.EnsureFolder(backupFolder);
|
||||
|
||||
if (!_diskProvider.FolderWritable(backupFolder))
|
||||
{
|
||||
throw new UnauthorizedAccessException($"Backup folder {backupFolder} is not writable");
|
||||
}
|
||||
_diskProvider.EnsureFolder(GetBackupFolder(backupType));
|
||||
|
||||
var dateNow = DateTime.Now;
|
||||
var backupFilename = $"readarr_backup_v{BuildInfo.Version}_{dateNow:yyyy.MM.dd_HH.mm.ss}.zip";
|
||||
var backupPath = Path.Combine(backupFolder, backupFilename);
|
||||
var backupPath = Path.Combine(GetBackupFolder(backupType), backupFilename);
|
||||
|
||||
Cleanup();
|
||||
|
||||
|
||||
@@ -620,14 +620,14 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
{
|
||||
if (torrent.RatioLimit >= 0)
|
||||
{
|
||||
if (torrent.RatioLimit - torrent.Ratio <= 0.001f)
|
||||
if (torrent.Ratio >= torrent.RatioLimit)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (torrent.RatioLimit == -2 && config.MaxRatioEnabled)
|
||||
{
|
||||
if (config.MaxRatio - torrent.Ratio <= 0.001f)
|
||||
if (Math.Round(torrent.Ratio, 2) >= config.MaxRatio)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ using System.Net;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Serializer;
|
||||
@@ -209,7 +208,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
||||
|
||||
private void AuthenticateClient(HttpRequestBuilder requestBuilder, TransmissionSettings settings, bool reauthenticate = false)
|
||||
{
|
||||
var authKey = $"{requestBuilder.BaseUrl}:{settings.Password}";
|
||||
var authKey = string.Format("{0}:{1}", requestBuilder.BaseUrl, settings.Password);
|
||||
|
||||
var sessionId = _authSessionIDCache.Find(authKey);
|
||||
|
||||
@@ -221,26 +220,24 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
||||
authLoginRequest.SuppressHttpError = true;
|
||||
|
||||
var response = _httpClient.Execute(authLoginRequest);
|
||||
|
||||
switch (response.StatusCode)
|
||||
if (response.StatusCode == HttpStatusCode.MovedPermanently)
|
||||
{
|
||||
case HttpStatusCode.MovedPermanently:
|
||||
var url = response.Headers.GetSingleValue("Location");
|
||||
var url = response.Headers.GetSingleValue("Location");
|
||||
|
||||
throw new DownloadClientException("Remote site redirected to " + url);
|
||||
case HttpStatusCode.Forbidden:
|
||||
throw new DownloadClientException($"Failed to authenticate with Transmission. It may be necessary to add {BuildInfo.AppName}'s IP address to RPC whitelist.");
|
||||
case HttpStatusCode.Conflict:
|
||||
sessionId = response.Headers.GetSingleValue("X-Transmission-Session-Id");
|
||||
throw new DownloadClientException("Remote site redirected to " + url);
|
||||
}
|
||||
else if (response.StatusCode == HttpStatusCode.Conflict)
|
||||
{
|
||||
sessionId = response.Headers.GetSingleValue("X-Transmission-Session-Id");
|
||||
|
||||
if (sessionId == null)
|
||||
{
|
||||
throw new DownloadClientException("Remote host did not return a Session Id.");
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new DownloadClientAuthenticationException("Failed to authenticate with Transmission.");
|
||||
if (sessionId == null)
|
||||
{
|
||||
throw new DownloadClientException("Remote host did not return a Session Id.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new DownloadClientAuthenticationException("Failed to authenticate with Transmission.");
|
||||
}
|
||||
|
||||
_logger.Debug("Transmission authentication succeeded.");
|
||||
|
||||
@@ -13,26 +13,26 @@
|
||||
"60MinutesSixty": "60 minut: {0}",
|
||||
"About": "O aplikaci",
|
||||
"AddListExclusion": "Přidat vyloučení seznamu",
|
||||
"AddingTag": "Přidávání štítku",
|
||||
"AddingTag": "Přidání značky",
|
||||
"AgeWhenGrabbed": "Stáří (kdy bylo získáno)",
|
||||
"AlreadyInYourLibrary": "Již máte ve své knihovně",
|
||||
"AlternateTitles": "Alternativní název",
|
||||
"Analytics": "Analýzy",
|
||||
"AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery {appName}u. To zahrnuje informace o vašem prohlížeči, které stránky {appName} WebUI používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k upřednostnění funkcí a oprav chyb.",
|
||||
"AppDataDirectory": "Adresář AppData",
|
||||
"ApplyTags": "Použít štítky",
|
||||
"ApplyTags": "Použít značky",
|
||||
"Authentication": "Ověřování",
|
||||
"AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k {appName}u",
|
||||
"AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k {appName}",
|
||||
"AuthorClickToChangeBook": "Kliknutím změníte film",
|
||||
"AutoRedownloadFailedHelpText": "Automatické vyhledání a pokus o stažení jiného vydání",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Filmy odstraněné z disku jsou automaticky sledovány v {appName}u",
|
||||
"Automatic": "Automatický",
|
||||
"BackupFolderHelpText": "Relativní cesty budou v adresáři AppData společnosti {appName}",
|
||||
"BackupNow": "Zálohovat nyní",
|
||||
"BackupNow": "Ihned zálohovat",
|
||||
"BackupRetentionHelpText": "Automatické zálohy starší než doba uchovávání budou automaticky vyčištěny",
|
||||
"Backups": "Zálohy",
|
||||
"BindAddress": "Vázat adresu",
|
||||
"BindAddressHelpText": "Platná IP adresa, localhost nebo ‚*‘ pro všechna rozhraní",
|
||||
"BindAddressHelpText": "Platná IP adresa, localhost nebo '*' pro všechna rozhraní",
|
||||
"BindAddressHelpTextWarning": "Vyžaduje restart, aby se projevilo",
|
||||
"BookIsDownloading": "Film se stahuje",
|
||||
"BookIsDownloadingInterp": "Film se stahuje - {0}% {1}",
|
||||
@@ -41,8 +41,8 @@
|
||||
"Calendar": "Kalendář",
|
||||
"CalendarWeekColumnHeaderHelpText": "Zobrazuje se nad každým sloupcem, když je aktivní zobrazení týden",
|
||||
"Cancel": "Zrušit",
|
||||
"CancelPendingTask": "Opravdu chcete zrušit tento úkol čekající na vyřízení?",
|
||||
"CertificateValidation": "Ověřování certifikátu",
|
||||
"CancelPendingTask": "Opravdu chcete zrušit tento nevyřízený úkol?",
|
||||
"CertificateValidation": "Ověření certifikátu",
|
||||
"CertificateValidationHelpText": "Změňte přísnost ověřování certifikátů HTTPS. Neměňte, pokud nerozumíte rizikům.",
|
||||
"ChangeFileDate": "Změnit datum souboru",
|
||||
"ChangeHasNotBeenSavedYet": "Změna ještě nebyla uložena",
|
||||
@@ -51,7 +51,7 @@
|
||||
"ChmodFolderHelpTextWarning": "Funguje to pouze v případě, že je uživatel souboru {appName} vlastníkem souboru. Je lepší zajistit, aby stahovací klient správně nastavil oprávnění.",
|
||||
"ChownGroupHelpText": "Název skupiny nebo gid. Použijte gid pro vzdálené systémy souborů.",
|
||||
"ChownGroupHelpTextWarning": "Funguje to pouze v případě, že je uživatel souboru {appName} vlastníkem souboru. Je lepší zajistit, aby stahovací klient používal stejnou skupinu jako {appName}.",
|
||||
"Clear": "Vymazat",
|
||||
"Clear": "Vyčistit",
|
||||
"ClickToChangeQuality": "Kliknutím změníte kvalitu",
|
||||
"ClientPriority": "Priorita klienta",
|
||||
"CloneIndexer": "Klonovat indexátor",
|
||||
@@ -68,7 +68,7 @@
|
||||
"CutoffHelpText": "Jakmile je této kvality dosaženo, {appName} již nebude stahovat filmy",
|
||||
"CutoffUnmet": "Mezní hodnota nesplněna",
|
||||
"DatabaseMigration": "Migrace databáze",
|
||||
"Dates": "Data",
|
||||
"Dates": "Termíny",
|
||||
"DelayProfile": "Profil zpoždění",
|
||||
"DelayProfiles": "Profily zpoždění",
|
||||
"DelayingDownloadUntilInterp": "Zpoždění stahování do {0} o {1}",
|
||||
@@ -429,8 +429,8 @@
|
||||
"UsenetDelay": "Usenet Zpoždění",
|
||||
"UsenetDelayHelpText": "Zpoždění v minutách čekání před uvolněním z Usenetu",
|
||||
"Username": "Uživatelské jméno",
|
||||
"BranchUpdate": "Větev použitá k aktualizaci {appName}u",
|
||||
"BranchUpdateMechanism": "Větev použitá externím aktualizačním mechanismem",
|
||||
"BranchUpdate": "Pobočka, která se má použít k aktualizaci {appName}",
|
||||
"BranchUpdateMechanism": "Pobočka používaná mechanismem externí aktualizace",
|
||||
"Version": "Verze",
|
||||
"WeekColumnHeader": "Záhlaví sloupce týdne",
|
||||
"Year": "Rok",
|
||||
@@ -593,12 +593,12 @@
|
||||
"NoChange": "Žádná změna",
|
||||
"RemovingTag": "Odebírání značky",
|
||||
"SetTags": "Nastavit značky",
|
||||
"ApplyTagsHelpTextAdd": "Přidat: Přidat štítky do existujícího seznamu štítků",
|
||||
"ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak použít značky na vybrané klienty pro stahování",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané seznamy k importu",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít štítky na vybrané indexery",
|
||||
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané štítky",
|
||||
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit štítky zadanými štítky (prázdné pole vymaže všechny štítky)",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexery",
|
||||
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky",
|
||||
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (prázdné pole vymaže všechny značky)",
|
||||
"DeleteSelectedDownloadClients": "Odstranit klienta pro stahování",
|
||||
"DeleteSelectedIndexersMessageText": "Opravdu chcete smazat {count} vybraný(ch) indexer(ů)?",
|
||||
"Yes": "Ano",
|
||||
@@ -618,9 +618,9 @@
|
||||
"FreeSpace": "Volný prostor",
|
||||
"System": "Systém",
|
||||
"TotalSpace": "Celkový prostor",
|
||||
"ConnectionLost": "Ztráta spojení",
|
||||
"ConnectionLost": "Spojení ztraceno",
|
||||
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
|
||||
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude potřeba ho znovu načíst.",
|
||||
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude třebaho znovu načíst.",
|
||||
"Large": "Velký",
|
||||
"LastDuration": "lastDuration",
|
||||
"Ui": "UI",
|
||||
@@ -630,7 +630,7 @@
|
||||
"NextExecution": "Další spuštění",
|
||||
"ClickToChangeReleaseGroup": "Kliknutím změníte skupinu vydání",
|
||||
"ApplicationURL": "URL aplikace",
|
||||
"ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základu URL",
|
||||
"ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základní adresy URL",
|
||||
"Continuing": "Pokračující",
|
||||
"AutomaticUpdatesDisabledDocker": "Automatické aktualizace nejsou při použití aktualizačního mechanismu Docker přímo podporovány. Obraz kontejneru je nutné aktualizovat mimo {appName} nebo použít skript",
|
||||
"AppUpdated": "{appName} aktualizován",
|
||||
@@ -688,7 +688,7 @@
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "Opětovné stažení z interaktivního vyhledávání selhalo",
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Automaticky vyhledat a pokusit se o stažení jiného vydání, pokud bylo neúspěšné vydání zachyceno z interaktivního vyhledávání",
|
||||
"SelectDropdown": "'Vybrat...",
|
||||
"CustomFilter": "Vlastní filtr",
|
||||
"CustomFilter": "Vlastní filtry",
|
||||
"SelectQuality": "Vyberte kvalitu",
|
||||
"IndexerFlags": "Příznaky indexeru",
|
||||
"InteractiveSearchModalHeader": "Interaktivní vyhledávání",
|
||||
@@ -702,13 +702,13 @@
|
||||
"ConnectionSettingsUrlBaseHelpText": "Přidá předponu do {connectionName} url, jako např. {url}",
|
||||
"AuthBasic": "Základní (vyskakovací okno prohlížeče)",
|
||||
"AuthenticationMethod": "Metoda ověřování",
|
||||
"AuthenticationMethodHelpTextWarning": "Vyberte platnou metodu ověřování",
|
||||
"AuthenticationRequired": "Vyžadováno ověření",
|
||||
"AuthenticationRequiredHelpText": "Změnit, pro které požadavky je vyžadováno ověření. Neměňte, pokud nerozumíte rizikům.",
|
||||
"AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování",
|
||||
"AuthenticationRequired": "Vyžadované ověření",
|
||||
"AuthenticationRequiredHelpText": "Změnit, pro které požadavky je vyžadováno ověření. Pokud nerozumíte rizikům, neměňte je.",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Zadejte nové heslo",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Zadejte nové uživatelské jméno",
|
||||
"AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName}, aby bylo povoleno ověřování. Volitelně můžete zakázat ověřování z místních adres.",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Vložte nové heslo",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno",
|
||||
"AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName} povolení ověření. Ověřování z místních adres můžete volitelně zakázat.",
|
||||
"BlocklistOnlyHint": "Blokovat a nehledat náhradu",
|
||||
"Enabled": "Povoleno",
|
||||
"ApiKey": "Klíč API",
|
||||
@@ -724,7 +724,5 @@
|
||||
"InstallLatest": "Nainstalujte nejnovější",
|
||||
"CurrentlyInstalled": "Aktuálně nainstalováno",
|
||||
"UnmappedFiles": "Nezmapované složky",
|
||||
"AptUpdater": "K instalaci aktualizace používat apt",
|
||||
"Author": "Autor",
|
||||
"Book": "Kniha"
|
||||
"AptUpdater": "K instalaci aktualizace použijte apt"
|
||||
}
|
||||
|
||||
@@ -669,6 +669,5 @@
|
||||
"DockerUpdater": "opdater docker-containeren for at modtage opdateringen",
|
||||
"ExternalUpdater": "{appName} er konfigureret til at bruge en ekstern opdateringsmekanisme",
|
||||
"OnLatestVersion": "Den seneste version af {appName} er allerede installeret",
|
||||
"WouldYouLikeToRestoreBackup": "Vil du gendanne sikkerhedskopien »{name}«?",
|
||||
"MetadataProfile": "metadataprofil"
|
||||
"WouldYouLikeToRestoreBackup": "Vil du gendanne sikkerhedskopien »{name}«?"
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -328,11 +328,11 @@
|
||||
"ShortDateFormat": "Format de date courte",
|
||||
"ShowCutoffUnmetIconHelpText": "Afficher l'icône des fichiers lorsque la limite n'a pas été atteinte",
|
||||
"ShowDateAdded": "Afficher la date d'ajout",
|
||||
"ShowMonitored": "Afficher l'état de surveillance",
|
||||
"ShowMonitoredHelpText": "Affiche l'état de surveillance sous le poster",
|
||||
"ShowMonitored": "Afficher le chemin",
|
||||
"ShowMonitoredHelpText": "Afficher l'état de surveillance sous le poster",
|
||||
"ShowPath": "Afficher le chemin",
|
||||
"ShowQualityProfile": "Afficher le profil de qualité",
|
||||
"ShowQualityProfileHelpText": "Affiche le profil de qualité sous l'affiche",
|
||||
"ShowQualityProfileHelpText": "Afficher le profil de qualité sous l'affiche",
|
||||
"ShowRelativeDates": "Afficher les dates relatives",
|
||||
"ShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/Hier/etc) ou absolues",
|
||||
"ShowSearch": "Afficher la recherche",
|
||||
@@ -456,7 +456,7 @@
|
||||
"ReleaseTitle": "Titre de la version",
|
||||
"ShowBookTitleHelpText": "Affiche le titre du livre sous l'affiche",
|
||||
"ShowReleaseDate": "Afficher la date de sortie",
|
||||
"ShowTitle": "Afficher le titre",
|
||||
"ShowTitle": "Montrer le titre",
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Le dossier '{0}' et son contenu vont être supprimés.",
|
||||
"ReplaceIllegalCharactersHelpText": "Remplacer les caractères illégaux. Si non coché, Readarr les supprimera",
|
||||
"Level": "Niveau",
|
||||
|
||||
@@ -725,7 +725,7 @@
|
||||
"AppUpdated": "{appName} Aggiornato",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Tutti i risultati sono nascosti dal filtro applicato",
|
||||
"AutoRedownloadFailed": "Download fallito",
|
||||
"AddListExclusion": "Aggiungi elenco esclusioni",
|
||||
"AddListExclusion": "Aggiungi Lista esclusioni",
|
||||
"Location": "Posizione",
|
||||
"ListsSettingsSummary": "Liste",
|
||||
"RecentChanges": "Cambiamenti Recenti",
|
||||
|
||||
@@ -643,6 +643,5 @@
|
||||
"ApiKeyValidationHealthCheckMessage": "API 키를 {length}자 이상으로 업데이트하세요. 설정 또는 구성 파일을 통해 이 작업을 수행할 수 있습니다.",
|
||||
"AppUpdated": "{appName} 업데이트",
|
||||
"AppUpdatedVersion": "{appName}이 버전 `{version}`으로 업데이트되었습니다. 최신 변경 사항을 받으려면 {appName}을 다시 로드해야 합니다",
|
||||
"WouldYouLikeToRestoreBackup": "'{name}' 백업을 복원하시겠습니까?",
|
||||
"UseSSL": "SSL 사용"
|
||||
"WouldYouLikeToRestoreBackup": "'{name}' 백업을 복원하시겠습니까?"
|
||||
}
|
||||
|
||||
@@ -676,7 +676,7 @@
|
||||
"Medium": "Средний",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Все уведомления недоступны из-за ошибок",
|
||||
"TotalSpace": "Общее сводное место",
|
||||
"Ui": "Интерфейс",
|
||||
"Ui": "Пользовательский интерфейс",
|
||||
"Backup": "Резервное копирование",
|
||||
"Events": "События",
|
||||
"FreeSpace": "Свободное место",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"AddingTag": "Etiket ekleniyor",
|
||||
"AnalyticsEnabledHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir",
|
||||
"Columns": "Sütunlar",
|
||||
"DeleteIndexer": "İndeksleyiciyi Sil",
|
||||
"DeleteIndexer": "Dizinleyiciyi Sil",
|
||||
"DeleteRootFolderMessageText": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?",
|
||||
"Ended": "Biten",
|
||||
"Group": "Grup",
|
||||
@@ -28,7 +28,7 @@
|
||||
"Authentication": "Doğrulama",
|
||||
"AuthenticationMethodHelpText": "{appName}'e erişmek için Kullanıcı Adı ve Parola gereklidir",
|
||||
"AuthorClickToChangeBook": "Filmi değiştirmek için tıklayın",
|
||||
"AutoRedownloadFailedHelpText": "Farklı bir sürümü otomatik olarak ara ve indirmeyi dene",
|
||||
"AutoRedownloadFailedHelpText": "Otomatik olarak farklı bir Yayın arayın ve indirmeye çalışın",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Diskten silinen filmler otomatik olarak {appName}'da izlenmez",
|
||||
"Automatic": "Otomatik",
|
||||
"BackupFolderHelpText": "Göreli yollar {appName}'ın AppData dizini altında olacaktır",
|
||||
@@ -87,7 +87,7 @@
|
||||
"DeleteImportListExclusion": "İçe Aktarma Listesi Hariç Tutmasını Sil",
|
||||
"DeleteImportListExclusionMessageText": "Bu içe aktarma listesi hariç tutma işlemini silmek istediğinizden emin misiniz?",
|
||||
"DeleteImportListMessageText": "'{name}' listesini silmek istediğinizden emin misiniz?",
|
||||
"DeleteIndexerMessageText": "'{name}' indeksleyicisini silmek istediğinizden emin misiniz?",
|
||||
"DeleteIndexerMessageText": "'{name}' dizinleyicisini silmek istediğinizden emin misiniz?",
|
||||
"DeleteMetadataProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}",
|
||||
"DeleteNotification": "Bildirimi Sil",
|
||||
"DeleteNotificationMessageText": "'{name}' bildirimini silmek istediğinizden emin misiniz?",
|
||||
@@ -112,7 +112,7 @@
|
||||
"DownloadPropersAndRepacksHelpTexts1": "Propers / Repacks'e otomatik olarak yükseltme yapılıp yapılmayacağı",
|
||||
"DownloadWarningCheckDownloadClientForMoreDetails": "İndirme uyarısı: Daha fazla ayrıntı için indirme istemcisini kontrol edin",
|
||||
"Edit": "Düzenle",
|
||||
"Edition": "Versiyon",
|
||||
"Edition": "Baskı",
|
||||
"Enable": "etkinleştirme",
|
||||
"EnableAutomaticAdd": "Otomatik Eklemeyi Etkinleştir",
|
||||
"EnableAutomaticSearch": "Otomatik Aramayı Etkinleştir",
|
||||
@@ -133,7 +133,7 @@
|
||||
"FileNames": "Dosya Adları",
|
||||
"Filename": "Dosya adı",
|
||||
"Files": "Dosyalar",
|
||||
"FirstDayOfWeek": "Haftanın İlk Günü",
|
||||
"FirstDayOfWeek": "Haftanın ilk günü",
|
||||
"Fixed": "Düzeltilen",
|
||||
"Folder": "Klasör",
|
||||
"Folders": "Klasörler",
|
||||
@@ -170,10 +170,10 @@
|
||||
"IncludeHealthWarningsHelpText": "Sağlık Uyarılarını Dahil Et",
|
||||
"IncludeUnknownAuthorItemsHelpText": "Kuyrukta film olmayan öğeleri gösterin. Bu, kaldırılan filmleri veya {appName}'ın kategorisindeki herhangi bir şeyi içerebilir",
|
||||
"IncludeUnmonitored": "Takip Edilmeyenleri Dahil Et",
|
||||
"Indexer": "İndeksleyici",
|
||||
"IndexerPriority": "İndeksleyici Önceliği",
|
||||
"IndexerSettings": "İndeksleyici Ayarları",
|
||||
"Indexers": "İndeksleyiciler",
|
||||
"Indexer": "Dizinleyici",
|
||||
"IndexerPriority": "Dizinleyici Önceliği",
|
||||
"IndexerSettings": "Dizinleyici Ayarları",
|
||||
"Indexers": "Dizinleyiciler",
|
||||
"Interval": "Periyot",
|
||||
"IsCutoffCutoff": "Ayırmak",
|
||||
"IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Bu kalite karşılanana veya aşılana kadar yükseltin",
|
||||
@@ -217,9 +217,9 @@
|
||||
"NoBackupsAreAvailable": "Kullanılabilir yedek yok",
|
||||
"NoLeaveIt": "Hayır, Bırak",
|
||||
"NoLimitForAnyRuntime": "Herhangi bir çalışma zamanı için sınır yok",
|
||||
"NoLogFiles": "Log kayıt dosyası henüz oluşturulmadı",
|
||||
"NoLogFiles": "Log kayıt dosyası henüz yok",
|
||||
"NoMinimumForAnyRuntime": "Herhangi bir çalışma süresi için minimum değer yok",
|
||||
"NoUpdatesAreAvailable": "Güncelleme bulunamadı",
|
||||
"NoUpdatesAreAvailable": "Güncelleme yok",
|
||||
"NotificationTriggers": "Bildirim Tetikleyicileri",
|
||||
"OnGrabHelpText": "Yakalandığında",
|
||||
"OnHealthIssueHelpText": "Sağlık Sorunu Hakkında",
|
||||
@@ -333,8 +333,8 @@
|
||||
"ShowPath": "Yolu Göster",
|
||||
"ShowQualityProfile": "Kalite Profilini Göster",
|
||||
"ShowQualityProfileHelpText": "Poster altında kalite profilini göster",
|
||||
"ShowRelativeDates": "İlgili Tarihleri Göster",
|
||||
"ShowRelativeDatesHelpText": "Göreceli (Bugün/Dün/vb.) veya mutlak tarihleri göster",
|
||||
"ShowRelativeDates": "Göreli Tarihleri Göster",
|
||||
"ShowRelativeDatesHelpText": "Göreli (Bugün / Dün / vb.) Veya mutlak tarihleri göster",
|
||||
"ShowSearch": "Aramayı Göster",
|
||||
"ShowSearchActionHelpText": "Fareyle üzerine gelindiğinde arama düğmesini göster",
|
||||
"ShowSizeOnDisk": "Diskte Boyutu Göster",
|
||||
@@ -354,7 +354,7 @@
|
||||
"StartupDirectory": "Başlangıç Dizini",
|
||||
"Status": "Durum",
|
||||
"StatusEndedEnded": "Bitti",
|
||||
"Style": "Stil",
|
||||
"Style": "Tarz",
|
||||
"SuccessMyWorkIsDoneNoFilesToRename": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.",
|
||||
"SuccessMyWorkIsDoneNoFilesToRetag": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.",
|
||||
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor",
|
||||
@@ -366,7 +366,7 @@
|
||||
"Tasks": "Görevler",
|
||||
"TestAll": "Tümünü Test Et",
|
||||
"TestAllClients": "Tüm İstemcileri Test Et",
|
||||
"TestAllIndexers": "İndeksleyicileri Test Et",
|
||||
"TestAllIndexers": "Dizinleyicileri Test Et",
|
||||
"TestAllLists": "Tüm Listeleri Test Et",
|
||||
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Bu, tüm dizin oluşturucular için geçerli olacaktır, lütfen onlar tarafından belirlenen kurallara uyun",
|
||||
"TimeFormat": "Zaman formatı",
|
||||
@@ -382,7 +382,7 @@
|
||||
"URLBase": "URL Tabanı",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Yeni bir indirme istemcisi eklenemiyor, lütfen tekrar deneyin.",
|
||||
"UnableToAddANewImportListExclusionPleaseTryAgain": "Yeni bir liste dışlaması eklenemiyor, lütfen tekrar deneyin.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Yeni bir indeksleyici eklenemiyor, lütfen tekrar deneyin.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Yeni bir dizinleyici eklenemiyor, lütfen tekrar deneyin.",
|
||||
"UnableToAddANewListPleaseTryAgain": "Yeni bir liste eklenemiyor, lütfen tekrar deneyin.",
|
||||
"UnableToAddANewMetadataProfilePleaseTryAgain": "Yeni bir kaliteli profil eklenemiyor, lütfen tekrar deneyin.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Yeni bir bildirim eklenemiyor, lütfen tekrar deneyin.",
|
||||
@@ -397,7 +397,7 @@
|
||||
"UnableToLoadHistory": "Geçmiş yüklenemiyor",
|
||||
"UnableToLoadImportListExclusions": "Hariç Tutulanlar Listesi yüklenemiyor",
|
||||
"UnableToLoadIndexerOptions": "Dizin oluşturucu seçenekleri yüklenemiyor",
|
||||
"UnableToLoadIndexers": "İndeksleyiciler yüklenemiyor",
|
||||
"UnableToLoadIndexers": "Dizinleyiciler yüklenemiyor",
|
||||
"UnableToLoadLists": "Listeler yüklenemiyor",
|
||||
"UnableToLoadMediaManagementSettings": "Medya Yönetimi ayarları yüklenemiyor",
|
||||
"UnableToLoadMetadata": "Meta Veriler yüklenemiyor",
|
||||
@@ -437,12 +437,12 @@
|
||||
"YesCancel": "Evet İptal",
|
||||
"DownloadClientCheckDownloadingToRoot": "İndirme istemcisi {0}, indirmeleri kök klasöre yerleştirir {1}. Bir kök klasöre indirmemelisiniz.",
|
||||
"NotAvailable": "Müsait değil",
|
||||
"ReleaseTitle": "Yayın Başlığı",
|
||||
"ReleaseTitle": "Yayin Başlığı",
|
||||
"ShowReleaseDate": "Çıkış Tarihini Göster",
|
||||
"ReplaceIllegalCharactersHelpText": "Geçersiz karakterleri değiştirin. İşaretli değilse, {appName} onları kaldıracaktır.",
|
||||
"BookAvailableButMissing": "Film Mevcut, ancak Eksik",
|
||||
"NotMonitored": "Takip Edilmeyen",
|
||||
"OutputPath": "İndirilen Yol",
|
||||
"OutputPath": "Çıkış yolu",
|
||||
"Progress": "İlerleme",
|
||||
"ShowBookTitleHelpText": "Film başlığını posterin altında göster",
|
||||
"ShowTitle": "Başlığı göster",
|
||||
@@ -477,18 +477,18 @@
|
||||
"CreateEmptyAuthorFolders": "Boş film klasörleri oluşturun",
|
||||
"General": "Genel",
|
||||
"GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analizler ve güncellemeler",
|
||||
"ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indeksleyiciler kullanılamıyor",
|
||||
"ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor",
|
||||
"ImportListStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}",
|
||||
"ImportMechanismHealthCheckMessage": "Tamamlanan İndirme İşlemini Etkinleştir",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm indeksleyiciler kullanılamıyor",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm dizinleyiciler kullanılamıyor",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {0}",
|
||||
"IndexerRssHealthCheckNoAvailableIndexers": "Son zamanlardaki indeksleyici hataları nedeniyle tüm rss uyumlu indeksleyiciler geçici olarak kullanılamıyor",
|
||||
"IndexerRssHealthCheckNoAvailableIndexers": "Son zamanlardaki dizinleyici hataları nedeniyle tüm rss uyumlu dizinleyiciler geçici olarak kullanılamıyor",
|
||||
"IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni sürümleri otomatik olarak almayacak",
|
||||
"IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinken indeksleyici yok, {appName} herhangi bir otomatik arama sonucu sağlamayacak",
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Son zamanlardaki indeksleyici hataları nedeniyle tüm arama yeteneğine sahip indeksleyiciler geçici olarak kullanılamıyor",
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Son zamanlardaki dizinleyici hataları nedeniyle tüm arama yeteneğine sahip dizinleyiciler geçici olarak kullanılamıyor",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinken indeksleyici yok, {appName} herhangi bir etkileşimli arama sonucu sağlamayacaktır",
|
||||
"IndexersSettingsSummary": "İndeksleyiciler ve yayımlama kısıtlamaları",
|
||||
"IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indeksleyiciler kullanılamıyor",
|
||||
"IndexersSettingsSummary": "Dizinleyiciler ve yayımlama kısıtlamaları",
|
||||
"IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor",
|
||||
"IndexerStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {0}",
|
||||
"MediaManagement": "Medya Yönetimi",
|
||||
"MissingFromDisk": "{appName} dosyayı diskte bulamadı, bu yüzden kaldırıldı",
|
||||
@@ -595,7 +595,7 @@
|
||||
"ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın",
|
||||
"ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)",
|
||||
"DeleteSelectedDownloadClients": "İndirme İstemcilerini Sil",
|
||||
"DeleteSelectedIndexers": "İndeksleyicileri Sil",
|
||||
"DeleteSelectedIndexers": "Dizinleyicileri Sil",
|
||||
"ExistingTag": "Mevcut etiket",
|
||||
"No": "Hayır",
|
||||
"NoChange": "Değişiklik yok",
|
||||
@@ -652,10 +652,10 @@
|
||||
"ClickToChangeReleaseGroup": "Yayım grubunu değiştirmek için tıklayın",
|
||||
"CloneCondition": "Klon Durumu",
|
||||
"CustomFilter": "Özel Filtre",
|
||||
"AutoRedownloadFailed": "Başarısız İndirmeleri Yenile",
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Etkileşimli aramadan başarısız bir sürüm alındığında otomatik olarak farklı bir sürümü arayın ve indirmeye çalışın",
|
||||
"AutoRedownloadFailed": "Yeniden İndirme Başarısız",
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Başarısız indirmeler, etkileşimli aramada bulunduğunda otomatik olarak farklı bir versiyonu arayın ve indirmeyi deneyin",
|
||||
"ChangeCategoryHint": "İndirme İstemcisi'nden indirme işlemini 'İçe Aktarma Sonrası Kategorisi' olarak değiştirir",
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "Etkileşimli Arama'dan Başarısız İndirmeleri Yenile",
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "Etkileşimli Aramadan Yeniden İndirme Başarısız Oldu",
|
||||
"AutomaticAdd": "Otomatik Ekle",
|
||||
"DeleteCondition": "Koşulu Sil",
|
||||
"DeleteSelectedImportListsMessageText": "Seçilen {count} içe aktarma listesini silmek istediğinizden emin misiniz?",
|
||||
@@ -664,7 +664,7 @@
|
||||
"DeleteSelectedImportLists": "İçe Aktarma Listelerini Sil",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Seçilen {count} indirme istemcisini silmek istediğinizden emin misiniz?",
|
||||
"DeleteRootFolder": "Kök Klasörü Sil",
|
||||
"DeleteSelectedIndexersMessageText": "Seçilen {count} indeksleyiciyi silmek istediğinizden emin misiniz?",
|
||||
"DeleteSelectedIndexersMessageText": "Seçilen {count} dizinleyiciyi silmek istediğinizden emin misiniz?",
|
||||
"DoNotBlocklist": "Engelleme Listesine Eklemeyin",
|
||||
"DoNotBlocklistHint": "Engellenenler listesine eklemeden kaldır",
|
||||
"CustomFormatsSettingsTriggerInfo": "Bir yayına veya dosyaya, seçilen farklı koşul türlerinden en az biriyle eşleştiğinde Özel Format uygulanacaktır.",
|
||||
@@ -678,11 +678,11 @@
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent'in yapılandırılmış içerik düzenini mi, torrentteki orijinal düzeni mi kullanacağınızı yoksa her zaman bir alt klasör oluşturup oluşturmayacağınızı (qBittorrent 4.3.2+)",
|
||||
"EditSelectedImportLists": "Seçilen İçe Aktarma Listelerini Düzenle",
|
||||
"NoImportListsFound": "İçe aktarma listesi bulunamadı",
|
||||
"IndexerDownloadClientHelpText": "Bu indeksleyiciden almak için hangi indirme istemcisinin kullanılacağını belirtin",
|
||||
"IndexerDownloadClientHelpText": "Bu dizinleyiciden almak için hangi indirme istemcisinin kullanılacağını belirtin",
|
||||
"ManageDownloadClients": "İndirme İstemcilerini Yönet",
|
||||
"ManageIndexers": "İndeksleyicileri Yönet",
|
||||
"ManageIndexers": "Dizinleyicileri Yönet",
|
||||
"NoHistoryBlocklist": "Geçmiş engellenenler listesi yok",
|
||||
"NoIndexersFound": "İndeksleyici bulunamadı",
|
||||
"NoIndexersFound": "Dizinleyici bulunamadı",
|
||||
"InstanceName": "Örnek isim",
|
||||
"ListRefreshInterval": "Liste Yenileme Aralığı",
|
||||
"Label": "Etiket",
|
||||
@@ -697,7 +697,7 @@
|
||||
"Implementation": "Uygula",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizinleyiciler: {0}.",
|
||||
"LabelIsRequired": "Etiket gerekli",
|
||||
"EditSelectedIndexers": "Seçili İndeksleyicileri Düzenle",
|
||||
"EditSelectedIndexers": "Seçili Dizinleyicileri Düzenle",
|
||||
"ManageImportLists": "İçe Aktarma Listelerini Yönet",
|
||||
"IgnoreDownload": "İndirmeyi Yoksay",
|
||||
"IgnoreDownloadHint": "{appName}'in bu indirmeyi daha fazla işlemesini durdurur",
|
||||
@@ -710,7 +710,7 @@
|
||||
"RemoveCompleted": "Tamamlananları Kaldır",
|
||||
"RemoveFailedDownloads": "Başarısız İndirmeleri Kaldır",
|
||||
"ResetDefinitions": "Tanımları Sıfırla",
|
||||
"NotificationsPlexSettingsAuthToken": "Kimlik Doğrulama Token'ı",
|
||||
"NotificationsPlexSettingsAuthToken": "Kimlik Doğrulama Jetonu",
|
||||
"NotificationsSettingsUpdateMapPathsFrom": "Harita Yolları",
|
||||
"NotificationsPlexSettingsAuthenticateWithPlexTv": "Plex.tv ile kimlik doğrulaması yapın",
|
||||
"NotificationsSettingsUpdateLibrary": "Kitaplığı Güncelle",
|
||||
@@ -722,8 +722,8 @@
|
||||
"RemoveDownloadsAlert": "Kaldırma ayarları, yukarıdaki tabloda bireysel İndirme İstemcisi ayarlarına taşınmıştır.",
|
||||
"RemoveSelectedItem": "Seçilen Öğeyi Kaldır",
|
||||
"ResetQualityDefinitions": "Kalite Tanımlarını Sıfırla",
|
||||
"SelectIndexerFlags": "İndeksleyici Bayraklarını Seçin",
|
||||
"SetIndexerFlags": "İndeksleyici Bayraklarını Ayarla",
|
||||
"SelectIndexerFlags": "Dizinleyici Bayraklarını Seçin",
|
||||
"SetIndexerFlags": "Dizinleyici Bayraklarını Ayarla",
|
||||
"WouldYouLikeToRestoreBackup": "'{name}' yedeğini geri yüklemek ister misiniz?",
|
||||
"ThereWasAnErrorLoadingThisPage": "Sayfa yüklenirken bir hata oluştu",
|
||||
"Theme": "Tema",
|
||||
@@ -746,8 +746,8 @@
|
||||
"UpdateAvailable": "Yeni güncelleme mevcut",
|
||||
"ThemeHelpText": "Uygulama Kullanıcı Arayüzü Temasını Değiştirin, 'Otomatik' Teması, Açık veya Koyu modu ayarlamak için İşletim Sistemi Temanızı kullanacaktır. Theme.Park'tan ilham alındı",
|
||||
"RemoveQueueItemRemovalMethodHelpTextWarning": "'İndirme İstemcisinden Kaldır', indirme işlemini ve dosyaları indirme istemcisinden kaldıracaktır.",
|
||||
"ClickToChangeIndexerFlags": "İndeksleyici bayraklarını değiştirmek için tıklayın",
|
||||
"IndexerFlags": "İndeksleyici Bayrakları",
|
||||
"ClickToChangeIndexerFlags": "Dizinleyici bayraklarını değiştirmek için tıklayın",
|
||||
"IndexerFlags": "Dizinleyici Bayrakları",
|
||||
"IndexerSettingsSeedRatioHelpText": "Bir torrentin durdurulmadan önce ulaşması gereken oran. Boş bırakılırsa indirme istemcisinin varsayılan değerini kullanır. Oran en az 1,0 olmalı ve indeksleyici kurallarına uygun olmalıdır",
|
||||
"IndexerSettingsSeedTime": "Seed Süresi",
|
||||
"IndexerSettingsSeedRatio": "Seed Oranı",
|
||||
@@ -858,10 +858,5 @@
|
||||
"Other": "Diğer",
|
||||
"Continuing": "Devam Ediyor",
|
||||
"Monitoring": "Takip Durumu",
|
||||
"Book": "Kitap",
|
||||
"LogRotation": "Günlük Döndürme",
|
||||
"FilterSentryEventsHelpText": "Bilinen kullanıcı hatası olaylarının Analitik olarak gönderilmesini filtreleyin",
|
||||
"LogRotateHelpText": "Günlük klasöründe saklanacak maksimum günlük dosyası sayısı",
|
||||
"FilterAnalyticsEvents": "Analitik Olayları Filtrele",
|
||||
"ConsoleLogLevel": "Konsol Günlük Düzeyi"
|
||||
"Book": "Kitap"
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"About": "關於",
|
||||
"Actions": "動作",
|
||||
"Actions": "執行",
|
||||
"All": "全部",
|
||||
"AddingTag": "新增標籤",
|
||||
"Analytics": "分析",
|
||||
"AddList": "加入清單",
|
||||
"AddList": "新增列表",
|
||||
"ExportCustomFormat": "新增自定義格式",
|
||||
"Blocklist": "封鎖清單",
|
||||
"Branch": "分支",
|
||||
@@ -157,19 +157,5 @@
|
||||
"UnableToLoadTags": "無法載入標籤",
|
||||
"UnableToLoadUISettings": "無法載入 UI 設定",
|
||||
"UpdateAppDirectlyLoadError": "無法直接更新 {appName},",
|
||||
"UnableToLoadHistory": "無法載入歷史記錄",
|
||||
"AutoRedownloadFailed": "失敗時重新下載",
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "失敗時重新下載來自手動搜索的資源",
|
||||
"AuthenticationMethodHelpTextWarning": "請選擇一個有效的驗證方式",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "確認新密碼",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "請輸入新密碼",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "請輸入新用戶名",
|
||||
"AuthenticationMethod": "驗證方式",
|
||||
"AuthenticationRequired": "需要驗證",
|
||||
"AuthenticationRequiredHelpText": "更改需要進行驗證的請求。除非你了解其中的風險,否則請勿修改。",
|
||||
"AuthenticationRequiredWarning": "為防止未經認證的遠程訪問,{appName} 現需要啟用身份認證。您可以選擇禁用本地地址的身份認證。",
|
||||
"IgnoredPlaceHolder": "加入新的限制",
|
||||
"RequiredPlaceHolder": "加入新的限制",
|
||||
"RedownloadFailed": "失敗時重新下載",
|
||||
"UnableToAddANewRemotePathMappingPleaseTryAgain": "無法加入新的遠程路徑對應,請重試。"
|
||||
"UnableToLoadHistory": "無法載入歷史記錄"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
<PackageReference Include="Dapper" />
|
||||
<PackageReference Include="Diacritical.Net" />
|
||||
<PackageReference Include="LazyCache" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" />
|
||||
<PackageReference Include="Polly" />
|
||||
<PackageReference Include="System.Text.Json" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" />
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using FluentValidation;
|
||||
using FluentValidation.Validators;
|
||||
using NzbDrone.Common.Extensions;
|
||||
|
||||
namespace NzbDrone.Core.Validation
|
||||
@@ -9,5 +10,10 @@ namespace NzbDrone.Core.Validation
|
||||
{
|
||||
return ruleBuilder.Must(x => x.IsValidIpAddress()).WithMessage("Must contain wildcard (*) or a valid IP Address");
|
||||
}
|
||||
|
||||
public static IRuleBuilderOptions<T, string> NotListenAllIp4Address<T>(this IRuleBuilder<T, string> ruleBuilder)
|
||||
{
|
||||
return ruleBuilder.SetValidator(new RegularExpressionValidator(@"^(?!0\.0\.0\.0)")).WithMessage("Use * instead of 0.0.0.0");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ namespace Readarr.Api.V1.Config
|
||||
|
||||
SharedValidator.RuleFor(c => c.BindAddress)
|
||||
.ValidIpAddress()
|
||||
.NotListenAllIp4Address()
|
||||
.When(c => c.BindAddress != "*" && c.BindAddress != "localhost");
|
||||
|
||||
SharedValidator.RuleFor(c => c.Port).ValidPort();
|
||||
|
||||
Reference in New Issue
Block a user