diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dc667e803..53c0783f8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.35.0' + majorVersion: '1.30.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' @@ -19,7 +19,7 @@ variables: nodeVersion: '20.X' innoVersion: '6.2.2' windowsImage: 'windows-2022' - linuxImage: 'ubuntu-22.04' + linuxImage: 'ubuntu-20.04' macImage: 'macOS-13' trigger: diff --git a/docs.sh b/docs.sh index 38b0e0fbc..ccfde87a7 100755 --- a/docs.sh +++ b/docs.sh @@ -3,16 +3,15 @@ set -e FRAMEWORK="net6.0" PLATFORM=$1 -ARCHITECTURE="${2:-x64}" if [ "$PLATFORM" = "Windows" ]; then - RUNTIME="win-$ARCHITECTURE" + RUNTIME="win-x64" elif [ "$PLATFORM" = "Linux" ]; then - RUNTIME="linux-$ARCHITECTURE" + RUNTIME="linux-x64" elif [ "$PLATFORM" = "Mac" ]; then - RUNTIME="osx-$ARCHITECTURE" + RUNTIME="osx-x64" else - echo "Platform must be provided as first argument: Windows, Linux or Mac" + echo "Platform must be provided as first arguement: Windows, Linux or Mac" exit 1 fi @@ -38,7 +37,7 @@ dotnet clean $slnFile -c Release dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids dotnet new tool-manifest -dotnet tool install --version 7.3.2 Swashbuckle.AspNetCore.Cli +dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v1 & diff --git a/frontend/src/Components/Form/EnhancedSelectInput.js b/frontend/src/Components/Form/EnhancedSelectInput.js index 79b1c999c..732e10f37 100644 --- a/frontend/src/Components/Form/EnhancedSelectInput.js +++ b/frontend/src/Components/Form/EnhancedSelectInput.js @@ -20,8 +20,6 @@ import HintedSelectInputSelectedValue from './HintedSelectInputSelectedValue'; import TextInput from './TextInput'; import styles from './EnhancedSelectInput.css'; -const MINIMUM_DISTANCE_FROM_EDGE = 10; - function isArrowKey(keyCode) { return keyCode === keyCodes.UP_ARROW || keyCode === keyCodes.DOWN_ARROW; } @@ -139,9 +137,18 @@ class EnhancedSelectInput extends Component { // Listeners onComputeMaxHeight = (data) => { + const { + top, + bottom + } = data.offsets.reference; + const windowHeight = window.innerHeight; - data.styles.maxHeight = windowHeight - MINIMUM_DISTANCE_FROM_EDGE; + if ((/^botton/).test(data.placement)) { + data.styles.maxHeight = windowHeight - bottom; + } else { + data.styles.maxHeight = top; + } return data; }; @@ -453,10 +460,6 @@ class EnhancedSelectInput extends Component { order: 851, enabled: true, fn: this.onComputeMaxHeight - }, - preventOverflow: { - enabled: true, - boundariesElement: 'viewport' } }} > diff --git a/frontend/src/Components/Page/Sidebar/PageSidebarItem.css b/frontend/src/Components/Page/Sidebar/PageSidebarItem.css index 409062f97..5e3e3b52c 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebarItem.css +++ b/frontend/src/Components/Page/Sidebar/PageSidebarItem.css @@ -24,7 +24,6 @@ composes: link; padding: 10px 24px; - padding-left: 35px; } .isActiveLink { @@ -42,6 +41,10 @@ text-align: center; } +.noIcon { + margin-left: 25px; +} + .status { float: right; } diff --git a/frontend/src/Components/Page/Sidebar/PageSidebarItem.css.d.ts b/frontend/src/Components/Page/Sidebar/PageSidebarItem.css.d.ts index 5bf0eb815..77e23c767 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebarItem.css.d.ts +++ b/frontend/src/Components/Page/Sidebar/PageSidebarItem.css.d.ts @@ -8,6 +8,7 @@ interface CssExports { 'isActiveParentLink': string; 'item': string; 'link': string; + 'noIcon': string; 'status': string; } export const cssExports: CssExports; diff --git a/frontend/src/Components/Page/Sidebar/PageSidebarItem.js b/frontend/src/Components/Page/Sidebar/PageSidebarItem.js index 8d0e4e790..754071c79 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebarItem.js +++ b/frontend/src/Components/Page/Sidebar/PageSidebarItem.js @@ -63,7 +63,9 @@ class PageSidebarItem extends Component { } - {typeof title === 'function' ? title() : title} + + {typeof title === 'function' ? title() : title} + { !!StatusComponent && diff --git a/frontend/src/Components/Page/Toolbar/PageToolbarButton.css b/frontend/src/Components/Page/Toolbar/PageToolbarButton.css index e9a1b666d..0b6918296 100644 --- a/frontend/src/Components/Page/Toolbar/PageToolbarButton.css +++ b/frontend/src/Components/Page/Toolbar/PageToolbarButton.css @@ -22,14 +22,11 @@ display: flex; align-items: center; justify-content: center; - overflow: hidden; height: 24px; } .label { padding: 0 3px; - max-width: 100%; - max-height: 100%; color: var(--toolbarLabelColor); font-size: $extraSmallFontSize; line-height: calc($extraSmallFontSize + 1px); diff --git a/frontend/src/Components/Page/Toolbar/PageToolbarButton.js b/frontend/src/Components/Page/Toolbar/PageToolbarButton.js index 675bdfd02..c93603aa9 100644 --- a/frontend/src/Components/Page/Toolbar/PageToolbarButton.js +++ b/frontend/src/Components/Page/Toolbar/PageToolbarButton.js @@ -23,7 +23,6 @@ function PageToolbarButton(props) { isDisabled && styles.isDisabled )} isDisabled={isDisabled || isSpinning} - title={label} {...otherProps} > <_UsingDefaultRuntimeIdentifier>true - osx-$(Architecture) + osx-x64 diff --git a/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj b/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj index 78c8b7d0f..bb0b5fcc4 100644 --- a/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj +++ b/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj @@ -4,7 +4,7 @@ - + diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs index 9e2b31d87..857834d3f 100644 --- a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs +++ b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs @@ -30,7 +30,6 @@ namespace NzbDrone.Common.Test.InstrumentationTests [TestCase(@"https://anthelion.me/api.php?api_key=2b51db35e1910123321025a12b9933d2&o=json&t=movie&q=&tmdb=&imdb=&cat=&limit=100&offset=0")] [TestCase(@"https://avistaz.to/api/v1/jackett/auth: username=mySecret&password=mySecret&pid=mySecret")] [TestCase(@"https://www.sharewood.tv/api/2b51db35e1910123321025a12b9933d2/last-torrents")] - [TestCase(@"https://example.org/rss/torrents?rsskey=2b51db35e1910123321025a12b9933d2&search=")] // Indexer and Download Client Responses diff --git a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs index 393d6613a..e4b4384b2 100644 --- a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs +++ b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs @@ -10,7 +10,7 @@ namespace NzbDrone.Common.Instrumentation private static readonly Regex[] CleansingRules = { // Url - new (@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|rsskey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), + new (@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"(?<=[?& ;])[^=]*?(_?(?[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"rss(24h)?\.torrentleech\.org/(?!rss)(?[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"torrentleech\.org/rss/download/[0-9]+/(?[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase), diff --git a/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs b/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs deleted file mode 100644 index f110b96ac..000000000 --- a/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Text; -using NLog; -using NLog.Layouts.ClefJsonLayout; -using NzbDrone.Common.EnvironmentInfo; - -namespace NzbDrone.Common.Instrumentation; - -public class CleansingClefLogLayout : CompactJsonLayout -{ - protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target) - { - base.RenderFormattedMessage(logEvent, target); - - if (RuntimeInfo.IsProduction) - { - var result = CleanseLogMessage.Cleanse(target.ToString()); - target.Clear(); - target.Append(result); - } - } -} diff --git a/src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs b/src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs deleted file mode 100644 index f894a4df5..000000000 --- a/src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Text; -using NLog; -using NLog.Layouts; -using NzbDrone.Common.EnvironmentInfo; - -namespace NzbDrone.Common.Instrumentation; - -public class CleansingConsoleLogLayout : SimpleLayout -{ - public CleansingConsoleLogLayout(string format) - : base(format) - { - } - - protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target) - { - base.RenderFormattedMessage(logEvent, target); - - if (RuntimeInfo.IsProduction) - { - var result = CleanseLogMessage.Cleanse(target.ToString()); - target.Clear(); - target.Append(result); - } - } -} diff --git a/src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs b/src/NzbDrone.Common/Instrumentation/NzbDroneFileTarget.cs similarity index 87% rename from src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs rename to src/NzbDrone.Common/Instrumentation/NzbDroneFileTarget.cs index f74d1fca4..84658cf74 100644 --- a/src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs +++ b/src/NzbDrone.Common/Instrumentation/NzbDroneFileTarget.cs @@ -4,7 +4,7 @@ using NLog.Targets; namespace NzbDrone.Common.Instrumentation { - public class CleansingFileTarget : FileTarget + public class NzbDroneFileTarget : FileTarget { protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target) { diff --git a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs index d9fdd5b25..80793e812 100644 --- a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs +++ b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.IO; using NLog; using NLog.Config; +using NLog.Layouts.ClefJsonLayout; using NLog.Targets; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; @@ -12,11 +13,9 @@ namespace NzbDrone.Common.Instrumentation { public static class NzbDroneLogger { - private const string FileLogLayout = @"${date:format=yyyy-MM-dd HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; - private const string ConsoleFormat = "[${level}] ${logger}: ${message} ${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; - - private static readonly CleansingConsoleLogLayout CleansingConsoleLayout = new (ConsoleFormat); - private static readonly CleansingClefLogLayout ClefLogLayout = new (); + private const string FILE_LOG_LAYOUT = @"${date:format=yyyy-MM-dd HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; + public const string ConsoleLogLayout = "[${level}] ${logger}: ${message} ${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; + public static CompactJsonLayout ClefLogLayout = new CompactJsonLayout(); private static bool _isConfigured; @@ -120,7 +119,11 @@ namespace NzbDrone.Common.Instrumentation ? formatEnumValue : ConsoleLogFormat.Standard; - ConfigureConsoleLayout(coloredConsoleTarget, logFormat); + coloredConsoleTarget.Layout = logFormat switch + { + ConsoleLogFormat.Clef => ClefLogLayout, + _ => ConsoleLogLayout + }; var loggingRule = new LoggingRule("*", level, coloredConsoleTarget); @@ -137,7 +140,7 @@ namespace NzbDrone.Common.Instrumentation private static void RegisterAppFile(IAppFolderInfo appFolderInfo, string name, string fileName, int maxArchiveFiles, LogLevel minLogLevel) { - var fileTarget = new CleansingFileTarget(); + var fileTarget = new NzbDroneFileTarget(); fileTarget.Name = name; fileTarget.FileName = Path.Combine(appFolderInfo.GetLogFolder(), fileName); @@ -150,7 +153,7 @@ namespace NzbDrone.Common.Instrumentation fileTarget.MaxArchiveFiles = maxArchiveFiles; fileTarget.EnableFileDelete = true; fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling; - fileTarget.Layout = FileLogLayout; + fileTarget.Layout = FILE_LOG_LAYOUT; var loggingRule = new LoggingRule("*", minLogLevel, fileTarget); @@ -169,7 +172,7 @@ namespace NzbDrone.Common.Instrumentation fileTarget.ConcurrentWrites = false; fileTarget.ConcurrentWriteAttemptDelay = 50; fileTarget.ConcurrentWriteAttempts = 100; - fileTarget.Layout = FileLogLayout; + fileTarget.Layout = FILE_LOG_LAYOUT; var loggingRule = new LoggingRule("*", LogLevel.Trace, fileTarget); @@ -214,15 +217,6 @@ namespace NzbDrone.Common.Instrumentation { return GetLogger(obj.GetType()); } - - public static void ConfigureConsoleLayout(ColoredConsoleTarget target, ConsoleLogFormat format) - { - target.Layout = format switch - { - ConsoleLogFormat.Clef => NzbDroneLogger.ClefLogLayout, - _ => NzbDroneLogger.CleansingConsoleLayout - }; - } } public enum ConsoleLogFormat diff --git a/src/NzbDrone.Common/Processes/ProcessProvider.cs b/src/NzbDrone.Common/Processes/ProcessProvider.cs index c68207a09..4947e7080 100644 --- a/src/NzbDrone.Common/Processes/ProcessProvider.cs +++ b/src/NzbDrone.Common/Processes/ProcessProvider.cs @@ -6,7 +6,6 @@ using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; -using System.Text; using NLog; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Model; @@ -118,9 +117,7 @@ namespace NzbDrone.Common.Processes UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, - RedirectStandardInput = true, - StandardOutputEncoding = Encoding.UTF8, - StandardErrorEncoding = Encoding.UTF8 + RedirectStandardInput = true }; if (environmentVariables != null) diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index 106890399..359fa8820 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -5,21 +5,21 @@ - - - + + + - - - - + + + + - - + + - + diff --git a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs index b6f06d180..3699a9d0c 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests torrentInfo.InfoUrl.Should().Be("https://filelist.io/details.php?id=665873"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 19:20:19")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 20:20:19")); torrentInfo.Size.Should().Be(8300512414); torrentInfo.InfoHash.Should().Be(null); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs index 06326d162..39d628d79 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs @@ -26,15 +26,15 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests [SetUp] public void Setup() { - Subject.Definition = new IndexerDefinition + Subject.Definition = new IndexerDefinition() { Name = "HdBits", - Settings = new HDBitsSettings { ApiKey = "fakekey" } + Settings = new HDBitsSettings() { ApiKey = "fakekey" } }; _movieSearchCriteria = new MovieSearchCriteria { - Categories = new[] { 2000, 2010 }, + Categories = new int[] { 2000, 2010 }, ImdbId = "0076759" }; } @@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests var torrents = (await Subject.Fetch(_movieSearchCriteria)).Releases; torrents.Should().HaveCount(2); - torrents.First().Should().BeOfType(); + torrents.First().Should().BeOfType(); var first = torrents.First() as TorrentInfo; diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index f4715b203..b9f4f23d2 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -274,7 +274,7 @@ namespace NzbDrone.Core.Configuration { var instanceName = _appOptions.InstanceName ?? GetValue("InstanceName", BuildInfo.AppName); - if (instanceName.Contains(BuildInfo.AppName, StringComparison.OrdinalIgnoreCase)) + if (instanceName.ContainsIgnoreCase(BuildInfo.AppName)) { return instanceName; } diff --git a/src/NzbDrone.Core/Datastore/BasicRepository.cs b/src/NzbDrone.Core/Datastore/BasicRepository.cs index 796e277b7..dc76a5a31 100644 --- a/src/NzbDrone.Core/Datastore/BasicRepository.cs +++ b/src/NzbDrone.Core/Datastore/BasicRepository.cs @@ -254,7 +254,7 @@ namespace NzbDrone.Core.Datastore protected void Delete(SqlBuilder builder) { - var sql = builder.AddDeleteTemplate(typeof(TModel)); + var sql = builder.AddDeleteTemplate(typeof(TModel)).LogQuery(); using (var conn = _database.OpenConnection()) { diff --git a/src/NzbDrone.Core/Datastore/Migration/042_myanonamouse_freeleech_wedge_options.cs b/src/NzbDrone.Core/Datastore/Migration/042_myanonamouse_freeleech_wedge_options.cs deleted file mode 100644 index 5a93488d5..000000000 --- a/src/NzbDrone.Core/Datastore/Migration/042_myanonamouse_freeleech_wedge_options.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Collections.Generic; -using System.Data; -using Dapper; -using FluentMigrator; -using Newtonsoft.Json.Linq; -using NzbDrone.Common.Serializer; -using NzbDrone.Core.Datastore.Migration.Framework; - -namespace NzbDrone.Core.Datastore.Migration -{ - [Migration(042)] - public class myanonamouse_freeleech_wedge_options : NzbDroneMigrationBase - { - protected override void MainDbUpgrade() - { - Execute.WithConnection(MigrateIndexersToWedgeOptions); - } - - private void MigrateIndexersToWedgeOptions(IDbConnection conn, IDbTransaction tran) - { - var updated = new List(); - - using (var cmd = conn.CreateCommand()) - { - cmd.Transaction = tran; - cmd.CommandText = "SELECT \"Id\", \"Settings\" FROM \"Indexers\" WHERE \"Implementation\" = 'MyAnonamouse'"; - - using (var reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - var id = reader.GetInt32(0); - var settings = Json.Deserialize(reader.GetString(1)); - - if (settings.ContainsKey("freeleech") && settings.Value("freeleech").Type == JTokenType.Boolean) - { - var optionValue = settings.Value("freeleech") switch - { - true => 2, // Required - _ => 0 // Never - }; - - settings.Remove("freeleech"); - settings.Add("useFreeleechWedge", optionValue); - } - - updated.Add(new - { - Id = id, - Settings = settings.ToJson() - }); - } - } - } - - var updateSql = "UPDATE \"Indexers\" SET \"Settings\" = @Settings WHERE \"Id\" = @Id"; - conn.Execute(updateSql, updated, transaction: tran); - } - } -} diff --git a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs index 3085dbf63..ae076c14b 100644 --- a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs +++ b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs @@ -7,7 +7,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -26,9 +25,8 @@ namespace NzbDrone.Core.Download.Clients.Aria2 ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs index 9e22a7460..f8fd44e97 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs @@ -8,7 +8,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download.Clients.Blackhole @@ -21,9 +20,8 @@ namespace NzbDrone.Core.Download.Clients.Blackhole ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs index 0b64150ee..0f0364e61 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs @@ -7,7 +7,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download.Clients.Blackhole @@ -17,9 +16,8 @@ namespace NzbDrone.Core.Download.Clients.Blackhole public UsenetBlackhole(IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, localizationService, logger) + : base(httpClient, configService, diskProvider, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs index 90bd6ba1f..ca63ba0e7 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs @@ -9,7 +9,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -24,9 +23,8 @@ namespace NzbDrone.Core.Download.Clients.Deluge ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs index 97afe9480..482e86e30 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs @@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.DownloadStation.Proxies; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -34,9 +33,8 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _dsInfoProxy = dsInfoProxy; _dsTaskProxySelector = dsTaskProxySelector; diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs index e78f5f5d2..4661c6518 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs @@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.DownloadStation.Proxies; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -32,9 +31,8 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, localizationService, logger) + : base(httpClient, configService, diskProvider, logger) { _dsInfoProxy = dsInfoProxy; _dsTaskProxySelector = dsTaskProxySelector; diff --git a/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs b/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs index 5d39d7b5f..845b4fa1c 100644 --- a/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs +++ b/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs @@ -8,7 +8,6 @@ using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.Flood.Models; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; @@ -23,9 +22,8 @@ namespace NzbDrone.Core.Download.Clients.Flood ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs index 00e7e06b4..cec808592 100644 --- a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs +++ b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs @@ -6,7 +6,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download.Clients.FreeboxDownload @@ -20,9 +19,8 @@ namespace NzbDrone.Core.Download.Clients.FreeboxDownload ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs b/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs index 560c40eb3..b5aa1eb06 100644 --- a/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs +++ b/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs @@ -6,7 +6,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -21,9 +20,8 @@ namespace NzbDrone.Core.Download.Clients.Hadouken ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs index a87460d71..e1088780d 100644 --- a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs +++ b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs @@ -7,7 +7,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -21,9 +20,8 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, localizationService, logger) + : base(httpClient, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs b/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs index 49ada68e6..b286bf922 100644 --- a/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs +++ b/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs @@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Exceptions; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -19,14 +18,15 @@ namespace NzbDrone.Core.Download.Clients.Nzbget public class Nzbget : UsenetClientBase { private readonly INzbgetProxy _proxy; + private readonly string[] _successStatus = { "SUCCESS", "NONE" }; + private readonly string[] _deleteFailedStatus = { "HEALTH", "DUPE", "SCAN", "COPY", "BAD" }; public Nzbget(INzbgetProxy proxy, IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, localizationService, logger) + : base(httpClient, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs index 99f80ab22..a0b1e85fd 100644 --- a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs +++ b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs @@ -8,7 +8,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; @@ -18,9 +17,8 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic { public Pneumatic(IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(configService, diskProvider, localizationService, logger) + : base(configService, diskProvider, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index 3d1863784..6555ce6cc 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -8,7 +8,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -31,9 +30,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent IConfigService configService, IDiskProvider diskProvider, ICacheManager cacheManager, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxySelector = proxySelector; diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs index 246262527..584e392b2 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs @@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Exceptions; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -23,9 +22,8 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, localizationService, logger) + : base(httpClient, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs b/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs index ad14de894..c62a1f6ff 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs @@ -5,7 +5,6 @@ using NLog; using NzbDrone.Common.Disk; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; namespace NzbDrone.Core.Download.Clients.Transmission { @@ -16,9 +15,8 @@ namespace NzbDrone.Core.Download.Clients.Transmission ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(proxy, torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(proxy, torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs index 977e3bfee..f5cf1fed9 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs @@ -6,7 +6,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -21,9 +20,8 @@ namespace NzbDrone.Core.Download.Clients.Transmission ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs index 3b87962bb..79f5df0e4 100644 --- a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs +++ b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs @@ -4,7 +4,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.Transmission; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; namespace NzbDrone.Core.Download.Clients.Vuze { @@ -17,9 +16,8 @@ namespace NzbDrone.Core.Download.Clients.Vuze ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(proxy, torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(proxy, torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs index 628ebdf52..5218f9ebe 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs @@ -10,7 +10,6 @@ using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.rTorrent; using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -28,9 +27,8 @@ namespace NzbDrone.Core.Download.Clients.RTorrent IConfigService configService, IDiskProvider diskProvider, IRTorrentDirectoryValidator rTorrentDirectoryValidator, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxy = proxy; _rTorrentDirectoryValidator = rTorrentDirectoryValidator; diff --git a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs index 98ad41eec..ef12042fb 100644 --- a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs @@ -7,9 +7,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; -using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; namespace NzbDrone.Core.Download.Clients.UTorrent @@ -23,9 +21,8 @@ namespace NzbDrone.Core.Download.Clients.UTorrent ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _proxy = proxy; } @@ -75,9 +72,6 @@ namespace NzbDrone.Core.Download.Clients.UTorrent } public override string Name => "uTorrent"; - - public override ProviderMessage Message => new (_localizationService.GetLocalizedString("DownloadClientUTorrentProviderMessage"), ProviderMessageType.Warning); - public override bool SupportsCategories => true; protected override void Test(List failures) diff --git a/src/NzbDrone.Core/Download/DownloadClientBase.cs b/src/NzbDrone.Core/Download/DownloadClientBase.cs index 9a7da6fd6..7659c32a6 100644 --- a/src/NzbDrone.Core/Download/DownloadClientBase.cs +++ b/src/NzbDrone.Core/Download/DownloadClientBase.cs @@ -8,7 +8,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -20,7 +19,6 @@ namespace NzbDrone.Core.Download { protected readonly IConfigService _configService; protected readonly IDiskProvider _diskProvider; - protected readonly ILocalizationService _localizationService; protected readonly Logger _logger; public abstract string Name { get; } @@ -42,12 +40,10 @@ namespace NzbDrone.Core.Download protected DownloadClientBase(IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) { _configService = configService; _diskProvider = diskProvider; - _localizationService = localizationService; _logger = logger; } diff --git a/src/NzbDrone.Core/Download/TorrentClientBase.cs b/src/NzbDrone.Core/Download/TorrentClientBase.cs index 217e70a31..322cc206b 100644 --- a/src/NzbDrone.Core/Download/TorrentClientBase.cs +++ b/src/NzbDrone.Core/Download/TorrentClientBase.cs @@ -8,7 +8,6 @@ using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; @@ -25,9 +24,8 @@ namespace NzbDrone.Core.Download ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(configService, diskProvider, localizationService, logger) + : base(configService, diskProvider, logger) { _torrentFileInfoReader = torrentFileInfoReader; _seedConfigProvider = seedConfigProvider; diff --git a/src/NzbDrone.Core/Download/UsenetClientBase.cs b/src/NzbDrone.Core/Download/UsenetClientBase.cs index 1e85ffbb9..ac62359aa 100644 --- a/src/NzbDrone.Core/Download/UsenetClientBase.cs +++ b/src/NzbDrone.Core/Download/UsenetClientBase.cs @@ -5,7 +5,6 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Localization; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; @@ -20,9 +19,8 @@ namespace NzbDrone.Core.Download protected UsenetClientBase(IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, - ILocalizationService localizationService, Logger logger) - : base(configService, diskProvider, localizationService, logger) + : base(configService, diskProvider, logger) { _httpClient = httpClient; } diff --git a/src/NzbDrone.Core/History/HistoryService.cs b/src/NzbDrone.Core/History/HistoryService.cs index e78e5d229..144258272 100644 --- a/src/NzbDrone.Core/History/HistoryService.cs +++ b/src/NzbDrone.Core/History/HistoryService.cs @@ -224,7 +224,7 @@ namespace NzbDrone.Core.History if (message.Release.PublishDate != DateTime.MinValue) { - history.Data.Add("PublishedDate", message.Release.PublishDate.ToUniversalTime().ToString("s") + "Z"); + history.Data.Add("PublishedDate", message.Release.PublishDate.ToString("s") + "Z"); } _historyRepository.Insert(history); diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index f45ff4173..cde688637 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -232,7 +232,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (queryCats.Any() && searchCriteria is TvSearchCriteria { Season: > 0 }) { // Avoid searching for specials if it's a non-zero season search - queryCats.RemoveAll(cat => cat is "anime[tv_special]" or "anime[ova]" or "anime[dvd_special]" or "anime[bd_special]"); + queryCats.RemoveAll(cat => cat is "anime[tv_special]" or "anime[ova]" or "anime[ona]" or "anime[dvd_special]" or "anime[bd_special]"); } if (queryCats.Any()) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs index 14b64979b..7ba07ab80 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text.RegularExpressions; +using System.Threading.Tasks; using AngleSharp.Html.Parser; using NLog; using NzbDrone.Common.Extensions; @@ -43,19 +44,46 @@ namespace NzbDrone.Core.Indexers.Definitions return new AnimeTorrentsParser(Settings, Capabilities.Categories); } - protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) + protected override async Task DoLogin() { - if (httpResponse.Content.Contains("Access Denied!") || httpResponse.Content.Contains("login.php")) + UpdateCookies(null, null); + + var loginUrl = Settings.BaseUrl + "login.php"; + + var loginPage = await ExecuteAuth(new HttpRequest(loginUrl)); + + var requestBuilder = new HttpRequestBuilder(loginUrl) { - throw new IndexerAuthException("AnimeTorrents authentication with cookies failed."); + LogResponseContent = true, + AllowAutoRedirect = true + }; + + var authLoginRequest = requestBuilder + .Post() + .SetCookies(loginPage.GetCookies()) + .AddFormParameter("username", Settings.Username) + .AddFormParameter("password", Settings.Password) + .AddFormParameter("form", "login") + .AddFormParameter("rememberme[]", "1") + .SetHeader("Content-Type", "application/x-www-form-urlencoded") + .SetHeader("Referer", loginUrl) + .Build(); + + var response = await ExecuteAuth(authLoginRequest); + + if (response.Content == null || !response.Content.Contains("logout.php")) + { + throw new IndexerAuthException("AnimeTorrents authentication failed"); } - return false; + UpdateCookies(response.GetCookies(), DateTime.Now.AddDays(30)); + + _logger.Debug("AnimeTorrents authentication succeeded"); } - protected override IDictionary GetCookies() + protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) { - return CookieUtil.CookieHeaderToDictionary(Settings.Cookie); + return httpResponse.Content.Contains("Access Denied!") || httpResponse.Content.Contains("login.php"); } private IndexerCapabilities SetCapabilities() @@ -91,7 +119,6 @@ namespace NzbDrone.Core.Indexers.Definitions caps.Categories.AddCategoryMapping(17, NewznabStandardCategory.BooksComics, "Doujinshi"); caps.Categories.AddCategoryMapping(18, NewznabStandardCategory.BooksComics, "Doujinshi 18+"); caps.Categories.AddCategoryMapping(19, NewznabStandardCategory.Audio, "OST"); - caps.Categories.AddCategoryMapping(20, NewznabStandardCategory.AudioAudiobook, "Audiobooks"); return caps; } @@ -264,7 +291,7 @@ namespace NzbDrone.Core.Indexers.Definitions var qTitleLink = row.QuerySelector("td:nth-of-type(2) a:nth-of-type(1)"); var title = qTitleLink?.TextContent.Trim(); - // If we search and get no results, we still get a table just with no info. + // If we search an get no results, we still get a table just with no info. if (title.IsNullOrWhiteSpace()) { break; @@ -279,8 +306,6 @@ namespace NzbDrone.Core.Indexers.Definitions var connections = row.QuerySelector("td:nth-of-type(8)").TextContent.Trim().Split('/', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); var seeders = ParseUtil.CoerceInt(connections[0]); - var leechers = ParseUtil.CoerceInt(connections[1]); - var grabs = ParseUtil.CoerceInt(connections[2]); var categoryLink = row.QuerySelector("td:nth-of-type(1) a")?.GetAttribute("href") ?? string.Empty; var categoryId = ParseUtil.GetArgumentFromQueryString(categoryLink, "cat"); @@ -302,17 +327,17 @@ namespace NzbDrone.Core.Indexers.Definitions PublishDate = publishedDate, Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(6)").TextContent.Trim()), Seeders = seeders, - Peers = leechers + seeders, - Grabs = grabs, + Peers = ParseUtil.CoerceInt(connections[1]) + seeders, + Grabs = ParseUtil.CoerceInt(connections[2]), DownloadVolumeFactor = downloadVolumeFactor, UploadVolumeFactor = 1, Genres = row.QuerySelectorAll("td:nth-of-type(2) a.tortags").Select(t => t.TextContent.Trim()).ToList() }; - var uploadFactor = row.QuerySelector("img[alt*=\"x Multiplier Torrent\"]")?.GetAttribute("alt"); - if (uploadFactor != null) + var uLFactorImg = row.QuerySelector("img[alt*=\"x Multiplier Torrent\"]"); + if (uLFactorImg != null) { - release.UploadVolumeFactor = ParseUtil.CoerceDouble(uploadFactor.Split('x')[0]); + release.UploadVolumeFactor = ParseUtil.CoerceDouble(uLFactorImg.GetAttribute("alt").Split('x')[0]); } releaseInfos.Add(release); @@ -324,7 +349,7 @@ namespace NzbDrone.Core.Indexers.Definitions public Action, DateTime?> CookiesUpdater { get; set; } } - public class AnimeTorrentsSettings : CookieTorrentBaseSettings + public class AnimeTorrentsSettings : UserPassTorrentBaseSettings { public AnimeTorrentsSettings() { @@ -335,7 +360,7 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(4, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech torrents only")] public bool FreeleechOnly { get; set; } - [FieldDefinition(5, Label = "Downloadable Only", Type = FieldType.Checkbox, HelpText = "Search downloadable torrents only (enable this only if your account class is Newbie)", Advanced = true)] + [FieldDefinition(5, Label = "Downloadable Only", Type = FieldType.Checkbox, HelpText = "Search downloadable torrents only (enable this only if your account class is Newbie)")] public bool DownloadableOnly { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index 3fc4a3328..f9194f00a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Indexers.Definitions return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList(); } - private static IndexerCapabilities SetCapabilities() + private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities { @@ -69,8 +69,7 @@ namespace NzbDrone.Core.Indexers.Definitions }, Flags = new List { - IndexerFlag.Internal, - IndexerFlag.Exclusive, + IndexerFlag.Internal } }; @@ -92,7 +91,7 @@ namespace NzbDrone.Core.Indexers.Definitions _capabilities = capabilities; } - private IEnumerable GetPagedRequests(SearchCriteriaBase searchCriteria, string searchTerm, string imdbId = null, int tmdbId = 0) + private IEnumerable GetPagedRequests(SearchCriteriaBase searchCriteria, string term, string imdbId = null, int tmdbId = 0) { var body = new Dictionary { @@ -129,9 +128,9 @@ namespace NzbDrone.Core.Indexers.Definitions body.Add("tmdb_id", tmdbId); } - if (searchTerm.IsNotNullOrWhiteSpace()) + if (term.IsNotNullOrWhiteSpace()) { - body.Add("search", searchTerm.Trim()); + body.Add("search", term); } var cats = _capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories); @@ -199,16 +198,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - var searchTerm = searchCriteria.SanitizedTvSearchString; - - if (searchCriteria.Season is > 0 && - searchCriteria.Episode.IsNotNullOrWhiteSpace() && - DateTime.TryParseExact($"{searchCriteria.Season} {searchCriteria.Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate)) - { - searchTerm = $"{searchCriteria.SanitizedSearchTerm} {showDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}"; - } - - pageableRequests.Add(GetPagedRequests(searchCriteria, searchTerm, searchCriteria.FullImdbId)); + pageableRequests.Add(GetPagedRequests(searchCriteria, searchCriteria.SanitizedTvSearchString, searchCriteria.FullImdbId)); return pageableRequests; } @@ -285,6 +275,13 @@ namespace NzbDrone.Core.Indexers.Definitions var details = row.InfoUrl; var link = row.DownloadLink; + var flags = new HashSet(); + + if (row.Internal) + { + flags.Add(IndexerFlag.Internal); + } + var release = new TorrentInfo { Title = row.Name, @@ -294,7 +291,7 @@ namespace NzbDrone.Core.Indexers.Definitions Guid = details, Categories = _categories.MapTrackerCatDescToNewznab(row.Category), PublishDate = DateTime.Parse(row.CreatedAt, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal), - IndexerFlags = GetIndexerFlags(row), + IndexerFlags = flags, Size = row.Size, Grabs = row.Grabs, Seeders = row.Seeders, @@ -304,8 +301,6 @@ namespace NzbDrone.Core.Indexers.Definitions UploadVolumeFactor = 1, MinimumRatio = 1, MinimumSeedTime = 172800, // 120 hours - Languages = row.Audios?.Split(",", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List(), - Subs = row.Subtitles?.Split(",", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List(), }; // BHD can return crazy values for tmdb @@ -324,23 +319,6 @@ namespace NzbDrone.Core.Indexers.Definitions .ToArray(); } - private static HashSet GetIndexerFlags(BeyondHDTorrent item) - { - var flags = new HashSet(); - - if (item.Internal) - { - flags.Add(IndexerFlag.Internal); - } - - if (item.Exclusive) - { - flags.Add(IndexerFlag.Exclusive); - } - - return flags; - } - public Action, DateTime?> CookiesUpdater { get; set; } } @@ -472,13 +450,9 @@ namespace NzbDrone.Core.Indexers.Definitions [JsonPropertyName("times_completed")] public int Grabs { get; set; } - public int Seeders { get; set; } public int Leechers { get; set; } - public string Audios { get; set; } - public string Subtitles { get; set; } - [JsonPropertyName("created_at")] public string CreatedAt { get; set; } @@ -504,8 +478,6 @@ namespace NzbDrone.Core.Indexers.Definitions public bool Limited { get; set; } - public bool Exclusive { get; set; } - public bool Internal { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs index 9e2c6e06b..6abdd710e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs @@ -8,7 +8,6 @@ using System.Text; using System.Text.RegularExpressions; using AngleSharp.Dom; using Microsoft.AspNetCore.WebUtilities; -using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NLog; using NzbDrone.Common.Extensions; @@ -215,19 +214,19 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann if (selector.Selector != null) { var selectorSelector = ApplyGoTemplateText(selector.Selector.TrimStart('.'), variables); - var fieldSelector = JsonParseFieldSelector(parentObj, selectorSelector); + selectorSelector = JsonParseFieldSelector(parentObj, selectorSelector); JToken selection = null; - if (fieldSelector != null) + if (selectorSelector != null) { - selection = parentObj.SelectToken(fieldSelector); + selection = parentObj.SelectToken(selectorSelector); } if (selection == null) { if (required) { - throw new Exception($"Selector \"{selectorSelector}\" didn't match {parentObj.ToString(Formatting.None)}"); + throw new Exception(string.Format("Selector \"{0}\" didn't match {1}", selectorSelector, parentObj.ToString())); } return null; @@ -235,7 +234,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann if (selection.Type is JTokenType.Array) { - // turn this json array into a comma-delimited string + // turn this json array into a comma delimited string var valueArray = selection.Value(); value = string.Join(",", valueArray); } @@ -260,7 +259,7 @@ 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)}"); + throw new Exception($"None of the case selectors \"{string.Join(",", selector.Case)}\" matched {parentObj}"); } return null; diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs index 4b96e25ed..28be1c3e5 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs @@ -105,7 +105,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann } catch (Exception ex) { - _logger.Debug(ex, "Failed to parse JSON rows count."); + _logger.Trace(ex, "Failed to parse JSON rows count."); } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs index 6d91d930d..a15751ab7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs @@ -77,7 +77,7 @@ public class FileListParser : IParseIndexerResponse InfoUrl = GetInfoUrl(id), Seeders = row.Seeders, Peers = row.Leechers + row.Seeders, - PublishDate = DateTime.Parse(row.UploadDate + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), + PublishDate = DateTime.Parse(row.UploadDate + " +0200", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), Description = row.SmallDescription, Genres = row.SmallDescription.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList(), ImdbId = imdbId, @@ -101,7 +101,7 @@ public class FileListParser : IParseIndexerResponse var url = new HttpUri(_settings.BaseUrl) .CombinePath("/download.php") .AddQueryParam("id", torrentId.ToString()) - .AddQueryParam("passkey", _settings.Passkey.Trim()); + .AddQueryParam("passkey", _settings.Passkey); return url.FullUri; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs index b4d924511..84ea1be25 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs @@ -32,7 +32,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits return new HDBitsParser(Settings, Capabilities.Categories); } - private static IndexerCapabilities SetCapabilities() + private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities { @@ -43,11 +43,6 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits MovieSearchParams = new List { MovieSearchParam.Q, MovieSearchParam.ImdbId - }, - Flags = new List - { - IndexerFlag.Internal, - IndexerFlag.Exclusive, } }; diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs index 5f8b947ae..c66c6213e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs @@ -85,9 +85,6 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [JsonProperty(PropertyName = "type_origin")] public int TypeOrigin { get; set; } - [JsonProperty(PropertyName = "type_exclusive")] - public int TypeExclusive { get; set; } - [JsonProperty(PropertyName = "imdb")] public ImdbInfo ImdbInfo { get; set; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsInfo.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsInfo.cs new file mode 100644 index 000000000..412295abf --- /dev/null +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsInfo.cs @@ -0,0 +1,9 @@ +using NzbDrone.Core.Parser.Model; + +namespace NzbDrone.Core.Indexers.Definitions.HDBits +{ + public class HDBitsInfo : TorrentInfo + { + public bool? Internal { get; set; } + } +} diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs index 8b0b55319..b157aaf9b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs @@ -62,8 +62,16 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits } var id = result.Id; + var internalRelease = result.TypeOrigin == 1; - releaseInfos.Add(new TorrentInfo + var flags = new HashSet(); + + if (internalRelease) + { + flags.Add(IndexerFlag.Internal); + } + + releaseInfos.Add(new HDBitsInfo { Guid = $"HDBits-{id}", Title = GetTitle(result), @@ -77,43 +85,28 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits Files = (int)result.NumFiles, Peers = result.Leechers + result.Seeders, PublishDate = result.Added.ToUniversalTime(), + Internal = internalRelease, Year = result.ImdbInfo?.Year ?? 0, ImdbId = result.ImdbInfo?.Id ?? 0, TvdbId = result.TvdbInfo?.Id ?? 0, DownloadVolumeFactor = GetDownloadVolumeFactor(result), UploadVolumeFactor = GetUploadVolumeFactor(result), - IndexerFlags = GetIndexerFlags(result) + IndexerFlags = flags }); } return releaseInfos.ToArray(); } + public Action, DateTime?> CookiesUpdater { get; set; } + private string GetTitle(TorrentQueryResponse item) { - // Use release name for XXX content and full discs - return item.TypeCategory != 7 && item.TypeMedium != 1 && _settings.UseFilenames && item.FileName.IsNotNullOrWhiteSpace() + return _settings.UseFilenames && item.FileName.IsNotNullOrWhiteSpace() ? item.FileName.Replace(".torrent", "", StringComparison.InvariantCultureIgnoreCase) : item.Name; } - private static HashSet GetIndexerFlags(TorrentQueryResponse item) - { - var flags = new HashSet(); - - if (item.TypeOrigin == 1) - { - flags.Add(IndexerFlag.Internal); - } - - if (item.TypeExclusive == 1) - { - flags.Add(IndexerFlag.Exclusive); - } - - return flags; - } - private double GetDownloadVolumeFactor(TorrentQueryResponse item) { if (item.FreeLeech == "yes") @@ -160,7 +153,5 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits return url.FullUri; } - - public Action, DateTime?> CookiesUpdater { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs index d77c26935..d000c8206 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs @@ -403,13 +403,10 @@ namespace NzbDrone.Core.Indexers.Definitions private static string CleanTitle(string title) { - // Drop invalid chars that seems to have cropped up in some titles. #6582 + // drop invalid chars that seems to have cropped up in some titles. #6582 title = Regex.Replace(title, @"[\u0000-\u0008\u000A-\u001F\u0100-\uFFFF]", string.Empty, RegexOptions.Compiled); title = Regex.Replace(title, @"[\(\[\{]REQ(UEST(ED)?)?[\)\]\}]", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase); - // Drop languages between brackets conflicting with anime release group parsing - title = Regex.Replace(title, @"^\[[a-z0-9 ._-]+\][-._ ](?.*-[a-z0-9]+)$", "${title}", RegexOptions.Compiled | RegexOptions.IgnoreCase); - return title.Trim(' ', '-', ':'); } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs index dad8fe8e8..d2b2f8d1a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs @@ -16,7 +16,6 @@ using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; -using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; using NzbDrone.Core.IndexerSearch.Definitions; @@ -37,8 +36,8 @@ namespace NzbDrone.Core.Indexers.Definitions public override bool SupportsPagination => true; public override int PageSize => 100; public override IndexerCapabilities Capabilities => SetCapabilities(); - private readonly ICacheManager _cacheManager; + private static readonly Regex TorrentIdRegex = new Regex(@"tor/download.php\?tid=(?<id>\d+)$"); public MyAnonamouse(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger, ICacheManager cacheManager) : base(httpClient, eventAggregator, indexerStatusService, configService, logger) @@ -60,66 +59,39 @@ namespace NzbDrone.Core.Indexers.Definitions { var downloadLink = link.RemoveQueryParam("canUseToken"); - if (Settings.UseFreeleechWedge is (int)MyAnonamouseFreeleechWedgeAction.Preferred or (int)MyAnonamouseFreeleechWedgeAction.Required && - bool.TryParse(link.GetQueryParam("canUseToken"), out var canUseToken) && canUseToken) + if (Settings.Freeleech && bool.TryParse(link.GetQueryParam("canUseToken"), out var canUseToken) && canUseToken) { - _logger.Debug("Attempting to use freeleech wedge for {0}", downloadLink.AbsoluteUri); + _logger.Debug("Attempting to use freeleech token for {0}", downloadLink.AbsoluteUri); - if (int.TryParse(link.GetQueryParam("tid"), out var torrentId) && torrentId > 0) + var idMatch = TorrentIdRegex.Match(downloadLink.AbsoluteUri); + if (idMatch.Success) { + var id = int.Parse(idMatch.Groups["id"].Value); var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); var freeleechUrl = Settings.BaseUrl + $"json/bonusBuy.php/{timestamp}"; - var freeleechRequestBuilder = new HttpRequestBuilder(freeleechUrl) - .Accept(HttpAccept.Json) + var freeleechRequest = new HttpRequestBuilder(freeleechUrl) .AddQueryParam("spendtype", "personalFL") - .AddQueryParam("torrentid", torrentId) - .AddQueryParam("timestamp", timestamp.ToString()); + .AddQueryParam("torrentid", id) + .AddQueryParam("timestamp", timestamp.ToString()) + .Build(); - freeleechRequestBuilder.LogResponseContent = true; - - var cookies = GetCookies(); - - if (cookies != null && cookies.Any()) - { - freeleechRequestBuilder.SetCookies(cookies); - } - - var freeleechRequest = freeleechRequestBuilder.Build(); - - var freeleechResponse = await _httpClient.ExecuteProxiedAsync(freeleechRequest, Definition).ConfigureAwait(false); - - var resource = Json.Deserialize<MyAnonamouseBuyPersonalFreeleechResponse>(freeleechResponse.Content); + var indexerReq = new IndexerRequest(freeleechRequest); + var response = await FetchIndexerResponse(indexerReq).ConfigureAwait(false); + var resource = Json.Deserialize<MyAnonamouseBuyPersonalFreeleechResponse>(response.Content); if (resource.Success) { - _logger.Debug("Successfully used freeleech wedge for torrentid {0}.", torrentId); - } - else if (resource.Error.IsNotNullOrWhiteSpace() && resource.Error.ContainsIgnoreCase("This Torrent is VIP")) - { - _logger.Debug("{0} is already VIP, continuing downloading: {1}", torrentId, resource.Error); - } - else if (resource.Error.IsNotNullOrWhiteSpace() && resource.Error.ContainsIgnoreCase("This is already a personal freeleech")) - { - _logger.Debug("{0} is already a personal freeleech, continuing downloading: {1}", torrentId, resource.Error); + _logger.Debug("Successfully to used freeleech token for torrentid {0}", id); } else { - _logger.Warn("Failed to purchase freeleech wedge for {0}: {1}", torrentId, resource.Error); - - if (Settings.UseFreeleechWedge == (int)MyAnonamouseFreeleechWedgeAction.Preferred) - { - _logger.Debug("'Use Freeleech Wedge' option set to preferred, continuing downloading: '{0}'", downloadLink.AbsoluteUri); - } - else - { - throw new ReleaseUnavailableException($"Failed to buy freeleech wedge and 'Use Freeleech Wedge' is set to required, aborting download: '{downloadLink.AbsoluteUri}'"); - } + _logger.Debug("Failed to use freeleech token: {0}", resource.Error); } } else { - _logger.Warn("Could not get torrent id from link {0}, skipping use of freeleech wedge.", downloadLink.AbsoluteUri); + _logger.Debug("Could not get torrent id from link {0}, skipping freeleech", downloadLink.AbsoluteUri); } } @@ -563,7 +535,7 @@ namespace NzbDrone.Core.Indexers.Definitions .CombinePath("/tor/download.php") .AddQueryParam("tid", torrentId); - if (_settings.UseFreeleechWedge is (int)MyAnonamouseFreeleechWedgeAction.Preferred or (int)MyAnonamouseFreeleechWedgeAction.Required && canUseToken) + if (_settings.Freeleech && canUseToken) { url = url.AddQueryParam("canUseToken", "true"); } @@ -588,11 +560,8 @@ namespace NzbDrone.Core.Indexers.Definitions _logger.Debug("Fetching user data: {0}", request.Url.FullUri); var response = _httpClient.ExecuteProxied(request, _definition); - var jsonResponse = JsonConvert.DeserializeObject<MyAnonamouseUserDataResponse>(response.Content); - _logger.Trace("Current user class: '{0}'", jsonResponse.UserClass); - return jsonResponse.UserClass?.Trim(); }, TimeSpan.FromHours(1)); @@ -623,7 +592,6 @@ namespace NzbDrone.Core.Indexers.Definitions SearchInSeries = false; SearchInFilenames = false; SearchLanguages = Array.Empty<int>(); - UseFreeleechWedge = (int)MyAnonamouseFreeleechWedgeAction.Never; } [FieldDefinition(2, Type = FieldType.Textbox, Label = "Mam Id", HelpText = "Mam Session Id (Created Under Preferences -> Security)")] @@ -632,21 +600,21 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(3, Type = FieldType.Select, Label = "Search Type", SelectOptions = typeof(MyAnonamouseSearchType), HelpText = "Specify the desired search type")] public int SearchType { get; set; } - [FieldDefinition(4, Type = FieldType.Checkbox, Label = "Search in description", HelpText = "Search text in the description")] + [FieldDefinition(4, Type = FieldType.Checkbox, Label = "Use Freeleech Wedges", HelpText = "Use freeleech wedges to make grabbed torrents personal freeleech")] + public bool Freeleech { get; set; } + + [FieldDefinition(5, Type = FieldType.Checkbox, Label = "Search in description", HelpText = "Search text in the description")] public bool SearchInDescription { get; set; } - [FieldDefinition(5, Type = FieldType.Checkbox, Label = "Search in series", HelpText = "Search text in the series")] + [FieldDefinition(6, Type = FieldType.Checkbox, Label = "Search in series", HelpText = "Search text in the series")] public bool SearchInSeries { get; set; } - [FieldDefinition(6, Type = FieldType.Checkbox, Label = "Search in filenames", HelpText = "Search text in the filenames")] + [FieldDefinition(7, Type = FieldType.Checkbox, Label = "Search in filenames", HelpText = "Search text in the filenames")] public bool SearchInFilenames { get; set; } - [FieldDefinition(7, Type = FieldType.Select, Label = "Search Languages", SelectOptions = typeof(MyAnonamouseSearchLanguages), HelpText = "Specify the desired languages. If unspecified, all options are used.")] + [FieldDefinition(8, Type = FieldType.Select, Label = "Search Languages", SelectOptions = typeof(MyAnonamouseSearchLanguages), HelpText = "Specify the desired languages. If unspecified, all options are used.")] public IEnumerable<int> SearchLanguages { get; set; } - [FieldDefinition(8, Type = FieldType.Select, Label = "Use Freeleech Wedges", SelectOptions = typeof(MyAnonamouseFreeleechWedgeAction), HelpText = "Use freeleech wedges to make grabbed torrents personal freeleech")] - public int UseFreeleechWedge { get; set; } - public override NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); @@ -866,18 +834,6 @@ namespace NzbDrone.Core.Indexers.Definitions Other = 47, } - public enum MyAnonamouseFreeleechWedgeAction - { - [FieldOption(Label = "Never", Hint = "Do not buy as freeleech")] - Never = 0, - - [FieldOption(Label = "Preferred", Hint = "Buy and use wedge if possible")] - Preferred = 1, - - [FieldOption(Label = "Required", Hint = "Abort download if unable to buy wedge")] - Required = 2, - } - public class MyAnonamouseTorrent { public int Id { get; set; } @@ -919,7 +875,7 @@ namespace NzbDrone.Core.Indexers.Definitions public class MyAnonamouseUserDataResponse { - [JsonProperty(PropertyName = "classname")] + [JsonProperty(PropertyName = "class")] public string UserClass { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index dcc26338e..731c96bb5 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -240,8 +240,6 @@ namespace NzbDrone.Core.Indexers.Definitions public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse) { - var torrentInfos = new List<ReleaseInfo>(); - if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { STJson.TryDeserialize<JsonRpcResponse<NebulanceErrorResponse>>(indexerResponse.HttpResponse.Content, out var errorResponse); @@ -249,6 +247,13 @@ namespace NzbDrone.Core.Indexers.Definitions throw new IndexerException(indexerResponse, "Unexpected response status '{0}' code from indexer request: {1}", indexerResponse.HttpResponse.StatusCode, errorResponse?.Result?.Error?.Message ?? "Check the logs for more information."); } + if (!indexerResponse.HttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value)) + { + throw new IndexerException(indexerResponse, "Unexpected response header {0} from indexer request, expected {1}", indexerResponse.HttpResponse.Headers.ContentType, HttpAccept.Json.Value); + } + + var torrentInfos = new List<ReleaseInfo>(); + JsonRpcResponse<NebulanceResponse> jsonResponse; try diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs index ad3f48b07..f9ab56128 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs @@ -128,7 +128,7 @@ namespace NzbDrone.Core.Indexers.Newznab parameters.Set("tvdbid", searchCriteria.TvdbId.Value.ToString()); } - if (searchCriteria.TmdbId.HasValue && capabilities.TvSearchTmdbAvailable) + if (searchCriteria.TmdbId.HasValue && capabilities.TvSearchTvdbAvailable) { parameters.Set("tmdbid", searchCriteria.TmdbId.Value.ToString()); } diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index e989a5c6a..096199880 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -27,7 +27,7 @@ public class NorBits : TorrentIndexerBase<NorBitsSettings> public override string[] IndexerUrls => new[] { "https://norbits.net/" }; public override string Description => "NorBits is a Norwegian Private site for MOVIES / TV / GENERAL"; public override string Language => "nb-NO"; - public override Encoding Encoding => Encoding.UTF8; + public override Encoding Encoding => Encoding.GetEncoding("iso-8859-1"); public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override IndexerCapabilities Capabilities => SetCapabilities(); @@ -129,14 +129,26 @@ public class NorBits : TorrentIndexerBase<NorBitsSettings> } }; - caps.Categories.AddCategoryMapping("main_cat[]=1", NewznabStandardCategory.Movies, "Filmer"); - caps.Categories.AddCategoryMapping("main_cat[]=2", NewznabStandardCategory.TV, "TV"); + caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=49", NewznabStandardCategory.MoviesUHD, "Filmer - UHD-2160p"); + caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=19", NewznabStandardCategory.MoviesHD, "Filmer - HD-1080p/i"); + caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=20", NewznabStandardCategory.MoviesHD, "Filmer - HD-720p"); + caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=22", NewznabStandardCategory.MoviesSD, "Filmer - SD"); + caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=49", NewznabStandardCategory.TVUHD, "TV - UHD-2160p"); + caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=19", NewznabStandardCategory.TVHD, "TV - HD-1080p/i"); + caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=20", NewznabStandardCategory.TVHD, "TV - HD-720p"); + caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=22", NewznabStandardCategory.TVSD, "TV - SD"); caps.Categories.AddCategoryMapping("main_cat[]=3", NewznabStandardCategory.PC, "Programmer"); caps.Categories.AddCategoryMapping("main_cat[]=4", NewznabStandardCategory.Console, "Spill"); - caps.Categories.AddCategoryMapping("main_cat[]=5", NewznabStandardCategory.Audio, "Musikk"); + caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=42", NewznabStandardCategory.AudioMP3, "Musikk - 192"); + caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=43", NewznabStandardCategory.AudioMP3, "Musikk - 256"); + caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=44", NewznabStandardCategory.AudioMP3, "Musikk - 320"); + caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=45", NewznabStandardCategory.AudioMP3, "Musikk - VBR"); + caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=46", NewznabStandardCategory.AudioLossless, "Musikk - Lossless"); caps.Categories.AddCategoryMapping("main_cat[]=6", NewznabStandardCategory.Books, "Tidsskrift"); caps.Categories.AddCategoryMapping("main_cat[]=7", NewznabStandardCategory.AudioAudiobook, "Lydbøker"); - caps.Categories.AddCategoryMapping("main_cat[]=8", NewznabStandardCategory.AudioVideo, "Musikkvideoer"); + caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=19", NewznabStandardCategory.AudioVideo, "Musikkvideoer - HD-1080p/i"); + caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=20", NewznabStandardCategory.AudioVideo, "Musikkvideoer - HD-720p"); + caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=22", NewznabStandardCategory.AudioVideo, "Musikkvideoer - SD"); caps.Categories.AddCategoryMapping("main_cat[]=40", NewznabStandardCategory.AudioOther, "Podcasts"); return caps; @@ -265,17 +277,20 @@ public class NorBitsParser : IParseIndexerResponse foreach (var row in rows) { - var link = _settings.BaseUrl + row.QuerySelector("td:nth-of-type(2) > a[href*=\"download.php?id=\"]")?.GetAttribute("href")?.TrimStart('/'); + var link = _settings.BaseUrl + row.QuerySelector("td:nth-of-type(2) > a[href*=\"download.php?id=\"]")?.GetAttribute("href").TrimStart('/'); var qDetails = row.QuerySelector("td:nth-of-type(2) > a[href*=\"details.php?id=\"]"); - var title = qDetails?.GetAttribute("title")?.Trim(); - var details = _settings.BaseUrl + qDetails?.GetAttribute("href")?.TrimStart('/'); + var title = qDetails?.GetAttribute("title").Trim(); + var details = _settings.BaseUrl + qDetails?.GetAttribute("href").TrimStart('/'); - var catQuery = row.QuerySelector("td:nth-of-type(1) a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last().Split('&', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - var category = catQuery?.FirstOrDefault(x => x.StartsWith("main_cat[]=", StringComparison.OrdinalIgnoreCase)); + var mainCategory = row.QuerySelector("td:nth-of-type(1) > div > a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); + var secondCategory = row.QuerySelector("td:nth-of-type(1) > div > a[href*=\"sub2_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); - var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(9)")?.TextContent); - var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(10)")?.TextContent); + var categoryList = new[] { mainCategory, secondCategory }; + var cat = string.Join("&", categoryList.Where(c => !string.IsNullOrWhiteSpace(c))); + + var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(9)").TextContent); + var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(10)").TextContent); var release = new TorrentInfo { @@ -283,7 +298,7 @@ public class NorBitsParser : IParseIndexerResponse InfoUrl = details, DownloadUrl = link, Title = title, - Categories = _categories.MapTrackerCatToNewznab(category), + Categories = _categories.MapTrackerCatToNewznab(cat), Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(7)")?.TextContent), Files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(3) > a")?.TextContent.Trim()), Grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(8)")?.FirstChild?.TextContent.Trim()), diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index 7b6fe586e..997ba97e0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -56,19 +56,6 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { foreach (var torrent in result.Torrents) { - // skip non-freeleech results when freeleech only is set - var downloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch - { - "FREELEECH" or "NEUTRAL LEECH" => 0, - "HALF LEECH" => 0.5, - _ => 1 - }; - - if (_settings.FreeleechOnly && downloadVolumeFactor != 0.0) - { - continue; - } - var id = torrent.Id; var title = torrent.ReleaseName; @@ -91,12 +78,6 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn categories.Add(NewznabStandardCategory.TV); } - var uploadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch - { - "NEUTRAL LEECH" => 0, - _ => 1 - }; - torrentInfos.Add(new TorrentInfo { Guid = $"PassThePopcorn-{id}", @@ -113,8 +94,13 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn ImdbId = result.ImdbId.IsNotNullOrWhiteSpace() ? int.Parse(result.ImdbId) : 0, Scene = torrent.Scene, IndexerFlags = flags, - DownloadVolumeFactor = downloadVolumeFactor, - UploadVolumeFactor = uploadVolumeFactor, + DownloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch + { + "FREELEECH" => 0, + "HALF LEECH" => 0.5, + _ => 1 + }, + UploadVolumeFactor = 1, MinimumRatio = 1, MinimumSeedTime = 345600, Genres = result.Tags ?? new List<string>(), diff --git a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs index 44f6bae38..26a5a42de 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs @@ -30,7 +30,7 @@ namespace NzbDrone.Core.Indexers.Definitions "https://rutracker.net/", "https://rutracker.nl/" }; - public override string Description => "RuTracker.org is a RUSSIAN Semi-Private site with a thriving file-sharing community"; + public override string Description => "RuTracker.org is a Semi-Private Russian torrent site with a thriving file-sharing community"; public override string Language => "ru-RU"; public override Encoding Encoding => Encoding.GetEncoding("windows-1251"); public override IndexerPrivacy Privacy => IndexerPrivacy.SemiPrivate; @@ -144,7 +144,6 @@ namespace NzbDrone.Core.Indexers.Definitions SupportsRawSearch = true }; - // Note: When refreshing the categories use the tracker.php page and NOT the search.php page! caps.Categories.AddCategoryMapping(22, NewznabStandardCategory.Movies, "Наше кино"); caps.Categories.AddCategoryMapping(941, NewznabStandardCategory.Movies, "|- Кино СССР"); caps.Categories.AddCategoryMapping(1666, NewznabStandardCategory.Movies, "|- Детские отечественные фильмы"); @@ -934,8 +933,6 @@ namespace NzbDrone.Core.Indexers.Definitions caps.Categories.AddCategoryMapping(1224, NewznabStandardCategory.AudioLossless, "|- Авторская песня (lossless)"); caps.Categories.AddCategoryMapping(1225, NewznabStandardCategory.AudioMP3, "|- Авторская песня (lossy)"); caps.Categories.AddCategoryMapping(1226, NewznabStandardCategory.Audio, "|- Менестрели и ролевики (lossy и lossless)"); - caps.Categories.AddCategoryMapping(782, NewznabStandardCategory.Audio, "Лейбл- и сцен-паки. Неофициальные сборники и ремастеринги. AI-музыка"); - caps.Categories.AddCategoryMapping(577, NewznabStandardCategory.Audio, "|- AI-Music - музыка ИИ, нейросетей (lossy и lossless)"); caps.Categories.AddCategoryMapping(1842, NewznabStandardCategory.AudioLossless, "Label Packs (lossless)"); caps.Categories.AddCategoryMapping(1648, NewznabStandardCategory.AudioMP3, "Label packs, Scene packs (lossy)"); caps.Categories.AddCategoryMapping(134, NewznabStandardCategory.AudioLossless, "|- Неофициальные сборники и ремастеринги (lossless)"); @@ -1752,7 +1749,7 @@ namespace NzbDrone.Core.Indexers.Definitions title = Regex.Replace(title, @"(\([\p{IsCyrillic}\W]+)\s/\s(.+?)\)", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase); // Remove VO, MVO and DVO from titles - var vo = new Regex(@"((?:\dx\s)?(?:[A-Z])?VO\s\(.+?\))"); + var vo = new Regex(@".VO\s\(.+?\)"); title = vo.Replace(title, string.Empty); // Remove R5 and (R5) from release names @@ -1760,7 +1757,7 @@ namespace NzbDrone.Core.Indexers.Definitions title = r5.Replace(title, "$1"); // Remove Sub languages from release names - title = Regex.Replace(title, @"(\bSub\b[^+]*\b|\b[\+]*Sub[\+]*\b)", string.Empty); + title = Regex.Replace(title, @"(\bSub\b.*$|\b[\+]*Sub[\+]*\b)", string.Empty); } // language fix: all rutracker releases contains russian track diff --git a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs index e8d8b1584..ab63387e6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs @@ -20,7 +20,7 @@ public class SecretCinema : GazelleBase<GazelleSettings> { public override string Name => "Secret Cinema"; public override string[] IndexerUrls => new[] { "https://secret-cinema.pw/" }; - public override string Description => "Secret Cinema is a Private ratioless site for rare MOVIES."; + public override string Description => "A tracker for rare movies."; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override IndexerCapabilities Capabilities => SetCapabilities(); @@ -151,7 +151,7 @@ public class SecretCinemaParser : IParseIndexerResponse if (torrent.RemasterTitle.IsNotNullOrWhiteSpace()) { - release.Title += $" [{WebUtility.HtmlDecode(torrent.RemasterTitle).Trim()}]"; + release.Title += $" [{torrent.RemasterTitle.Trim()}]"; } // Replace media formats with standards diff --git a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs index 244a9c286..f0170d868 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs @@ -262,7 +262,7 @@ namespace NzbDrone.Core.Indexers.Definitions return jsonResponse.Resource.Select(torrent => new TorrentInfo { - Guid = torrent.Url, + Guid = torrent.Id.ToString(), Title = CleanTitle(torrent.Name), Description = torrent.ShortDescription, Size = torrent.Size, diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs index aa02c4578..9371c8aa0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs @@ -7,7 +7,6 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; -using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; @@ -53,7 +52,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IParseIndexerResponse GetParser() { - return new TorrentDayParser(Settings, Capabilities.Categories, _logger); + return new TorrentDayParser(Settings, Capabilities.Categories); } protected override IDictionary<string, string> GetCookies() @@ -229,29 +228,15 @@ namespace NzbDrone.Core.Indexers.Definitions { private readonly TorrentDaySettings _settings; private readonly IndexerCapabilitiesCategories _categories; - private readonly Logger _logger; - public TorrentDayParser(TorrentDaySettings settings, IndexerCapabilitiesCategories categories, Logger logger) + public TorrentDayParser(TorrentDaySettings settings, IndexerCapabilitiesCategories categories) { _settings = settings; _categories = categories; - _logger = logger; } public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse) { - if (indexerResponse.HttpResponse.HasHttpRedirect) - { - _logger.Warn("Redirected to {0} from indexer request", indexerResponse.HttpResponse.RedirectUrl); - - if (indexerResponse.HttpResponse.RedirectUrl.ContainsIgnoreCase("/login.php")) - { - throw new IndexerException(indexerResponse, "We are being redirected to the login page. Most likely your session expired or was killed. Recheck your cookie and try testing the indexer."); - } - - throw new IndexerException(indexerResponse, "Redirected to {0} from indexer request", indexerResponse.HttpResponse.RedirectUrl); - } - var torrentInfos = new List<TorrentInfo>(); var rows = JsonConvert.DeserializeObject<dynamic>(indexerResponse.Content); diff --git a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs index 72d4f1c2b..381441434 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs @@ -121,15 +121,8 @@ public class XSpeeds : TorrentIndexerBase<XSpeedsSettings> caps.Categories.AddCategoryMapping(112, NewznabStandardCategory.MoviesOther, "Anime Movies"); caps.Categories.AddCategoryMapping(111, NewznabStandardCategory.MoviesOther, "Anime TV"); caps.Categories.AddCategoryMapping(150, NewznabStandardCategory.PC, "Apps"); - caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.TV, "AV1"); - caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.Movies, "AV1"); - caps.Categories.AddCategoryMapping(159, NewznabStandardCategory.Movies, "Movie Boxsets AV1"); - caps.Categories.AddCategoryMapping(158, NewznabStandardCategory.Movies, "Movies AV1"); - caps.Categories.AddCategoryMapping(157, NewznabStandardCategory.TV, "TV AV1"); - caps.Categories.AddCategoryMapping(160, NewznabStandardCategory.TV, "TV Boxsets AV1"); - caps.Categories.AddCategoryMapping(153, NewznabStandardCategory.Books, "Books"); - caps.Categories.AddCategoryMapping(154, NewznabStandardCategory.AudioAudiobook, "Audiobooks"); - caps.Categories.AddCategoryMapping(155, NewznabStandardCategory.Books, "Books & Magazines"); + caps.Categories.AddCategoryMapping(80, NewznabStandardCategory.AudioAudiobook, "Audiobooks"); + caps.Categories.AddCategoryMapping(48, NewznabStandardCategory.Books, "Books Magazines"); caps.Categories.AddCategoryMapping(68, NewznabStandardCategory.MoviesOther, "Cams/TS"); caps.Categories.AddCategoryMapping(140, NewznabStandardCategory.TVDocumentary, "Documentary"); caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.MoviesDVD, "DVDR"); @@ -161,7 +154,6 @@ public class XSpeeds : TorrentIndexerBase<XSpeedsSettings> caps.Categories.AddCategoryMapping(146, NewznabStandardCategory.MoviesSD, "Movies SD"); caps.Categories.AddCategoryMapping(13, NewznabStandardCategory.Audio, "Music"); caps.Categories.AddCategoryMapping(135, NewznabStandardCategory.AudioLossless, "Music/FLAC"); - caps.Categories.AddCategoryMapping(151, NewznabStandardCategory.Audio, "Karaoke"); caps.Categories.AddCategoryMapping(136, NewznabStandardCategory.Audio, "Music Boxset"); caps.Categories.AddCategoryMapping(148, NewznabStandardCategory.AudioVideo, "Music Videos"); caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.Other, "Other"); diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index 4a8014c63..fde23c691 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -250,11 +250,7 @@ namespace NzbDrone.Core.Indexers { var response = await _httpClient.ExecuteProxiedAsync(request, Definition); - if (response.StatusCode is HttpStatusCode.MovedPermanently - or HttpStatusCode.Found - or HttpStatusCode.SeeOther - or HttpStatusCode.TemporaryRedirect - or HttpStatusCode.PermanentRedirect) + if (response.StatusCode is HttpStatusCode.MovedPermanently or HttpStatusCode.Found or HttpStatusCode.SeeOther) { var autoRedirectChain = new List<string> { request.Url.ToString() }; diff --git a/src/NzbDrone.Core/Indexers/IndexerFlag.cs b/src/NzbDrone.Core/Indexers/IndexerFlag.cs index cfa3d35de..26a65e96c 100644 --- a/src/NzbDrone.Core/Indexers/IndexerFlag.cs +++ b/src/NzbDrone.Core/Indexers/IndexerFlag.cs @@ -63,7 +63,6 @@ namespace NzbDrone.Core.Indexers } public static IndexerFlag Internal => new ("internal", "Uploader is an internal release group"); - public static IndexerFlag Exclusive => new ("exclusive", "An exclusive release that must not be uploaded anywhere else"); public static IndexerFlag FreeLeech => new ("freeleech", "Download doesn't count toward ratio"); public static IndexerFlag NeutralLeech => new ("neutralleech", "Download and upload doesn't count toward ratio"); public static IndexerFlag HalfLeech => new ("halfleech", "Release counts 50% to ratio"); diff --git a/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs b/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs index ac0cd085b..346b6acf1 100644 --- a/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs +++ b/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs @@ -95,7 +95,7 @@ namespace NzbDrone.Core.Instrumentation private void ReconfigureFile() { - foreach (var target in LogManager.Configuration.AllTargets.OfType<CleansingFileTarget>()) + foreach (var target in LogManager.Configuration.AllTargets.OfType<NzbDroneFileTarget>()) { target.MaxArchiveFiles = _configFileProvider.LogRotate; target.ArchiveAboveSize = _configFileProvider.LogSizeLimit.Megabytes(); @@ -120,7 +120,11 @@ namespace NzbDrone.Core.Instrumentation { var format = _configFileProvider.ConsoleLogFormat; - NzbDroneLogger.ConfigureConsoleLayout(consoleTarget, format); + consoleTarget.Layout = format switch + { + ConsoleLogFormat.Clef => NzbDroneLogger.ClefLogLayout, + _ => NzbDroneLogger.ConsoleLogLayout + }; } } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 913275a68..b1a0d993f 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -376,46 +376,5 @@ "ActiveIndexers": "Активни индиксатори", "AddApplication": "добави приложение", "Season": "Причина", - "CurrentlyInstalled": "Понастоящем инсталиран", - "DownloadClientSettingsAddPaused": "Добави на пауза", - "Encoding": "Кодиране", - "Episode": "епизод", - "Applications": "Приложения", - "Publisher": "Издател", - "Id": "ИН", - "Theme": "Тема", - "Label": "Етикет", - "Categories": "Категории", - "Album": "албум", - "Artist": "изпълнител", - "AddConnection": "Добави връзка", - "AddConnectionImplementation": "Добави връзка - {implementationName}", - "AddDownloadClientImplementation": "Добави клиент за изтегляне - {implementationName}", - "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Потвърдете новата парола", - "Default": "Подразбиране", - "Any": "Всеки", - "ApplicationUrlHelpText": "Външният URL адрес на това приложение, включително http(s)://, порт и основно URL", - "Database": "База данни", - "Destination": "Дестинация", - "DownloadClientAriaSettingsDirectoryHelpText": "Незадължително локация за изтеглянията, оставете празно, за да използвате локацията по подразбиране на Aria2", - "DownloadClientDelugeSettingsUrlBaseHelpText": "Добавя префикс към url адреса на deluge json, вижте {url}", - "Directory": "Директория", - "AddIndexerImplementation": "Добави индексатор - {implementationName}", - "AuthenticationRequiredHelpText": "Променете за кои заявки се изисква удостоверяване. Не променяйте, освен ако не разбирате рисковете.", - "AuthenticationRequiredPasswordHelpTextWarning": "Въведете нова парола", - "DownloadClientDownloadStationSettingsDirectoryHelpText": "Незадължителна споделена папка, в която да се поставят изтеглянията, оставете празно, за да използвате местоположението по подразбиране на Download Station", - "DownloadClientFloodSettingsAdditionalTags": "Допълнителни тагове", - "DownloadClientFloodSettingsAdditionalTagsHelpText": "Добавя свойствата на медията като тагове. Напътствията са примери.", - "DownloadClientFloodSettingsTagsHelpText": "Първоначални тагове на изтегляне. За да бъде разпознато едно изтегляне, то трябва да има всички начални тагове. По този начин се избягват конфликти с необвързани с приложение изтегляния.", - "ApplicationURL": "URL адрес на приложението", - "AuthenticationRequired": "Изисква се удостоверяване", - "ApplyChanges": "Прилагане на промените", - "ApiKeyValidationHealthCheckMessage": "Моля, актуализирайте API ключа си така, че да съдържа поне {length} знака. Можете да направите това чрез настройките или конфигурационния файл", - "AppUpdated": "{appName} Актуализиран", - "AppUpdatedVersion": "{appName} е актуализиранa до версия `{version}`, за да получите най-новите промени, ще трябва да презаредите {appName}", - "Donate": "Дарете", - "AddCustomFilter": "Добави персонализиран филтър", - "AuthenticationMethod": "Метод за удостоверяване", - "AuthenticationMethodHelpTextWarning": "Моля, изберете валиден метод за удостоверяване", - "BlackholeFolderHelpText": "Папка, в която {appName} ще съхранява файла {extension}" + "CurrentlyInstalled": "Понастоящем инсталиран" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 83a720b51..608973a41 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -484,7 +484,7 @@ "InfoUrl": "URL d'informació", "PublishedDate": "Data de publicació", "Redirected": "Redirecció", - "AllSearchResultsHiddenByFilter": "Tots els resultats estan ocults pel filtre aplicat.", + "AllSearchResultsHiddenByFilter": "Tots els resultats estan ocults pel filtre aplicat", "HealthMessagesInfoBox": "Podeu trobar més informació sobre la causa d'aquests missatges de comprovació de salut fent clic a l'enllaç wiki (icona del llibre) al final de la fila o consultant els vostres [registres]({link}). Si teniu problemes per a interpretar aquests missatges, podeu posar-vos en contacte amb el nostre suport als enllaços següents.", "AptUpdater": "Utilitzeu apt per a instal·lar l'actualització", "DockerUpdater": "actualitzeu el contenidor Docker per a rebre l'actualització", @@ -500,245 +500,5 @@ "UpdateAppDirectlyLoadError": "No es pot actualitzar {appName} directament,", "WouldYouLikeToRestoreBackup": "Voleu restaurar la còpia de seguretat '{name}'?", "InstallLatest": "Instal·la l'últim", - "CurrentlyInstalled": "Instal·lat actualment", - "DownloadClientSettingsAddPaused": "Afegeix pausats", - "Install": "Instal·la", - "DownloadClientFloodSettingsAdditionalTags": "Etiquetes addicionals", - "DownloadClientFreeboxSettingsApiUrl": "URL de l'API", - "DownloadClientFreeboxSettingsAppId": "Identificador de l'aplicació", - "PreviouslyInstalled": "Instal·lat anteriorment", - "PasswordConfirmation": "Confirmeu la contrasenya", - "IndexerHDBitsSettingsOriginsHelpText": "Si no s'especifica, s'utilitzen totes les opcions.", - "MinimumSeeders": "Seeders mínims", - "SeedRatio": "Ràtio de la llavor", - "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent està bloquejat per un hash, pot ser que no es rebutgi correctament durant el RSS/Search per a alguns indexadors, habilitant això permetrà que es rebutgi després que s'agafi el torrent, però abans que s'enviï al client.", - "SeedTime": "Temps de la llavor", - "DefaultCategory": "Categoria predeterminada", - "IndexerVipExpiredHealthCheckMessage": "Els beneficis VIP de l'indexador han caducat: {indexerNames}", - "MassEditor": "Editor de masses", - "NoSearchResultsFound": "No s'han trobat resultats de cerca, proveu de realitzar una nova cerca a continuació.", - "NotSupported": "No suportat", - "OverrideAndAddToDownloadClient": "Sobreescriu i afegeix al client de baixada", - "PackSeedTime": "Temps de la llavor del paquet", - "SearchAllIndexers": "Cerca tots els indexadors", - "SearchIndexers": "Cerca indexadors", - "SeedTimeHelpText": "L'hora en què un torrent s'ha de sembrar abans d'aturar-se, buit és el predeterminat de l'aplicació", - "SettingsIndexerLogging": "Registre de l'indexador millorat", - "TotalIndexerSuccessfulGrabs": "Indexador total correcte", - "BookSearch": "Cerca de llibres", - "ClearHistoryMessageText": "Esteu segur que voleu netejar tot l'historial de {appName}?", - "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", - "ClearHistory": "Neteja l'historial", - "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Clau de l'API del lloc", - "IndexerGazelleGamesSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)", - "IndexerBeyondHDSettingsRssKeyHelpText": "Clau RSS del lloc (trobada a Seguretat => Clau RSS)", - "ApplicationsLoadError": "No s'ha pogut carregar la llista d'aplicacions", - "BookSearchTypes": "Tipus de cerca de llibres", - "DownloadClientCategory": "Baixa la categoria del client", - "IndexerAuth": "Autor de l'indexador", - "IndexerBeyondHDSettingsLimitedOnly": "Només limitat", - "IndexerBeyondHDSettingsRefundOnly": "Només el reemborsament", - "IndexerBeyondHDSettingsRefundOnlyHelpText": "Cerca només el reemborsament", - "IndexerBeyondHDSettingsRewindOnlyHelpText": "Cerca només el rebobinat", - "IndexerBeyondHDSettingsSearchTypes": "Tipus de cerca", - "IndexerBeyondHDSettingsSearchTypesHelpText": "Seleccioneu els tipus de llançaments que us interessin. Si no hi ha cap seleccionat, s'utilitzen totes les opcions.", - "IndexerDownloadClientHelpText": "Especifiqueu quin client de baixada s'utilitza per a les captures fetes a {appName} des d'aquest indexador", - "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Ha de tenir permisos d'usuari i torrents", - "IndexerGazelleGamesSettingsSearchGroupNames": "Cerca noms de grup", - "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Mostra només els llançaments de freeleech", - "IndexerHDBitsSettingsUseFilenames": "Utilitza els noms de fitxer", - "IndexerHDBitsSettingsUseFilenamesHelpText": "Marqueu aquesta opció si voleu utilitzar noms de fitxer torrent com a títols de llançament", - "IndexerHDBitsSettingsUsernameHelpText": "Nom d'usuari del lloc", - "IndexerHealthCheckNoIndexers": "No hi ha indexadors activats, {appName} no retornarà els resultats de la cerca", - "IndexerHistoryLoadError": "Error en carregar l'historial de l'indexador", - "IndexerIPTorrentsSettingsCookieUserAgent": "Agent d'usuari de la galeta", - "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", - "IndexerInfo": "Informació de l'indexador", - "IndexerNebulanceSettingsApiKeyHelpText": "Clau API de la Configuració de l'usuari . Claus Api. La clau ha de tenir permisos de llista i baixada", - "IndexerNewznabSettingsVipExpirationHelpText": "Data d'entrada (yyyy-mm-dd) per a la caducitat VIP o en blanc, {appName} notificarà 1 setmana des de la caducitat de VIP", - "IndexerNoDefinitionCheckHealthCheckMessage": "Els indexadors no tenen definició i no funcionaran: {indexerNames}. Suprimiu i (o torneu a afegir) a {appName}.", - "IndexerObsoleteCheckMessage": "Els indexadors estan obsolets o s'han actualitzat: {0}. Suprimiu i (o torneu a afegir) a {appName}", - "IndexerPassThePopcornSettingsApiKeyHelpText": "Clau de l'API del lloc", - "IndexerRss": "Indexador RSS", - "IndexerSettingsGrabLimitHelpText": "El nombre màxim de captures especificat per la unitat respectiva que {appName} permetrà al lloc", - "IndexerSettingsPackSeedTimeIndexerHelpText": "L'hora en què un paquet (temporada o discografia) s'ha de sembrar el torrent abans d'aturar-se, buit és el valor predeterminat de l'aplicació", - "IndexerSettingsPreferMagnetUrl": "Prefereix l'URL de l'imant", - "IndexerSettingsPreferMagnetUrlHelpText": "Quan està activat, aquest indexador preferirà l'ús d'URLs magnet per a les captures amb enllaços de reserva a torrents", - "IndexerSettingsQueryLimitHelpText": "El nombre màxim de consultes especificat per la unitat respectiva que {appName} permetrà al lloc", - "InitialFailure": "Fallada inicial", - "NoIndexerCategories": "No s'ha trobat cap categoria per a aquest indexador", - "RepeatSearch": "Cerca repetida", - "SettingsLogRotateHelpText": "Nombre màxim de fitxers de registre a mantenir desats a la carpeta de registres", - "SyncProfile": "Perfil de sincronització", - "TotalUserAgentGrabs": "Total d'agents d'usuari", - "UnableToLoadAppProfiles": "No s'han pogut carregar els perfils de l'aplicació", - "VipExpiration": "Caducitat VIP", - "IndexerOrpheusSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)", - "IndexerRedactedSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)", - "ProwlarrSupportsAnyIndexer": "{appName} admet molts indexadors, a més de qualsevol indexador que utilitzi l'estàndard Newznab/Torznab utilitzant 'Generic Newznab' (per usenet) o 'Generic Torznab' (per torrents). Cerca i selecciona el teu indexador des de sota.", - "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Categoria alternativa predeterminada si no hi ha cap categoria assignada per a un llançament. Afegir una categoria específica a {appName} evita conflictes amb baixades no relacionades amb {appName}. L'ús d'una categoria és opcional, però molt recomanable.", - "AppProfileSelectHelpText": "Els perfils d'aplicació s'utilitzen per controlar RSS, la cerca automàtica i la configuració de cerca interactiva en sincronitzar aplicacions", - "AudioSearch": "Cerca d'àudio", - "IndexerSettingsAppsMinimumSeeders": "Aplicacions de cercadors mínims", - "DeleteApplication": "Suprimeix l'aplicació", - "DownloadClientSettingsPriorityItemHelpText": "Prioritat a usar en capturar elements", - "DownloadClientSettingsDefaultCategoryHelpText": "Categoria alternativa predeterminada si no hi ha cap categoria assignada per a un llançament. Afegir una categoria específica a {appName} evita conflictes amb baixades no relacionades amb {appName}. L'ús d'una categoria és opcional, però molt recomanable.", - "EditCategory": "Edita la categoria", - "IndexerQuery": "Consulta de l'indexador", - "IndexerSettingsBaseUrl": "Url base", - "IndexerSettingsCookieHelpText": "Cookie del lloc", - "IndexerSettingsLimitsUnitHelpText": "La unitat de temps per comptar els límits per indexador", - "IndexerSettingsPackSeedTime": "Temps de la llavor del paquet", - "IndexerSite": "Lloc indexador", - "IndexerTagsHelpTextWarning": "Les etiquetes s'han d'utilitzar amb precaució, poden tenir efectes no desitjats. Un indexador amb una etiqueta només sincronitzarà amb aplicacions amb la mateixa etiqueta.", - "IndexerSettingsSummary": "Configura diversos paràmetres globals de l'indexador.", - "ManageApplications": "Gestiona les aplicacions", - "PackSeedTimeHelpText": "L'hora en què un paquet (temporada o discografia) s'ha de sembrar el torrent abans d'aturar-se, buit és el valor predeterminat de l'aplicació", - "PreferMagnetUrl": "Prefereix l'URL de l'imant", - "PreferMagnetUrlHelpText": "Quan està activat, aquest indexador preferirà l'ús d'URLs magnet per a les captures amb enllaços de reserva a torrents", - "ProwlarrDownloadClientsInAppOnlyAlert": "Els clients de baixada només són per a les cerques a l'aplicació {appName} i no sincronitzen amb les aplicacions. No hi ha plans per afegir aquesta funcionalitat.", - "IndexerBeyondHDSettingsRewindOnly": "Només rebobina", - "ProxyValidationUnableToConnect": "No s'ha pogut connectar al servidor intermediari: {exceptionMessage}. Comprova els detalls del registre que envolta aquest error", - "QueryOptions": "Opcions de la consulta", - "TestAllApps": "Prova totes les aplicacions", - "TotalHostQueries": "Total de consultes de l'amfitrió", - "AverageGrabs": "Mitjana d'herba", - "AverageQueries": "Mitjana de consultes", - "FilterPlaceHolder": "Cerca indexadors", - "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Cerca només freeleech (Limited UL)", - "IndexerBeyondHDSettingsApiKeyHelpText": "Clau API del lloc (trobada a Seguretat => Clau API)", - "IndexerSettingsVipExpiration": "Caducitat VIP", - "IndexerVipExpiringHealthCheckMessage": "Els beneficis VIP de l'indexador expiraran aviat: {indexerNames}", - "LastFailure": "Darrera fallada", - "MovieSearch": "Cerca de pel·lícules", - "MovieSearchTypes": "Tipus de cerca de pel·lícules", - "MusicSearchTypes": "Tipus de cerca de música", - "QueryType": "Tipus de consulta", - "RssQueries": "Consultes RSS", - "SyncLevelFull": "Sincronització completa: mantindrà els indexadors d'aquesta aplicació completament sincronitzats. Els canvis fets als indexadors a {appName} se sincronitzen amb aquesta aplicació. Qualsevol canvi fet a indexadors remotament dins d'aquesta aplicació serà anul·lat per {appName} en la següent sincronització.", - "TotalHostGrabs": "Total d'amfitrions", - "TotalQueries": "Total de consultes", - "NoApplicationsFound": "No s'ha trobat cap aplicació", - "SyncProfiles": "Sincronitza els perfils", - "TorznabUrl": "Url Torznab", - "TvSearch": "Cerca de TV", - "DeleteIndexerProxy": "Suprimeix el servidor intermediari de l'indexador", - "DisabledUntil": "Desactivat fins", - "GrabTitle": "Captura el títol", - "SettingsIndexerLoggingHelpText": "Registra dades addicionals de l'indexador", - "SyncLevel": "Nivell de sincronització", - "AdvancedSettingsHiddenClickToShow": "Configuració avançada oculta, feu clic per mostrar", - "AdvancedSettingsShownClickToHide": "Configuració avançada mostrada, feu clic per amagar", - "AppsMinimumSeeders": "Aplicacions de cercadors mínims", - "AppsMinimumSeedersHelpText": "«Mínims filtradors requerits per les Aplicacions perquè l'indexador s'agafi", - "CountIndexersAvailable": "{count} indexador(s) disponible", - "HistoryCleanup": "Neteja de l'historial", - "HistoryDetails": "Detalls de l'historial", - "SettingsFilterSentryEventsHelpText": "Filtra els esdeveniments d'error d'usuari coneguts perquè s'enviïn com a Analytics", - "MappedCategories": "Categories assignades", - "AppSettingsSummary": "Aplicacions i paràmetres per configurar com {appName} interactua amb els vostres programes PVR", - "ConnectSettingsSummary": "Notificacions i scripts personalitzats", - "DeleteClientCategory": "Suprimeix la categoria del client de baixada", - "FullSync": "Sincronització completa", - "IndexerAlreadySetup": "Almenys una instància de l'indexador ja està configurada", - "RawSearchSupported": "S'admet la cerca RAW", - "RssFeed": "Canal RSS", - "SearchTypes": "Tipus de cerca", - "SeedRatioHelpText": "La relació a la qual ha d'arribar un torrent abans d'aturar-se, buida és la predeterminada de l'aplicació", - "SemiPrivate": "Semi-Privada", - "TotalIndexerQueries": "Total de consultes de l'indexador", - "TotalUserAgentQueries": "Total de consultes d'agents d'usuari", - "GoToApplication": "Ves a l'aplicació", - "Url": "Url", - "AreYouSureYouWantToDeleteIndexer": "Esteu segur que voleu suprimir '{name}' de {appName}?", - "AverageResponseTimesMs": "Temps mitjà de resposta de l'indexador (ms)", - "FoundCountReleases": "S'han trobat {itemCount} versions", - "AuthQueries": "Consultes d'Autorització", - "BasicSearch": "Cerca bàsica", - "IndexerName": "Nom de l'indexador", - "IndexerStatus": "Estat de l'indexador", - "IndexerTagsHelpText": "Utilitzeu etiquetes per especificar els intermediaris de l'indexador o a quines aplicacions se sincronitza l'indexador.", - "NewznabUrl": "Url Newznab", - "SearchCountIndexers": "Cerca {count} indexador", - "UnableToLoadDevelopmentSettings": "No s'han pogut carregar els paràmetres de desenvolupament", - "SettingsFilterSentryEvents": "Filtra els esdeveniments d'anàlisi", - "ApplicationTagsHelpText": "Sincronitza els indexadors d'aquesta aplicació que tenen una o més etiquetes coincidents. Si no es llisten etiquetes aquí, llavors no s'impedirà la sincronització d'indexadors a causa de les seves etiquetes.", - "ApplicationTagsHelpTextWarning": "Les etiquetes s'han d'utilitzar amb precaució, poden tenir efectes no desitjats. Una aplicació amb una etiqueta només sincronitzarà amb els indexadors que tinguin la mateixa etiqueta.", - "DeleteSelectedApplications": "Suprimeix les aplicacions seleccionades", - "DownloadClientsSettingsSummary": "Baixa la configuració dels clients per a la integració a la cerca de la interfície d'usuari {appName}", - "ElapsedTime": "Temps transcorregut", - "EnableIndexer": "Habilita l'indexador", - "EnableRssHelpText": "Habilita el canal RSS per a l'indexador", - "IncludeManualGrabsHelpText": "Inclou les notes manuals fetes a {appName}", - "IndexerFailureRate": "Taxa de fallada de l'indexador", - "ProwlarrSupportsAnyDownloadClient": "{appName} admet qualsevol dels clients de baixada que es llisten a continuació.", - "TotalGrabs": "Grabs totals", - "IndexerDetails": "Detalls de l'indexador", - "IndexerPriorityHelpText": "Prioritat de l'indexador des de l'1 (el més alt) fins al 50 (el més oest). Per defecte: 25.", - "IndexerProxy": "Servidor intermediari de l'indexador", - "UISettingsSummary": "Opcions de data, idioma i color defectuoses", - "IndexerCategories": "Categories de l'indexador", - "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", - "SearchCapabilities": "Capacitats de cerca", - "SearchType": "Tipus de cerca", - "SettingsLogSql": "Registre Sql", - "SyncLevelAddRemove": "Afegeix i elimina només: quan s'afegeixen o s'eliminen els indexadors de {appName}, s'actualitzarà aquesta aplicació remota.", - "IndexerProxies": "Propis de l'indexador", - "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronitza les fulles del torrent de la llista de blocs en bloc mentre s'agafa", - "CertificateValidationHelpText": "Canvia l'estricta validació de la certificació HTTPS", - "IndexerDisabled": "Indexador desactivat", - "IndexerFileListSettingsPasskeyHelpText": "Contrasenya del lloc (Aquesta és la cadena alfanumèrica a l'URL del seguidor que es mostra al client de baixada)", - "IndexerSettingsQueryLimit": "Límit de consulta", - "IndexerHDBitsSettingsPasskeyHelpText": "Contrasenya dels detalls de l'usuari", - "IndexerSettingsPasskey": "Clau de pas", - "ClickToChangeQueryOptions": "Feu clic per a canviar les opcions de consulta", - "EnabledRedirected": "Activat, redirigit", - "Parameters": "Paràmetres", - "QueryResults": "Resultats de la consulta", - "RedirectHelpText": "Redirigeix la sol·licitud de baixada entrant per a l'indexador i passa la captura directament en lloc de intermediaris a través de {appName}", - "UnableToLoadIndexerProxies": "No s'han pogut carregar els intermediaris de l'indexador", - "IndexerId": "ID de l'indexador", - "IndexerAlphaRatioSettingsExcludeScene": "Exclou l'escena", - "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Exclou els llançaments d'escenes dels resultats", - "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", - "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", - "IndexerFileListSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", - "IndexerFileListSettingsUsernameHelpText": "Nom d'usuari del lloc", - "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Cerca publicacions per noms de grup", - "IndexerHDBitsSettingsOrigins": "Orígens", - "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "Agent d'usuari associat a la cookie utilitzada des del navegador", - "IndexerNewznabSettingsApiKeyHelpText": "Clau de l'API del lloc", - "IndexerNzbIndexSettingsApiKeyHelpText": "Clau de l'API del lloc", - "IndexerSettingsAppsMinimumSeedersHelpText": "«Mínims filtradors requerits per les Aplicacions perquè l'indexador s'agafi", - "IndexerSettingsFreeleechOnly": "Només Freeleech", - "IndexerSettingsGrabLimit": "Límit de captura", - "IndexerSettingsLimitsUnit": "Unitats de límits", - "IndexerSettingsRssKey": "Clau RSS", - "SelectIndexers": "Selecciona els indexadors", - "SettingsSqlLoggingHelpText": "Registra totes les consultes SQL de {appName}", - "SyncAppIndexers": "Sincronitza els indexadors d'aplicacions", - "AppProfileInUse": "Perfil d'aplicació en ús", - "DeleteAppProfile": "Suprimeix el perfil de l'aplicació", - "TVSearchTypes": "Tipus de cerca de TV", - "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", - "IndexerMTeamTpSettingsApiKeyHelpText": "Clau API del Lloc (trobada a Tauler de control de l'usuari => Seguretat => Laboratori)", - "MinimumSeedersHelpText": "Visors mínims requerits per l'aplicació perquè l'indexador s'agafi", - "NoIndexerHistory": "No s'ha trobat cap historial per a aquest indexador", - "SearchQueries": "Cerca consultes", - "SettingsConsoleLogLevel": "Nivell de registre de la consola", - "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Només blat de moro daurat", - "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Cerca només els llançaments Golden Popcorn", - "Open": "Obre", - "ProwlarrDownloadClientsAlert": "Si voleu fer cerques directament dins de {appName}, heu d'afegir Clients de Baixades. En cas contrari, no cal afegir-les aquí. Per a les cerques des de les teves Apps, els clients de descàrrega configurats s'utilitzen en el seu lloc.", - "Website": "Lloc web", - "DownloadClientQbittorrentSettingsUseSslHelpText": "Utilitza una connexió segura. Vegeu Opcions -> Interfície web -> 'Utilitza HTTPS en comptes d'HTTP' a qBittorrent.", - "IndexerAvistazSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", - "IndexerAvistazSettingsPasswordHelpText": "Contrasenya del lloc", - "IndexerAvistazSettingsPidHelpText": "PID de la pàgina del meu compte o del meu perfil", - "IndexerAvistazSettingsUsernameHelpText": "Nom d'usuari del lloc", - "IndexerAvistazSettingsUsernameHelpTextWarning": "Només el rang de membre i superior pot utilitzar l'API en aquest indexador.", - "SelectedCountOfCountReleases": "S'han seleccionat {selectedCount} de les versions {itemCount}", - "SettingsLogRotate": "Rotació del registre", - "AreYouSureYouWantToDeleteCategory": "Esteu segur que voleu suprimir la categoria assignada?", - "Book": "Llibre" + "CurrentlyInstalled": "Instal·lat actualment" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 21975a02e..48fb9848c 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -23,7 +23,7 @@ "ProxyType": "Typ serveru proxy", "Reddit": "Reddit", "ErrorLoadingContents": "Chyba při načítání obsahu", - "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Všechny indexery jsou nedostupné z důvodu selhání déle než 6 hodin", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání po dobu delší než 6 hodin", "RemovedFromTaskQueue": "Odebráno z fronty úkolů", "ResetAPIKey": "Resetovat klíč API", "SSLCertPassword": "Heslo SSL Cert", @@ -52,10 +52,10 @@ "IncludeHealthWarningsHelpText": "Včetně varování ohledně zdraví", "Indexer": "Indexer", "IndexerFlags": "Příznaky indexeru", - "IndexerPriority": "Priorita indexeru", - "IndexerPriorityHelpText": "Priorita indexeru od 1 (Nejvyšší) do 50 (Nejnižší). Výchozí: 25.", + "IndexerPriority": "Priorita indexování", + "IndexerPriorityHelpText": "Priorita indexování od 1 (nejvyšší) do 50 (nejnižší). Výchozí: 25.", "Indexers": "Indexery", - "IndexerStatusAllUnavailableHealthCheckMessage": "Všechny indexery jsou nedostupné z důvodu selhání", + "IndexerStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání", "LastWriteTime": "Čas posledního zápisu", "Level": "Úroveň", "LogLevel": "Úroveň protokolu", @@ -73,8 +73,8 @@ "ApiKey": "Klíč API", "AppDataDirectory": "Adresář AppData", "AppDataLocationHealthCheckMessage": "Aktualizace nebude možná, aby se zabránilo odstranění AppData při aktualizaci", - "ApplicationStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu selhání", - "ApplicationStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu selhání: {0}", + "ApplicationStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu poruch", + "ApplicationStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu poruch: {0}", "Apply": "Použít", "Branch": "Větev", "BranchUpdate": "Větev použitá k aktualizaci {appName}u", @@ -105,7 +105,7 @@ "Tasks": "Úkoly", "Test": "Test", "UnableToLoadTags": "Značky nelze načíst", - "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Všechny proxy indexerů jsou nedostupné z důvodu selhání", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání", "ApplyTags": "Použít štítky", "MoreInfo": "Více informací", "System": "Systém", @@ -183,7 +183,7 @@ "BypassProxyForLocalAddresses": "Obcházení proxy serveru pro místní adresy", "DeleteIndexerProxyMessageText": "Opravdu chcete odstranit proxy indexeru ‚{name}‘?", "DeleteTag": "Odstranit štítek", - "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxy indexerů nedostupné z důvodu selhání: {indexerProxyNames}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání: {indexerProxyNames}", "Name": "název", "New": "Nový", "Protocol": "Protokol", @@ -265,7 +265,7 @@ "Exception": "Výjimka", "ExistingTag": "Stávající štítek", "IllRestartLater": "Restartuji později", - "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání déle než 6 hodin: {indexerNames}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání po dobu delší než 6 hodin: {indexerNames}", "IndexerStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání: {indexerNames}", "SettingsTimeFormat": "Časový formát", "ShowAdvanced": "Zobrazit pokročilé", @@ -320,8 +320,8 @@ "UnableToLoadIndexers": "Nelze načíst indexery", "Yes": "Ano", "GrabReleases": "Získat vydání", - "ApplicationLongTermStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu selhání déle než 6 hodin: {0}", - "ApplicationLongTermStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu selhání déle než 6 hodin", + "ApplicationLongTermStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu poruchy po dobu delší než 6 hodin: {0}", + "ApplicationLongTermStatusCheckAllClientMessage": "Všechny aplikace jsou z důvodu poruchy nedostupné déle než 6 hodin", "Ended": "Ukončeno", "LastDuration": "lastDuration", "LastExecution": "Poslední poprava", @@ -370,8 +370,8 @@ "Artist": "Umělec", "EditIndexerImplementation": "Upravit indexer - {implementationName}", "Episode": "Epizoda", - "NotificationStatusAllClientHealthCheckMessage": "Všechna oznámení jsou nedostupná z důvodu selhání", - "NotificationStatusSingleClientHealthCheckMessage": "Oznámení nedostupná z důvodu selhání: {notificationNames}", + "NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání", + "NotificationStatusSingleClientHealthCheckMessage": "Seznamy nejsou k dispozici z důvodu selhání: {notificationNames}", "Application": "Aplikace", "AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}", "Encoding": "Kódování", @@ -409,7 +409,7 @@ "days": "dnů", "Id": "ID", "CountApplicationsSelected": "{count} vybraných aplikací", - "IndexerHDBitsSettingsCodecs": "Kodeky", + "IndexerHDBitsSettingsCodecs": "Kodek", "IndexerHDBitsSettingsMediums": "Střední", "Directory": "Adresář", "CustomFilter": "Vlastní filtr", @@ -558,86 +558,5 @@ "IndexerSettingsAppsMinimumSeeders": "Minimální počet seederů aplikací", "UsenetBlackholeNzbFolder": "Složka Nzb", "SearchIndexers": "Hledat indexery", - "IndexerSettingsAppsMinimumSeedersHelpText": "Minimální počet seederů požadovaných aplikacemi pro indexer, výchozí hodnota synchronizačního profilu je prázdná", - "IndexerProxy": "Proxy indexeru", - "IndexerBeyondHDSettingsRssKeyHelpText": "Klíč RSS ze stránky (Naleznete v Moje zabezpečení => Klíč RSS)", - "IndexerHDBitsSettingsCodecsHelpText": "Pokud není zadáno, použijí se všechny možnosti.", - "IndexerHDBitsSettingsUsernameHelpText": "Uživatelské jméno stránky", - "IndexerAvistazSettingsUsernameHelpTextWarning": "Rozhraní API v tomto indexeru mohou používat pouze hodnosti člen a vyšší.", - "IndexerBeyondHDSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Moje zabezpečení => Klíč API)", - "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "IndexerProxies": "Proxy indexeru", - "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "IndexerHistoryLoadError": "Chyba při načítání historie indexeru", - "IndexerId": "ID indexeru", - "IndexerNoDefinitionCheckHealthCheckMessage": "Indexery nemají žádnou definici a nebudou fungovat: {indexerNames}. Odeberte je a (nebo) znovu přidejte do {appName}.", - "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Vyloučit vydání SCENE z výsledků", - "IndexerAlreadySetup": "Alespoň jedna instance indexeru je již nastavena", - "IndexerAvistazSettingsPasswordHelpText": "Heslo stránky", - "IndexerAvistazSettingsPidHelpText": "PID ze stránky Můj účet nebo Můj profil", - "IndexerAvistazSettingsUsernameHelpText": "Uživatelské jméno stránky", - "IndexerBeyondHDSettingsLimitedOnly": "Pouze omezené", - "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Hledat pouze freeleech (Omezené nahrávání)", - "IndexerCategories": "Kategorie indexeru", - "IndexerDisabled": "Indexer zakázán", - "IndexerDownloadClientHealthCheckMessage": "Indexery s neplatnými klienty pro stahování: {indexerNames}.", - "IndexerDownloadClientHelpText": "Určete, který klient pro stahování se použije pro grabování v rámci {appName} z tohoto indexeru", - "IndexerFailureRate": "Míra selhání indexeru", - "IndexerFileListSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "IndexerFileListSettingsPasskeyHelpText": "Přístupový klíč stránky (Jedná se o alfanumerický řetězec v url adrese trackeru zobrazené v klientovi pro stahování)", - "IndexerGazelleGamesSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)", - "IndexerGazelleGamesSettingsSearchGroupNames": "Hledat názvy skupin", - "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Zobrazit pouze freeleech vydání", - "IndexerHDBitsSettingsOriginsHelpText": "Pokud není zadáno, použijí se všechny možnosti.", - "IndexerHDBitsSettingsUseFilenames": "Použít názvy souborů", - "IndexerHealthCheckNoIndexers": "Nejsou povoleny žádné indexery, {appName} nevrátí výsledky vyhledávání", - "IndexerIPTorrentsSettingsCookieUserAgent": "Uživatelský agent cookie", - "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "Uživatelský agent přidružený cookie použitý z prohlížeče", - "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "IndexerNebulanceSettingsApiKeyHelpText": "Klíč API z Nastavení uživatele > Klíče API. Klíč musí mít oprávnění Seznam a Stáhnout", - "IndexerNewznabSettingsAdditionalParametersHelpText": "Dodatečné parametry Newznab", - "IndexerNewznabSettingsApiKeyHelpText": "Klíč API stránky", - "IndexerObsoleteCheckMessage": "Indexery jsou zastaralé nebo byly aktualizovány: {0}. Odeberte je a (nebo) znovu přidejte do {appName}", - "IndexerOrpheusSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)", - "IndexerPassThePopcornSettingsApiUserHelpText": "Tato nastavení naleznete v nastavení zabezpečení PassThePopcorn (Upravit profil > Zabezpečení).", - "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "IndexerRedactedSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)", - "IndexerRss": "RSS indexeru", - "LastFailure": "Poslední selhání", - "IndexerSettingsAdditionalParameters": "Dodatečné parametry", - "IndexerSettingsApiPath": "Cesta k API", - "IndexerSettingsApiUser": "Uživatel API", - "IndexerAuth": "Ověření indexeru", - "IndexerInfo": "Informace o indexeru", - "IndexerName": "Název indexeru", - "IndexerDetails": "Podrobnosti indexeru", - "IndexerHDBitsSettingsPasskeyHelpText": "Přístupový klíč z Podrobnosti o uživateli", - "IndexerQuery": "Dotaz na indexer", - "IndexerAlphaRatioSettingsExcludeScene": "Vyloučit SCENE", - "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "IndexerBeyondHDSettingsSearchTypes": "Hledat typy", - "IndexerBeyondHDSettingsSearchTypesHelpText": "Vyberte typy vydání, které vás zajímají. Pokud není vybrán žádný, použijí se všechny možnosti.", - "IndexerFileListSettingsUsernameHelpText": "Uživatelské jméno stránky", - "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Musí mít oprávnění Uživatel a Torrenty", - "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Hledat vydání podle názvů skupin", - "IndexerHDBitsSettingsMediumsHelpText": "Pokud není zadáno, použijí se všechny možnosti.", - "IndexerHDBitsSettingsUseFilenamesHelpText": "Zaškrtněte tuto možnost, pokud chcete používat názvy souborů torrentů jako názvy vydání", - "IndexerNewznabSettingsVipExpirationHelpText": "Zadejte datum (rrrr-mm-dd) pro vypršení VIP nebo prázdné, {appName} bude upozorňovat 1 týden před vypršením VIP", - "IndexerNzbIndexSettingsApiKeyHelpText": "Klíč API stránky", - "IndexerPassThePopcornSettingsApiKeyHelpText": "Klíč API stránky", - "IndexerMTeamTpSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Uživatelský ovládací panel => Zabezpečení => Laboratoř)", - "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Pouze Golden Popcorn", - "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Hledat pouze vydání Golden Popcorn", - "IndexerSettingsApiPathHelpText": "Cesta k api, obvykle {url}", - "IndexerAvistazSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "InitialFailure": "Úvodní selhání", - "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Klíč API stránky", - "SearchTypes": "Hledat typy", - "NotificationTriggersHelpText": "Vyber, které události mají vyvolat toto upozornění", - "IndexerSettingsBaseUrl": "Základní URL", - "DownloadClientUTorrentProviderMessage": "uTorrent má historii zahrnování kryptoměnových těžařů, malwaru a reklam, důrazně vám doporučujeme zvolit jiného klienta.", - "IndexerSettingsBaseUrlHelpText": "Vyberte, jakou základní URL bude {appName} používat pro požadavky na web", - "IndexerSettingsPackSeedTimeIndexerHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace", - "PackSeedTimeHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace" + "IndexerSettingsAppsMinimumSeedersHelpText": "Minimální počet seederů požadovaných aplikacemi pro indexer, výchozí hodnota synchronizačního profilu je prázdná" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index b07ede40b..1e2c052f2 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -87,13 +87,13 @@ "Delete": "Löschen", "DeleteAppProfile": "App-Profil löschen", "DeleteApplication": "Applikation löschen", - "DeleteApplicationMessageText": "Bist du sicher, dass du die Anwendung „{name}“ löschen möchtest?", + "DeleteApplicationMessageText": "Wirklich die Applikation '{0}' löschen?", "DeleteBackup": "Sicherung löschen", "DeleteBackupMessageText": "Soll das Backup '{name}' wirklich gelöscht werden?", "DeleteDownloadClient": "Download-Client löschen", "DeleteDownloadClientMessageText": "Bist du sicher, dass du den Download Client '{name}' wirklich löschen willst?", "DeleteIndexerProxy": "Indexer Proxy löschen", - "DeleteIndexerProxyMessageText": "Bist du sicher, dass du den Indexer-Proxy „{name}“ löschen möchtest?", + "DeleteIndexerProxyMessageText": "Tag '{0}' wirklich löschen?", "DeleteNotification": "Benachrichtigung löschen", "DeleteNotificationMessageText": "Bist du sicher, dass du die Benachrichtigung '{name}' wirklich löschen willst?", "DeleteTag": "Tag löschen", @@ -165,7 +165,7 @@ "HomePage": "Hauptseite", "Host": "Host", "Hostname": "Hostname", - "Id": "ID", + "Id": "Id", "IgnoredAddresses": "Ignorierte Adressen", "IllRestartLater": "Später neustarten", "IncludeHealthWarningsHelpText": "Zustandswarnung", @@ -193,7 +193,7 @@ "IndexerSite": "Indexer-Seite", "IndexerStatusAllUnavailableHealthCheckMessage": "Alle Indexer sind aufgrund von Fehlern nicht verfügbar", "IndexerStatusUnavailableHealthCheckMessage": "Indexer nicht verfügbar aufgrund von Fehlern: {indexerNames}", - "IndexerTagsHelpText": "Verwende Tags, um Indexer-Proxys oder die Apps, mit denen der Indexer synchronisiert wird, anzugeben.", + "IndexerTagsHelpText": "Benutze Tags, um Indexer-Proxies zu spezifizieren, mit welchen Apps der Indexer synchronisiert oder um Indexer zu organisieren.", "IndexerVipExpiredHealthCheckMessage": "Die VIP Indexer Vorteile sind abgelaufen: {indexerNames}", "IndexerVipExpiringHealthCheckMessage": "Die Indexer VIP Vorteile verfallen bald: {indexerNames}", "Indexers": "Indexer", @@ -254,7 +254,7 @@ "Ok": "Ok", "OnApplicationUpdate": "Bei Anwendungsaktualisierung", "OnApplicationUpdateHelpText": "Bei Anwendungsaktualisierung", - "OnGrab": "Bei Release-Grabs", + "OnGrab": "Bei Erfassung", "OnHealthIssue": "Bei Gesundheitsproblem", "OnHealthIssueHelpText": "Zustandsproblem", "OpenBrowserOnStart": "Browser beim Start öffnen", @@ -276,7 +276,7 @@ "Privacy": "Privatsphäre", "Private": "Privat", "Protocol": "Protokoll", - "ProwlarrSupportsAnyDownloadClient": "{appName} unterstützt jeden der unten aufgeführten Download-Clients.", + "ProwlarrSupportsAnyDownloadClient": "Jeder Downloader der den Newznab-Standard verwendet oder unten aufgelistet ist wird untertützt.", "ProwlarrSupportsAnyIndexer": "{appName} unterstützt alle Indexer, welcher den Newznab/Torznab Standard implementiert (verwende 'Generic Newznab' (für Usenet) oder 'Generic Torznab' (für Torrents)) und darüber hinaus viele weitere Indexer. Wählen Sie im Folgenden Ihren Indexer aus der Liste.", "Proxies": "Proxies", "Proxy": "Proxy", @@ -395,7 +395,7 @@ "TestAllClients": "Prüfe alle Clients", "TestAllIndexers": "Prüfe alle Indexer", "OnLatestVersion": "Die neueste Version von {appName} ist bereits installiert", - "ThemeHelpText": "Ändere das UI-Design der Anwendung, das 'Auto'-Design verwendet das Betriebssystem-Design, um den Hell- oder Dunkelmodus festzulegen. Inspiriert von {inspiredBy}.", + "ThemeHelpText": "Ändere das UI-Theme der Anwendung. Das 'Auto'-Theme verwendet dein Betriebssystem-Theme, um den hellen oder dunklen Modus einzustellen. Inspiriert von {0}", "Time": "Zeit", "Title": "Titel", "Today": "Heute", @@ -406,7 +406,7 @@ "Type": "Typ", "UI": "Oberfläche", "UILanguage": "Oberflächen Sprache ( UI Language )", - "UILanguageHelpText": "Sprache, die {appName} für die Benutzeroberfläche verwenden wird", + "UILanguageHelpText": "Sprache für die gesamte Oberfläche", "UILanguageHelpTextWarning": "Webseite muss neu geladen werden", "UISettings": "Benutzeroberflächen Einstellungen", "UISettingsSummary": "Optionen für Datum, Sprache und Farbbeinträchtigungen", @@ -461,7 +461,7 @@ "ApplyChanges": "Änderungen anwenden", "CountIndexersSelected": "{count} Indexer ausgewählt", "DeleteSelectedDownloadClients": "Lösche Download Client(s)", - "DeleteSelectedApplicationsMessageText": "Bist du sicher, dass du {count} ausgewählte Anwendung(en) löschen möchtest?", + "DeleteSelectedApplicationsMessageText": "Indexer '{0}' wirklich löschen?", "DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?", "DeleteSelectedIndexersMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte(n) Indexer löschen möchten?", "EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten", @@ -518,7 +518,7 @@ "ActiveApps": "Aktive Apps", "ActiveIndexers": "Aktive Indexer", "AppsMinimumSeeders": "Apps Mindestanzahl von Seedern", - "ApplicationTagsHelpText": "Indexer mit dieser Anwendung synchronisieren, die mindestens einen übereinstimmenden Tag haben. Wenn hier keine Tags aufgeführt sind, wird kein Indexer aufgrund seiner Tags von der Synchronisierung ausgeschlossen.", + "ApplicationTagsHelpText": "Synchronisiere Indexer für diese Anwendung die keine passenden Tags oder mindestens 1 passendes Tag haben", "ApplicationTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.", "AddApplicationImplementation": "Anwendung hinzufügen - {implementationName}", "AddConnectionImplementation": "Verbindung hinzufügen - {implementationName}", @@ -670,141 +670,5 @@ "SeedRatio": "Seed-Verhältnis", "SeedTime": "Seed-Zeit", "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Wenn ein Torrent durch einen Hash blockiert wird, wird er möglicherweise nicht korrekt abgelehnt während RSS/Recherche für einige Indexer. Diese Option aktiviert die Ablehnung des Torrents nach dem Abrufen, aber bevor er an den Client gesendet wird.", - "IndexerHDBitsSettingsOriginsHelpText": "Wenn nicht angegeben, werden alle Optionen verwendet.", - "IndexerSettingsGrabLimit": "Grab-Limit", - "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Nur nach Freeleech suchen (Begrenztes UL)", - "IndexerFileListSettingsPasskeyHelpText": "Site Passkey (Dies ist die alphanumerische Zeichenfolge in der Tracker-URL, die in deinem Download-Client angezeigt wird)", - "IndexerIPTorrentsSettingsCookieUserAgent": "Cookie-Benutzer-Agent", - "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Standard-Fallback-Kategorie, wenn für eine Veröffentlichung keine zugeordnete Kategorie existiert. Das Hinzufügen einer für {appName} spezifischen Kategorie vermeidet Konflikte mit nicht verwandten {appName}-Downloads. Die Verwendung einer Kategorie ist optional, aber dringend empfohlen. Eine [Kategorie]-Unterverzeichnis wird im Ausgabeverzeichnis erstellt.", - "IndexerBeyondHDSettingsRssKeyHelpText": "RSS-Schlüssel von der Website (zu finden unter Mein Sicherheitsbereich => RSS-Schlüssel)", - "IndexerHDBitsSettingsUseFilenamesHelpText": "Aktiviere diese Option, wenn du Torrent-Dateinamen als Releasetitel verwenden möchtest", - "IndexerSettingsAppsMinimumSeedersHelpText": "Minimale benötigte Seeder von den Anwendungen, damit der Indexer greifen kann; leer ist die Standardeinstellung des Sync-Profils", - "IndexerGazelleGamesSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)", - "IndexerPassThePopcornSettingsApiUserHelpText": "Diese Einstellungen findest du in deinen PassThePopcorn-Sicherheitseinstellungen (Profil bearbeiten > Sicherheit).", - "IndexerSettingsQueryLimitHelpText": "Die maximale Anzahl an Queries, die {appName} der Seite gemäß der jeweiligen Einheit erlauben wird", - "IndexerRedactedSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)", - "IndexerSettingsQueryLimit": "Query Limit", - "PackSeedTimeHelpText": "Die Zeit, die ein Pack (Season oder Diskographie)-Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App", - "TotalIndexerSuccessfulGrabs": "Gesamtanzahl erfolgreicher Indexer-Suchanfragen", - "ProwlarrDownloadClientsInAppOnlyAlert": "Download-Clients sind nur für In-App-Suchen in {appName} und synchronisieren sich nicht mit Apps. Es sind keine Pläne vorgesehen, eine solche Funktionalität hinzuzufügen.", - "TotalUserAgentGrabs": "Gesamtanzahl der User-Agent-Grabs", - "DefaultCategory": "Standardkategorie", - "IndexerDownloadClientHelpText": "Gib an, welcher Download-Client für Grab-Vorgänge, die innerhalb von {appName} von diesem Indexer durchgeführt werden, verwendet wird", - "IndexerHistoryLoadError": "Fehler beim Laden der Indexer-Historie", - "IndexerNzbIndexSettingsApiKeyHelpText": "Website-API-Key", - "IndexerPassThePopcornSettingsApiKeyHelpText": "Website-API-Key", - "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Sucher nur Golden Popcorn Releases", - "IndexerSettingsCookieHelpText": "Website Cookie", - "IndexerSettingsPackSeedTimeIndexerHelpText": "Die Zeit, die ein Pack (Season oder Diskographie)-Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App", - "SearchAllIndexers": "Alle Indexer durchsuchen", - "SearchCountIndexers": "Suche {count} Indexer(s)", - "SeedTimeHelpText": "Die Zeit, die ein Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App", - "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", - "IndexerNewznabSettingsVipExpirationHelpText": "Gib das Datum (yyyy-mm-dd) für das VIP-Ablaufdatum ein oder lasse es leer, {appName} benachrichtigt eine Woche vor Ablauf des VIP", - "ProxyValidationUnableToConnect": "Kann nicht mit dem Proxy verbunden werden: {exceptionMessage}. Überprüfe das Protokoll rund um diesen Fehler für Details", - "IndexerId": "Indexer ID", - "OnGrabHelpText": "Bei Release Grab", - "AuthQueries": "Authentifizierungsanfragen", - "PackSeedTime": "Pack-Seed-Zeit", - "DeleteSelectedApplications": "Ausgewählte Anwendungen löschen", - "DownloadClientSettingsDefaultCategoryHelpText": "Standard-Fallback-Kategorie, wenn für eine Veröffentlichung keine zugeordnete Kategorie existiert. Das Hinzufügen einer für {appName} spezifischen Kategorie vermeidet Konflikte mit nicht verwandten {appName}-Downloads. Die Verwendung einer Kategorie ist optional, aber dringend empfohlen.", - "FoundCountReleases": "{itemCount} Veröffentlichungen gefunden", - "IncludeManualGrabsHelpText": "Manuelle Abrufe, die innerhalb von {appName} gemacht wurden, einbeziehen", - "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Veröffentlichungen suchen", - "IndexerBeyondHDSettingsApiKeyHelpText": "API-Schlüssel von der Website (zu finden in „Meine Sicherheit“ => „API-Schlüssel“)", - "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Releases suchen", - "IndexerBeyondHDSettingsRefundOnlyHelpText": "Nur nach Rückerstattungen suchen", - "IndexerDisabled": "Indexer deaktiviert", - "IndexerFileListSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", - "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Suche Veröffentlichungen nach Gruppennamen", - "IndexerNebulanceSettingsApiKeyHelpText": "API-Schlüssel aus den Benutzereinstellungen > API-Schlüssel. Der Schlüssel muss List- und Download-Berechtigungen haben", - "IndexerSettingsGrabLimitHelpText": "Die maximale Anzahl an Grabs, die {appName} der Seite erlauben wird, wie von der jeweiligen Einheit festgelegt", - "IndexerSettingsLimitsUnit": "Limits-Einheit", - "IndexerSettingsLimitsUnitHelpText": "Die Zeiteinheit zur Berechnung der Limits pro Indexer", - "IndexerStatus": "Indexer Status", - "LastFailure": "Letzter Fehler", - "ManageApplications": "Applikationen verwalten", - "NoApplicationsFound": "Keine Applikationen gefunden", - "NoIndexerCategories": "Keine Kategorien für diesen Indexer gefunden", - "NoIndexerHistory": "Keine Historie für diesen Indexer gefunden", - "Open": "Offen", - "OverrideAndAddToDownloadClient": "Überschreiben und zum Download-Client hinzufügen", - "PreferMagnetUrl": "Magnet URL bevorzugen", - "PreferMagnetUrlHelpText": "Wenn aktiviert, wird dieser Indexer die Verwendung von Magnet-URLs für Grabs bevorzugen, mit Rückfall auf Torrent-Links", - "RssQueries": "RSS Anfragen", - "TotalHostGrabs": "Gesamtanzahl der Host-Grabs", - "TotalHostQueries": "Gesamtanzahl der Host-Suchanfragen", - "SeedRatioHelpText": "Das Verhältnis, das ein Torrent erreichen sollte, bevor er gestoppt wird. Leer ist die Standardeinstellung der App", - "AverageGrabs": "Durchschnittliche Abrufe", - "AverageQueries": "Durchschnittliche Anfragen", - "SelectedCountOfCountReleases": "Ausgewählt {selectedCount} von {itemCount} Releases", - "NewznabUrl": "Newznab Url", - "QueryType": "Abfragetyp", - "DisabledUntil": "Deaktiviert bis", - "MappedCategories": "Zuordnete Kategorien", - "AreYouSureYouWantToDeleteIndexer": "Bist du sicher, dass du „{name}“ aus {appName} löschen möchtest?", - "TotalIndexerQueries": "Gesamtanzahl der Indexer-Suchanfragen", - "ProwlarrDownloadClientsAlert": "Wenn du beabsichtigst, direkt innerhalb von {appName} zu suchen, musst du Download-Clients hinzufügen. Andernfalls musst du sie hier nicht hinzufügen. Für Suchen aus deinen Apps werden stattdessen die dort konfigurierten Download-Clients verwendet.", - "AppsMinimumSeedersHelpText": "Mindestanzahl an Seedern, die von der Anwendung für den Indexer erforderlich ist, um herunterzuladen. Leer bedeutet, dass das Standardprofil der Synchronisierung verwendet wird", - "CountIndexersAvailable": "{count} Indexer verfügbar", - "DeleteClientCategory": "Download-Client-Kategorie löschen", - "DeleteSelectedIndexer": "Ausgewählten Indexer löschen", - "TotalGrabs": "Gesamtanzahl der Grabs", - "DownloadClientCategory": "Download-Client-Kategorie", - "EditCategory": "Kategorie bearbeiten", - "IndexerSettingsApiUser": "API Benutzer", - "RssFeed": "RSS Feed", - "InitialFailure": "Initialer Fehler", - "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Blockierte Torrent-Hashes beim Abrufen synchron ablehnen", - "DeleteSelectedIndexers": "Ausgewählte Indexer löschen", - "IndexerHDBitsSettingsPasskeyHelpText": "Passkey aus den Benutzerdetails", - "IndexerSettingsPasskey": "Pass Key", - "ClickToChangeQueryOptions": "Klicken, um Abfrageoptionen zu ändern", - "IndexerCategories": "Indexer-Kategorien", - "SearchQueries": "Suchanfragen", - "IndexerAlphaRatioSettingsExcludeScene": "SCENE ausschließen", - "IndexerAlphaRatioSettingsExcludeSceneHelpText": "SCENE-Veröffentlichungen aus den Ergebnissen ausschließen", - "IndexerBeyondHDSettingsRefundOnly": "Nur Rückerstattung", - "IndexerFileListSettingsUsernameHelpText": "Website-Benutzername", - "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Muss Benutzer- und Torrents-Berechtigungen haben", - "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Zeige nur Freeleech-Releases", - "IndexerHDBitsSettingsUsernameHelpText": "Webseite-Benutzername", - "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", - "IndexerNewznabSettingsApiKeyHelpText": "Website API Key", - "IndexerOrpheusSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)", - "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", - "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Website-API-Schlüssel", - "AreYouSureYouWantToDeleteCategory": "Bist du sicher, dass du die zugeordnete Kategorie löschen möchtest?", - "DownloadClientSettingsPriorityItemHelpText": "Priorität, die beim Abrufen von Elementen verwendet werden soll", - "GoToApplication": "Zur Anwendung gehen", - "HistoryDetails": "Historie-Details", - "IndexerBeyondHDSettingsLimitedOnly": "Nur begrenzt", - "IndexerHDBitsSettingsOrigins": "Ursprünge", - "IndexerHDBitsSettingsUseFilenames": "Verwende Dateinamen", - "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent, der mit dem Cookie aus dem Browser verwendet wird", - "IndexerNewznabSettingsAdditionalParametersHelpText": "Zusätzliche Newznab-Parameter", - "IndexerSettingsPackSeedTime": "Pack-Seed-Zeit", - "IndexerSettingsRssKey": "RSS Schlüssel", - "IndexerMTeamTpSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden im Benutzersteuerungsfeld => Sicherheit => Labor)", - "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", - "IndexerSettingsFreeleechOnly": "Nur Freeleech", - "IndexerSettingsPreferMagnetUrl": "Magnet-URL bevorzugen", - "IndexerSettingsPreferMagnetUrlHelpText": "Wenn aktiviert, bevorzugt dieser Indexer die Verwendung von Magnet-URLs für Grabs mit Rückfall auf Torrent-Links", - "TorznabUrl": "Torznab Url", - "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Nur Golden Popcorn", - "IndexerSettingsBaseUrl": "Basis Url", - "IndexerAvistazSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Veröffentlichungen suchen", - "IndexerAvistazSettingsPasswordHelpText": "Website-Passwort", - "IndexerAvistazSettingsPidHelpText": "PID aus der „Mein Konto“- oder „Mein Profil“-Seite", - "IndexerAvistazSettingsUsernameHelpText": "Website-Benutzername", - "IndexerAvistazSettingsUsernameHelpTextWarning": "Nur Mitglieder mit Rang „Mitglied“ und höher können die API auf diesem Indexer nutzen.", - "IndexerBeyondHDSettingsRewindOnly": "Nur zurückspulen", - "IndexerBeyondHDSettingsRewindOnlyHelpText": "Nur Rückwärtssuche", - "IndexerBeyondHDSettingsSearchTypesHelpText": "Wähle die Arten von Veröffentlichungen aus, die dich interessieren. Wenn keine ausgewählt sind, werden alle Optionen verwendet.", - "IndexerFailureRate": "Indexer-Fehlerrate", - "IndexerGazelleGamesSettingsSearchGroupNames": "Suche Gruppennamen", - "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" + "IndexerHDBitsSettingsOriginsHelpText": "Wenn nicht angegeben, werden alle Optionen verwendet." } diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 2565fdf01..5e74f61d0 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -241,7 +241,6 @@ "DownloadClientStatusSingleClientHealthCheckMessage": "Download clients unavailable due to failures: {downloadClientNames}", "DownloadClientTransmissionSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Transmission location", "DownloadClientTransmissionSettingsUrlBaseHelpText": "Adds a prefix to the {clientName} rpc url, eg {url}, defaults to '{defaultUrl}'", - "DownloadClientUTorrentProviderMessage": "uTorrent has a history of including cryptominers, malware and ads, we strongly encourage you to choose a different client.", "DownloadClients": "Download Clients", "DownloadClientsLoadError": "Unable to load download clients", "DownloadClientsSettingsSummary": "Download clients configuration for integration into {appName} UI search", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index e7981a69e..919dd5353 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -806,6 +806,5 @@ "InstallMajorVersionUpdateMessageLink": "Por favor revisa [{domain}]({url}) para más información.", "FailedToFetchSettings": "Error al recuperar la configuración", "CurrentlyInstalled": "Actualmente instalado", - "PreviouslyInstalled": "Previamente instalado", - "DownloadClientUTorrentProviderMessage": "uTorrent tiene un amplio historial de incluir criptomineros, malware y publicidad, por lo que recomendamos encarecidamente que elijas un cliente diferente." + "PreviouslyInstalled": "Previamente instalado" } diff --git a/src/NzbDrone.Core/Localization/Core/fa.json b/src/NzbDrone.Core/Localization/Core/fa.json index c0f9f6513..0967ef424 100644 --- a/src/NzbDrone.Core/Localization/Core/fa.json +++ b/src/NzbDrone.Core/Localization/Core/fa.json @@ -1,13 +1 @@ -{ - "ApiKey": "کلید API", - "NetCore": ".NET", - "Add": "افزودن", - "About": "درباره", - "Actions": "اقدامات", - "Docker": "Docker", - "AddConnection": "افزودن پیوند", - "AddConnectionImplementation": "افزودن پیوند - {implementationName}", - "AddDownloadClientImplementation": "افزودن کلاینت دانلود - {implementationName}", - "Torrents": "تورنت ها", - "Usenet": "Usenet" -} +{} diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 0236ce555..74a5e7a50 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -25,7 +25,7 @@ "SettingsTimeFormat": "Kellonajan esitys", "Message": "Viesti", "Seeders": "Jakajat", - "TestAll": "Koesta kaikki", + "TestAll": "Kaikkien testaus", "AddDownloadClient": "Lisää latauspalvelu", "CustomFilters": "Omat suodattimet", "DeleteTag": "Poista tunniste", @@ -34,7 +34,7 @@ "Fixed": "Korjattu", "FocusSearchBox": "Kohdista hakukenttä", "ForMoreInformationOnTheIndividualDownloadClients": "Saat lisätietoja yksittäisistä latauspalveluista painamalla niiden ohessa olevia lisätietopainikkeita.", - "HideAdvanced": "Laajenna asetukset", + "HideAdvanced": "Piilota lisäasetukset", "History": "Historia", "MIA": "Puuttuu", "New": "Uutta", @@ -88,7 +88,7 @@ "Logs": "Lokitiedot", "Mechanism": "Mekanismi", "Name": "Nimi", - "NoLinks": "Kytköksiä ei ole", + "NoLinks": "Ei linkkejä", "Peers": "Vertaiset", "Presets": "Esiasetukset", "Priority": "Painotus", @@ -121,8 +121,8 @@ "TagIsNotUsedAndCanBeDeleted": "Tunniste ei ole käytössä ja voidaan poistaa.", "TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.", "Tasks": "Tehtävät", - "Test": "Koesta", - "TestAllClients": "Koesta palvelut", + "Test": "Testaa", + "TestAllClients": "Koesta latauspalvelut", "Time": "Aika", "Title": "Nimike", "Tomorrow": "Huomenna", @@ -130,11 +130,11 @@ "Torrents": "Torrentit", "Type": "Tyyppi", "UILanguage": "Käyttöliittymän kieli", - "UnableToAddANewApplicationPleaseTryAgain": "Virhe lisättäessä sovellusta. Yritä uudelleen.", + "UnableToAddANewApplicationPleaseTryAgain": "Uuden sovelluksen lisäys epäonnistui. Yritä uudelleen.", "UnableToAddANewIndexerPleaseTryAgain": "Uuden hakupalvelun lisääminen epäonnistui. Yritä uudelleen.", - "UnableToAddANewIndexerProxyPleaseTryAgain": "Virhe lisättäessä tiedonhaun välityspalvelinta. Yritä uudelleen.", - "BackupsLoadError": "Virhe ladattaessa varmuuskopioita.", - "DownloadClientsLoadError": "Virhe ladattaessa latauspalveluita.", + "UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.", + "BackupsLoadError": "Varmuuskopioinnin lataus epäonnistui", + "DownloadClientsLoadError": "Latauspalveluiden lataus epäonnistui", "UnableToLoadGeneralSettings": "Yleisasetusten lataus epäonnistui", "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.", "Added": "Lisäysaika", @@ -161,17 +161,17 @@ "SendAnonymousUsageData": "Lähetä nimettömiä käyttötietoja", "SetTags": "Tunnisteiden määritys", "SettingsEnableColorImpairedMode": "Heikentyneen värinäön tila", - "ShowAdvanced": "Supista asetukset", + "ShowAdvanced": "Näytä lisäasetukset", "ShowSearchHelpText": "Näytä hakupainike osoitettaessa.", "Shutdown": "Sammuta", "Size": "Koko", "Sort": "Järjestys", "UnableToAddANewDownloadClientPleaseTryAgain": "Latauspalvelun lisääminen epäonnistui. Yritä uudelleen.", "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää", - "UnableToLoadHistory": "Virhe ladattaessa historiaa.", - "UnableToLoadNotifications": "Virhe ladattaessa ilmoituspalveluita.", - "UnableToLoadTags": "Virhe ladattaessa tunnisteita.", - "UnableToLoadUISettings": "Virhe ladattaessa käyttöliittymäasetuksia.", + "UnableToLoadHistory": "Historian lataus epäonnistui", + "UnableToLoadNotifications": "Ilmoituspalveluiden lataus epäonnistui", + "UnableToLoadTags": "Tunnisteiden lataus epäonnistui", + "UnableToLoadUISettings": "Käyttöliittymäasetusten lataus epäonnistui", "UnsavedChanges": "Muutoksia ei ole tallennettu", "Yesterday": "Eilen", "ConnectionLost": "Yhteys menetettiin", @@ -207,9 +207,9 @@ "StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta", "StartupDirectory": "Käynnistyskansio", "TableOptions": "Taulukkonäkymän asetukset", - "TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys.", + "TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys", "TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille hakupalveluille.", - "UnableToAddANewAppProfilePleaseTryAgain": "Virhe lisättäessä sovellusprofiilia. Yritä uudelleen.", + "UnableToAddANewAppProfilePleaseTryAgain": "Uuden sovellusprofiilin lisäys epäonnistui. Yritä uudelleen.", "UnableToAddANewNotificationPleaseTryAgain": "Ilmoituspalvelun lisääminen epäonnistui. Yritä uudelleen.", "Version": "Versio", "View": "Näkymä", @@ -232,7 +232,7 @@ "Cancel": "Peruuta", "CancelPendingTask": "Haluatko varmasti perua odottavan tehtävän?", "CertificateValidation": "Varmenteen vahvistus", - "CertificateValidationHelpText": "Määritä HTTPS-varmennevahvistuksen tiukkuus. Älä muuta, jos et ymmärrä riskejä.", + "CertificateValidationHelpText": "Muuta HTTPS-varmennevahvistuksen tarkkuutta. Älä muuta, jollet ymmärrä tähän liittyviä riskejä.", "ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu", "Clear": "Tyhjennä", "CloneProfile": "Monista profiili", @@ -312,7 +312,7 @@ "FullSync": "Täysi synkronointi", "SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen hakupalvelut täysin synkronoituna. Hakupalveluihin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.", "EnableIndexer": "Ota hakupalvelu käyttöön", - "FilterPlaceHolder": "Suodata palveluita", + "FilterPlaceHolder": "Suodata hakupalveluita", "IndexerHealthCheckNoIndexers": "Yhtään hakupalvelua ei ole käytössä, eikä {appName} tämän vuoksi löydä tuloksia.", "IndexerObsoleteCheckMessage": "Hakupalvelut ovat poistuneet tai ne ovat muuttuneet: {0}. Poista tai lisää ne {appName}iin uudelleen.", "IndexerProxy": "Tiedonhaun välityspalvelin", @@ -324,7 +324,7 @@ "UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.", "SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja hakupalveluiden toiminnasta, mukaanlukien vastaukset", "IndexerTagsHelpText": "Tunnisteilla voit kohdistaa tiedonhaun välityspalvelimia ja määrittää mihin sovelluksiin ne synkronoidaan.", - "UnableToLoadAppProfiles": "Virhe ladattaessa sovellusprofiileja.", + "UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui", "AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään hakupalvelulle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/manuaali).", "IndexerQuery": "Hakupalvelukysely", "IndexerRss": "Hakupalvelun RSS", @@ -338,8 +338,8 @@ "SyncLevel": "Synkronoinnin laajuus", "SyncLevelAddRemove": "Vain lisäys/poisto: Kun {appName}in hakupalveluita lisätään tai poistetaan, päivittyy myös tämä etäsovellus.", "SyncAppIndexers": "Synkronoi sovelluksiin", - "TestAllApps": "Koesta sovellukset", - "UnableToLoadIndexerProxies": "Virhe ladattaessa tiedonhaun välityspalvelimia.", + "TestAllApps": "Testaa kaikki sovellukset", + "UnableToLoadIndexerProxies": "Tiedonhaun välityspalvelinten lataus epäonnistui", "AddedToDownloadClient": "Julkaisu lisättiin latauspalveluun", "AddNewIndexer": "Lisää uusi hakupalvelu", "AddToDownloadClient": "Lisää julkaisu latauspalveluun", @@ -369,12 +369,12 @@ "EnableRssHelpText": "Käytä hakupalvelulle RSS-syötettä.", "DeleteApplication": "Poista sovellus", "DeleteAppProfile": "Poista sovellusprofiili", - "IndexerProxies": "Hakupalveluiden välityspalvelimet", + "IndexerProxies": "Tiedonhaun välityspalvelimet", "IndexerAuth": "Hakupalvelun todennus", "Notifications": "Ilmoituspalvelut", "NotificationTriggersHelpText": "Valitse ilmoituksen laukaisevat tapahtumat.", "Stats": "Tilastot", - "UnableToLoadDevelopmentSettings": "Virhe ladattaessa kehittäjäasetuksia.", + "UnableToLoadDevelopmentSettings": "Kehittäjäasetusten lataus epäonnistui", "AppSettingsSummary": "Sovellukset ja asetukset, joilla määritetään miten {appName} viestii PVR-sovellustesi kanssa.", "Privacy": "Yksityisyys", "NetCore": ".NET", @@ -389,7 +389,7 @@ "OnHealthIssue": "Vakausongelmat", "HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi 0.", "HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.", - "TestAllIndexers": "Koesta palvelut", + "TestAllIndexers": "Koesta hakupalvelut", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti rajapinnan kanssa viestinyt sovellus.", "Categories": "Kategoriat", "Database": "Tietokanta", @@ -402,7 +402,7 @@ "Proxies": "Välityspalvelimet", "Public": "Julkinen", "SemiPrivate": "Osittain yksityinen", - "ApplicationsLoadError": "Virhe ladattaessa sovelluslistaa.", + "ApplicationsLoadError": "Sovelluslistan lataus epäonnistui", "Url": "URL", "Website": "Verkkosivusto", "IndexerNoDefinitionCheckHealthCheckMessage": "Hakupalveluiden määritykset puuttuvat, eivätkä ne toimi: {indexerNames}. Poista tai lisää ne {appName}iin uudelleen.", @@ -412,7 +412,7 @@ "GrabReleases": "Kaappaa julkaisu(t)", "Link": "Linkki", "SearchTypes": "Etsittävät tyypit", - "UnableToLoadIndexers": "Virhe ladattaessa hakupalveluita.", + "UnableToLoadIndexers": "Hakupalveluiden lataus epäonnistui", "Yes": "Kyllä", "MappedDrivesRunningAsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja UKK:sta.", "No": "Ei", @@ -501,13 +501,13 @@ "TotalIndexerSuccessfulGrabs": "Onnistuneiden hakupalvelukaappausten kokonaismäärä", "AppUpdated": "{appName} on päivitetty", "AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.", - "IndexerDownloadClientHelpText": "Määritä {appName}in käyttöliittymässä tästä hakupalvelusta kaapattaessa käytettävä latauspalvelu.", + "IndexerDownloadClientHelpText": "Määritä {appName}issa tästä hakupalvelusta tehdyille kaappauksille käytettävä latauspalvelu.", "AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt tunnistautumisen käyttöönoton. Paikallisilta osoitteilta se voidaan valinnaisesti poistaa käytöstä.", "TotalGrabs": "Kaappausten kokonaismäärä", "AddDownloadClientImplementation": "Lisätään latauspalvelua – {implementationName}", "AddIndexerImplementation": "Lisätään hakupalvelua – {implementationName}", "OnGrabHelpText": "Kun julkaisu kaapataan", - "ManageDownloadClients": "Hallitse palveluita", + "ManageDownloadClients": "Hallitse latauspalveluita", "NoDownloadClientsFound": "Latauspalveluita ei löytynyt", "CountDownloadClientsSelected": "{count} latauspalvelu(a) on valittu", "EditSelectedDownloadClients": "Muokkaa valittuja latauspalveluita", @@ -519,7 +519,7 @@ "ApplyChanges": "Toteuta muutokset", "EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä", "NoHistoryFound": "Historiaa ei löytynyt", - "NoIndexersFound": "Palveluita ei löytynyt", + "NoIndexersFound": "Hakupalveluita ei löytynyt", "StopSelecting": "Lopeta valitseminen", "EditConnectionImplementation": "Muokataan ilmoituspalvelua – {implementationName}", "AddConnectionImplementation": "Lisätään ilmoituspavelua – {implementationName}", @@ -668,7 +668,7 @@ "DownloadClientFreeboxSettingsPortHelpText": "Freebox-liittymän portti. Oletus on {port}.", "DownloadClientPneumaticSettingsNzbFolder": "NZB-kansio", "DownloadClientQbittorrentSettingsSequentialOrder": "Peräkkäinen järjestys", - "CustomFilter": "Oma suodatin", + "CustomFilter": "Mukautettu suodatin", "DownloadClientFreeboxSettingsAppIdHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä käytettävä App ID -sovellustunniste.", "DownloadClientFreeboxSettingsAppToken": "Sovellustietue", "DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä vaatii vähintään NzbGetin version 16.0.", @@ -715,8 +715,8 @@ "UpdaterLogFiles": "Päivittäjän lokitiedostot", "WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion \"{name}\"?", "InstallLatest": "Asenna uusin", - "CurrentlyInstalled": "Käytössä oleva versio", - "PreviouslyInstalled": "Aiemmin käytössä ollut versio", + "CurrentlyInstalled": "Nyt asennettu", + "PreviouslyInstalled": "Aiemmin asennettu", "Mixed": "Sekoitettu", "IndexerSettingsAppsMinimumSeeders": "Jakajien vähimmäismäärä", "FailedToFetchSettings": "Asetusten nouto epäonnistui", @@ -805,6 +805,6 @@ "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Vain \"Golden Popcorn\"", "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Etsi vain ns. kultaisella pocornilla merkittyjä julkaisuja.", "IndexerSettingsFreeleechOnly": "Vain \"Freeleech\"", - "IndexerSettingsCookieHelpText": "Jos sivusto vaatii kirjautumisevästeen, on se noudettava selaimen avulla.", + "IndexerSettingsCookieHelpText": "Jos sivusto vaatii kirjautumisevästeen, se on noudettava selaimen kautta.", "IndexerAvistazSettingsPasswordHelpText": "Sivuston salasana" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 8768f9c50..b156ce10a 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -384,7 +384,7 @@ "HistoryCleanupDaysHelpTextWarning": "Les fichiers dans la corbeille plus anciens que le nombre de jours sélectionné seront nettoyés automatiquement", "OnGrab": "Récupéré à la sortie", "OnHealthIssue": "Lors de problème de santé", - "TestAllIndexers": "Tester tous les indexeurs", + "TestAllIndexers": "Testez tous les indexeurs", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fourni par l'application qui a appelé l'API", "Database": "Base de données", "HistoryCleanup": "Nettoyage de l'historique", @@ -806,6 +806,5 @@ "IndexerSettingsPreferMagnetUrl": "URL de préférence Magnet", "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Popcorn doré uniquement", "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Rechercher uniquement les versions Golden Popcorn", - "IndexerAvistazSettingsUsernameHelpTextWarning": "Seuls les membres de rang et supérieur peuvent utiliser l'API sur cet indexeur.", - "DownloadClientUTorrentProviderMessage": "uTorrent a un historique d'inclusion de cryptomineurs, de logiciels malveillants et de publicités. Nous vous recommandons fortement de choisir un autre client." + "IndexerAvistazSettingsUsernameHelpTextWarning": "Seuls les membres de rang et supérieur peuvent utiliser l'API sur cet indexeur." } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 5a30e0f08..7bbae2162 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -417,94 +417,5 @@ "UsenetBlackholeNzbFolder": "Nzb 폴더", "UseSsl": "SSL 사용", "TorrentBlackholeTorrentFolder": "토렌트 폴더", - "DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더", - "UserAgentProvidedByTheAppThatCalledTheAPI": "API를 호출한 앱에서 제공하는 사용자 에이전트", - "days": "일", - "minutes": "분", - "Author": "저작자", - "Categories": "카테고리", - "SeedRatio": "종자 비율", - "AuthenticationRequiredHelpText": "필수 인증을 요청하는 변경 사항. 위험을 이해하지 못한다면 변경하지 마세요.", - "DownloadClientFloodSettingsAdditionalTagsHelpText": "미디어의 속성을 태그로 추가합니다. 힌트는 예시입니다.", - "DownloadClientRTorrentSettingsAddStoppedHelpText": "활성화하면 rTorrent에 정지된 상태에서 토런트와 마그넷이 추가됩니다. 마그넷 파일이 손상될 수 있습니다.", - "HealthMessagesInfoBox": "행 끝에 있는 위키 링크(책 아이콘)를 클릭하거나 [로그]({link})를 확인하면 이러한 상태 점검 메시지의 원인에 대한 상세 정보를 찾을 수 있습니다. 이러한 메시지를 해석하는 데 어려움이 있는 경우 아래 링크에서 지원팀에 문의할 수 있습니다.", - "DownloadClientSettingsDestinationHelpText": "다운로드 대상을 수동으로 지정하고 기본값을 사용하려면 비워두세요.", - "DownloadClientSettingsInitialStateHelpText": "{clientName}에 추가된 토런트의 초기 상태", - "IndexerSettingsAdditionalParameters": "매개 변수 추가", - "NoEventsFound": "이벤트가 없음", - "BlackholeFolderHelpText": "{appName}가 {extension} 파일을 저장할 폴더", - "DownloadClientSettingsUrlBaseHelpText": "{clientName} url에 {url}과 같은 접두사를 추가합니다.", - "DownloadClientQbittorrentSettingsContentLayout": "콘텐츠 레이아웃", - "Install": "설치", - "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "새 비밀번호 확인", - "FailedToFetchSettings": "설정을 가져오는데 실패함", - "Default": "기본값", - "Episode": "에피소드", - "AuthenticationMethod": "인증 방법", - "IndexerSettingsSeedRatio": "시드 비율", - "Destination": "대상", - "DownloadClientFreeboxSettingsAppToken": "앱 토큰", - "Logout": "로그아웃", - "DownloadClientFreeboxSettingsApiUrl": "API 주소", - "IndexerHDBitsSettingsCodecs": "코덱", - "WhatsNew": "새로운 소식?", - "DownloadClientFreeboxSettingsPortHelpText": "Freebox 인터페이스에 액세스하는 데 사용되는 포트, 기본값은 '{port}'", - "DownloadClientPneumaticSettingsStrmFolderHelpText": "이 폴더의 .strm 파일은 드론으로 가져옵니다.", - "DownloadClientQbittorrentSettingsInitialStateHelpText": "qBittorrent에 추가된 토렌트의 초기 상태입니다. 강제 토렌트는 시드 제한을 따르지 않는다는 점에 유의하세요.", - "DownloadClientRTorrentSettingsDirectoryHelpText": "다운로드를 넣을 선택 위치, 기본 rTorrent 위치를 사용하려면 비워두세요.", - "DownloadClientSettingsUseSslHelpText": "{clientName}에 연결할 때 보안 연결을 사용", - "DownloadClientTransmissionSettingsUrlBaseHelpText": "{clientName} rpc URL에 접두사를 추가합니다(예: {url}, 기본값은 '{defaultUrl}')", - "InstallMajorVersionUpdateMessageLink": "상세 내용은 [{domain}]({url})을 확인하세요.", - "ApplicationUrlHelpText": "이 애플리케이션의 외부 URL - http(s)://, port 및 URL 기반 포함", - "Theme": "테마", - "ApplicationURL": "애플리케이션 URL", - "Directory": "디렉토리", - "DownloadClientDownloadStationSettingsDirectoryHelpText": "다운로드를 넣을 공유 폴더(선택 사항). 기본 다운로드 스테이션 위치를 사용하려면 비워두세요.", - "DownloadClientFloodSettingsAdditionalTags": "추가 태그", - "DownloadClientFloodSettingsUrlBaseHelpText": "{url}와 같은 Flood API에 접두사를 추가합니다", - "DownloadClientFreeboxSettingsApiUrlHelpText": "API 버전을 사용하여 Freebox API 기본 URL을 정의하세요, 예를 들어 '{url}', 기본값은 '{defaultApiUrl}')", - "DownloadClientFreeboxSettingsAppId": "앱 ID", - "DownloadClientNzbgetSettingsAddPausedHelpText": "이 옵션을 사용하려면 최소한 NzbGet 버전 16.0이 필요합니다", - "DownloadClientPneumaticSettingsNzbFolderHelpText": "이 폴더는 XBMC에서 접근할 수 있어야 합니다.", - "DownloadClientRTorrentSettingsAddStopped": "중지됨 추가", - "Category": "카테고리", - "DownloadClientTransmissionSettingsDirectoryHelpText": "다운로드를 넣을 위치 (선택 사항), 기본 전송 위치를 사용하려면 비워두세요", - "External": "외부", - "IndexerSettingsSeedRatioHelpText": "토렌드가 멈추기 전에 도달해야 하는 비율, 비어 있을 경우 다운로드 클라이언트의 기본값을 사용합니다. 비율은 최소 1.0이어야 하며 인덱서 규칙을 따라야 합니다", - "IndexerSettingsSeedTimeHelpText": "토렌드가 중지되기 전에 시드되어야 하는 시간, 비어 있을 경우 다운로드 클라이언트의 기본값을 사용합니다", - "InvalidUILanguage": "UI가 잘못된 언어로 설정되어 있습니다, 수정하고 설정을 저장하세요", - "AuthenticationRequired": "인증 필요", - "NotificationsTelegramSettingsIncludeAppNameHelpText": "다른 애플리케이션의 알림을 구분하기 위해 메시지 제목 앞에 {appName}를 접두사로 사용 (선택 사항)", - "PackageVersionInfo": "{packageVersion} by {packageAuthor}", - "Duration": "기간", - "Script": "스크립트", - "SelectDownloadClientModalTitle": "{modalTitle} - 다운로드 클라이언트 선택", - "TheLogLevelDefault": "로그 수준의 기본값은 '정보'이며 [일반 설정](/settings/general)에서 변경할 수 있습니다", - "UpdaterLogFiles": "업데이트 도구 로그 파일", - "CountDownloadClientsSelected": "{count}개의 다운로드 클라이언트를 선택함", - "DefaultNameCopiedProfile": "{name} - 복사", - "DownloadClientDelugeSettingsUrlBaseHelpText": "deluge json url에 접두사를 추가합니다. {url}을(를) 참조하세요", - "FailedToFetchUpdates": "업데이트를 가져오는데 실패함", - "ApplyChanges": "변경 사항 적용", - "Started": "시작됨", - "Database": "데이터베이스", - "PasswordConfirmation": "비밀번호 확인", - "TorrentBlackholeSaveMagnetFiles": "마그넷 파일 저장", - "TorrentBlackholeSaveMagnetFilesExtension": "마그넷 파일 확장자 저장", - "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "마그넷 링크에 사용할 확장자, 기본값은 '.magnet'입니다", - "TorrentBlackholeSaveMagnetFilesHelpText": ".torrent 파일을 사용할 수 없는 경우 마그넷 링크를 저장합니다 (다운로드 클라이언트가 파일에 저장된 마그넷을 지원하는 경우에만 유용함)", - "AuthenticationMethodHelpTextWarning": "유효한 인증 방법을 선택해주세요", - "AuthenticationRequiredPasswordHelpTextWarning": "새로운 비밀번호를 입력하세요", - "AuthenticationRequiredUsernameHelpTextWarning": "새로운 사용자이름을 입력하세요", - "AuthenticationRequiredWarning": "인증 없이 원격 액세스를 방지하기 위해 {appName}은(는) 이제 인증을 활성화해야 합니다. 선택적으로 로컬 주소에서 인증을 비활성화할 수 있습니다.", - "CountIndexersSelected": "{count}개의 인덱서를 선택함", - "Label": "라벨", - "More": "더 보기", - "Donate": "기부하기", - "Menu": "메뉴", - "DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent의 구성된 콘텐츠 레이아웃을 사용할지, 토런트의 원래 레이아웃을 사용할지, 항상 하위 폴더를 생성할지(qBittorrent 4.3.2+)", - "DownloadClientSettingsAddPaused": "일시 중지 추가", - "SecretToken": "비밀 토큰", - "NoDownloadClientsFound": "다운로드 클라이언트를 찾을 수 없음", - "PrioritySettings": "우선 순위: {0}" + "DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 12e1c4557..a01858498 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -160,6 +160,5 @@ "AptUpdater": "Bruk apt til å installere oppdateringen", "Discord": "Discord", "AddCustomFilter": "Legg til eget filter", - "Clone": "Lukk", - "AddDownloadClientImplementation": "Ny Nedlastingsklient - {implementationName}" + "Clone": "Lukk" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 43c1f2932..25d1187a4 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -126,7 +126,7 @@ "DownloadClientStatusAllClientHealthCheckMessage": "Todos os clientes de download estão indisponíveis devido a falhas", "DownloadClientStatusSingleClientHealthCheckMessage": "Clientes de download indisponíveis devido a falhas: {downloadClientNames}", "DownloadClients": "Clientes de download", - "DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do {appName}", + "DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do usuário do {appName}", "Duration": "Duração", "Edit": "Editar", "EditIndexer": "Editar Indexador", @@ -204,7 +204,7 @@ "IndexerNoDefinitionCheckHealthCheckMessage": "Os indexadores não têm definição e não funcionarão: {indexerNames}. Remova e (ou) adicione novamente ao {appName}.", "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao {appName}", "IndexerPriority": "Prioridade do indexador", - "IndexerPriorityHelpText": "Prioridade do indexador, de 1 (mais alta) a 50 (mais baixa). Padrão: 25.", + "IndexerPriorityHelpText": "Prioridade do Indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25.", "IndexerProxies": "Proxies do Indexador", "IndexerProxy": "Proxy do Indexador", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Todos os proxies estão indisponíveis devido a falhas", @@ -248,7 +248,7 @@ "MassEditor": "Editor em Massa", "Mechanism": "Mecanismo", "Message": "Mensagem", - "MinimumSeeders": "Mínimo de semeadores", + "MinimumSeeders": "Mínimo de Seeders", "MinimumSeedersHelpText": "Semeadores mínimos exigidos pelo aplicativo para o indexador baixar", "Mode": "Modo", "More": "Mais", @@ -513,7 +513,7 @@ "DeleteSelectedDownloadClients": "Excluir cliente(s) de download", "DeleteSelectedDownloadClientsMessageText": "Tem certeza de que deseja excluir o(s) {count} cliente(s) de download selecionado(s)?", "DeleteSelectedIndexersMessageText": "Tem certeza de que deseja excluir o(s) {count} indexador(es) selecionado(s)?", - "DownloadClientPriorityHelpText": "Priorizar vários clientes de download. Usamos uma distribuição equilibrada para clientes com a mesma prioridade.", + "DownloadClientPriorityHelpText": "Priorizar vários clientes de download. Usamos um rodízio para clientes com a mesma prioridade.", "EditSelectedDownloadClients": "Editar clientes de download selecionados", "EditSelectedIndexers": "Editar indexadores selecionados", "ManageDownloadClients": "Gerenciar clientes de download", @@ -538,10 +538,10 @@ "PackSeedTime": "Tempo de Semente do Pacote", "PackSeedTimeHelpText": "A hora em que um torrent de pacote (temporada ou discografia) deve ser propagado antes de parar, vazio é o padrão do aplicativo", "QueryType": "Tipo de consulta", - "SeedTime": "Tempo de semeadura", + "SeedTime": "Tempo de Semeação", "SearchAllIndexers": "Pesquisar todos os indexadores", "SearchCountIndexers": "Pesquisar {count} indexador(es)", - "SeedRatio": "Proporção de semeadura", + "SeedRatio": "Proporção de sementes", "SeedRatioHelpText": "A proporção que um torrent deve atingir antes de parar, vazio é o padrão do aplicativo", "SeedTimeHelpText": "O tempo que um torrent deve ser propagado antes de parar, vazio é o padrão do aplicativo", "SelectedCountOfCountReleases": "{selectedCount} de {itemCount} lançamentos selecionados", @@ -611,7 +611,7 @@ "NotificationsEmailSettingsUseEncryptionHelpText": "Se preferir usar criptografia se configurado no servidor, usar sempre criptografia via SSL (somente porta 465) ou StartTLS (qualquer outra porta) ou nunca usar criptografia", "NotificationsEmailSettingsUseEncryption": "Usar Criptografia", "IndexerHDBitsSettingsPasskeyHelpText": "Chave de Acesso dos Detalhes do Usuário", - "IndexerSettingsPasskey": "Chave de acesso", + "IndexerSettingsPasskey": "Chave de Acesso", "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Excluir lançamentos SCENE dos resultados", "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Pesquisar lançamentos freeleech somente", "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Pesquisar lançamentos freeleech somente", @@ -632,7 +632,7 @@ "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Pesquisar lançamentos por nomes de grupos", "IndexerHDBitsSettingsCodecs": "Codecs", "IndexerHDBitsSettingsMediumsHelpText": "se não for especificado, todas as opções serão usadas.", - "IndexerHDBitsSettingsOriginsHelpText": "Se não for especificado, todas as opções serão usadas.", + "IndexerHDBitsSettingsOriginsHelpText": "se não for especificado, todas as opções serão usadas.", "IndexerHDBitsSettingsUseFilenames": "Usar nomes de arquivos", "IndexerHDBitsSettingsUsernameHelpText": "Nome de Usuário do Site", "IndexerHDBitsSettingsMediums": "Meios", @@ -652,7 +652,7 @@ "IndexerSettingsApiUser": "Usuário da API", "IndexerSettingsBaseUrl": "URL Base", "IndexerSettingsCookie": "Cookie", - "IndexerSettingsCookieHelpText": "Cookie do site", + "IndexerSettingsCookieHelpText": "Cookie do Site", "IndexerSettingsFreeleechOnly": "Só Freeleech", "IndexerSettingsGrabLimit": "Limite de Captura", "IndexerSettingsGrabLimitHelpText": "O número máximo de capturas conforme especificado pela respectiva unidade que {appName} permitirá ao site", @@ -744,7 +744,7 @@ "Mixed": "Misturado", "Donate": "Doar", "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronizar Lista de Bloqueio de Hashes de Torrents Rejeitados Enquanto Baixando", - "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, pode não ser rejeitado corretamente durante a Sincronização RSS/Pesquisa em alguns indexadores. Ativar isso permitirá que ele seja rejeitado após obter o torrent, mas antes de enviar ao cliente.", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", "ClickToChangeQueryOptions": "Clique para alterar as opções de consulta", "IndexerMTeamTpSettingsApiKeyHelpText": "Chave API do Site (Encontrada no Painel de Controle do Usuário => Segurança => Laboratório)", "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech", @@ -806,6 +806,5 @@ "InstallMajorVersionUpdateMessageLink": "Verifique [{domain}]({url}) para obter mais informações.", "FailedToFetchSettings": "Falha ao obter configurações", "CurrentlyInstalled": "Atualmente instalado", - "PreviouslyInstalled": "Instalado anteriormente", - "DownloadClientUTorrentProviderMessage": "O uTorrent tem um histórico de incluir criptomineradores, malware e anúncios, recomendamos que você escolha outro cliente de download." + "PreviouslyInstalled": "Instalado anteriormente" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 2385c5ddf..928835b58 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -444,7 +444,7 @@ "DisabledForLocalAddresses": "Dezactivat pentru adresele locale", "None": "Nici unul", "ResetAPIKeyMessageText": "Sigur doriți să vă resetați cheia API?", - "AddApplicationImplementation": "Adăugați aplicație - {implementationName}", + "AddApplicationImplementation": "Adăugați aplicație - {implementareName}", "AddCategory": "Adăugați categorie", "AddConnection": "Adăugați conexiune", "AddConnectionImplementation": "Adăugați conexiune - {implementationName}", @@ -491,13 +491,5 @@ "Stats": "Status", "CurrentlyInstalled": "În prezent instalat", "Mixed": "Fix", - "Season": "Motiv", - "ActiveIndexers": "Indexatorii activi", - "Any": "Oricare", - "AdvancedSettingsShownClickToHide": "Setări avansate afișate, click pentru a le ascunde", - "AdvancedSettingsHiddenClickToShow": "Setări avansate ascunse, click pentru afișare", - "ApiKeyValidationHealthCheckMessage": "Te rugăm să actualizezi cheia API astfel încât să aibă cel puțin {length} caractere. Poți face acest lucru din setări sau din fișierul de configurare", - "AddToDownloadClient": "Adaugă versiunea în clientul de descărcare", - "AddSyncProfile": "Adaugă profil de sincronizare", - "AddedToDownloadClient": "Versiune adăugată în client" + "Season": "Motiv" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index f31829160..d396b076e 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -806,6 +806,5 @@ "InstallMajorVersionUpdateMessage": "Это обновление установит новую версию, которая может не поддерживаться вашей системой. Вы уверены, что хотите установить это обновление?", "FailedToFetchSettings": "Не удалось загрузить настройки", "CurrentlyInstalled": "Установлено", - "PreviouslyInstalled": "Ранее установленный", - "DownloadClientUTorrentProviderMessage": "Мы настоятельно советуем не использовать uTorrent, т.к. он известен как программа-шифровальщик и в целом вредоносное ПО." + "PreviouslyInstalled": "Ранее установленный" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 0d4af37ac..b9a2525f7 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -806,6 +806,5 @@ "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Kullanıcı ve Torrent izinlerine sahip olmalısınız", "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Grup adlarına göre sürüm ara", "IndexerHealthCheckNoIndexers": "Hiçbir indeksleyici etkinleştirilmedi, {appName} arama sonuçlarını döndürmeyecek", - "QueryType": "Sorgu Türü", - "DownloadClientUTorrentProviderMessage": "uTorrent'in kripto para madenciliği, kötü amaçlı yazılım ve reklam içerme geçmişi vardır, bu nedenle farklı bir istemci seçmenizi önemle tavsiye ederiz." + "QueryType": "Sorgu Türü" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index f42bd890b..f6390540a 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -441,13 +441,5 @@ "CurrentlyInstalled": "В даний час встановлено", "Season": "Причина", "Stats": "Статус", - "CountIndexersSelected": "{count} індексер(-и) обрано", - "SeedRatio": "Коефіцієнт роздачі", - "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Якщо торрент заблоковано хешем, він може не бути належним чином відхилений під час RSS/пошуку для деяких індексаторів. Увімкнення цього параметра дозволить відхилити його після захоплення торента, але до його відправки клієнту.", - "MinimumSeeders": "Мінімум сидерів (роздаючих)", - "SeedTime": "Час сидіння", - "Author": "Автор", - "OnHealthRestoredHelpText": "При відновленні стану", - "IndexerHDBitsSettingsOriginsHelpText": "Якщо не вказано, використовуються всі параметри.", - "days": "дні(в)" + "CountIndexersSelected": "{count} індексер(-и) обрано" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 41f815655..8e67403f0 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -16,7 +16,7 @@ "Added": "添加日期", "AddedToDownloadClient": "发布已添加档案到客户端", "AddingTag": "添加标签", - "Age": "寿命", + "Age": "年龄", "All": "全部", "AllIndexersHiddenDueToFilter": "由于应用了筛选器,所有索引器都被隐藏。", "Analytics": "分析", @@ -735,24 +735,5 @@ "PreviouslyInstalled": "上次安装", "FailedToFetchSettings": "设置同步失败", "DownloadClientSettingsPriorityItemHelpText": "抓取内容时优先使用", - "IndexerAlphaRatioSettingsExcludeScene": "排除场景", - "IndexerAlphaRatioSettingsExcludeSceneHelpText": "从结果中排除场景版本", - "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerBeyondHDSettingsLimitedOnly": "仅限", - "IndexerBeyondHDSettingsApiKeyHelpText": "来自网站的API密钥(在我的安全 => API密钥)", - "IndexerAvistazSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerAvistazSettingsPasswordHelpText": "网站密码", - "IndexerAvistazSettingsPidHelpText": "我的帐户或个人资料页的PID", - "IndexerAvistazSettingsUsernameHelpText": "网站用户名", - "IndexerAvistazSettingsUsernameHelpTextWarning": "只有成员级别及以上才能使用此索引器上的API。", - "IndexerBeyondHDSettingsLimitedOnlyHelpText": "仅限免费搜索(有限UL)", - "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerHDBitsSettingsUsernameHelpText": "网站用户名", - "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerFileListSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerFileListSettingsUsernameHelpText": "网站用户名", - "IndexerBeyondHDSettingsRefundOnlyHelpText": "Search refund only" + "IndexerAlphaRatioSettingsExcludeScene": "排除场景" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_Hans.json b/src/NzbDrone.Core/Localization/Core/zh_Hans.json index 54e88a350..1617e57fb 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_Hans.json +++ b/src/NzbDrone.Core/Localization/Core/zh_Hans.json @@ -2,6 +2,5 @@ "About": "关于", "Add": "添加", "Analytics": "分析", - "Username": "用户名", - "AcceptConfirmationModal": "中文" + "Username": "用户名" } diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs index 04bac39f0..7ca1dc8fc 100755 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; -using System.Linq; using FluentValidation.Results; using NLog; using NzbDrone.Common.Disk; @@ -39,31 +38,7 @@ namespace NzbDrone.Core.Notifications.CustomScript public override string Link => "https://wiki.servarr.com/prowlarr/settings#connections"; - public override ProviderMessage Message => new ("Testing will execute the script with the EventType set to Test, ensure your script handles this correctly", ProviderMessageType.Warning); - - public override void OnGrab(GrabMessage message) - { - var environmentVariables = new StringDictionary(); - - environmentVariables.Add("Prowlarr_EventType", "Grab"); - environmentVariables.Add("Prowlarr_InstanceName", _configFileProvider.InstanceName); - environmentVariables.Add("Prowlarr_ApplicationUrl", _configService.ApplicationUrl); - environmentVariables.Add("Prowlarr_Release_Title", message.Release.Title); - environmentVariables.Add("Prowlarr_Release_Indexer", message.Release.Indexer ?? string.Empty); - environmentVariables.Add("Prowlarr_Release_Size", message.Release.Size.ToString()); - environmentVariables.Add("Prowlarr_Release_Genres", string.Join("|", message.Release.Genres)); - environmentVariables.Add("Prowlarr_Release_Categories", string.Join("|", message.Release.Categories.Select(f => f.Name))); - environmentVariables.Add("Prowlarr_Release_IndexerFlags", string.Join("|", message.Release.IndexerFlags.Select(f => f.Name))); - environmentVariables.Add("Prowlarr_Release_PublishDate", message.Release.PublishDate.ToUniversalTime().ToString("s") + "Z"); - environmentVariables.Add("Prowlarr_Download_Client", message.DownloadClientName ?? string.Empty); - environmentVariables.Add("Prowlarr_Download_Client_Type", message.DownloadClientType ?? string.Empty); - environmentVariables.Add("Prowlarr_Download_Id", message.DownloadId ?? string.Empty); - environmentVariables.Add("Prowlarr_Source", message.Source ?? string.Empty); - environmentVariables.Add("Prowlarr_Host", message.Host ?? string.Empty); - environmentVariables.Add("Prowlarr_Redirect", message.Redirect.ToString()); - - ExecuteScript(environmentVariables); - } + public override ProviderMessage Message => new ProviderMessage("Testing will execute the script with the EventType set to Test, ensure your script handles this correctly", ProviderMessageType.Warning); public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) { @@ -155,5 +130,10 @@ namespace NzbDrone.Core.Notifications.CustomScript return processOutput; } + + private bool ValidatePathParent(string possibleParent, string path) + { + return possibleParent.IsParentPath(path); + } } } diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs index 48b93f35d..9eb41e989 100644 --- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs +++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using FluentValidation.Results; using NzbDrone.Common.Extensions; -using NzbDrone.Core.Configuration; using NzbDrone.Core.Notifications.Discord.Payloads; using NzbDrone.Core.Validation; @@ -11,12 +10,10 @@ namespace NzbDrone.Core.Notifications.Discord public class Discord : NotificationBase<DiscordSettings> { private readonly IDiscordProxy _proxy; - private readonly IConfigFileProvider _configFileProvider; - public Discord(IDiscordProxy proxy, IConfigFileProvider configFileProvider) + public Discord(IDiscordProxy proxy) { _proxy = proxy; - _configFileProvider = configFileProvider; } public override string Name => "Discord"; @@ -25,18 +22,18 @@ namespace NzbDrone.Core.Notifications.Discord public override void OnGrab(GrabMessage message) { var embed = new Embed - { - Author = new DiscordAuthor - { - Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, - IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" - }, - Title = RELEASE_GRABBED_TITLE, - Description = message.Message, - Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), - Color = message.Successful ? (int)DiscordColors.Success : (int)DiscordColors.Danger, - Fields = new List<DiscordField>() - }; + { + Author = new DiscordAuthor + { + Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" + }, + Title = RELEASE_GRABBED_TITLE, + Description = message.Message, + Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + Color = message.Successful ? (int)DiscordColors.Success : (int)DiscordColors.Danger, + Fields = new List<DiscordField>() + }; foreach (var field in Settings.GrabFields) { @@ -83,72 +80,81 @@ namespace NzbDrone.Core.Notifications.Discord public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) { - var embed = new Embed - { - Author = new DiscordAuthor - { - Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, - IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" - }, - Title = healthCheck.Source.Name, - Description = healthCheck.Message, - Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), - Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Danger - }; + var attachments = new List<Embed> + { + new Embed + { + Author = new DiscordAuthor + { + Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" + }, + Title = healthCheck.Source.Name, + Description = healthCheck.Message, + Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Danger + } + }; - var payload = CreatePayload(null, new List<Embed> { embed }); + var payload = CreatePayload(null, attachments); _proxy.SendPayload(payload, Settings); } public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck) { - var embed = new Embed - { - Author = new DiscordAuthor - { - Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, - IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" - }, - Title = "Health Issue Resolved: " + previousCheck.Source.Name, - Description = $"The following issue is now resolved: {previousCheck.Message}", - Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), - Color = (int)DiscordColors.Success - }; + var attachments = new List<Embed> + { + new Embed + { + Author = new DiscordAuthor + { + Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" + }, + Title = "Health Issue Resolved: " + previousCheck.Source.Name, + Description = $"The following issue is now resolved: {previousCheck.Message}", + Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + Color = (int)DiscordColors.Success + } + }; - var payload = CreatePayload(null, new List<Embed> { embed }); + var payload = CreatePayload(null, attachments); _proxy.SendPayload(payload, Settings); } public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage) { - var embed = new Embed - { - Author = new DiscordAuthor - { - Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, - IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" - }, - Title = APPLICATION_UPDATE_TITLE, - Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), - Color = (int)DiscordColors.Standard, - Fields = new List<DiscordField> - { - new () - { - Name = "Previous Version", - Value = updateMessage.PreviousVersion.ToString() - }, - new () - { - Name = "New Version", - Value = updateMessage.NewVersion.ToString() - } - }, - }; + var attachments = new List<Embed> + { + new Embed + { + Author = new DiscordAuthor + { + Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" + }, + Title = APPLICATION_UPDATE_TITLE, + Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + Color = (int)DiscordColors.Standard, + Fields = new List<DiscordField>() + { + new DiscordField() + { + Name = "Previous Version", + Value = updateMessage.PreviousVersion.ToString() + }, + new DiscordField() + { + Name = "New Version", + Value = updateMessage.NewVersion.ToString() + } + }, + } + }; - var payload = CreatePayload(null, new List<Embed> { embed }); + var payload = CreatePayload(null, attachments); _proxy.SendPayload(payload, Settings); } @@ -202,5 +208,19 @@ namespace NzbDrone.Core.Notifications.Discord return payload; } + + private static string BytesToString(long byteCount) + { + string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; //Longs run out around EB + if (byteCount == 0) + { + return "0 " + suf[0]; + } + + var bytes = Math.Abs(byteCount); + var place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024))); + var num = Math.Round(bytes / Math.Pow(1024, place), 1); + return string.Format("{0} {1}", (Math.Sign(byteCount) * num).ToString(), suf[place]); + } } } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookRelease.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookRelease.cs index ad98e5440..295d62986 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookRelease.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookRelease.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Notifications.Webhook @@ -16,18 +13,10 @@ namespace NzbDrone.Core.Notifications.Webhook ReleaseTitle = release.Title; Indexer = release.Indexer; Size = release.Size; - Categories = release.Categories.Select(f => f.Name).ToList(); - Genres = release.Genres.ToList(); - IndexerFlags = release.IndexerFlags.Select(f => f.Name).ToHashSet(); - PublishDate = release.PublishDate; } public string ReleaseTitle { get; set; } public string Indexer { get; set; } public long? Size { get; set; } - public List<string> Categories { get; set; } - public List<string> Genres { get; set; } - public HashSet<string> IndexerFlags { get; set; } - public DateTime? PublishDate { get; set; } } } diff --git a/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs b/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs index 6f0788607..7d8c83d50 100644 --- a/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs +++ b/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs @@ -9,7 +9,6 @@ namespace NzbDrone.Core.Parser.Model { public ReleaseInfo() { - Genres = new List<string>(); IndexerFlags = new HashSet<IndexerFlag>(); Categories = new List<IndexerCategory>(); Languages = new List<string>(); diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 3f70dd577..5cfd16a41 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -11,18 +11,18 @@ <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" /> <PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" /> <PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" /> - <PackageReference Include="Npgsql" Version="7.0.10" /> - <PackageReference Include="Polly" Version="8.5.2" /> + <PackageReference Include="Npgsql" Version="7.0.9" /> + <PackageReference Include="Polly" Version="8.5.1" /> <PackageReference Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" /> <PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" /> <PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" /> - <PackageReference Include="System.Memory" Version="4.6.3" /> + <PackageReference Include="System.Memory" Version="4.6.0" /> <PackageReference Include="System.ServiceModel.Syndication" Version="6.0.0" /> <PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> - <PackageReference Include="NLog" Version="5.4.0" /> + <PackageReference Include="NLog" Version="5.3.4" /> <PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> - <PackageReference Include="System.Text.Json" Version="6.0.11" /> + <PackageReference Include="System.Text.Json" Version="6.0.10" /> <PackageReference Include="MonoTorrent" Version="2.0.7" /> <PackageReference Include="YamlDotNet" Version="13.1.1" /> <PackageReference Include="AngleSharp" Version="1.2.0" /> diff --git a/src/NzbDrone.Host/Prowlarr.Host.csproj b/src/NzbDrone.Host/Prowlarr.Host.csproj index 12bd5168e..07fed755c 100644 --- a/src/NzbDrone.Host/Prowlarr.Host.csproj +++ b/src/NzbDrone.Host/Prowlarr.Host.csproj @@ -4,10 +4,10 @@ <OutputType>Library</OutputType> </PropertyGroup> <ItemGroup> - <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" /> - <PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.1" /> - <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.3" /> - <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="7.3.2" /> + <PackageReference Include="NLog.Extensions.Logging" Version="5.3.15" /> + <PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" /> + <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> + <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> <PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" /> </ItemGroup> diff --git a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj index b9ccacd9e..d37b95690 100644 --- a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj @@ -6,7 +6,7 @@ <PackageReference Include="FluentAssertions" Version="6.11.0" /> <PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="Moq" Version="4.17.2" /> - <PackageReference Include="NLog" Version="5.4.0" /> + <PackageReference Include="NLog" Version="5.3.4" /> <PackageReference Include="NUnit" Version="3.14.0" /> <PackageReference Include="RestSharp" Version="106.15.0" /> <PackageReference Include="RestSharp.Serializers.SystemTextJson" Version="106.15.0" /> diff --git a/src/NzbDrone.Update/Prowlarr.Update.csproj b/src/NzbDrone.Update/Prowlarr.Update.csproj index 09b95e2f8..5570a6f1b 100644 --- a/src/NzbDrone.Update/Prowlarr.Update.csproj +++ b/src/NzbDrone.Update/Prowlarr.Update.csproj @@ -6,7 +6,7 @@ <ItemGroup> <PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" /> - <PackageReference Include="NLog" Version="5.4.0" /> + <PackageReference Include="NLog" Version="5.3.4" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NzbDrone.Common\Prowlarr.Common.csproj" /> diff --git a/src/NzbDrone.Windows/Prowlarr.Windows.csproj b/src/NzbDrone.Windows/Prowlarr.Windows.csproj index 4a9f864e5..f3baa19dc 100644 --- a/src/NzbDrone.Windows/Prowlarr.Windows.csproj +++ b/src/NzbDrone.Windows/Prowlarr.Windows.csproj @@ -4,7 +4,7 @@ <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <ItemGroup> - <PackageReference Include="NLog" Version="5.4.0" /> + <PackageReference Include="NLog" Version="5.3.4" /> <PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" /> </ItemGroup> <ItemGroup> diff --git a/src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs b/src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs index 347c7e9c6..dfaf24a9e 100644 --- a/src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs +++ b/src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs @@ -1,4 +1,3 @@ -using FluentValidation; using NzbDrone.Core.Download; using NzbDrone.SignalR; using Prowlarr.Http; @@ -14,7 +13,6 @@ namespace Prowlarr.Api.V1.DownloadClient public DownloadClientController(IBroadcastSignalRMessage signalRBroadcaster, IDownloadClientFactory downloadClientFactory) : base(signalRBroadcaster, downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper) { - SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50); } } } diff --git a/src/Prowlarr.Api.V1/Health/HealthResource.cs b/src/Prowlarr.Api.V1/Health/HealthResource.cs index 3f357285d..1e2c8ffa5 100644 --- a/src/Prowlarr.Api.V1/Health/HealthResource.cs +++ b/src/Prowlarr.Api.V1/Health/HealthResource.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using NzbDrone.Common.Http; using NzbDrone.Core.HealthCheck; using Prowlarr.Http.REST; @@ -10,7 +11,7 @@ namespace Prowlarr.Api.V1.Health public string Source { get; set; } public HealthCheckResult Type { get; set; } public string Message { get; set; } - public string WikiUrl { get; set; } + public HttpUri WikiUrl { get; set; } } public static class HealthResourceMapper @@ -28,7 +29,7 @@ namespace Prowlarr.Api.V1.Health Source = model.Source.Name, Type = model.Type, Message = model.Message, - WikiUrl = model.WikiUrl.FullUri + WikiUrl = model.WikiUrl }; } diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs index 07955299d..6f360a574 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs @@ -21,7 +21,6 @@ namespace Prowlarr.Api.V1.Indexers .ValidId() .SetValidator(appProfileExistsValidator); - SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50); SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator); } } diff --git a/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj b/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj index 15684b0fe..aac0b246f 100644 --- a/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj +++ b/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj @@ -4,8 +4,8 @@ </PropertyGroup> <ItemGroup> <PackageReference Include="FluentValidation" Version="9.5.4" /> - <PackageReference Include="NLog" Version="5.4.0" /> - <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="7.3.2" /> + <PackageReference Include="NLog" Version="5.3.4" /> + <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NzbDrone.Core\Prowlarr.Core.csproj" /> diff --git a/src/Prowlarr.Api.V1/Tags/TagController.cs b/src/Prowlarr.Api.V1/Tags/TagController.cs index 83e9825c9..ed3aeebb9 100644 --- a/src/Prowlarr.Api.V1/Tags/TagController.cs +++ b/src/Prowlarr.Api.V1/Tags/TagController.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using FluentValidation; using Microsoft.AspNetCore.Mvc; using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Messaging.Events; @@ -21,8 +20,6 @@ namespace Prowlarr.Api.V1.Tags : base(signalRBroadcaster) { _tagService = tagService; - - SharedValidator.RuleFor(c => c.Label).NotEmpty(); } public override TagResource GetResourceById(int id) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index 35cb7d6a0..c7fa206e8 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -4739,8 +4739,7 @@ "nullable": true }, "wikiUrl": { - "type": "string", - "nullable": true + "$ref": "#/components/schemas/HttpUri" } }, "additionalProperties": false @@ -4992,6 +4991,48 @@ }, "additionalProperties": false }, + "HttpUri": { + "type": "object", + "properties": { + "fullUri": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "scheme": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "host": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "port": { + "type": "integer", + "format": "int32", + "nullable": true, + "readOnly": true + }, + "path": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "query": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "fragment": { + "type": "string", + "nullable": true, + "readOnly": true + } + }, + "additionalProperties": false + }, "IActionResult": { "type": "object", "additionalProperties": false diff --git a/src/Prowlarr.Http/Authentication/AuthenticationController.cs b/src/Prowlarr.Http/Authentication/AuthenticationController.cs index 05b058895..8bfec4318 100644 --- a/src/Prowlarr.Http/Authentication/AuthenticationController.cs +++ b/src/Prowlarr.Http/Authentication/AuthenticationController.cs @@ -1,14 +1,9 @@ using System.Collections.Generic; -using System.IO; using System.Security.Claims; -using System.Security.Cryptography; using System.Threading.Tasks; -using System.Xml; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using NLog; -using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; using NzbDrone.Core.Authentication; using NzbDrone.Core.Configuration; @@ -21,15 +16,11 @@ namespace Prowlarr.Http.Authentication { private readonly IAuthenticationService _authService; private readonly IConfigFileProvider _configFileProvider; - private readonly IAppFolderInfo _appFolderInfo; - private readonly Logger _logger; - public AuthenticationController(IAuthenticationService authService, IConfigFileProvider configFileProvider, IAppFolderInfo appFolderInfo, Logger logger) + public AuthenticationController(IAuthenticationService authService, IConfigFileProvider configFileProvider) { _authService = authService; _configFileProvider = configFileProvider; - _appFolderInfo = appFolderInfo; - _logger = logger; } [HttpPost("login")] @@ -54,23 +45,7 @@ namespace Prowlarr.Http.Authentication IsPersistent = resource.RememberMe == "on" }; - try - { - await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties); - } - catch (CryptographicException e) - { - if (e.InnerException is XmlException) - { - _logger.Error(e, "Failed to authenticate user due to corrupt XML. Please remove all XML files from {0} and restart Prowlarr", Path.Combine(_appFolderInfo.AppDataFolder, "asp")); - } - else - { - _logger.Error(e, "Failed to authenticate user. {0}", e.Message); - } - - return Unauthorized(); - } + await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties); if (returnUrl.IsNullOrWhiteSpace()) { diff --git a/src/Prowlarr.Http/Prowlarr.Http.csproj b/src/Prowlarr.Http/Prowlarr.Http.csproj index e326e5ed3..938b722a4 100644 --- a/src/Prowlarr.Http/Prowlarr.Http.csproj +++ b/src/Prowlarr.Http/Prowlarr.Http.csproj @@ -5,7 +5,7 @@ <ItemGroup> <PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="ImpromptuInterface" Version="7.0.1" /> - <PackageReference Include="NLog" Version="5.4.0" /> + <PackageReference Include="NLog" Version="5.3.4" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NzbDrone.Core\Prowlarr.Core.csproj" />